blob: 21fd2164959e6798f4a060a54ec9593976a2bd15 [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 Liu8024b922024-12-20 23:31:32 +000081 HeaderLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000082
83 BinaryDecoratorInfo *BinaryDecoratorInfo
84 LibraryDecoratorInfo *LibraryDecoratorInfo
85 TestBinaryInfo *TestBinaryInfo
86 BenchmarkDecoratorInfo *BenchmarkDecoratorInfo
87 ObjectLinkerInfo *ObjectLinkerInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +000088 StubDecoratorInfo *StubDecoratorInfo
Yu Liu323d77a2024-12-16 23:13:57 +000089}
90
91type BinaryDecoratorInfo struct{}
92type LibraryDecoratorInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000093 ExportIncludeDirs proptools.Configurable[[]string]
Yu Liu116610a2025-01-06 21:54:48 +000094 InjectBsslHash bool
Yu Liu323d77a2024-12-16 23:13:57 +000095}
Yu Liuffe86322024-12-18 18:53:12 +000096
Yu Liu8024b922024-12-20 23:31:32 +000097type SnapshotInfo struct {
98 SnapshotAndroidMkSuffix string
Yu Liuffe86322024-12-18 18:53:12 +000099}
100
Yu Liu323d77a2024-12-16 23:13:57 +0000101type TestBinaryInfo struct {
102 Gtest bool
103}
104type BenchmarkDecoratorInfo struct{}
Yu Liu8a8d5b42025-01-07 00:48:08 +0000105
106type StubDecoratorInfo struct{}
107
Yu Liu323d77a2024-12-16 23:13:57 +0000108type ObjectLinkerInfo struct{}
109
Yu Liu8a8d5b42025-01-07 00:48:08 +0000110type LibraryInfo struct {
111 BuildStubs bool
112}
113
Yu Liub1bfa9d2024-12-05 18:57:51 +0000114// Common info about the cc module.
115type CcInfo struct {
Yu Liu323d77a2024-12-16 23:13:57 +0000116 IsPrebuilt bool
117 CmakeSnapshotSupported bool
118 CompilerInfo *CompilerInfo
119 LinkerInfo *LinkerInfo
Yu Liu8024b922024-12-20 23:31:32 +0000120 SnapshotInfo *SnapshotInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +0000121 LibraryInfo *LibraryInfo
Yu Liub1bfa9d2024-12-05 18:57:51 +0000122}
123
Yu Liu8024b922024-12-20 23:31:32 +0000124var CcInfoProvider = blueprint.NewProvider[*CcInfo]()
Yu Liub1bfa9d2024-12-05 18:57:51 +0000125
Yu Liu986d98c2024-11-12 00:28:11 +0000126type LinkableInfo struct {
127 // StaticExecutable returns true if this is a binary module with "static_executable: true".
Yu Liu8024b922024-12-20 23:31:32 +0000128 StaticExecutable bool
129 Static bool
130 Shared bool
131 HasStubsVariants bool
132 StubsVersion string
133 IsStubs bool
134 UnstrippedOutputFile android.Path
135 OutputFile android.OptionalPath
136 CoverageFiles android.Paths
137 SAbiDumpFiles android.Paths
Yu Liu8a8d5b42025-01-07 00:48:08 +0000138 CcLibrary bool
Yu Liu8024b922024-12-20 23:31:32 +0000139 CcLibraryInterface bool
140 RustLibraryInterface bool
141 // CrateName returns the crateName for a Rust library
142 CrateName string
143 // DepFlags returns a slice of Rustc string flags
144 ExportedCrateLinkDirs []string
145 // This can be different from the one on CommonModuleInfo
146 BaseModuleName string
147 HasNonSystemVariants bool
148 IsLlndk bool
149 InVendorOrProduct bool
150 // SubName returns the modules SubName, used for image and NDK/SDK variations.
151 SubName string
152 InRamdisk bool
153 OnlyInRamdisk bool
154 InVendorRamdisk bool
155 OnlyInVendorRamdisk bool
156 InRecovery bool
157 OnlyInRecovery bool
Yu Liu8a8d5b42025-01-07 00:48:08 +0000158 Installable *bool
Yu Liu986d98c2024-11-12 00:28:11 +0000159}
160
Yu Liu8024b922024-12-20 23:31:32 +0000161var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]()
Yu Liu986d98c2024-11-12 00:28:11 +0000162
Colin Cross463a90e2015-06-17 14:20:06 -0700163func init() {
Paul Duffin036e7002019-12-19 19:16:28 +0000164 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -0700165
Inseob Kim3b244062023-07-11 13:31:36 +0900166 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +0000167 pctx.Import("android/soong/cc/config")
168}
169
170func RegisterCCBuildComponents(ctx android.RegistrationContext) {
171 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
172
173 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -0700174 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700175 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -0700176 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -0700177 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700178 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -0700179 })
Colin Cross16b23492016-01-06 14:41:07 -0800180
Paul Duffin036e7002019-12-19 19:16:28 +0000181 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -0400182 for _, san := range Sanitizers {
183 san.registerMutators(ctx)
184 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800185
Colin Cross8a962802024-10-09 15:29:27 -0700186 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
187 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -0800188
Colin Cross597bad62024-10-08 15:10:55 -0700189 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +0000190
Colin Crossf5f4ad32024-01-19 15:41:48 -0800191 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -0700192
Colin Crossd38feb02024-01-23 16:38:06 -0800193 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800194
Colin Cross33e0c812024-01-23 16:36:07 -0800195 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000196
Colin Cross6ac83a82024-01-23 11:23:10 -0800197 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900198
Colin Cross8a962802024-10-09 15:29:27 -0700199 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
200 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700201 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700202
Colin Cross91ae5ec2024-10-01 14:03:40 -0700203 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800204 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700205 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800206 })
207
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000208 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700209}
210
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500211// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
212// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
213// edges to these modules.
214// This object is constructed in DepsMutator, by calling to various module delegates to set
215// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
216// dependencies.
217// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
218// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800219type Deps struct {
220 SharedLibs, LateSharedLibs []string
221 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800222 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800223 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700224
Colin Cross3e5e7782022-06-17 22:17:05 +0000225 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
226 // prevent automatically exporting symbols.
227 UnexportedStaticLibs []string
228
Chris Parsons79d66a52020-06-05 17:26:16 -0400229 // Used for data dependencies adjacent to tests
230 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700231 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400232
Yo Chiang219968c2020-09-22 18:45:04 +0800233 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
234 SystemSharedLibs []string
235
Vinh Tran367d89d2023-04-28 11:21:25 -0400236 // Used by DepMutator to pass aidl_library modules to aidl compiler
237 AidlLibs []string
238
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500239 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800240 StaticUnwinderIfLegacy bool
241
Colin Cross5950f382016-12-13 12:50:57 -0800242 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700243
Colin Cross81413472016-04-11 14:37:39 -0700244 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700245
Cole Faust65cb40a2024-10-21 15:41:42 -0700246 GeneratedSources []string
247 GeneratedHeaders []string
248 DeviceFirstGeneratedHeaders []string
249 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700250
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700251 ReexportGeneratedHeaders []string
252
Colin Crossc465efd2021-06-11 18:00:04 -0700253 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700254
255 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700256 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900257
258 // List of libs that need to be excluded for APEX variant
259 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900260 // List of libs that need to be excluded for non-APEX variant
261 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800262
263 // LLNDK headers for the ABI checker to check LLNDK implementation library.
264 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700265 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800266 // Instead, the LLNDK implementation depends on the LLNDK header libs.
267 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700268}
269
Ivan Lozano0a468a42024-05-13 21:03:34 -0400270// A struct which to collect flags for rlib dependencies
271type RustRlibDep struct {
272 LibPath android.Path // path to the rlib
273 LinkDirs []string // flags required for dependency (e.g. -L flags)
274 CrateName string // crateNames associated with rlibDeps
275}
276
277func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
278 return a.LibPath == b.LibPath
279}
280
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500281// PathDeps is a struct containing file paths to dependencies of a module.
282// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
283// It's used to construct flags for various build statements (such as for compiling and linking).
284// It is then passed to module decorator functions responsible for registering build statements
285// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800286type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700287 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900288 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700289 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900290 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700291 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700292 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400293 // Paths and crateNames for RustStaticLib dependencies
294 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700295
Colin Cross0de8a1e2020-09-18 14:15:30 -0700296 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700297 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700298
Colin Cross26c34ed2016-09-30 17:10:16 -0700299 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100300 Objs Objects
301 // Paths to .o files in dependencies that provide them. Note that these lists
302 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800303 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700304 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700305
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100306 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
307 // the libs from all whole_static_lib dependencies.
308 WholeStaticLibsFromPrebuilts android.Paths
309
Colin Cross26c34ed2016-09-30 17:10:16 -0700310 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700311 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900312 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700313
Inseob Kimd110f872019-12-06 13:15:38 +0900314 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000315 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900316 IncludeDirs android.Paths
317 SystemIncludeDirs android.Paths
318 ReexportedDirs android.Paths
319 ReexportedSystemDirs android.Paths
320 ReexportedFlags []string
321 ReexportedGeneratedHeaders android.Paths
322 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400323 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700324
Colin Cross26c34ed2016-09-30 17:10:16 -0700325 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700326 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700327
Dan Willemsena0790e32018-10-12 00:24:23 -0700328 // Path to the dynamic linker binary
329 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700330
331 // For Darwin builds, the path to the second architecture's output that should
332 // be combined with this architectures's output into a FAT MachO file.
333 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400334
335 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
336 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800337
338 // LLNDK headers for the ABI checker to check LLNDK implementation library.
339 LlndkIncludeDirs android.Paths
340 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700341
342 directImplementationDeps android.Paths
343 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700344}
345
Colin Cross4af21ed2019-11-04 09:37:55 -0800346// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
347// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
348// command line so they can be overridden by the local module flags).
349type LocalOrGlobalFlags struct {
350 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700351 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800352 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700353 CFlags []string // Flags that apply to C and C++ source files
354 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
355 ConlyFlags []string // Flags that apply to C source files
356 CppFlags []string // Flags that apply to C++ source files
357 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700358 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800359}
360
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500361// Flags contains various types of command line flags (and settings) for use in building build
362// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800363type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500364 // Local flags (which individual modules are responsible for). These may override global flags.
365 Local LocalOrGlobalFlags
366 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700367 Global LocalOrGlobalFlags
368 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800369
370 aidlFlags []string // Flags that apply to aidl source files
371 rsFlags []string // Flags that apply to renderscript source files
372 libFlags []string // Flags to add libraries early to the link order
373 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
374 TidyFlags []string // Flags that apply to clang-tidy
375 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700376
Colin Crossc3199482017-03-30 15:03:04 -0700377 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800378 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700379 SystemIncludeFlags []string
380
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800381 Toolchain config.Toolchain
382 Tidy bool // True if ninja .tidy rules should be generated.
383 NeedTidyFiles bool // True if module link should depend on .tidy files
384 GcovCoverage bool // True if coverage files should be generated.
385 SAbiDump bool // True if header abi dumps should be generated.
386 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800387 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800388
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500389 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800390 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500391 // The target-device system path to the dynamic linker.
392 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800393
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700394 CFlagsDeps android.Paths // Files depended on by compiler flags
395 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800396
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500397 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700398 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800399
Colin Cross19878da2019-03-28 14:45:07 -0700400 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700401 protoC bool // Whether to use C instead of C++
402 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700403
404 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200405 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700406}
407
Colin Crossca860ac2016-01-04 14:34:37 -0800408// Properties used to compile all C or C++ modules
409type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700410 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800411 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700412
Yi Kong5786f5c2024-05-28 02:22:34 +0900413 // Aggresively trade performance for smaller binary size.
414 // This should only be used for on-device binaries that are rarely executed and not
415 // performance critical.
416 Optimize_for_size *bool `android:"arch_variant"`
417
Jiyong Parkb35a8192020-08-10 15:59:36 +0900418 // The API level that this module is built against. The APIs of this API level will be
419 // visible at build time, but use of any APIs newer than min_sdk_version will render the
420 // module unloadable on older devices. In the future it will be possible to weakly-link new
421 // APIs, making the behavior match Java: such modules will load on older devices, but
422 // calling new APIs on devices that do not support them will result in a crash.
423 //
424 // This property has the same behavior as sdk_version does for Java modules. For those
425 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
426 // does for Java code.
427 //
428 // In addition, setting this property causes two variants to be built, one for the platform
429 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800430 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700431
Jiyong Parkb35a8192020-08-10 15:59:36 +0900432 // Minimum OS API level supported by this C or C++ module. This property becomes the value
433 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
434 // this property is also used to ensure that the min_sdk_version of the containing module is
435 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
436 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
437 // min_sdk_version of the containing APEX. When the module
438 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900439 Min_sdk_version *string
440
Colin Crossc511bc52020-04-07 16:50:32 +0000441 // If true, always create an sdk variant and don't create a platform variant.
442 Sdk_variant_only *bool
443
Colin Cross4297f402024-11-20 15:20:09 -0800444 AndroidMkSharedLibs []string `blueprint:"mutated"`
445 AndroidMkStaticLibs []string `blueprint:"mutated"`
446 AndroidMkRlibs []string `blueprint:"mutated"`
447 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
448 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
449 AndroidMkHeaderLibs []string `blueprint:"mutated"`
450 HideFromMake bool `blueprint:"mutated"`
451 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700452
Yo Chiang219968c2020-09-22 18:45:04 +0800453 // Set by DepsMutator.
454 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
455
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900456 // The name of the image this module is built for
457 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200458
459 // The VNDK version this module is built against. If empty, the module is not
460 // build against the VNDK.
461 VndkVersion string `blueprint:"mutated"`
462
463 // Suffix for the name of Android.mk entries generated by this module
464 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800465
466 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
467 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900468 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900469
Yifan Hong39143a92020-10-26 12:43:12 -0700470 // Make this module available when building for ramdisk.
471 // On device without a dedicated recovery partition, the module is only
472 // available after switching root into
473 // /first_stage_ramdisk. To expose the module before switching root, install
474 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800475 Ramdisk_available *bool
476
Yifan Hong39143a92020-10-26 12:43:12 -0700477 // Make this module available when building for vendor ramdisk.
478 // On device without a dedicated recovery partition, the module is only
479 // available after switching root into
480 // /first_stage_ramdisk. To expose the module before switching root, install
481 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700482 Vendor_ramdisk_available *bool
483
Jiyong Parkf9332f12018-02-01 00:54:12 +0900484 // Make this module available when building for recovery
485 Recovery_available *bool
486
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200487 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000488 VendorVariantNeeded bool `blueprint:"mutated"`
489 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200490 CoreVariantNeeded bool `blueprint:"mutated"`
491 RamdiskVariantNeeded bool `blueprint:"mutated"`
492 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
493 RecoveryVariantNeeded bool `blueprint:"mutated"`
494
495 // A list of variations for the "image" mutator of the form
496 //<image name> '.' <version char>, for example, 'vendor.S'
497 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900498
499 // Allows this module to use non-APEX version of libraries. Useful
500 // for building binaries that are started before APEXes are activated.
501 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900502
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000503 // Allows this module to be included in CMake release snapshots to be built outside of Android
504 // build system and source tree.
505 Cmake_snapshot_supported *bool
506
Colin Cross1bc94122021-10-28 13:25:54 -0700507 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000508
509 // Set by factories of module types that can only be referenced from variants compiled against
510 // the SDK.
511 AlwaysSdk bool `blueprint:"mutated"`
512
513 // Variant is an SDK variant created by sdkMutator
514 IsSdkVariant bool `blueprint:"mutated"`
515 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
516 // variant to have a ".sdk" suffix.
517 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700518
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800519 Target struct {
520 Platform struct {
521 // List of modules required by the core variant.
522 Required []string `android:"arch_variant"`
523
524 // List of modules not required by the core variant.
525 Exclude_required []string `android:"arch_variant"`
526 } `android:"arch_variant"`
527
528 Recovery struct {
529 // List of modules required by the recovery variant.
530 Required []string `android:"arch_variant"`
531
532 // List of modules not required by the recovery variant.
533 Exclude_required []string `android:"arch_variant"`
534 } `android:"arch_variant"`
535 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700536}
537
538type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900539 // whether this module should be allowed to be directly depended by other
540 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900541 // If set to true, two variants will be built separately, one like
542 // normal, and the other limited to the set of libraries and headers
543 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700544 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900545 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700546 // so it shouldn't have any unversioned runtime dependencies, or
547 // make assumptions about the system that may not be true in the
548 // future.
549 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900550 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900551 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900552 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900553 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900554 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700555 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
556 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900557
Justin Yunebcf0c52021-01-08 18:00:19 +0900558 // This is the same as the "vendor_available" except that the install path
559 // of the vendor variant is /odm or /vendor/odm.
560 // By replacing "vendor_available: true" with "odm_available: true", the
561 // module will install its vendor variant to the /odm partition or /vendor/odm.
562 // As the modules with "odm_available: true" still create the vendor variants,
563 // they can link to the other vendor modules as the vendor_available modules do.
564 // Also, the vendor modules can link to odm_available modules.
565 //
566 // It may not be used for VNDK modules.
567 Odm_available *bool
568
Justin Yun63e9ec72020-10-29 16:49:43 +0900569 // whether this module should be allowed to be directly depended by other
570 // modules with `product_specific: true` or `product_available: true`.
571 // If set to true, an additional product variant will be built separately
572 // that is limited to the set of libraries and headers that are exposed to
573 // /product modules.
574 //
575 // The product variant may be used with a different (newer) /system,
576 // so it shouldn't have any unversioned runtime dependencies, or
577 // make assumptions about the system that may not be true in the
578 // future.
579 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900580 // If set to false, this module becomes inaccessible from /product modules.
581 //
582 // Different from the 'vendor_available' property, the modules with
583 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
584 // library without 'product_available' may not be depended on by any other
585 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900586 //
587 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
588 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
589 Product_available *bool
590
Jiyong Park5fb8c102018-04-09 12:03:06 +0900591 // whether this module is capable of being loaded with other instance
592 // (possibly an older version) of the same module in the same process.
593 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
594 // can be double loaded in a vendor process if the library is also a
595 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
596 // explicitly marked as `double_loadable: true` by the owner, or the dependency
597 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
598 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800599
600 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
601 IsLLNDK bool `blueprint:"mutated"`
602
Colin Cross5271fea2021-04-27 13:06:04 -0700603 // IsVendorPublicLibrary is set for the core and product variants of a library that has
604 // vendor_public_library stubs.
605 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800606}
607
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500608// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
609// to understanding details about the type of the current module.
610// For example, one might call these functions to determine whether the current module is a static
611// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800612type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800613 static() bool
614 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800615 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700616 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800617 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900618 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900619 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900620 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700621 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900622 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700623 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800624 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900625 minSdkVersion() string
626 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700627 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700628 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800629 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800630 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700631 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900632 inProduct() bool
633 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800634 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700635 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900636 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900637 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700638 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700639 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800640 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000641 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800642 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900643 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800644 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800645 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800646 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700647 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700648 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900649 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700650 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800651 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800652 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800653 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800654 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900655 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000656 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800657}
658
659type SharedFlags struct {
660 numSharedFlags int
661 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800662}
663
664type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700665 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800666 ModuleContextIntf
667}
668
669type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700670 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800671 ModuleContextIntf
672}
673
Colin Cross37047f12016-12-13 17:06:13 -0800674type DepsContext interface {
675 android.BottomUpMutatorContext
676 ModuleContextIntf
677}
678
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500679// feature represents additional (optional) steps to building cc-related modules, such as invocation
680// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800681type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800682 flags(ctx ModuleContext, flags Flags) Flags
683 props() []interface{}
684}
685
Joe Onorato37f900c2023-07-18 16:58:16 -0700686// Information returned from Generator about the source code it's generating
687type GeneratedSource struct {
688 IncludeDirs android.Paths
689 Sources android.Paths
690 Headers android.Paths
691 ReexportedDirs android.Paths
692}
693
694// generator allows injection of generated code
695type Generator interface {
696 GeneratorProps() []interface{}
697 GeneratorInit(ctx BaseModuleContext)
698 GeneratorDeps(ctx DepsContext, deps Deps) Deps
699 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
700 GeneratorSources(ctx ModuleContext) GeneratedSource
701 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
702}
703
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500704// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500705// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800706type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700707 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800708 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800709 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700710 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000711 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700712
Colin Cross76fada02016-07-27 10:31:13 -0700713 appendCflags([]string)
714 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700715 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800716}
717
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500718// linker is the interface for a linker decorator object. Individual module types can provide
719// their own implementation for this decorator, and thus specify custom logic regarding build
720// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800721type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700722 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800723 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700724 linkerFlags(ctx ModuleContext, flags Flags) Flags
725 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000726 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800727 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700728
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700729 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700730 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900731 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800732 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700733
734 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900735 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000736
737 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700738 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800739
740 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000741}
742
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500743// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000744type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500745 sharedLibs []string
746 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
747 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700748 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800749}
750
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500751// installer is the interface for an installer helper object. This helper is responsible for
752// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800753type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700754 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700755 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000756 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800757 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700758 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700759 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900760 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000761 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900762 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800763}
764
Inseob Kima1888ce2022-10-04 14:42:02 +0900765type overridable interface {
766 overriddenModules() []string
767}
768
Colin Cross6e511a92020-07-27 21:26:48 -0700769type libraryDependencyKind int
770
771const (
772 headerLibraryDependency = iota
773 sharedLibraryDependency
774 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400775 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700776)
777
778func (k libraryDependencyKind) String() string {
779 switch k {
780 case headerLibraryDependency:
781 return "headerLibraryDependency"
782 case sharedLibraryDependency:
783 return "sharedLibraryDependency"
784 case staticLibraryDependency:
785 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400786 case rlibLibraryDependency:
787 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700788 default:
789 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
790 }
791}
792
793type libraryDependencyOrder int
794
795const (
796 earlyLibraryDependency = -1
797 normalLibraryDependency = 0
798 lateLibraryDependency = 1
799)
800
801func (o libraryDependencyOrder) String() string {
802 switch o {
803 case earlyLibraryDependency:
804 return "earlyLibraryDependency"
805 case normalLibraryDependency:
806 return "normalLibraryDependency"
807 case lateLibraryDependency:
808 return "lateLibraryDependency"
809 default:
810 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
811 }
812}
813
814// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
815// tags that have a set of predefined tag objects that are reused for each dependency, a
816// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
817// That means that comparing a libraryDependencyTag for equality will only be equal if all
818// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
819// then check individual metadata fields instead.
820type libraryDependencyTag struct {
821 blueprint.BaseDependencyTag
822
823 // These are exported so that fmt.Printf("%#v") can call their String methods.
824 Kind libraryDependencyKind
825 Order libraryDependencyOrder
826
827 wholeStatic bool
828
829 reexportFlags bool
830 explicitlyVersioned bool
831 dataLib bool
832 ndk bool
833
834 staticUnwinder bool
835
836 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900837
Cindy Zhou18417cb2020-12-10 07:12:38 -0800838 // Whether or not this dependency should skip the apex dependency check
839 skipApexAllowedDependenciesCheck bool
840
Jiyong Parke3867542020-12-03 17:28:25 +0900841 // Whether or not this dependency has to be followed for the apex variants
842 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900843 // Whether or not this dependency has to be followed for the non-apex variants
844 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000845
846 // If true, don't automatically export symbols from the static library into a shared library.
847 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700848}
849
850// header returns true if the libraryDependencyTag is tagging a header lib dependency.
851func (d libraryDependencyTag) header() bool {
852 return d.Kind == headerLibraryDependency
853}
854
855// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
856func (d libraryDependencyTag) shared() bool {
857 return d.Kind == sharedLibraryDependency
858}
859
860// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
861func (d libraryDependencyTag) static() bool {
862 return d.Kind == staticLibraryDependency
863}
864
Colin Cross65cb3142021-12-10 23:05:02 +0000865func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
866 if d.shared() {
867 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
868 }
869 return nil
870}
871
872var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
873
Colin Crosse9fe2942020-11-10 18:12:15 -0800874// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
875// binaries or other shared libraries are installed as dependencies.
876func (d libraryDependencyTag) InstallDepNeeded() bool {
877 return d.shared()
878}
879
880var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
881
Yu Liu67a28422024-03-05 00:36:31 +0000882func (d libraryDependencyTag) PropagateAconfigValidation() bool {
883 return d.static()
884}
885
886var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
887
Colin Crosse9fe2942020-11-10 18:12:15 -0800888// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700889// libraryDependencyTag. Each tag object is created globally and reused for multiple
890// dependencies (although since the object contains no references, assigning a tag to a
891// variable and modifying it will not modify the original). Users can compare the tag
892// returned by ctx.OtherModuleDependencyTag against the global original
893type dependencyTag struct {
894 blueprint.BaseDependencyTag
895 name string
896}
897
Colin Crosse9fe2942020-11-10 18:12:15 -0800898// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
899// libraryDependencyTag, but where the dependency needs to be installed when the parent is
900// installed.
901type installDependencyTag struct {
902 blueprint.BaseDependencyTag
903 android.InstallAlwaysNeededDependencyTag
904 name string
905}
906
Colin Crossc99deeb2016-04-11 15:06:20 -0700907var (
Colin Cross6e511a92020-07-27 21:26:48 -0700908 genSourceDepTag = dependencyTag{name: "gen source"}
909 genHeaderDepTag = dependencyTag{name: "gen header"}
910 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
911 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900912 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700913 reuseObjTag = dependencyTag{name: "reuse objects"}
914 staticVariantTag = dependencyTag{name: "static variant"}
915 vndkExtDepTag = dependencyTag{name: "vndk extends"}
916 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700917 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800918 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700919 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000920 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500921 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400922 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800923 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700924)
925
Roland Levillainf89cd092019-07-29 16:22:59 +0100926func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700927 ccLibDepTag, ok := depTag.(libraryDependencyTag)
928 return ok && ccLibDepTag.shared()
929}
930
931func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
932 ccLibDepTag, ok := depTag.(libraryDependencyTag)
933 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100934}
935
Zach Johnson3df4e632020-11-06 11:56:27 -0800936func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
937 ccLibDepTag, ok := depTag.(libraryDependencyTag)
938 return ok && ccLibDepTag.header()
939}
940
Roland Levillainf89cd092019-07-29 16:22:59 +0100941func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800942 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100943}
944
Colin Crossca860ac2016-01-04 14:34:37 -0800945// Module contains the properties and members used by all C/C++ module types, and implements
946// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500947// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
948// interface.
949//
950// To define a C/C++ related module, construct a new Module object and point its delegates to
951// type-specific structs. These delegates will be invoked to register module-specific build
952// statements which may be unique to the module type. For example, module.compiler.compile() should
953// be defined so as to register build statements which are responsible for compiling the module.
954//
955// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
956// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
957// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
958// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800959type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700960 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700961
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700962 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700963 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -0700964 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700965
Colin Crossca860ac2016-01-04 14:34:37 -0800966 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +0000967 hod android.HostOrDeviceSupported
968 multilib android.Multilib
969 testModule bool
970 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -0700971
Paul Duffina0843f62019-12-13 19:50:38 +0000972 // Allowable SdkMemberTypes of this module type.
973 sdkMemberTypes []android.SdkMemberType
974
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500975 // decorator delegates, initialize before calling Init
976 // these may contain module-specific implementations, and effectively allow for custom
977 // type-specific logic. These members may reference different objects or the same object.
978 // Functions of these decorators will be invoked to initialize and register type-specific
979 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800980 generators []Generator
981 compiler compiler
982 linker linker
983 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500984
Spandan Dase12d2522023-09-12 21:42:31 +0000985 features []feature
986 stl *stl
987 sanitize *sanitize
988 coverage *coverage
989 fuzzer *fuzzer
990 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +0000991 lto *lto
992 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000993 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800994
Colin Cross31076b32020-10-23 17:22:06 -0700995 library libraryInterface
996
Colin Cross635c3b02016-05-18 15:37:25 -0700997 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800998
Colin Crossb98c8b02016-07-29 13:44:28 -0700999 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -07001000
Yu Liue70976d2024-10-15 20:45:35 +00001001 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001002
1003 // Flags used to compile this module
1004 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -07001005
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001006 // Shared flags among build rules of this module
1007 sharedFlags SharedFlags
1008
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08001009 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -07001010 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +09001011
1012 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +09001013
1014 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -07001015 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07001016
1017 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -08001018
Inseob Kim37e0bb02024-04-29 15:54:44 +09001019 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001020
1021 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -07001022
1023 hasAidl bool
1024 hasLex bool
1025 hasProto bool
1026 hasRenderscript bool
1027 hasSysprop bool
1028 hasWinMsg bool
1029 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +00001030
1031 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -07001032}
1033
Yu Liu76d94462024-10-31 23:32:36 +00001034func (c *Module) IncrementalSupported() bool {
1035 return c.incremental
1036}
1037
1038var _ blueprint.Incremental = (*Module)(nil)
1039
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001040func (c *Module) AddJSONData(d *map[string]interface{}) {
1041 c.AndroidModuleBase().AddJSONData(d)
1042 (*d)["Cc"] = map[string]interface{}{
1043 "SdkVersion": c.SdkVersion(),
1044 "MinSdkVersion": c.MinSdkVersion(),
1045 "VndkVersion": c.VndkVersion(),
1046 "ProductSpecific": c.ProductSpecific(),
1047 "SocSpecific": c.SocSpecific(),
1048 "DeviceSpecific": c.DeviceSpecific(),
1049 "InProduct": c.InProduct(),
1050 "InVendor": c.InVendor(),
1051 "InRamdisk": c.InRamdisk(),
1052 "InVendorRamdisk": c.InVendorRamdisk(),
1053 "InRecovery": c.InRecovery(),
1054 "VendorAvailable": c.VendorAvailable(),
1055 "ProductAvailable": c.ProductAvailable(),
1056 "RamdiskAvailable": c.RamdiskAvailable(),
1057 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1058 "RecoveryAvailable": c.RecoveryAvailable(),
1059 "OdmAvailable": c.OdmAvailable(),
1060 "InstallInData": c.InstallInData(),
1061 "InstallInRamdisk": c.InstallInRamdisk(),
1062 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1063 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1064 "InstallInRecovery": c.InstallInRecovery(),
1065 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001066 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001067 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1068 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001069 "AidlSrcs": c.hasAidl,
1070 "LexSrcs": c.hasLex,
1071 "ProtoSrcs": c.hasProto,
1072 "RenderscriptSrcs": c.hasRenderscript,
1073 "SyspropSrcs": c.hasSysprop,
1074 "WinMsgSrcs": c.hasWinMsg,
1075 "YaccSrsc": c.hasYacc,
1076 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001077 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001078 }
1079}
1080
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001081func (c *Module) SetPreventInstall() {
1082 c.Properties.PreventInstall = true
1083}
1084
1085func (c *Module) SetHideFromMake() {
1086 c.Properties.HideFromMake = true
1087}
1088
Ivan Lozanod7586b62021-04-01 09:49:36 -04001089func (c *Module) HiddenFromMake() bool {
1090 return c.Properties.HideFromMake
1091}
1092
Cole Fauste8a87832024-09-11 11:35:46 -07001093func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001094 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001095 if c.ImageVariation().Variation == android.CoreVariation {
1096 required = append(required, c.Properties.Target.Platform.Required...)
1097 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1098 } else if c.InRecovery() {
1099 required = append(required, c.Properties.Target.Recovery.Required...)
1100 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1101 }
1102 return android.FirstUniqueStrings(required)
1103}
1104
Ivan Lozano52767be2019-10-18 14:49:46 -07001105func (c *Module) Toc() android.OptionalPath {
1106 if c.linker != nil {
1107 if library, ok := c.linker.(libraryInterface); ok {
1108 return library.toc()
1109 }
1110 }
1111 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1112}
1113
1114func (c *Module) ApiLevel() string {
1115 if c.linker != nil {
1116 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001117 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001118 }
1119 }
1120 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1121}
1122
1123func (c *Module) Static() bool {
1124 if c.linker != nil {
1125 if library, ok := c.linker.(libraryInterface); ok {
1126 return library.static()
1127 }
1128 }
1129 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1130}
1131
1132func (c *Module) Shared() bool {
1133 if c.linker != nil {
1134 if library, ok := c.linker.(libraryInterface); ok {
1135 return library.shared()
1136 }
1137 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001138
Ivan Lozano52767be2019-10-18 14:49:46 -07001139 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1140}
1141
1142func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001143 if c.stl != nil {
1144 return c.stl.Properties.SelectedStl
1145 }
1146 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001147}
1148
Ivan Lozano52767be2019-10-18 14:49:46 -07001149func (c *Module) StubDecorator() bool {
1150 if _, ok := c.linker.(*stubDecorator); ok {
1151 return true
1152 }
1153 return false
1154}
1155
Yi Kong5786f5c2024-05-28 02:22:34 +09001156func (c *Module) OptimizeForSize() bool {
1157 return Bool(c.Properties.Optimize_for_size)
1158}
1159
Ivan Lozano52767be2019-10-18 14:49:46 -07001160func (c *Module) SdkVersion() string {
1161 return String(c.Properties.Sdk_version)
1162}
1163
Artur Satayev480e25b2020-04-27 18:53:18 +01001164func (c *Module) MinSdkVersion() string {
1165 return String(c.Properties.Min_sdk_version)
1166}
1167
Jiyong Park5df7bd32021-08-25 16:18:46 +09001168func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001169 if linker, ok := c.linker.(*objectLinker); ok {
1170 return linker.isCrt()
1171 }
1172 return false
1173}
1174
Jiyong Park5df7bd32021-08-25 16:18:46 +09001175func (c *Module) SplitPerApiLevel() bool {
1176 return c.canUseSdk() && c.isCrt()
1177}
1178
Colin Crossc511bc52020-04-07 16:50:32 +00001179func (c *Module) AlwaysSdk() bool {
1180 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1181}
1182
Ivan Lozano183a3212019-10-18 14:18:45 -07001183func (c *Module) CcLibrary() bool {
1184 if c.linker != nil {
1185 if _, ok := c.linker.(*libraryDecorator); ok {
1186 return true
1187 }
Colin Crossd48fe732020-09-23 20:37:24 -07001188 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1189 return true
1190 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001191 }
1192 return false
1193}
1194
1195func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001196 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001197 return true
1198 }
1199 return false
1200}
1201
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001202func (c *Module) RlibStd() bool {
1203 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1204}
1205
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001206func (c *Module) RustLibraryInterface() bool {
1207 return false
1208}
1209
Ivan Lozano0a468a42024-05-13 21:03:34 -04001210func (c *Module) CrateName() string {
1211 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1212}
1213
1214func (c *Module) ExportedCrateLinkDirs() []string {
1215 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1216}
1217
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001218func (c *Module) IsFuzzModule() bool {
1219 if _, ok := c.compiler.(*fuzzBinary); ok {
1220 return true
1221 }
1222 return false
1223}
1224
1225func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1226 return c.FuzzModule
1227}
1228
1229func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1230 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1231 return fuzzer.fuzzPackagedModule
1232 }
1233 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1234}
1235
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001236func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001237 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1238 return fuzzer.sharedLibraries
1239 }
1240 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1241}
1242
Ivan Lozano2b262972019-11-21 12:30:50 -08001243func (c *Module) NonCcVariants() bool {
1244 return false
1245}
1246
Ivan Lozano183a3212019-10-18 14:18:45 -07001247func (c *Module) SetStatic() {
1248 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001249 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001250 library.setStatic()
1251 return
1252 }
1253 }
1254 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1255}
1256
1257func (c *Module) SetShared() {
1258 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001259 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001260 library.setShared()
1261 return
1262 }
1263 }
1264 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1265}
1266
1267func (c *Module) BuildStaticVariant() bool {
1268 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001269 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001270 return library.buildStatic()
1271 }
1272 }
1273 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1274}
1275
1276func (c *Module) BuildSharedVariant() bool {
1277 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001278 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001279 return library.buildShared()
1280 }
1281 }
1282 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1283}
1284
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001285func (c *Module) BuildRlibVariant() bool {
1286 // cc modules can never build rlib variants
1287 return false
1288}
1289
Ivan Lozano183a3212019-10-18 14:18:45 -07001290func (c *Module) Module() android.Module {
1291 return c
1292}
1293
Jiyong Parkc20eee32018-09-05 22:36:17 +09001294func (c *Module) OutputFile() android.OptionalPath {
1295 return c.outputFile
1296}
1297
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001298func (c *Module) CoverageFiles() android.Paths {
1299 if c.linker != nil {
1300 if library, ok := c.linker.(libraryInterface); ok {
1301 return library.objs().coverageFiles
1302 }
1303 }
1304 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1305}
1306
Ivan Lozano183a3212019-10-18 14:18:45 -07001307var _ LinkableInterface = (*Module)(nil)
1308
Jiyong Park719b4462019-01-13 00:39:51 +09001309func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001310 if c.linker != nil {
1311 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001312 }
1313 return nil
1314}
1315
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001316func (c *Module) CoverageOutputFile() android.OptionalPath {
1317 if c.linker != nil {
1318 return c.linker.coverageOutputFilePath()
1319 }
1320 return android.OptionalPath{}
1321}
1322
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001323func (c *Module) RelativeInstallPath() string {
1324 if c.installer != nil {
1325 return c.installer.relativeInstallPath()
1326 }
1327 return ""
1328}
1329
Jooyung Han344d5432019-08-23 11:17:39 +09001330func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001331 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001332}
1333
Colin Cross36242852017-06-23 15:06:31 -07001334func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001335 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001336 for _, generator := range c.generators {
1337 c.AddProperties(generator.GeneratorProps()...)
1338 }
Colin Crossca860ac2016-01-04 14:34:37 -08001339 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001340 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001341 }
1342 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001343 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001344 }
1345 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001346 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001347 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001348 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001349 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001350 }
Colin Cross16b23492016-01-06 14:41:07 -08001351 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001352 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001353 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001354 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001355 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001356 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001357 if c.fuzzer != nil {
1358 c.AddProperties(c.fuzzer.props()...)
1359 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001360 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001361 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001362 }
Stephen Craneba090d12017-05-09 15:44:35 -07001363 if c.lto != nil {
1364 c.AddProperties(c.lto.props()...)
1365 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001366 if c.afdo != nil {
1367 c.AddProperties(c.afdo.props()...)
1368 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001369 if c.orderfile != nil {
1370 c.AddProperties(c.orderfile.props()...)
1371 }
Colin Crossca860ac2016-01-04 14:34:37 -08001372 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001373 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001374 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001375 // Allow test-only on libraries that are not cc_test_library
1376 if c.library != nil && !c.testLibrary() {
1377 c.AddProperties(&c.sourceProperties)
1378 }
Colin Crossc472d572015-03-17 15:06:21 -07001379
Colin Cross36242852017-06-23 15:06:31 -07001380 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001381 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001382 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001383
Colin Cross36242852017-06-23 15:06:31 -07001384 return c
Colin Crossc472d572015-03-17 15:06:21 -07001385}
1386
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001387// UseVndk() returns true if this module is built against VNDK.
1388// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001389func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001390 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001391}
1392
Colin Crossc511bc52020-04-07 16:50:32 +00001393func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001394 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001395 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001396}
1397
1398func (c *Module) UseSdk() bool {
1399 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001400 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001401 }
1402 return false
1403}
1404
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001405func (c *Module) isCoverageVariant() bool {
1406 return c.coverage.Properties.IsCoverageVariant
1407}
1408
Colin Cross95f1ca02020-10-29 20:47:22 -07001409func (c *Module) IsNdk(config android.Config) bool {
1410 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001411}
1412
Colin Cross127bb8b2020-12-16 16:46:01 -08001413func (c *Module) IsLlndk() bool {
1414 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001415}
1416
Colin Cross1f3f1302021-04-26 18:37:44 -07001417func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001418 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001419 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001420}
1421
Colin Cross5271fea2021-04-27 13:06:04 -07001422func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1423 lib := moduleLibraryInterface(m)
1424 return lib != nil && (lib.hasVendorPublicLibrary())
1425}
1426
1427// IsVendorPublicLibrary returns true for vendor public libraries.
1428func (c *Module) IsVendorPublicLibrary() bool {
1429 return c.VendorProperties.IsVendorPublicLibrary
1430}
1431
Ivan Lozanof1868af2022-04-12 13:08:36 -04001432func (c *Module) IsVndkPrebuiltLibrary() bool {
1433 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1434 return true
1435 }
1436 return false
1437}
1438
1439func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1440 return c.Properties.SdkAndPlatformVariantVisibleToMake
1441}
1442
Ivan Lozanod7586b62021-04-01 09:49:36 -04001443func (c *Module) HasLlndkStubs() bool {
1444 lib := moduleLibraryInterface(c)
1445 return lib != nil && lib.hasLLNDKStubs()
1446}
1447
1448func (c *Module) StubsVersion() string {
1449 if lib, ok := c.linker.(versionedInterface); ok {
1450 return lib.stubsVersion()
1451 }
1452 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1453}
1454
Colin Cross127bb8b2020-12-16 16:46:01 -08001455// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1456// and does not set llndk.vendor_available: false.
1457func (c *Module) isImplementationForLLNDKPublic() bool {
1458 library, _ := c.library.(*libraryDecorator)
1459 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001460 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001461}
1462
Colin Cross3513fb12024-01-24 14:44:47 -08001463func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001464 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001465 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001466 }
1467 return false
1468}
1469
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001470func (c *Module) isOrderfileCompile() bool {
1471 if orderfile := c.orderfile; orderfile != nil {
1472 return orderfile.Properties.OrderfileLoad
1473 }
1474 return false
1475}
1476
Yi Kongc702ebd2022-08-19 16:02:45 +08001477func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001478 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001479}
1480
Yi Konged79fa32023-06-04 17:15:42 +09001481func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001482 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001483}
1484
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001485func (c *Module) isNDKStubLibrary() bool {
1486 if _, ok := c.compiler.(*stubDecorator); ok {
1487 return true
1488 }
1489 return false
1490}
1491
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001492func (c *Module) SubName() string {
1493 return c.Properties.SubName
1494}
1495
Jiyong Park25fc6a92018-11-18 18:02:45 +09001496func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001497 if lib := c.library; lib != nil {
1498 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001499 }
1500 return false
1501}
1502
1503func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001504 if lib := c.library; lib != nil {
1505 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001506 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001507 return false
1508}
1509
Alan Stokes73feba32022-11-14 12:21:24 +00001510func (c *Module) IsStubsImplementationRequired() bool {
1511 if lib := c.library; lib != nil {
1512 return lib.isStubsImplementationRequired()
1513 }
1514 return false
1515}
1516
Colin Cross0477b422020-10-13 18:43:54 -07001517// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1518// the implementation. If it is an implementation library it returns its own name.
1519func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1520 name := ctx.OtherModuleName(c)
1521 if versioned, ok := c.linker.(versionedInterface); ok {
1522 name = versioned.implementationModuleName(name)
1523 }
1524 return name
1525}
1526
Martin Stjernholm2856c662020-12-02 15:03:42 +00001527// Similar to ImplementationModuleName, but uses the Make variant of the module
1528// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1529// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1530// under the premise that the prebuilt module overrides its source counterpart
1531// if it is exposed to Make).
1532func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1533 name := c.BaseModuleName()
1534 if versioned, ok := c.linker.(versionedInterface); ok {
1535 name = versioned.implementationModuleName(name)
1536 }
1537 return name
1538}
1539
Jiyong Park7d55b612021-06-11 17:22:09 +09001540func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001541 return Bool(c.Properties.Bootstrap)
1542}
1543
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001544func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001545 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1546 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1547 return false
1548 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001549 return c.linker != nil && c.linker.nativeCoverage()
1550}
1551
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001552func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001553 if p, ok := c.linker.(SnapshotInterface); ok {
1554 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001555 }
1556 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001557}
1558
Jiyong Parkf1194352019-02-25 11:05:47 +09001559func isBionic(name string) bool {
1560 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001561 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001562 return true
1563 }
1564 return false
1565}
1566
Martin Stjernholm279de572019-09-10 23:18:20 +01001567func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001568 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001569 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001570 }
1571 return isBionic(name)
1572}
1573
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001574func (c *Module) isCfiAssemblySupportEnabled() bool {
1575 return c.sanitize != nil &&
1576 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1577}
1578
Inseob Kim800d1142021-06-14 12:03:51 +09001579func (c *Module) InstallInRoot() bool {
1580 return c.installer != nil && c.installer.installInRoot()
1581}
1582
Colin Crossca860ac2016-01-04 14:34:37 -08001583type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001584 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001585 moduleContextImpl
1586}
1587
Colin Cross37047f12016-12-13 17:06:13 -08001588type depsContext struct {
1589 android.BottomUpMutatorContext
1590 moduleContextImpl
1591}
1592
Colin Crossca860ac2016-01-04 14:34:37 -08001593type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001594 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001595 moduleContextImpl
1596}
1597
1598type moduleContextImpl struct {
1599 mod *Module
1600 ctx BaseModuleContext
1601}
1602
Colin Crossb98c8b02016-07-29 13:44:28 -07001603func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001604 return ctx.mod.toolchain(ctx.ctx)
1605}
1606
1607func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001608 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001609}
1610
1611func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001612 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001613}
1614
Colin Cross6a730042024-12-05 13:53:43 -08001615func (ctx *moduleContextImpl) staticLibrary() bool {
1616 return ctx.mod.staticLibrary()
1617}
1618
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001619func (ctx *moduleContextImpl) testBinary() bool {
1620 return ctx.mod.testBinary()
1621}
1622
Yi Kong56fc1b62022-09-06 16:24:00 +08001623func (ctx *moduleContextImpl) testLibrary() bool {
1624 return ctx.mod.testLibrary()
1625}
1626
Jiyong Park1d1119f2019-07-29 21:27:18 +09001627func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001628 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001629}
1630
Inseob Kim7f283f42020-06-01 21:53:49 +09001631func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001632 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001633}
1634
Inseob Kim1042d292020-06-01 23:23:05 +09001635func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001636 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001637}
1638
Yi Kong5786f5c2024-05-28 02:22:34 +09001639func (ctx *moduleContextImpl) optimizeForSize() bool {
1640 return ctx.mod.OptimizeForSize()
1641}
1642
Jooyung Hanccce2f22020-03-07 03:45:53 +09001643func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001644 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001645}
1646
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001647func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001648 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001649}
1650
1651func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001652 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001653 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001654 }
1655 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001656}
1657
Jiyong Parkb35a8192020-08-10 15:59:36 +09001658func (ctx *moduleContextImpl) minSdkVersion() string {
1659 ver := ctx.mod.MinSdkVersion()
1660 if ver == "apex_inherit" && !ctx.isForPlatform() {
1661 ver = ctx.apexSdkVersion().String()
1662 }
1663 if ver == "apex_inherit" || ver == "" {
1664 ver = ctx.sdkVersion()
1665 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001666
1667 if ctx.ctx.Device() {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001668 // When building for vendor/product, use the latest _stable_ API as "current".
1669 // This is passed to clang/aidl compilers so that compiled/generated code works
1670 // with the system.
1671 if (ctx.inVendor() || ctx.inProduct()) && (ver == "" || ver == "current") {
1672 ver = ctx.ctx.Config().PlatformSdkVersion().String()
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001673 }
1674 }
1675
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001676 // For crt objects, the meaning of min_sdk_version is very different from other types of
1677 // module. For them, min_sdk_version defines the oldest version that the build system will
1678 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1679 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1680 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001681 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1682 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1683 // support such an old version. The version is set to the later version in case when the
1684 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1685 // it's for an APEX.
1686 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1687 if ctx.isForPlatform() {
1688 ver = strconv.Itoa(android.FutureApiLevelInt)
1689 } else { // for apex
1690 ver = ctx.apexSdkVersion().String()
1691 if ver == "" { // in case when min_sdk_version was not set by the APEX
1692 ver = ctx.sdkVersion()
1693 }
1694 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001695 }
1696
Jiyong Parkb35a8192020-08-10 15:59:36 +09001697 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1698 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1699 minSdkVersionInt, err2 := strconv.Atoi(ver)
1700 if err == nil && err2 == nil {
1701 if sdkVersionInt < minSdkVersionInt {
1702 return strconv.Itoa(sdkVersionInt)
1703 }
1704 }
1705 return ver
1706}
1707
1708func (ctx *moduleContextImpl) isSdkVariant() bool {
1709 return ctx.mod.IsSdkVariant()
1710}
1711
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001712func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001713 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001714}
Justin Yun8effde42017-06-23 19:24:43 +09001715
Kiyoung Kimaa394802024-01-08 12:55:45 +09001716func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1717 return ctx.mod.InVendorOrProduct()
1718}
1719
Colin Cross95f1ca02020-10-29 20:47:22 -07001720func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1721 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001722}
1723
Colin Cross127bb8b2020-12-16 16:46:01 -08001724func (ctx *moduleContextImpl) IsLlndk() bool {
1725 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001726}
1727
Colin Cross127bb8b2020-12-16 16:46:01 -08001728func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1729 return ctx.mod.isImplementationForLLNDKPublic()
1730}
1731
Colin Cross3513fb12024-01-24 14:44:47 -08001732func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1733 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001734}
1735
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001736func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1737 return ctx.mod.isOrderfileCompile()
1738}
1739
Yi Kongc702ebd2022-08-19 16:02:45 +08001740func (ctx *moduleContextImpl) isCfi() bool {
1741 return ctx.mod.isCfi()
1742}
1743
Yi Konged79fa32023-06-04 17:15:42 +09001744func (ctx *moduleContextImpl) isFuzzer() bool {
1745 return ctx.mod.isFuzzer()
1746}
1747
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001748func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1749 return ctx.mod.isNDKStubLibrary()
1750}
1751
Colin Cross5271fea2021-04-27 13:06:04 -07001752func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1753 return ctx.mod.IsVendorPublicLibrary()
1754}
1755
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001756func (ctx *moduleContextImpl) selectedStl() string {
1757 if stl := ctx.mod.stl; stl != nil {
1758 return stl.Properties.SelectedStl
1759 }
1760 return ""
1761}
1762
Ivan Lozanobd721262018-11-27 14:33:03 -08001763func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1764 return ctx.mod.linker.useClangLld(actx)
1765}
1766
Colin Crossce75d2c2016-10-06 16:12:58 -07001767func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001768 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001769}
1770
Logan Chiene274fc92019-12-03 11:18:32 -08001771func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Crossff694a82023-12-13 15:54:49 -08001772 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1773 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001774}
1775
Colin Crosse07f2312020-08-13 11:24:56 -07001776func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001777 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1778 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001779}
1780
Dan Albertc8060532020-07-22 22:32:17 -07001781func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001782 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001783}
1784
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001785func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001786 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001787}
1788
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001789func (ctx *moduleContextImpl) nativeCoverage() bool {
1790 return ctx.mod.nativeCoverage()
1791}
1792
Colin Cross95b07f22020-12-16 11:06:50 -08001793func (ctx *moduleContextImpl) isPreventInstall() bool {
1794 return ctx.mod.Properties.PreventInstall
1795}
1796
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001797func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1798 shared := &ctx.mod.sharedFlags
1799 if shared.flagsMap == nil {
1800 shared.numSharedFlags = 0
1801 shared.flagsMap = make(map[string]string)
1802 }
1803 return shared
1804}
1805
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001806func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1807 return ctx.mod.isCfiAssemblySupportEnabled()
1808}
1809
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001810func (ctx *moduleContextImpl) notInPlatform() bool {
1811 return ctx.mod.NotInPlatform()
1812}
1813
Yu Liu76d94462024-10-31 23:32:36 +00001814func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1815 if ctx.mod.makeVarsInfo == nil {
1816 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1817 }
1818 return ctx.mod.makeVarsInfo
1819}
1820
Colin Cross635c3b02016-05-18 15:37:25 -07001821func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001822 return &Module{
1823 hod: hod,
1824 multilib: multilib,
1825 }
1826}
1827
Colin Cross635c3b02016-05-18 15:37:25 -07001828func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001829 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001830 module.features = []feature{
1831 &tidyFeature{},
1832 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001833 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001834 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001835 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001836 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001837 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001838 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001839 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001840 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001841 return module
1842}
1843
Colin Crossce75d2c2016-10-06 16:12:58 -07001844func (c *Module) Prebuilt() *android.Prebuilt {
1845 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1846 return p.prebuilt()
1847 }
1848 return nil
1849}
1850
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001851func (c *Module) IsPrebuilt() bool {
1852 return c.Prebuilt() != nil
1853}
1854
Colin Crossce75d2c2016-10-06 16:12:58 -07001855func (c *Module) Name() string {
1856 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001857 if p, ok := c.linker.(interface {
1858 Name(string) string
1859 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001860 name = p.Name(name)
1861 }
1862 return name
1863}
1864
Alex Light3d673592019-01-18 14:37:31 -08001865func (c *Module) Symlinks() []string {
1866 if p, ok := c.installer.(interface {
1867 symlinkList() []string
1868 }); ok {
1869 return p.symlinkList()
1870 }
1871 return nil
1872}
1873
Chris Parsons216e10a2020-07-09 17:12:52 -04001874func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001875 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001876 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001877 }); ok {
1878 return p.dataPaths()
1879 }
1880 return nil
1881}
1882
Ivan Lozanof1868af2022-04-12 13:08:36 -04001883func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001884 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1885 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001886 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001887 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001888 if c.ProductSpecific() {
1889 // If the module is product specific with 'product_specific: true',
1890 // do not add a name suffix because it is a base module.
1891 return ""
1892 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001893 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001894 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001895 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001896 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001897 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001898 // add version suffix only if the module is using different vndk version than the
1899 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001900 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001901 }
1902 return nameSuffix
1903}
1904
Ivan Lozanof1868af2022-04-12 13:08:36 -04001905func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1906 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001907
1908 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001909 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001910 }
1911
Colin Cross127bb8b2020-12-16 16:46:01 -08001912 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001913 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001914 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1915 // added for product variant only when we have vendor and product variants with core
1916 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001917 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001918 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001919 subName += vendorPublicLibrarySuffix
1920 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001921 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1922 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001923 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001924 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001925 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001926 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001927 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001928 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001929 subName += RecoverySuffix
1930 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1931 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001932 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001933 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001934 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001935 } else if c.IsStubs() && c.IsSdkVariant() {
1936 // Public API surface (NDK)
1937 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1938 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001939 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001940
1941 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001942}
1943
Sam Delmerico75dbca22023-04-20 13:13:25 +00001944func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1945 ctx := &moduleContext{
1946 ModuleContext: actx,
1947 moduleContextImpl: moduleContextImpl{
1948 mod: c,
1949 },
1950 }
1951 ctx.ctx = ctx
1952 return ctx
1953}
1954
Spandan Das20fce2d2023-04-12 17:21:39 +00001955// TODO (b/277651159): Remove this allowlist
1956var (
1957 skipStubLibraryMultipleApexViolation = map[string]bool{
1958 "libclang_rt.asan": true,
1959 "libclang_rt.hwasan": true,
1960 // runtime apex
1961 "libc": true,
1962 "libc_hwasan": true,
1963 "libdl_android": true,
1964 "libm": true,
1965 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00001966 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00001967 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01001968 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00001969 "libandroidio": true,
1970 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01001971 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00001972 "libnativebridge": true,
1973 "libnativehelper": true,
1974 "libnativeloader": true,
1975 "libsigchain": true,
1976 }
1977)
1978
1979// Returns true if a stub library could be installed in multiple apexes
1980func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
1981 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08001982 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00001983 return false
1984 }
1985 // If this is not a stub library, no check necessary
1986 if !c.HasStubsVariants() {
1987 return false
1988 }
1989 // Skip the allowlist
1990 // Use BaseModuleName so that this matches prebuilts.
1991 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
1992 return false
1993 }
1994
Spandan Das20fce2d2023-04-12 17:21:39 +00001995 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08001996 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
1997 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00001998 return true
1999 }
2000 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08002001 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00002002 return true
2003 }
2004 // Default: no violation
2005 return false
2006}
2007
Chris Parsons8d6e4332021-02-22 16:13:50 -05002008func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002009 ctx := moduleContextFromAndroidModuleContext(actx, c)
2010
Inseob Kim37e0bb02024-04-29 15:54:44 +09002011 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2012 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2013 Logtags: c.logtagsPaths,
2014 })
2015
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002016 // If Test_only is set on a module in bp file, respect the setting, otherwise
2017 // see if is a known test module type.
2018 testOnly := c.testModule || c.testLibrary()
2019 if c.sourceProperties.Test_only != nil {
2020 testOnly = Bool(c.sourceProperties.Test_only)
2021 }
2022 // Keep before any early returns.
2023 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2024 TestOnly: testOnly,
2025 TopLevelTarget: c.testModule,
2026 })
2027
Ivan Lozanof1868af2022-04-12 13:08:36 -04002028 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002029 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002030 if !apexInfo.IsForPlatform() {
2031 c.hideApexVariantFromMake = true
2032 }
2033
Chris Parsonseefc9e62021-04-02 17:36:47 -04002034 c.makeLinkType = GetMakeLinkType(actx, c)
2035
Colin Crossf18e1102017-11-16 14:33:08 -08002036 deps := c.depsToPaths(ctx)
2037 if ctx.Failed() {
2038 return
2039 }
2040
Joe Onorato37f900c2023-07-18 16:58:16 -07002041 for _, generator := range c.generators {
2042 gen := generator.GeneratorSources(ctx)
2043 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2044 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2045 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2046 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2047 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2048 if len(deps.Objs.objFiles) == 0 {
2049 // If we are reusuing object files (which happens when we're a shared library and we're
2050 // reusing our static variant's object files), then skip adding the actual source files,
2051 // because we already have the object for it.
2052 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2053 }
2054 }
2055
2056 if ctx.Failed() {
2057 return
2058 }
2059
Spandan Das20fce2d2023-04-12 17:21:39 +00002060 if c.stubLibraryMultipleApexViolation(actx) {
2061 actx.PropertyErrorf("apex_available",
2062 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2063 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002064 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2065 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002066 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2067 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002068 }
2069
Colin Crossca860ac2016-01-04 14:34:37 -08002070 flags := Flags{
2071 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002072 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002073 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002074 for _, generator := range c.generators {
2075 flags = generator.GeneratorFlags(ctx, flags, deps)
2076 }
Colin Crossca860ac2016-01-04 14:34:37 -08002077 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002078 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002079 }
2080 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002081 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002082 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002083 if c.stl != nil {
2084 flags = c.stl.flags(ctx, flags)
2085 }
Colin Cross16b23492016-01-06 14:41:07 -08002086 if c.sanitize != nil {
2087 flags = c.sanitize.flags(ctx, flags)
2088 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002089 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002090 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002091 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002092 if c.fuzzer != nil {
2093 flags = c.fuzzer.flags(ctx, flags)
2094 }
Stephen Craneba090d12017-05-09 15:44:35 -07002095 if c.lto != nil {
2096 flags = c.lto.flags(ctx, flags)
2097 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002098 if c.afdo != nil {
2099 flags = c.afdo.flags(ctx, flags)
2100 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002101 if c.orderfile != nil {
2102 flags = c.orderfile.flags(ctx, flags)
2103 }
Colin Crossca860ac2016-01-04 14:34:37 -08002104 for _, feature := range c.features {
2105 flags = feature.flags(ctx, flags)
2106 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002107 if ctx.Failed() {
2108 return
2109 }
2110
Colin Cross4af21ed2019-11-04 09:37:55 -08002111 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2112 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2113 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002114
Colin Cross4af21ed2019-11-04 09:37:55 -08002115 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002116
2117 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002118 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002119 }
2120 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002121 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002122 }
2123
Colin Cross3e5e7782022-06-17 22:17:05 +00002124 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2125
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002126 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002127 // We need access to all the flags seen by a source file.
2128 if c.sabi != nil {
2129 flags = c.sabi.flags(ctx, flags)
2130 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002131
Colin Cross4af21ed2019-11-04 09:37:55 -08002132 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002133
Joe Onorato37f900c2023-07-18 16:58:16 -07002134 for _, generator := range c.generators {
2135 generator.GeneratorBuildActions(ctx, flags, deps)
2136 }
2137
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002138 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002139 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002140 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002141 if ctx.Failed() {
2142 return
2143 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002144 }
2145
Colin Crossca860ac2016-01-04 14:34:37 -08002146 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002147 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002148 if ctx.Failed() {
2149 return
2150 }
Colin Cross635c3b02016-05-18 15:37:25 -07002151 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002152
Chris Parsons94a0bba2021-06-04 15:03:47 -04002153 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002154
2155 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2156 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2157 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002158 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002159
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002160 if Bool(c.Properties.Cmake_snapshot_supported) {
2161 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2162 }
2163
Chris Parsons94a0bba2021-06-04 15:03:47 -04002164 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002165
2166 if c.linker != nil {
2167 moduleInfoJSON := ctx.ModuleInfoJSON()
2168 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2169 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2170 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2171 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2172 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2173
2174 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2175 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2176 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2177 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2178
2179 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2180 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2181 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2182 moduleInfoJSON.SubName += ".cfi"
2183 }
2184 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2185 moduleInfoJSON.SubName += ".hwasan"
2186 }
2187 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2188 moduleInfoJSON.SubName += ".scs"
2189 }
2190 }
2191 moduleInfoJSON.SubName += c.Properties.SubName
2192
2193 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2194 moduleInfoJSON.Uninstallable = true
2195 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002196 }
Wei Lia1aa2972024-06-21 13:08:51 -07002197
2198 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002199
Cole Faust96a692b2024-08-08 14:47:51 -07002200 if b, ok := c.compiler.(*baseCompiler); ok {
2201 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2202 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2203 c.hasProto = b.hasSrcExt(ctx, ".proto")
2204 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2205 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2206 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2207 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2208 }
2209
Yu Liuec7043d2024-11-05 18:22:20 +00002210 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002211 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002212 }
2213 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002214 ccObjectInfo.ObjFiles = objs.objFiles
2215 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002216 }
Yu Liu4f825132024-12-18 00:35:39 +00002217 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002218 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2219 }
2220
Yu Liu8024b922024-12-20 23:31:32 +00002221 linkableInfo := CreateCommonLinkableInfo(c)
2222 if lib, ok := c.linker.(versionedInterface); ok {
2223 linkableInfo.StubsVersion = lib.stubsVersion()
2224 }
2225 if c.linker != nil {
2226 if library, ok := c.linker.(libraryInterface); ok {
2227 linkableInfo.Static = library.static()
Yu Liu8a8d5b42025-01-07 00:48:08 +00002228 linkableInfo.Shared = library.shared()
Yu Liu8024b922024-12-20 23:31:32 +00002229 linkableInfo.CoverageFiles = library.objs().coverageFiles
2230 linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles
2231 }
2232 }
2233 android.SetProvider(ctx, LinkableInfoProvider, linkableInfo)
Yu Liu986d98c2024-11-12 00:28:11 +00002234
Yu Liu323d77a2024-12-16 23:13:57 +00002235 ccInfo := CcInfo{
Yu Liu323d77a2024-12-16 23:13:57 +00002236 IsPrebuilt: c.IsPrebuilt(),
2237 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
2238 }
2239 if c.compiler != nil {
2240 ccInfo.CompilerInfo = &CompilerInfo{
2241 Srcs: c.compiler.(CompiledInterface).Srcs(),
2242 Cflags: c.compiler.baseCompilerProps().Cflags,
2243 AidlInterfaceInfo: AidlInterfaceInfo{
2244 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2245 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2246 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2247 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2248 },
2249 }
2250 switch decorator := c.compiler.(type) {
2251 case *libraryDecorator:
2252 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002253 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs,
Yu Liu323d77a2024-12-16 23:13:57 +00002254 }
2255 }
2256 }
2257 if c.linker != nil {
2258 ccInfo.LinkerInfo = &LinkerInfo{
Yu Liu8024b922024-12-20 23:31:32 +00002259 WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs,
2260 StaticLibs: c.linker.baseLinkerProps().Static_libs,
2261 SharedLibs: c.linker.baseLinkerProps().Shared_libs,
2262 HeaderLibs: c.linker.baseLinkerProps().Header_libs,
Yu Liu323d77a2024-12-16 23:13:57 +00002263 }
2264 switch decorator := c.linker.(type) {
2265 case *binaryDecorator:
2266 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2267 case *libraryDecorator:
Yu Liu116610a2025-01-06 21:54:48 +00002268 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
2269 InjectBsslHash: Bool(c.linker.(*libraryDecorator).Properties.Inject_bssl_hash),
2270 }
Yu Liu323d77a2024-12-16 23:13:57 +00002271 case *testBinary:
2272 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2273 Gtest: decorator.testDecorator.gtest(),
2274 }
2275 case *benchmarkDecorator:
2276 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2277 case *objectLinker:
2278 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{}
Yu Liu8a8d5b42025-01-07 00:48:08 +00002279 case *stubDecorator:
2280 ccInfo.LinkerInfo.StubDecoratorInfo = &StubDecoratorInfo{}
Yu Liu323d77a2024-12-16 23:13:57 +00002281 }
Yu Liu8024b922024-12-20 23:31:32 +00002282
2283 if s, ok := c.linker.(SnapshotInterface); ok {
2284 ccInfo.SnapshotInfo = &SnapshotInfo{
2285 SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(),
2286 }
Yu Liuffe86322024-12-18 18:53:12 +00002287 }
2288 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002289 if c.library != nil {
2290 ccInfo.LibraryInfo = &LibraryInfo{
2291 BuildStubs: c.library.buildStubs(),
2292 }
2293 }
Yu Liu8024b922024-12-20 23:31:32 +00002294 android.SetProvider(ctx, CcInfoProvider, &ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002295
mrziwangabdb2932024-06-18 12:43:41 -07002296 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002297
2298 if c.makeVarsInfo != nil {
2299 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2300 }
mrziwangabdb2932024-06-18 12:43:41 -07002301}
2302
Yu Liu8024b922024-12-20 23:31:32 +00002303func CreateCommonLinkableInfo(mod LinkableInterface) *LinkableInfo {
2304 return &LinkableInfo{
2305 StaticExecutable: mod.StaticExecutable(),
2306 HasStubsVariants: mod.HasStubsVariants(),
2307 OutputFile: mod.OutputFile(),
2308 UnstrippedOutputFile: mod.UnstrippedOutputFile(),
2309 IsStubs: mod.IsStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002310 CcLibrary: mod.CcLibrary(),
Yu Liu8024b922024-12-20 23:31:32 +00002311 CcLibraryInterface: mod.CcLibraryInterface(),
2312 RustLibraryInterface: mod.RustLibraryInterface(),
2313 BaseModuleName: mod.BaseModuleName(),
2314 IsLlndk: mod.IsLlndk(),
2315 HasNonSystemVariants: mod.HasNonSystemVariants(),
2316 SubName: mod.SubName(),
2317 InVendorOrProduct: mod.InVendorOrProduct(),
2318 InRamdisk: mod.InRamdisk(),
2319 OnlyInRamdisk: mod.OnlyInRamdisk(),
2320 InVendorRamdisk: mod.InVendorRamdisk(),
2321 OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(),
2322 InRecovery: mod.InRecovery(),
2323 OnlyInRecovery: mod.OnlyInRecovery(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002324 Installable: mod.Installable(),
Yu Liu8024b922024-12-20 23:31:32 +00002325 }
2326}
2327
Yu Liuec7043d2024-11-05 18:22:20 +00002328func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2329 if len(files) > 0 {
2330 ctx.SetOutputFiles(files, tag)
2331 }
2332}
2333
mrziwangabdb2932024-06-18 12:43:41 -07002334func (c *Module) setOutputFiles(ctx ModuleContext) {
2335 if c.outputFile.Valid() {
2336 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2337 } else {
2338 ctx.SetOutputFiles(android.Paths{}, "")
2339 }
2340 if c.linker != nil {
2341 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2342 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2343 }
Wei Lia1aa2972024-06-21 13:08:51 -07002344}
2345
2346func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2347 // Dump metadata that can not be done in android/compliance-metadata.go
2348 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
2349 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static()))
2350 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2351
2352 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002353 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002354 staticDepNames := make([]string, 0, len(staticDeps))
2355 for _, dep := range staticDeps {
2356 staticDepNames = append(staticDepNames, dep.Name())
2357 }
2358
2359 staticDepPaths := make([]string, 0, len(deps.StaticLibs))
2360 for _, dep := range deps.StaticLibs {
2361 staticDepPaths = append(staticDepPaths, dep.String())
2362 }
2363 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2364 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2365
2366 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002367 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002368 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2369 for _, dep := range wholeStaticDeps {
2370 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2371 }
2372
2373 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2374 for _, dep := range deps.WholeStaticLibs {
2375 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2376 }
2377 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2378 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002379}
2380
2381func (c *Module) maybeUnhideFromMake() {
2382 // If a lib is directly included in any of the APEXes or is not available to the
2383 // platform (which is often the case when the stub is provided as a prebuilt),
2384 // unhide the stubs variant having the latest version gets visible to make. In
2385 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2386 // force anything in the make world to link against the stubs library. (unless it
2387 // is explicitly referenced via .bootstrap suffix or the module is marked with
2388 // 'bootstrap: true').
2389 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002390 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002391 c.IsStubs() && !c.InVendorRamdisk() {
2392 c.Properties.HideFromMake = false // unhide
2393 // Note: this is still non-installable
2394 }
2395}
2396
Colin Cross8ff10582023-12-07 13:10:56 -08002397// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2398// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002399func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002400 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002401 // If the module has been specifically configure to not be installed then
2402 // hide from make as otherwise it will break when running inside make
2403 // as the output path to install will not be specified. Not all uninstallable
2404 // modules can be hidden from make as some are needed for resolving make side
2405 // dependencies.
2406 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002407 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002408 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002409 c.SkipInstall()
2410 }
2411
2412 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2413 // to allow using the outputs in a genrule.
2414 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002415 c.installer.install(ctx, c.outputFile.Path())
2416 if ctx.Failed() {
2417 return
Colin Crossca860ac2016-01-04 14:34:37 -08002418 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002419 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002420}
2421
Colin Cross0ea8ba82019-06-06 14:33:29 -07002422func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002423 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002424 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002425 }
Colin Crossca860ac2016-01-04 14:34:37 -08002426 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002427}
2428
Colin Crossca860ac2016-01-04 14:34:37 -08002429func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002430 for _, generator := range c.generators {
2431 generator.GeneratorInit(ctx)
2432 }
Colin Crossca860ac2016-01-04 14:34:37 -08002433 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002434 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002435 }
Colin Crossca860ac2016-01-04 14:34:37 -08002436 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002437 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002438 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002439 if c.stl != nil {
2440 c.stl.begin(ctx)
2441 }
Colin Cross16b23492016-01-06 14:41:07 -08002442 if c.sanitize != nil {
2443 c.sanitize.begin(ctx)
2444 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002445 if c.coverage != nil {
2446 c.coverage.begin(ctx)
2447 }
Yi Kong9723e332023-12-04 14:52:53 +09002448 if c.afdo != nil {
2449 c.afdo.begin(ctx)
2450 }
Stephen Craneba090d12017-05-09 15:44:35 -07002451 if c.lto != nil {
2452 c.lto.begin(ctx)
2453 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002454 if c.orderfile != nil {
2455 c.orderfile.begin(ctx)
2456 }
Dan Albert92fe7402020-07-15 13:33:30 -07002457 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002458 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002459 if err != nil {
2460 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002461 c.Properties.Sdk_version = nil
2462 } else {
2463 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002464 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002465 }
Colin Crossca860ac2016-01-04 14:34:37 -08002466}
2467
Colin Cross37047f12016-12-13 17:06:13 -08002468func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002469 deps := Deps{}
2470
Joe Onorato37f900c2023-07-18 16:58:16 -07002471 for _, generator := range c.generators {
2472 deps = generator.GeneratorDeps(ctx, deps)
2473 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002474 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002475 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002476 }
2477 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002478 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002479 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002480 if c.stl != nil {
2481 deps = c.stl.deps(ctx, deps)
2482 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002483 if c.coverage != nil {
2484 deps = c.coverage.deps(ctx, deps)
2485 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002486
Colin Crossb6715442017-10-24 11:13:31 -07002487 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2488 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2489 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2490 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2491 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2492 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002493 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002494 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002495
Colin Cross516c5452024-10-28 13:45:21 -07002496 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2497 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2498 }
2499
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002500 for _, lib := range deps.ReexportSharedLibHeaders {
2501 if !inList(lib, deps.SharedLibs) {
2502 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2503 }
2504 }
2505
2506 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002507 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2508 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 -07002509 }
2510 }
2511
Colin Cross5950f382016-12-13 12:50:57 -08002512 for _, lib := range deps.ReexportHeaderLibHeaders {
2513 if !inList(lib, deps.HeaderLibs) {
2514 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2515 }
2516 }
2517
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002518 for _, gen := range deps.ReexportGeneratedHeaders {
2519 if !inList(gen, deps.GeneratedHeaders) {
2520 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2521 }
2522 }
2523
Colin Crossc99deeb2016-04-11 15:06:20 -07002524 return deps
2525}
2526
Colin Cross516c5452024-10-28 13:45:21 -07002527func checkConflictingExplicitVersions(libs []string) error {
2528 withoutVersion := func(s string) string {
2529 name, _ := StubsLibNameAndVersion(s)
2530 return name
2531 }
2532 var errs []error
2533 for i, lib := range libs {
2534 libName := withoutVersion(lib)
2535 libsToCompare := libs[i+1:]
2536 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2537 return withoutVersion(s) == libName
2538 })
2539 if j >= 0 {
2540 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2541 lib, libsToCompare[j]))
2542 }
2543 }
2544 return errors.Join(errs...)
2545}
2546
Dan Albert7e9d2952016-08-04 13:02:36 -07002547func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002548 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002549 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002550 moduleContextImpl: moduleContextImpl{
2551 mod: c,
2552 },
2553 }
2554 ctx.ctx = ctx
2555
Colin Crossca860ac2016-01-04 14:34:37 -08002556 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002557}
2558
Jiyong Park7ed9de32018-10-15 22:25:07 +09002559// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002560func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002561 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2562 version := name[sharp+1:]
2563 libname := name[:sharp]
2564 return libname, version
2565 }
2566 return name, ""
2567}
2568
Dan Albert92fe7402020-07-15 13:33:30 -07002569func GetCrtVariations(ctx android.BottomUpMutatorContext,
2570 m LinkableInterface) []blueprint.Variation {
2571 if ctx.Os() != android.Android {
2572 return nil
2573 }
2574 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002575 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2576 minSdkVersion := m.MinSdkVersion()
2577 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2578 minSdkVersion = m.SdkVersion()
2579 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002580 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2581 if err != nil {
2582 ctx.PropertyErrorf("min_sdk_version", err.Error())
2583 }
Colin Cross363ec762023-01-13 13:45:14 -08002584
2585 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002586 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002587 if apiLevel.LessThan(minApiForArch) {
2588 apiLevel = minApiForArch
2589 }
2590
Dan Albert92fe7402020-07-15 13:33:30 -07002591 return []blueprint.Variation{
2592 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002593 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002594 }
2595 }
2596 return []blueprint.Variation{
2597 {Mutator: "sdk", Variation: ""},
2598 }
2599}
2600
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002601func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2602 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002603
2604 variations = append([]blueprint.Variation(nil), variations...)
2605
Liz Kammer23942242022-04-08 15:41:00 -04002606 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002607 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002608 if version == "impl" {
2609 version = ""
2610 }
Colin Crosse7257d22020-09-24 09:56:18 -07002611 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002612 if tag, ok := depTag.(libraryDependencyTag); ok {
2613 tag.explicitlyVersioned = true
Colin Crossafcdce82024-10-22 13:59:33 -07002614 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2615 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2616 // the modified copy to depTag.
2617 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002618 } else {
2619 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2620 }
Colin Crosse7257d22020-09-24 09:56:18 -07002621 }
Colin Crosse7257d22020-09-24 09:56:18 -07002622
Colin Cross0de8a1e2020-09-18 14:15:30 -07002623 if far {
2624 ctx.AddFarVariationDependencies(variations, depTag, name)
2625 } else {
2626 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002627 }
2628}
2629
Kiyoung Kim487689e2022-07-26 09:48:22 +09002630func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2631 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002632 return snapshot
2633 }
2634
2635 return lib
2636}
2637
Kiyoung Kim37693d02024-04-04 09:56:15 +09002638// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002639// of names:
2640//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002641// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002642//
2643// For each of these, it adds the name of the ndk_library module to the list of
2644// variant libs.
2645//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002646// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002647//
2648// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002649//
2650// The caller can then know to add the variantLibs dependencies differently from the
2651// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002652func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002653 variantLibs = []string{}
2654
2655 nonvariantLibs = []string{}
2656 for _, entry := range list {
2657 // strip #version suffix out
2658 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002659 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002660 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002661 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002662 nonvariantLibs = append(nonvariantLibs, entry)
2663 }
2664 }
2665 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002666
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002667}
2668
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002669func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2670 nonVariantLibs := []string{}
2671 variantLibs := []string{}
2672
2673 for _, lib := range libs {
2674 replaceLibName := GetReplaceModuleName(lib, replaceList)
2675 if replaceLibName == lib {
2676 // Do not handle any libs which are not in API imports
2677 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2678 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2679 variantLibs = append(variantLibs, replaceLibName)
2680 } else {
2681 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2682 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002683 }
2684
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002685 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002686}
2687
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002688func (c *Module) shouldUseApiSurface() bool {
2689 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2690 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2691 // LLNDK Variant
2692 return true
2693 }
2694
2695 if c.Properties.IsSdkVariant {
2696 // NDK Variant
2697 return true
2698 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002699 }
2700
2701 return false
2702}
2703
Colin Cross1e676be2016-10-12 14:38:15 -07002704func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002705 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002706 return
2707 }
2708
Colin Cross37047f12016-12-13 17:06:13 -08002709 ctx := &depsContext{
2710 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002711 moduleContextImpl: moduleContextImpl{
2712 mod: c,
2713 },
2714 }
2715 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002716
Colin Crossc99deeb2016-04-11 15:06:20 -07002717 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002718
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002719 apiNdkLibs := []string{}
2720 apiLateNdkLibs := []string{}
2721
Yo Chiang219968c2020-09-22 18:45:04 +08002722 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2723
Dan Albert914449f2016-06-17 16:45:24 -07002724 variantNdkLibs := []string{}
2725 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002726 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002727 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2728 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2729 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002730 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002731
Colin Cross32ec36c2016-12-15 07:39:51 -08002732 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002733 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002734 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002735 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002736 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002737
Spandan Das73bcafc2022-08-18 23:26:00 +00002738 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002739 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2740 if variationExists {
2741 actx.AddVariationDependencies(nil, depTag, lib)
2742 } else {
2743 // dependencies to ndk_headers fall here as ndk_headers do not have
2744 // any variants.
2745 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2746 }
Spandan Dasff665182024-09-11 18:48:44 +00002747 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002748 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002749 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002750 } else {
2751 actx.AddVariationDependencies(nil, depTag, lib)
2752 }
2753 }
2754
Dan Albertf1d14c72020-07-30 14:32:55 -07002755 if c.isNDKStubLibrary() {
2756 // NDK stubs depend on their implementation because the ABI dumps are
2757 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002758
Spandan Das8b08aea2023-03-14 19:29:34 +00002759 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2760 c.ImageVariation(),
2761 blueprint.Variation{Mutator: "link", Variation: "shared"},
2762 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002763 }
2764
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002765 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2766 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2767 c.Target().NativeBridge == android.NativeBridgeDisabled {
2768 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002769 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002770 llndkHeaderLibTag,
2771 deps.LlndkHeaderLibs...)
2772 }
2773
Jiyong Park5d1598f2019-02-25 22:14:17 +09002774 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002775 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002776
Jiyong Park5d1598f2019-02-25 22:14:17 +09002777 actx.AddVariationDependencies([]blueprint.Variation{
2778 {Mutator: "link", Variation: "static"},
2779 }, depTag, lib)
2780 }
2781
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002782 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002783 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002784 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002785
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002786 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002787 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002788 }
Jiyong Parke3867542020-12-03 17:28:25 +09002789 if inList(lib, deps.ExcludeLibsForApex) {
2790 depTag.excludeInApex = true
2791 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002792 actx.AddVariationDependencies([]blueprint.Variation{
2793 {Mutator: "link", Variation: "static"},
2794 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002795 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002796
Jooyung Han75568392020-03-20 04:29:24 +09002797 // staticUnwinderDep is treated as staticDep for Q apexes
2798 // so that native libraries/binaries are linked with static unwinder
2799 // because Q libc doesn't have unwinder APIs
2800 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002801 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002802 actx.AddVariationDependencies([]blueprint.Variation{
2803 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002804 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002805 }
2806
Jiyong Park7ed9de32018-10-15 22:25:07 +09002807 // shared lib names without the #version suffix
2808 var sharedLibNames []string
2809
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002810 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002811 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002812 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002813 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002814 }
Jiyong Parke3867542020-12-03 17:28:25 +09002815 if inList(lib, deps.ExcludeLibsForApex) {
2816 depTag.excludeInApex = true
2817 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002818 if inList(lib, deps.ExcludeLibsForNonApex) {
2819 depTag.excludeInNonApex = true
2820 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002821
Jiyong Park73c54ee2019-10-22 20:31:18 +09002822 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002823 sharedLibNames = append(sharedLibNames, name)
2824
Colin Crosse7257d22020-09-24 09:56:18 -07002825 variations := []blueprint.Variation{
2826 {Mutator: "link", Variation: "shared"},
2827 }
Spandan Dasff665182024-09-11 18:48:44 +00002828 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002829 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002830
Colin Crossfe9acfe2021-06-14 16:13:03 -07002831 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002832 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002833 actx.AddVariationDependencies([]blueprint.Variation{
2834 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002835 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002836 }
2837
Colin Cross3e5e7782022-06-17 22:17:05 +00002838 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002839 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002840 actx.AddVariationDependencies([]blueprint.Variation{
2841 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002842 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002843 }
2844
Jiyong Park7ed9de32018-10-15 22:25:07 +09002845 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002846 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002847 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2848 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2849 // linking against both the stubs lib and the non-stubs lib at the same time.
2850 continue
2851 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002852 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002853 variations := []blueprint.Variation{
2854 {Mutator: "link", Variation: "shared"},
2855 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002856 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002857 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002858
Dan Willemsen59339a22018-07-22 21:18:45 -07002859 actx.AddVariationDependencies([]blueprint.Variation{
2860 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002861 }, dataLibDepTag, deps.DataLibs...)
2862
Colin Crossc8caa062021-09-24 16:50:14 -07002863 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2864
Chris Parsons79d66a52020-06-05 17:26:16 -04002865 actx.AddVariationDependencies([]blueprint.Variation{
2866 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002867 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002868
Colin Cross68861832016-07-08 10:41:41 -07002869 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002870
2871 for _, gen := range deps.GeneratedHeaders {
2872 depTag := genHeaderDepTag
2873 if inList(gen, deps.ReexportGeneratedHeaders) {
2874 depTag = genHeaderExportDepTag
2875 }
2876 actx.AddDependency(c, depTag, gen)
2877 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002878
Cole Faust65cb40a2024-10-21 15:41:42 -07002879 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2880 depTag := genHeaderDepTag
2881 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2882 }
2883
Dan Albert92fe7402020-07-15 13:33:30 -07002884 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002885 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002886 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002887 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002888 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002889 }
Colin Crossc465efd2021-06-11 18:00:04 -07002890 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002891 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002892 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002893 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002894 if deps.DynamicLinker != "" {
2895 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002896 }
Dan Albert914449f2016-06-17 16:45:24 -07002897
2898 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002899
Colin Cross8acea3e2024-12-12 14:53:30 -08002900 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002901 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002902 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002903 {Mutator: "link", Variation: "shared"},
2904 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002905 actx.AddVariationDependencies([]blueprint.Variation{
2906 {Mutator: "version", Variation: version},
2907 {Mutator: "link", Variation: "shared"},
2908 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002909
Colin Cross8acea3e2024-12-12 14:53:30 -08002910 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002911 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002912 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002913 {Mutator: "link", Variation: "shared"},
2914 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002915 actx.AddVariationDependencies([]blueprint.Variation{
2916 {Mutator: "version", Variation: version},
2917 {Mutator: "link", Variation: "shared"},
2918 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002919
Vinh Tran367d89d2023-04-28 11:21:25 -04002920 if len(deps.AidlLibs) > 0 {
2921 actx.AddDependency(
2922 c,
2923 aidlLibraryTag,
2924 deps.AidlLibs...,
2925 )
2926 }
2927
Colin Cross6362e272015-10-29 15:25:03 -07002928}
Colin Cross21b9a242015-03-24 14:15:58 -07002929
Colin Crosse40b4ea2018-10-02 22:25:58 -07002930func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002931 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002932 c.beginMutator(ctx)
2933 }
2934}
2935
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002936// Whether a module can link to another module, taking into
2937// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002938func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002939 tag blueprint.DependencyTag) {
2940
2941 switch t := tag.(type) {
2942 case dependencyTag:
2943 if t != vndkExtDepTag {
2944 return
2945 }
2946 case libraryDependencyTag:
2947 default:
2948 return
2949 }
2950
Ivan Lozanof9e21722020-12-02 09:00:51 -05002951 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002952 // Host code is not restricted
2953 return
2954 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002955
Ivan Lozano52767be2019-10-18 14:49:46 -07002956 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002957 // Platform code can link to anything
2958 return
2959 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002960 if from.InRamdisk() {
2961 // Ramdisk code is not NDK
2962 return
2963 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002964 if from.InVendorRamdisk() {
2965 // Vendor ramdisk code is not NDK
2966 return
2967 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002968 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002969 // Recovery code is not NDK
2970 return
2971 }
Colin Cross31076b32020-10-23 17:22:06 -07002972 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002973 if c.StubDecorator() {
2974 // These aren't real libraries, but are the stub shared libraries that are included in
2975 // the NDK.
2976 return
2977 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002978 }
Logan Chien834b9a62019-01-14 15:39:03 +08002979
Ivan Lozano52767be2019-10-18 14:49:46 -07002980 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002981 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2982 // to link to libc++ (non-NDK and without sdk_version).
2983 return
2984 }
2985
Ivan Lozano52767be2019-10-18 14:49:46 -07002986 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002987 // NDK code linking to platform code is never okay.
2988 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002989 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002990 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002991 }
2992
2993 // At this point we know we have two NDK libraries, but we need to
2994 // check that we're not linking against anything built against a higher
2995 // API level, as it is only valid to link against older or equivalent
2996 // APIs.
2997
Inseob Kim01a28722018-04-11 09:48:45 +09002998 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002999 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003000 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003001 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003002 // Current can't be linked against by anything else.
3003 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003004 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003005 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003006 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003007 if err != nil {
3008 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003009 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003010 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003011 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003012 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003013 if err != nil {
3014 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003015 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003016 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003017 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003018
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003019 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003020 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003021 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003022 }
3023 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003024 }
Dan Albert202fe492017-12-15 13:56:59 -08003025
3026 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003027 fromStl := from.SelectedStl()
3028 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003029 if fromStl == "" || toStl == "" {
3030 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003031 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003032 // We can be permissive with the system "STL" since it is only the C++
3033 // ABI layer, but in the future we should make sure that everyone is
3034 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003035 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003036 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003037 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3038 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003039 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003040}
3041
Jooyung Han479ca172020-10-19 18:51:07 +09003042func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3043 if c, ok := ctx.Module().(*Module); ok {
3044 ctx.VisitDirectDeps(func(dep android.Module) {
3045 depTag := ctx.OtherModuleDependencyTag(dep)
3046 ccDep, ok := dep.(LinkableInterface)
3047 if ok {
3048 checkLinkType(ctx, c, ccDep, depTag)
3049 }
3050 })
3051 }
3052}
3053
Jiyong Park5fb8c102018-04-09 12:03:06 +09003054// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003055// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3056// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003057// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003058func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003059 check := func(child, parent android.Module) bool {
3060 to, ok := child.(*Module)
3061 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003062 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003063 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003064
Jooyung Hana70f0672019-01-18 15:20:43 +09003065 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3066 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003067 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003068
Jiyong Park0474e1f2021-01-14 14:26:06 +09003069 // These dependencies are not excercised at runtime. Tracking these will give us
3070 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003071 depTag := ctx.OtherModuleDependencyTag(child)
3072 if IsHeaderDepTag(depTag) {
3073 return false
3074 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003075 if depTag == staticVariantTag {
3076 return false
3077 }
3078 if depTag == stubImplDepTag {
3079 return false
3080 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003081 if depTag == android.RequiredDepTag {
3082 return false
3083 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003084
Justin Yun63e9ec72020-10-29 16:49:43 +09003085 // Even if target lib has no vendor variant, keep checking dependency
3086 // graph in case it depends on vendor_available or product_available
3087 // but not double_loadable transtively.
3088 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003089 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003090 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003091
Jiyong Park0474e1f2021-01-14 14:26:06 +09003092 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3093 // one.
3094 if Bool(to.VendorProperties.Double_loadable) {
3095 return true
3096 }
3097
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003098 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003099 return false
3100 }
3101
Jooyung Hana70f0672019-01-18 15:20:43 +09003102 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3103 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003104 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003105 return false
3106 }
3107 if module, ok := ctx.Module().(*Module); ok {
3108 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003109 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003110 ctx.WalkDeps(check)
3111 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003112 }
3113 }
3114}
3115
Yu Liue4312402023-01-18 09:15:31 -08003116func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3117 // For the dependency from platform to apex, use the latest stubs
3118 apexSdkVersion := android.FutureApiLevel
3119 if !apexInfo.IsForPlatform() {
3120 apexSdkVersion = apexInfo.MinSdkVersion
3121 }
3122
3123 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3124 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3125 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3126 // (b/144430859)
3127 apexSdkVersion = android.FutureApiLevel
3128 }
3129
3130 return apexSdkVersion
3131}
3132
Colin Crossc99deeb2016-04-11 15:06:20 -07003133// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003134func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003135 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003136
Colin Cross0de8a1e2020-09-18 14:15:30 -07003137 var directStaticDeps []StaticLibraryInfo
3138 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003139
Colin Cross0de8a1e2020-09-18 14:15:30 -07003140 reexportExporter := func(exporter FlagExporterInfo) {
3141 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3142 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3143 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3144 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3145 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003146 }
3147
Colin Crossff694a82023-12-13 15:54:49 -08003148 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003149 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003150
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003151 skipModuleList := map[string]bool{}
3152
Yu Liu8024b922024-12-20 23:31:32 +00003153 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003154 depName := ctx.OtherModuleName(dep)
3155 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003156
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003157 if _, ok := skipModuleList[depName]; ok {
3158 // skip this module because original module or API imported module matching with this should be used instead.
3159 return
3160 }
3161
Yu Liu8024b922024-12-20 23:31:32 +00003162 var ccInfo *CcInfo
3163 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3164 if hasCcInfo {
3165 ccInfo = v
3166 }
3167 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003168 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003169 if !hasCcInfo {
3170 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3171 }
3172 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003173 return
3174 }
3175
Vinh Tran367d89d2023-04-28 11:21:25 -04003176 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003177 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003178 depPaths.AidlLibraryInfos = append(
3179 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003180 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003181 )
3182 }
3183 }
3184
Yu Liu8024b922024-12-20 23:31:32 +00003185 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003186 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003187 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003188 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003189 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003190 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003191 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003192 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003193 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003194 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003195 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003196 // Support exported headers from a generated_sources dependency
3197 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003198 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003199 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003200 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003201 genRule.GeneratedDeps...)
3202 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003203 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003204 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003205 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003206 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003207 genRule.GeneratedSourceFiles...)
3208 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003209 // 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 +09003210 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003211 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003212 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003213 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003214 }
Colin Crosscef792e2021-06-11 18:01:26 -07003215 case CrtBeginDepTag:
3216 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3217 case CrtEndDepTag:
3218 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003219 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003220 return
3221 }
3222
Colin Crossfe17f6f2019-03-28 19:30:56 -07003223 if depTag == android.ProtoPluginDepTag {
3224 return
3225 }
3226
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003227 if depTag == android.RequiredDepTag {
3228 return
3229 }
3230
Yu Liu8024b922024-12-20 23:31:32 +00003231 commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey)
3232 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003233 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 -07003234 return
3235 }
Yu Liu8024b922024-12-20 23:31:32 +00003236 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003237 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003238 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003239 return
3240 }
3241
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003242 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003243 // Skip reused objects for stub libraries, they use their own stub object file instead.
3244 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3245 // version mutator, so the stubs variant is created from the shared variant that
3246 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003247 if !c.library.buildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003248 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003249 objs := staticAnalogue.ReuseObjects
3250 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003251 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003252 reexportExporter(depExporterInfo)
3253 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003254 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003255 }
3256
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003257 if depTag == llndkHeaderLibTag {
3258 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3259 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3260 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3261 }
3262
Yu Liu8024b922024-12-20 23:31:32 +00003263 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003264
3265 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3266 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003267 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003268 return
3269 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003270
Jiyong Parke3867542020-12-03 17:28:25 +09003271 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3272 return
3273 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003274 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3275 return
3276 }
Jiyong Parke3867542020-12-03 17:28:25 +09003277
Colin Cross313aa542023-12-13 13:47:44 -08003278 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003279
Colin Cross6e511a92020-07-27 21:26:48 -07003280 var ptr *android.Paths
3281 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003282
Colin Cross6e511a92020-07-27 21:26:48 -07003283 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003284
Colin Cross6e511a92020-07-27 21:26:48 -07003285 switch {
3286 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003287 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003288 if !ctx.Config().AllowMissingDependencies() {
3289 ctx.ModuleErrorf("module %q is not a header library", depName)
3290 } else {
3291 ctx.AddMissingDependencies([]string{depName})
3292 }
3293 return
3294 }
Colin Cross6e511a92020-07-27 21:26:48 -07003295 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003296 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003297 if !ctx.Config().AllowMissingDependencies() {
3298 ctx.ModuleErrorf("module %q is not a shared library", depName)
3299 } else {
3300 ctx.AddMissingDependencies([]string{depName})
3301 }
3302 return
3303 }
Jiyong Parke3867542020-12-03 17:28:25 +09003304
Jiyong Park7d55b612021-06-11 17:22:09 +09003305 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3306 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003307
Jiyong Park1ad8e162020-12-01 23:40:09 +09003308 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3309 // linkFile, depFile, and ptr.
3310 if c.IsStubs() {
3311 break
3312 }
3313
Colin Cross0de8a1e2020-09-18 14:15:30 -07003314 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3315 depFile = sharedLibraryInfo.TableOfContents
3316
Colin Crossb614cd42024-10-11 12:52:21 -07003317 if !sharedLibraryInfo.IsStubs {
3318 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3319 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3320 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3321 }
3322 }
3323
Colin Cross6e511a92020-07-27 21:26:48 -07003324 ptr = &depPaths.SharedLibs
3325 switch libDepTag.Order {
3326 case earlyLibraryDependency:
3327 ptr = &depPaths.EarlySharedLibs
3328 depPtr = &depPaths.EarlySharedLibsDeps
3329 case normalLibraryDependency:
3330 ptr = &depPaths.SharedLibs
3331 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003332 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003333 case lateLibraryDependency:
3334 ptr = &depPaths.LateSharedLibs
3335 depPtr = &depPaths.LateSharedLibsDeps
3336 default:
3337 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003338 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003339
Colin Cross6e511a92020-07-27 21:26:48 -07003340 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003341 if linkableInfo.RustLibraryInterface {
3342 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003343 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3344 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3345 if libDepTag.wholeStatic {
3346 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3347 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003348
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003349 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3350 // exported functions from the rust generated staticlib still exported.
3351 if c.CcLibrary() && c.Shared() {
3352 c.WholeRustStaticlib = true
3353 }
Colin Cross6e511a92020-07-27 21:26:48 -07003354 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003355
Colin Cross6e511a92020-07-27 21:26:48 -07003356 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003357 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3358 if !isStaticLib {
3359 if !ctx.Config().AllowMissingDependencies() {
3360 ctx.ModuleErrorf("module %q is not a static library", depName)
3361 } else {
3362 ctx.AddMissingDependencies([]string{depName})
3363 }
3364 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003365 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003366
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003367 // Stubs lib doesn't link to the static lib dependencies. Don't set
3368 // linkFile, depFile, and ptr.
3369 if c.IsStubs() {
3370 break
3371 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003372
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003373 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3374 if libDepTag.wholeStatic {
3375 ptr = &depPaths.WholeStaticLibs
3376 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3377 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3378 } else {
3379 // This case normally catches prebuilt static
3380 // libraries, but it can also occur when
3381 // AllowMissingDependencies is on and the
3382 // dependencies has no sources of its own
3383 // but has a whole_static_libs dependency
3384 // on a missing library. We want to depend
3385 // on the .a file so that there is something
3386 // in the dependency tree that contains the
3387 // error rule for the missing transitive
3388 // dependency.
3389 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3390 }
3391 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3392 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3393 } else {
3394 switch libDepTag.Order {
3395 case earlyLibraryDependency:
3396 panic(fmt.Errorf("early static libs not supported"))
3397 case normalLibraryDependency:
3398 // static dependencies will be handled separately so they can be ordered
3399 // using transitive dependencies.
3400 ptr = nil
3401 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3402 case lateLibraryDependency:
3403 ptr = &depPaths.LateStaticLibs
3404 default:
3405 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3406 }
3407 }
3408
3409 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3410 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3411
3412 if libDepTag.unexportedSymbols {
3413 depPaths.LdFlags = append(depPaths.LdFlags,
3414 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3415 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003416 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003417 }
3418
Yu Liu8024b922024-12-20 23:31:32 +00003419 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3420 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003421 ctx.ModuleErrorf("module %q not a static library", depName)
3422 return
3423 }
Logan Chien43d34c32017-12-20 01:17:32 +08003424
Colin Cross6e511a92020-07-27 21:26:48 -07003425 // When combining coverage files for shared libraries and executables, coverage files
3426 // in static libraries act as if they were whole static libraries. The same goes for
3427 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003428 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003429 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003430 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003431 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003432 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003433 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003434 // Handle non-CC modules here
3435 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003436 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003437 }
3438 }
3439
Colin Cross6e511a92020-07-27 21:26:48 -07003440 if ptr != nil {
3441 if !linkFile.Valid() {
3442 if !ctx.Config().AllowMissingDependencies() {
3443 ctx.ModuleErrorf("module %q missing output file", depName)
3444 } else {
3445 ctx.AddMissingDependencies([]string{depName})
3446 }
3447 return
3448 }
3449 *ptr = append(*ptr, linkFile.Path())
3450 }
3451
3452 if depPtr != nil {
3453 dep := depFile
3454 if !dep.Valid() {
3455 dep = linkFile
3456 }
3457 *depPtr = append(*depPtr, dep.Path())
3458 }
3459
Colin Cross0de8a1e2020-09-18 14:15:30 -07003460 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3461 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3462 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3463 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003464 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3465
3466 // Only re-export RustRlibDeps for cc static libs
3467 if c.static() {
3468 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3469 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003470
3471 if libDepTag.reexportFlags {
3472 reexportExporter(depExporterInfo)
3473 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3474 // Re-exported shared library headers must be included as well since they can help us with type information
3475 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003476 c.sabi.Properties.ReexportedIncludes = append(
3477 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003478 c.sabi.Properties.ReexportedSystemIncludes = append(
3479 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003480 }
3481
Yu Liu8024b922024-12-20 23:31:32 +00003482 makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003483 switch {
3484 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003485 c.Properties.AndroidMkHeaderLibs = append(
3486 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003487 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003488 // Note: the order of libs in this list is not important because
3489 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003490 c.Properties.AndroidMkSharedLibs = append(
3491 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003492 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003493 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003494 if libDepTag.wholeStatic {
3495 c.Properties.AndroidMkWholeStaticLibs = append(
3496 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3497 } else {
3498 c.Properties.AndroidMkStaticLibs = append(
3499 c.Properties.AndroidMkStaticLibs, makeLibName)
3500 }
Colin Cross6e511a92020-07-27 21:26:48 -07003501 }
3502 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003503 } else if !c.IsStubs() {
3504 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3505
Colin Cross6e511a92020-07-27 21:26:48 -07003506 switch depTag {
3507 case runtimeDepTag:
3508 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liu8024b922024-12-20 23:31:32 +00003509 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003510 case objDepTag:
3511 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3512 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003513 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003514 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003515 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003516 case dynamicLinkerDepTag:
3517 depPaths.DynamicLinker = linkFile
3518 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003519 }
Colin Crossca860ac2016-01-04 14:34:37 -08003520 })
3521
Jeff Gaston294356f2017-09-27 17:05:30 -07003522 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003523 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3524 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3525 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003526
Colin Crossdd84e052017-05-17 13:44:16 -07003527 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003528 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003529 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3530 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003531 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003532 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3533
Jiyong Park74955042019-10-22 20:19:51 +09003534 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3535 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003536 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003537 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003538 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003539 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003540
3541 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003542 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003543 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003544 }
Colin Crossdd84e052017-05-17 13:44:16 -07003545
Colin Crossca860ac2016-01-04 14:34:37 -08003546 return depPaths
3547}
3548
Spandan Das10c41362024-12-03 01:33:09 +00003549func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003550 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003551 bootstrap := false
Spandan Das10c41362024-12-03 01:33:09 +00003552 if linkable, ok := parent.(LinkableInterface); !ok {
3553 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
Jiyong Park7d55b612021-06-11 17:22:09 +09003554 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003555 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003556 bootstrap = linkable.Bootstrap()
3557 }
3558
Spandan Das10c41362024-12-03 01:33:09 +00003559 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003560
3561 useStubs := false
3562
Yu Liu8024b922024-12-20 23:31:32 +00003563 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003564 if !apexInfo.IsForPlatform() {
3565 // For platform libraries, use current version of LLNDK
3566 // If this is for use_vendor apex we will apply the same rules
3567 // of apex sdk enforcement below to choose right version.
3568 useStubs = true
3569 }
3570 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3571 // If not building for APEX or the containing APEX allows the use of
3572 // platform APIs, use stubs only when it is from an APEX (and not from
3573 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3574 // bootstrap modules, always link to non-stub variant
Yu Liu8024b922024-12-20 23:31:32 +00003575 isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003576
Spandan Dasff665182024-09-11 18:48:44 +00003577 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003578 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003579 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3580 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003581 }
3582
3583 return useStubs
3584}
3585
3586// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3587// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3588// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3589// has different level of updatability. For example, if a library foo in an APEX depends on a
3590// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3591// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3592// same APEX as foo, the non-stub variant of bar is used.
3593func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3594 depTag := ctx.OtherModuleDependencyTag(dep)
3595 libDepTag, ok := depTag.(libraryDependencyTag)
3596 if !ok || !libDepTag.shared() {
3597 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3598 }
3599
Colin Cross313aa542023-12-13 13:47:44 -08003600 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3601 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3602 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003603
3604 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003605 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003606 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003607 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3608 toUse := stubs[len(stubs)-1]
3609 sharedLibraryInfo = toUse.SharedLibraryInfo
3610 depExporterInfo = toUse.FlagExporterInfo
3611 }
3612 }
3613 return sharedLibraryInfo, depExporterInfo
3614}
3615
Colin Cross0de8a1e2020-09-18 14:15:30 -07003616// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3617// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003618// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003619// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003620func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3621 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003622 var staticPaths android.Paths
3623 for _, staticDep := range staticDeps {
3624 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3625 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3626 }
3627 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003628 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003629 }
3630 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3631
3632 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3633
3634 // reorder the dependencies based on transitive dependencies
3635 staticPaths = android.FirstUniquePaths(staticPaths)
3636 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3637
3638 if len(orderedStaticPaths) != len(staticPaths) {
3639 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3640 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3641 }
3642
3643 return orderedStaticPaths, transitiveStaticLibs
3644}
3645
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003646// BaseLibName trims known prefixes and suffixes
3647func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003648 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3649 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003650 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003651 return libName
3652}
3653
Yu Liu8024b922024-12-20 23:31:32 +00003654func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003655 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003656 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3657 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003658
Yu Liu8024b922024-12-20 23:31:32 +00003659 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003660 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003661 if ccInfo.SnapshotInfo != nil {
3662 return linkableInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003663 }
3664 }
3665
Yu Liu8024b922024-12-20 23:31:32 +00003666 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003667 // The vendor and product modules in Make will have been renamed to not conflict with the
3668 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003669 return libName + linkableInfo.SubName
3670 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003671 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003672 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003673 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003674 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003675 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003676 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003677 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003678 } else {
3679 return libName
3680 }
3681}
3682
Colin Crossca860ac2016-01-04 14:34:37 -08003683func (c *Module) InstallInData() bool {
3684 if c.installer == nil {
3685 return false
3686 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003687 return c.installer.inData()
3688}
3689
3690func (c *Module) InstallInSanitizerDir() bool {
3691 if c.installer == nil {
3692 return false
3693 }
3694 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003695 return true
3696 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003697 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003698}
3699
Yifan Hong1b3348d2020-01-21 15:53:22 -08003700func (c *Module) InstallInRamdisk() bool {
3701 return c.InRamdisk()
3702}
3703
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003704func (c *Module) InstallInVendorRamdisk() bool {
3705 return c.InVendorRamdisk()
3706}
3707
Jiyong Parkf9332f12018-02-01 00:54:12 +09003708func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003709 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003710}
3711
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003712func (c *Module) MakeUninstallable() {
3713 if c.installer == nil {
3714 c.ModuleBase.MakeUninstallable()
3715 return
3716 }
3717 c.installer.makeUninstallable(c)
3718}
3719
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003720func (c *Module) HostToolPath() android.OptionalPath {
3721 if c.installer == nil {
3722 return android.OptionalPath{}
3723 }
3724 return c.installer.hostToolPath()
3725}
3726
Nan Zhangd4e641b2017-07-12 12:55:28 -07003727func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3728 return c.outputFile
3729}
3730
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003731func (c *Module) static() bool {
3732 if static, ok := c.linker.(interface {
3733 static() bool
3734 }); ok {
3735 return static.static()
3736 }
3737 return false
3738}
3739
Colin Cross6a730042024-12-05 13:53:43 -08003740func (c *Module) staticLibrary() bool {
3741 if static, ok := c.linker.(interface {
3742 staticLibrary() bool
3743 }); ok {
3744 return static.staticLibrary()
3745 }
3746 return false
3747}
3748
Jiyong Park379de2f2018-12-19 02:47:14 +09003749func (c *Module) staticBinary() bool {
3750 if static, ok := c.linker.(interface {
3751 staticBinary() bool
3752 }); ok {
3753 return static.staticBinary()
3754 }
3755 return false
3756}
3757
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003758func (c *Module) testBinary() bool {
3759 if test, ok := c.linker.(interface {
3760 testBinary() bool
3761 }); ok {
3762 return test.testBinary()
3763 }
3764 return false
3765}
3766
Jingwen Chen537242c2022-08-24 11:53:27 +00003767func (c *Module) testLibrary() bool {
3768 if test, ok := c.linker.(interface {
3769 testLibrary() bool
3770 }); ok {
3771 return test.testLibrary()
3772 }
3773 return false
3774}
3775
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003776func (c *Module) benchmarkBinary() bool {
3777 if b, ok := c.linker.(interface {
3778 benchmarkBinary() bool
3779 }); ok {
3780 return b.benchmarkBinary()
3781 }
3782 return false
3783}
3784
3785func (c *Module) fuzzBinary() bool {
3786 if f, ok := c.linker.(interface {
3787 fuzzBinary() bool
3788 }); ok {
3789 return f.fuzzBinary()
3790 }
3791 return false
3792}
3793
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003794// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3795func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003796 if h, ok := c.linker.(interface {
3797 header() bool
3798 }); ok {
3799 return h.header()
3800 }
3801 return false
3802}
3803
Ivan Lozanod7586b62021-04-01 09:49:36 -04003804func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003805 if b, ok := c.linker.(interface {
3806 binary() bool
3807 }); ok {
3808 return b.binary()
3809 }
3810 return false
3811}
3812
Justin Yun5e035862021-06-29 20:50:37 +09003813func (c *Module) StaticExecutable() bool {
3814 if b, ok := c.linker.(*binaryDecorator); ok {
3815 return b.static()
3816 }
3817 return false
3818}
3819
Ivan Lozanod7586b62021-04-01 09:49:36 -04003820func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003821 if o, ok := c.linker.(interface {
3822 object() bool
3823 }); ok {
3824 return o.object()
3825 }
3826 return false
3827}
3828
Kiyoung Kim37693d02024-04-04 09:56:15 +09003829func (m *Module) Dylib() bool {
3830 return false
3831}
3832
3833func (m *Module) Rlib() bool {
3834 return false
3835}
3836
Ivan Lozanof9e21722020-12-02 09:00:51 -05003837func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003838 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003839 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003840 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003841 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003842 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003843 return "native:product"
3844 }
Jooyung Han38002912019-05-16 04:01:54 +09003845 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003846 } else if c.InRamdisk() {
3847 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003848 } else if c.InVendorRamdisk() {
3849 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003850 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003851 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003852 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003853 return "native:ndk:none:none"
3854 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3855 //family, link := getNdkStlFamilyAndLinkType(c)
3856 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3857 } else {
3858 return "native:platform"
3859 }
3860}
3861
Jiyong Park9d452992018-10-03 00:38:19 +09003862// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003863// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003864func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003865 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003866 // Stub libs and prebuilt libs in a versioned SDK are not
3867 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003868 return lib.shared() && !lib.buildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003869 }
3870 return false
3871}
3872
Jiyong Parka90ca002019-10-07 15:47:24 +09003873func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003874 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3875}
3876
3877func (c *Module) ApexAvailableFor() []string {
3878 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003879 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003880 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003881 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003882 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003883 }
Yu Liub73c3a62024-12-10 00:58:06 +00003884
3885 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09003886}
3887
Paul Duffin0cb37b92020-03-04 14:52:46 +00003888func (c *Module) EverInstallable() bool {
3889 return c.installer != nil &&
3890 // Check to see whether the module is actually ever installable.
3891 c.installer.everInstallable()
3892}
3893
Ivan Lozanod7586b62021-04-01 09:49:36 -04003894func (c *Module) PreventInstall() bool {
3895 return c.Properties.PreventInstall
3896}
3897
3898func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003899 if c.library != nil {
3900 if i := c.library.installable(); i != nil {
3901 return i
3902 }
3903 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003904 return c.Properties.Installable
3905}
3906
3907func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003908 ret := c.EverInstallable() &&
3909 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003910 proptools.BoolDefault(c.Installable(), true) &&
3911 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003912
3913 // The platform variant doesn't need further condition. Apex variants however might not
3914 // be installable because it will likely to be included in the APEX and won't appear
3915 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003916 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003917 return ret
3918 }
3919
3920 // Special case for modules that are configured to be installed to /data, which includes
3921 // test modules. For these modules, both APEX and non-APEX variants are considered as
3922 // installable. This is because even the APEX variants won't be included in the APEX, but
3923 // will anyway be installed to /data/*.
3924 // See b/146995717
3925 if c.InstallInData() {
3926 return ret
3927 }
3928
3929 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003930}
3931
Logan Chien41eabe62019-04-10 13:33:58 +08003932func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3933 if c.linker != nil {
3934 if library, ok := c.linker.(*libraryDecorator); ok {
3935 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3936 }
3937 }
3938}
3939
Jiyong Park45bf82e2020-12-15 22:29:02 +09003940var _ android.ApexModule = (*Module)(nil)
3941
3942// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003943func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossc1b36442021-05-06 13:42:48 -07003944 if depTag == stubImplDepTag {
3945 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003946 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003947 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003948 if depTag == staticVariantTag {
3949 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3950 // actually mean that the static lib (and its dependencies) are copied into the
3951 // APEX.
3952 return false
3953 }
Colin Cross8acea3e2024-12-12 14:53:30 -08003954
3955 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3956 if isLibDepTag && c.static() && libDepTag.shared() {
3957 // shared_lib dependency from a static lib is considered as crossing
3958 // the APEX boundary because the dependency doesn't actually is
3959 // linked; the dependency is used only during the compilation phase.
3960 return false
3961 }
3962
3963 if isLibDepTag && libDepTag.excludeInApex {
3964 return false
3965 }
3966
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003967 return true
3968}
3969
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003970func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003971 if c.HasStubsVariants() {
3972 if IsSharedDepTag(depTag) {
3973 // dynamic dep to a stubs lib crosses APEX boundary
3974 return false
3975 }
3976 if IsRuntimeDepTag(depTag) {
3977 // runtime dep to a stubs lib also crosses APEX boundary
3978 return false
3979 }
3980 if IsHeaderDepTag(depTag) {
3981 return false
3982 }
3983 }
3984 if c.IsLlndk() {
3985 return false
3986 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003987
3988 return true
3989}
3990
Jiyong Park45bf82e2020-12-15 22:29:02 +09003991// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003992func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3993 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003994 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3995 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3996 return nil
3997 }
Jooyung Han749dc692020-04-15 11:03:39 +09003998 // We don't check for prebuilt modules
3999 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4000 return nil
4001 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004002
Jooyung Han749dc692020-04-15 11:03:39 +09004003 minSdkVersion := c.MinSdkVersion()
4004 if minSdkVersion == "apex_inherit" {
4005 return nil
4006 }
4007 if minSdkVersion == "" {
4008 // JNI libs within APK-in-APEX fall into here
4009 // Those are okay to set sdk_version instead
4010 // We don't have to check if this is a SDK variant because
4011 // non-SDK variant resets sdk_version, which works too.
4012 minSdkVersion = c.SdkVersion()
4013 }
Dan Albertc8060532020-07-22 22:32:17 -07004014 if minSdkVersion == "" {
4015 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4016 }
4017 // Not using nativeApiLevelFromUser because the context here is not
4018 // necessarily a native context.
4019 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004020 if err != nil {
4021 return err
4022 }
Dan Albertc8060532020-07-22 22:32:17 -07004023
Colin Cross8ca61c12022-10-06 21:00:14 -07004024 // A dependency only needs to support a min_sdk_version at least
4025 // as high as the api level that the architecture was introduced in.
4026 // This allows introducing new architectures in the platform that
4027 // need to be included in apexes that normally require an older
4028 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004029 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004030 if sdkVersion.LessThan(minApiForArch) {
4031 sdkVersion = minApiForArch
4032 }
4033
Dan Albertc8060532020-07-22 22:32:17 -07004034 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004035 return fmt.Errorf("newer SDK(%v)", ver)
4036 }
4037 return nil
4038}
4039
Paul Duffinb5769c12021-05-12 16:16:51 +01004040// Implements android.ApexModule
4041func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4042 // stub libraries and native bridge libraries are always available to platform
4043 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4044}
4045
Inseob Kima1888ce2022-10-04 14:42:02 +09004046func (c *Module) overriddenModules() []string {
4047 if o, ok := c.linker.(overridable); ok {
4048 return o.overriddenModules()
4049 }
4050 return nil
4051}
4052
Liz Kammer35ca77e2021-12-22 15:31:40 -05004053type moduleType int
4054
4055const (
4056 unknownType moduleType = iota
4057 binary
4058 object
4059 fullLibrary
4060 staticLibrary
4061 sharedLibrary
4062 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004063 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004064 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004065)
4066
4067func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004068 if c.testBinary() {
4069 // testBinary is also a binary, so this comes before the c.Binary()
4070 // conditional. A testBinary has additional implicit dependencies and
4071 // other test-only semantics.
4072 return testBin
4073 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004074 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004075 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004076 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004077 } else if c.testLibrary() {
4078 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4079 // will let them add implicit compile deps on gtest, for example.
4080 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004081 // For now, treat them as regular libraries.
4082 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004083 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004084 static := false
4085 shared := false
4086 if library, ok := c.linker.(*libraryDecorator); ok {
4087 static = library.MutatedProperties.BuildStatic
4088 shared = library.MutatedProperties.BuildShared
4089 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4090 static = library.MutatedProperties.BuildStatic
4091 shared = library.MutatedProperties.BuildShared
4092 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004093 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004094 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004095 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004096 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004097 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004098 return staticLibrary
4099 }
4100 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004101 } else if c.isNDKStubLibrary() {
4102 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004103 }
4104 return unknownType
4105}
4106
Colin Crosscfad1192015-11-02 16:43:11 -08004107// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004108type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004109 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004110 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004111 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004112}
4113
Patrice Arrudac249c712019-03-19 17:00:29 -07004114// cc_defaults provides a set of properties that can be inherited by other cc
4115// modules. A module can use the properties from a cc_defaults using
4116// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4117// merged (when possible) by prepending the default module's values to the
4118// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004119func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004120 return DefaultsFactory()
4121}
4122
Colin Cross36242852017-06-23 15:06:31 -07004123func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004124 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004125
Colin Cross36242852017-06-23 15:06:31 -07004126 module.AddProperties(props...)
4127 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004128 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004129 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004130 &BaseCompilerProperties{},
4131 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004132 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004133 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004134 &StaticProperties{},
4135 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004136 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004137 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004138 &TestLinkerProperties{},
4139 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004140 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004141 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004142 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004143 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004144 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004145 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004146 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004147 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004148 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004149 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004150 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004151 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004152 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004153 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004154 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4155 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004156 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004157 )
Colin Crosscfad1192015-11-02 16:43:11 -08004158
Jooyung Hancc372c52019-09-25 15:18:44 +09004159 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004160
4161 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004162}
4163
Jiyong Park2286afd2020-06-16 21:58:53 +09004164func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004165 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004166}
4167
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004168func kytheExtractAllFactory() android.Singleton {
4169 return &kytheExtractAllSingleton{}
4170}
4171
4172type kytheExtractAllSingleton struct {
4173}
4174
4175func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4176 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004177 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004178 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004179 if len(files) > 0 {
4180 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004181 }
4182 })
4183 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4184 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004185 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004186 }
4187}
4188
Jihoon Kangf78a8902022-09-01 22:47:07 +00004189func (c *Module) Partition() string {
4190 if p, ok := c.installer.(interface {
4191 getPartition() string
4192 }); ok {
4193 return p.getPartition()
4194 }
4195 return ""
4196}
4197
Spandan Das2b6dfb52024-01-19 00:22:22 +00004198type sourceModuleName interface {
4199 sourceModuleName() string
4200}
4201
4202func (c *Module) BaseModuleName() string {
4203 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4204 // if the prebuilt module sets a source_module_name in Android.bp, use that
4205 return smn.sourceModuleName()
4206 }
4207 return c.ModuleBase.BaseModuleName()
4208}
4209
Spandan Dase20c56c2024-07-23 21:34:24 +00004210func (c *Module) stubsSymbolFilePath() android.Path {
4211 if library, ok := c.linker.(*libraryDecorator); ok {
4212 return library.stubsSymbolFilePath
4213 }
4214 return android.OptionalPath{}.Path()
4215}
4216
Colin Cross06a931b2015-10-28 17:23:31 -07004217var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004218var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004219var BoolPtr = proptools.BoolPtr
4220var String = proptools.String
4221var StringPtr = proptools.StringPtr