blob: 57b5e3cd7877a9c914ef093ce8e5da242d95e837 [file] [log] [blame]
Colin Cross5049f022015-03-18 13:28:46 -07001// Copyright 2015 Google Inc. All rights reserved.
Colin Cross3f40fa42015-01-30 17:27:36 -08002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file contains the module types for compiling C/C++ for Android, and converts the properties
18// into the flags and filenames necessary to pass to the compiler. The final creation of the rules
19// is handled in builder.go
20
21import (
Colin Cross516c5452024-10-28 13:45:21 -070022 "errors"
Colin Cross41955e82019-05-29 14:40:35 -070023 "fmt"
Logan Chien41eabe62019-04-10 13:33:58 +080024 "io"
Colin Cross516c5452024-10-28 13:45:21 -070025 "slices"
Dan Albert9e10cd42016-08-03 14:12:14 -070026 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080027 "strings"
28
Colin Cross97ba0732015-03-23 17:50:24 -070029 "github.com/google/blueprint"
Colin Crossa14fb6a2024-10-23 16:57:06 -070030 "github.com/google/blueprint/depset"
Colin Cross06a931b2015-10-28 17:23:31 -070031 "github.com/google/blueprint/proptools"
Colin Cross97ba0732015-03-23 17:50:24 -070032
Vinh Tran367d89d2023-04-28 11:21:25 -040033 "android/soong/aidl_library"
Colin Cross635c3b02016-05-18 15:37:25 -070034 "android/soong/android"
Colin Crossb98c8b02016-07-29 13:44:28 -070035 "android/soong/cc/config"
hamzehc0a671f2021-07-22 12:05:08 -070036 "android/soong/fuzz"
Colin Cross3f40fa42015-01-30 17:27:36 -080037)
38
Yu Liu76d94462024-10-31 23:32:36 +000039type CcMakeVarsInfo struct {
40 WarningsAllowed string
41 UsingWnoError string
42 MissingProfile string
43}
44
45var CcMakeVarsInfoProvider = blueprint.NewProvider[*CcMakeVarsInfo]()
46
Yu Liuec7043d2024-11-05 18:22:20 +000047type CcObjectInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000048 ObjFiles android.Paths
49 TidyFiles android.Paths
50 KytheFiles android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +000051}
52
53var CcObjectInfoProvider = blueprint.NewProvider[CcObjectInfo]()
54
Yu Liu323d77a2024-12-16 23:13:57 +000055type AidlInterfaceInfo struct {
56 // list of aidl_interface sources
57 Sources []string
58 // root directory of AIDL sources
59 AidlRoot string
60 // AIDL backend language (e.g. "cpp", "ndk")
61 Lang string
62 // list of flags passed to AIDL generator
63 Flags []string
64}
65
66type CompilerInfo struct {
67 Srcs android.Paths
68 // list of module-specific flags that will be used for C and C++ compiles.
69 Cflags proptools.Configurable[[]string]
70 AidlInterfaceInfo AidlInterfaceInfo
71 LibraryDecoratorInfo *LibraryDecoratorInfo
72}
73
74type LinkerInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000075 WholeStaticLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000076 // list of modules that should be statically linked into this module.
Yu Liu4f825132024-12-18 00:35:39 +000077 StaticLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000078 // list of modules that should be dynamically linked into this module.
Yu Liu4f825132024-12-18 00:35:39 +000079 SharedLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000080 // list of modules that should only provide headers for this module.
Yu Liu68a70b72025-01-08 22:54:44 +000081 HeaderLibs proptools.Configurable[[]string]
82 ImplementationModuleName *string
Yu Liu323d77a2024-12-16 23:13:57 +000083
84 BinaryDecoratorInfo *BinaryDecoratorInfo
85 LibraryDecoratorInfo *LibraryDecoratorInfo
86 TestBinaryInfo *TestBinaryInfo
87 BenchmarkDecoratorInfo *BenchmarkDecoratorInfo
88 ObjectLinkerInfo *ObjectLinkerInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +000089 StubDecoratorInfo *StubDecoratorInfo
Yu Liu323d77a2024-12-16 23:13:57 +000090}
91
92type BinaryDecoratorInfo struct{}
93type LibraryDecoratorInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000094 ExportIncludeDirs proptools.Configurable[[]string]
Yu Liu116610a2025-01-06 21:54:48 +000095 InjectBsslHash bool
Yu Liu323d77a2024-12-16 23:13:57 +000096}
Yu Liuffe86322024-12-18 18:53:12 +000097
Yu Liu8024b922024-12-20 23:31:32 +000098type SnapshotInfo struct {
99 SnapshotAndroidMkSuffix string
Yu Liuffe86322024-12-18 18:53:12 +0000100}
101
Yu Liu323d77a2024-12-16 23:13:57 +0000102type TestBinaryInfo struct {
103 Gtest bool
104}
105type BenchmarkDecoratorInfo struct{}
Yu Liu8a8d5b42025-01-07 00:48:08 +0000106
107type StubDecoratorInfo struct{}
108
Yu Liu323d77a2024-12-16 23:13:57 +0000109type ObjectLinkerInfo struct{}
110
Yu Liu8a8d5b42025-01-07 00:48:08 +0000111type LibraryInfo struct {
112 BuildStubs bool
113}
114
Yu Liub1bfa9d2024-12-05 18:57:51 +0000115// Common info about the cc module.
116type CcInfo struct {
Yu Liu323d77a2024-12-16 23:13:57 +0000117 IsPrebuilt bool
118 CmakeSnapshotSupported bool
Yu Liu68a70b72025-01-08 22:54:44 +0000119 HasLlndkStubs bool
Yu Liu323d77a2024-12-16 23:13:57 +0000120 CompilerInfo *CompilerInfo
121 LinkerInfo *LinkerInfo
Yu Liu8024b922024-12-20 23:31:32 +0000122 SnapshotInfo *SnapshotInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +0000123 LibraryInfo *LibraryInfo
Yu Liub1bfa9d2024-12-05 18:57:51 +0000124}
125
Yu Liu8024b922024-12-20 23:31:32 +0000126var CcInfoProvider = blueprint.NewProvider[*CcInfo]()
Yu Liub1bfa9d2024-12-05 18:57:51 +0000127
Yu Liu986d98c2024-11-12 00:28:11 +0000128type LinkableInfo struct {
129 // StaticExecutable returns true if this is a binary module with "static_executable: true".
Yu Liu8024b922024-12-20 23:31:32 +0000130 StaticExecutable bool
131 Static bool
132 Shared bool
133 HasStubsVariants bool
134 StubsVersion string
135 IsStubs bool
136 UnstrippedOutputFile android.Path
137 OutputFile android.OptionalPath
138 CoverageFiles android.Paths
139 SAbiDumpFiles android.Paths
Yu Liu8a8d5b42025-01-07 00:48:08 +0000140 CcLibrary bool
Yu Liu8024b922024-12-20 23:31:32 +0000141 CcLibraryInterface bool
142 RustLibraryInterface bool
143 // CrateName returns the crateName for a Rust library
144 CrateName string
145 // DepFlags returns a slice of Rustc string flags
146 ExportedCrateLinkDirs []string
147 // This can be different from the one on CommonModuleInfo
148 BaseModuleName string
149 HasNonSystemVariants bool
150 IsLlndk bool
151 InVendorOrProduct bool
152 // SubName returns the modules SubName, used for image and NDK/SDK variations.
153 SubName string
154 InRamdisk bool
155 OnlyInRamdisk bool
156 InVendorRamdisk bool
157 OnlyInVendorRamdisk bool
158 InRecovery bool
159 OnlyInRecovery bool
Yu Liu8a8d5b42025-01-07 00:48:08 +0000160 Installable *bool
Yu Liu97880e12025-01-07 19:03:34 +0000161 // RelativeInstallPath returns the relative install path for this module.
162 RelativeInstallPath string
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000163 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
164 RustApexExclude bool
Yu Liu986d98c2024-11-12 00:28:11 +0000165}
166
Yu Liu8024b922024-12-20 23:31:32 +0000167var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]()
Yu Liu986d98c2024-11-12 00:28:11 +0000168
Colin Cross463a90e2015-06-17 14:20:06 -0700169func init() {
Paul Duffin036e7002019-12-19 19:16:28 +0000170 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -0700171
Inseob Kim3b244062023-07-11 13:31:36 +0900172 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +0000173 pctx.Import("android/soong/cc/config")
174}
175
176func RegisterCCBuildComponents(ctx android.RegistrationContext) {
177 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
178
179 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -0700180 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700181 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -0700182 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -0700183 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700184 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -0700185 })
Colin Cross16b23492016-01-06 14:41:07 -0800186
Paul Duffin036e7002019-12-19 19:16:28 +0000187 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -0400188 for _, san := range Sanitizers {
189 san.registerMutators(ctx)
190 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800191
Colin Cross8a962802024-10-09 15:29:27 -0700192 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
193 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -0800194
Colin Cross597bad62024-10-08 15:10:55 -0700195 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +0000196
Colin Crossf5f4ad32024-01-19 15:41:48 -0800197 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -0700198
Colin Crossd38feb02024-01-23 16:38:06 -0800199 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800200
Colin Cross33e0c812024-01-23 16:36:07 -0800201 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000202
Colin Cross6ac83a82024-01-23 11:23:10 -0800203 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900204
Colin Cross8a962802024-10-09 15:29:27 -0700205 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
206 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700207 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700208
Colin Cross91ae5ec2024-10-01 14:03:40 -0700209 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800210 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700211 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800212 })
213
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000214 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700215}
216
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500217// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
218// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
219// edges to these modules.
220// This object is constructed in DepsMutator, by calling to various module delegates to set
221// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
222// dependencies.
223// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
224// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800225type Deps struct {
226 SharedLibs, LateSharedLibs []string
227 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800228 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800229 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700230
Colin Cross3e5e7782022-06-17 22:17:05 +0000231 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
232 // prevent automatically exporting symbols.
233 UnexportedStaticLibs []string
234
Chris Parsons79d66a52020-06-05 17:26:16 -0400235 // Used for data dependencies adjacent to tests
236 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700237 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400238
Yo Chiang219968c2020-09-22 18:45:04 +0800239 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
240 SystemSharedLibs []string
241
Vinh Tran367d89d2023-04-28 11:21:25 -0400242 // Used by DepMutator to pass aidl_library modules to aidl compiler
243 AidlLibs []string
244
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500245 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800246 StaticUnwinderIfLegacy bool
247
Colin Cross5950f382016-12-13 12:50:57 -0800248 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700249
Colin Cross81413472016-04-11 14:37:39 -0700250 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700251
Cole Faust65cb40a2024-10-21 15:41:42 -0700252 GeneratedSources []string
253 GeneratedHeaders []string
254 DeviceFirstGeneratedHeaders []string
255 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700256
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700257 ReexportGeneratedHeaders []string
258
Colin Crossc465efd2021-06-11 18:00:04 -0700259 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700260
261 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700262 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900263
264 // List of libs that need to be excluded for APEX variant
265 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900266 // List of libs that need to be excluded for non-APEX variant
267 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800268
269 // LLNDK headers for the ABI checker to check LLNDK implementation library.
270 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700271 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800272 // Instead, the LLNDK implementation depends on the LLNDK header libs.
273 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700274}
275
Ivan Lozano0a468a42024-05-13 21:03:34 -0400276// A struct which to collect flags for rlib dependencies
277type RustRlibDep struct {
278 LibPath android.Path // path to the rlib
279 LinkDirs []string // flags required for dependency (e.g. -L flags)
280 CrateName string // crateNames associated with rlibDeps
281}
282
283func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
284 return a.LibPath == b.LibPath
285}
286
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500287// PathDeps is a struct containing file paths to dependencies of a module.
288// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
289// It's used to construct flags for various build statements (such as for compiling and linking).
290// It is then passed to module decorator functions responsible for registering build statements
291// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800292type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700293 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900294 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700295 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900296 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700297 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700298 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400299 // Paths and crateNames for RustStaticLib dependencies
300 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700301
Colin Cross0de8a1e2020-09-18 14:15:30 -0700302 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700303 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700304
Colin Cross26c34ed2016-09-30 17:10:16 -0700305 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100306 Objs Objects
307 // Paths to .o files in dependencies that provide them. Note that these lists
308 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800309 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700310 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700311
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100312 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
313 // the libs from all whole_static_lib dependencies.
314 WholeStaticLibsFromPrebuilts android.Paths
315
Colin Cross26c34ed2016-09-30 17:10:16 -0700316 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700317 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900318 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700319
Inseob Kimd110f872019-12-06 13:15:38 +0900320 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000321 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900322 IncludeDirs android.Paths
323 SystemIncludeDirs android.Paths
324 ReexportedDirs android.Paths
325 ReexportedSystemDirs android.Paths
326 ReexportedFlags []string
327 ReexportedGeneratedHeaders android.Paths
328 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400329 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700330
Colin Cross26c34ed2016-09-30 17:10:16 -0700331 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700332 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700333
Dan Willemsena0790e32018-10-12 00:24:23 -0700334 // Path to the dynamic linker binary
335 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700336
337 // For Darwin builds, the path to the second architecture's output that should
338 // be combined with this architectures's output into a FAT MachO file.
339 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400340
341 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
342 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800343
344 // LLNDK headers for the ABI checker to check LLNDK implementation library.
345 LlndkIncludeDirs android.Paths
346 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700347
348 directImplementationDeps android.Paths
349 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700350}
351
Colin Cross4af21ed2019-11-04 09:37:55 -0800352// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
353// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
354// command line so they can be overridden by the local module flags).
355type LocalOrGlobalFlags struct {
356 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700357 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800358 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700359 CFlags []string // Flags that apply to C and C++ source files
360 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
361 ConlyFlags []string // Flags that apply to C source files
362 CppFlags []string // Flags that apply to C++ source files
363 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700364 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800365}
366
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500367// Flags contains various types of command line flags (and settings) for use in building build
368// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800369type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500370 // Local flags (which individual modules are responsible for). These may override global flags.
371 Local LocalOrGlobalFlags
372 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700373 Global LocalOrGlobalFlags
374 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800375
376 aidlFlags []string // Flags that apply to aidl source files
377 rsFlags []string // Flags that apply to renderscript source files
378 libFlags []string // Flags to add libraries early to the link order
379 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
380 TidyFlags []string // Flags that apply to clang-tidy
381 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700382
Colin Crossc3199482017-03-30 15:03:04 -0700383 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800384 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700385 SystemIncludeFlags []string
386
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800387 Toolchain config.Toolchain
388 Tidy bool // True if ninja .tidy rules should be generated.
389 NeedTidyFiles bool // True if module link should depend on .tidy files
390 GcovCoverage bool // True if coverage files should be generated.
391 SAbiDump bool // True if header abi dumps should be generated.
392 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800393 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800394
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500395 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800396 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500397 // The target-device system path to the dynamic linker.
398 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800399
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700400 CFlagsDeps android.Paths // Files depended on by compiler flags
401 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800402
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500403 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700404 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800405
Colin Cross19878da2019-03-28 14:45:07 -0700406 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700407 protoC bool // Whether to use C instead of C++
408 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700409
410 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200411 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700412}
413
Colin Crossca860ac2016-01-04 14:34:37 -0800414// Properties used to compile all C or C++ modules
415type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700416 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800417 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700418
Yi Kong5786f5c2024-05-28 02:22:34 +0900419 // Aggresively trade performance for smaller binary size.
420 // This should only be used for on-device binaries that are rarely executed and not
421 // performance critical.
422 Optimize_for_size *bool `android:"arch_variant"`
423
Jiyong Parkb35a8192020-08-10 15:59:36 +0900424 // The API level that this module is built against. The APIs of this API level will be
425 // visible at build time, but use of any APIs newer than min_sdk_version will render the
426 // module unloadable on older devices. In the future it will be possible to weakly-link new
427 // APIs, making the behavior match Java: such modules will load on older devices, but
428 // calling new APIs on devices that do not support them will result in a crash.
429 //
430 // This property has the same behavior as sdk_version does for Java modules. For those
431 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
432 // does for Java code.
433 //
434 // In addition, setting this property causes two variants to be built, one for the platform
435 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800436 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700437
Jiyong Parkb35a8192020-08-10 15:59:36 +0900438 // Minimum OS API level supported by this C or C++ module. This property becomes the value
439 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
440 // this property is also used to ensure that the min_sdk_version of the containing module is
441 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
442 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
443 // min_sdk_version of the containing APEX. When the module
444 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900445 Min_sdk_version *string
446
Colin Crossc511bc52020-04-07 16:50:32 +0000447 // If true, always create an sdk variant and don't create a platform variant.
448 Sdk_variant_only *bool
449
Colin Cross4297f402024-11-20 15:20:09 -0800450 AndroidMkSharedLibs []string `blueprint:"mutated"`
451 AndroidMkStaticLibs []string `blueprint:"mutated"`
452 AndroidMkRlibs []string `blueprint:"mutated"`
453 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
454 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
455 AndroidMkHeaderLibs []string `blueprint:"mutated"`
456 HideFromMake bool `blueprint:"mutated"`
457 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700458
Yo Chiang219968c2020-09-22 18:45:04 +0800459 // Set by DepsMutator.
460 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
461
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900462 // The name of the image this module is built for
463 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200464
465 // The VNDK version this module is built against. If empty, the module is not
466 // build against the VNDK.
467 VndkVersion string `blueprint:"mutated"`
468
469 // Suffix for the name of Android.mk entries generated by this module
470 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800471
472 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
473 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900474 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900475
Yifan Hong39143a92020-10-26 12:43:12 -0700476 // Make this module available when building for ramdisk.
477 // On device without a dedicated recovery partition, the module is only
478 // available after switching root into
479 // /first_stage_ramdisk. To expose the module before switching root, install
480 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800481 Ramdisk_available *bool
482
Yifan Hong39143a92020-10-26 12:43:12 -0700483 // Make this module available when building for vendor ramdisk.
484 // On device without a dedicated recovery partition, the module is only
485 // available after switching root into
486 // /first_stage_ramdisk. To expose the module before switching root, install
487 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700488 Vendor_ramdisk_available *bool
489
Jiyong Parkf9332f12018-02-01 00:54:12 +0900490 // Make this module available when building for recovery
491 Recovery_available *bool
492
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200493 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000494 VendorVariantNeeded bool `blueprint:"mutated"`
495 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200496 CoreVariantNeeded bool `blueprint:"mutated"`
497 RamdiskVariantNeeded bool `blueprint:"mutated"`
498 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
499 RecoveryVariantNeeded bool `blueprint:"mutated"`
500
501 // A list of variations for the "image" mutator of the form
502 //<image name> '.' <version char>, for example, 'vendor.S'
503 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900504
505 // Allows this module to use non-APEX version of libraries. Useful
506 // for building binaries that are started before APEXes are activated.
507 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900508
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000509 // Allows this module to be included in CMake release snapshots to be built outside of Android
510 // build system and source tree.
511 Cmake_snapshot_supported *bool
512
Colin Cross1bc94122021-10-28 13:25:54 -0700513 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000514
515 // Set by factories of module types that can only be referenced from variants compiled against
516 // the SDK.
517 AlwaysSdk bool `blueprint:"mutated"`
518
519 // Variant is an SDK variant created by sdkMutator
520 IsSdkVariant bool `blueprint:"mutated"`
521 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
522 // variant to have a ".sdk" suffix.
523 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700524
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800525 Target struct {
526 Platform struct {
527 // List of modules required by the core variant.
528 Required []string `android:"arch_variant"`
529
530 // List of modules not required by the core variant.
531 Exclude_required []string `android:"arch_variant"`
532 } `android:"arch_variant"`
533
534 Recovery struct {
535 // List of modules required by the recovery variant.
536 Required []string `android:"arch_variant"`
537
538 // List of modules not required by the recovery variant.
539 Exclude_required []string `android:"arch_variant"`
540 } `android:"arch_variant"`
541 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700542}
543
544type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900545 // whether this module should be allowed to be directly depended by other
546 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900547 // If set to true, two variants will be built separately, one like
548 // normal, and the other limited to the set of libraries and headers
549 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700550 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900551 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700552 // so it shouldn't have any unversioned runtime dependencies, or
553 // make assumptions about the system that may not be true in the
554 // future.
555 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900556 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900557 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900558 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900559 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900560 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700561 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
562 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900563
Justin Yunebcf0c52021-01-08 18:00:19 +0900564 // This is the same as the "vendor_available" except that the install path
565 // of the vendor variant is /odm or /vendor/odm.
566 // By replacing "vendor_available: true" with "odm_available: true", the
567 // module will install its vendor variant to the /odm partition or /vendor/odm.
568 // As the modules with "odm_available: true" still create the vendor variants,
569 // they can link to the other vendor modules as the vendor_available modules do.
570 // Also, the vendor modules can link to odm_available modules.
571 //
572 // It may not be used for VNDK modules.
573 Odm_available *bool
574
Justin Yun63e9ec72020-10-29 16:49:43 +0900575 // whether this module should be allowed to be directly depended by other
576 // modules with `product_specific: true` or `product_available: true`.
577 // If set to true, an additional product variant will be built separately
578 // that is limited to the set of libraries and headers that are exposed to
579 // /product modules.
580 //
581 // The product variant may be used with a different (newer) /system,
582 // so it shouldn't have any unversioned runtime dependencies, or
583 // make assumptions about the system that may not be true in the
584 // future.
585 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900586 // If set to false, this module becomes inaccessible from /product modules.
587 //
588 // Different from the 'vendor_available' property, the modules with
589 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
590 // library without 'product_available' may not be depended on by any other
591 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900592 //
593 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
594 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
595 Product_available *bool
596
Jiyong Park5fb8c102018-04-09 12:03:06 +0900597 // whether this module is capable of being loaded with other instance
598 // (possibly an older version) of the same module in the same process.
599 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
600 // can be double loaded in a vendor process if the library is also a
601 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
602 // explicitly marked as `double_loadable: true` by the owner, or the dependency
603 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
604 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800605
606 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
607 IsLLNDK bool `blueprint:"mutated"`
608
Colin Cross5271fea2021-04-27 13:06:04 -0700609 // IsVendorPublicLibrary is set for the core and product variants of a library that has
610 // vendor_public_library stubs.
611 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800612}
613
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500614// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
615// to understanding details about the type of the current module.
616// For example, one might call these functions to determine whether the current module is a static
617// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800618type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800619 static() bool
620 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800621 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700622 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800623 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900624 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900625 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900626 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700627 toolchain() config.Toolchain
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700628 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800629 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900630 minSdkVersion() string
631 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700632 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700633 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800634 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800635 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700636 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900637 inProduct() bool
638 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800639 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700640 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900641 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900642 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700643 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700644 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800645 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000646 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800647 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900648 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800649 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800650 useClangLld(actx ModuleContext) bool
Colin Crosse07f2312020-08-13 11:24:56 -0700651 apexVariationName() string
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900652 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700653 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800654 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800655 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800656 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800657 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900658 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000659 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800660}
661
662type SharedFlags struct {
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000663 NumSharedFlags int
664 FlagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800665}
666
667type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700668 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800669 ModuleContextIntf
670}
671
672type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700673 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800674 ModuleContextIntf
675}
676
Colin Cross37047f12016-12-13 17:06:13 -0800677type DepsContext interface {
678 android.BottomUpMutatorContext
679 ModuleContextIntf
680}
681
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500682// feature represents additional (optional) steps to building cc-related modules, such as invocation
683// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800684type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800685 flags(ctx ModuleContext, flags Flags) Flags
686 props() []interface{}
687}
688
Joe Onorato37f900c2023-07-18 16:58:16 -0700689// Information returned from Generator about the source code it's generating
690type GeneratedSource struct {
691 IncludeDirs android.Paths
692 Sources android.Paths
693 Headers android.Paths
694 ReexportedDirs android.Paths
695}
696
697// generator allows injection of generated code
698type Generator interface {
699 GeneratorProps() []interface{}
700 GeneratorInit(ctx BaseModuleContext)
701 GeneratorDeps(ctx DepsContext, deps Deps) Deps
702 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
703 GeneratorSources(ctx ModuleContext) GeneratedSource
704 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
705}
706
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500707// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500708// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800709type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700710 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800711 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800712 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700713 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000714 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700715
Colin Cross76fada02016-07-27 10:31:13 -0700716 appendCflags([]string)
717 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700718 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800719}
720
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500721// linker is the interface for a linker decorator object. Individual module types can provide
722// their own implementation for this decorator, and thus specify custom logic regarding build
723// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800724type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700725 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800726 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700727 linkerFlags(ctx ModuleContext, flags Flags) Flags
728 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000729 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800730 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700731
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700732 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700733 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900734 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800735 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700736
737 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900738 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000739
740 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700741 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800742
743 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000744}
745
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500746// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000747type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500748 sharedLibs []string
749 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
750 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700751 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800752}
753
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500754// installer is the interface for an installer helper object. This helper is responsible for
755// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800756type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700757 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700758 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000759 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800760 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700761 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700762 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900763 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000764 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900765 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800766}
767
Inseob Kima1888ce2022-10-04 14:42:02 +0900768type overridable interface {
769 overriddenModules() []string
770}
771
Colin Cross6e511a92020-07-27 21:26:48 -0700772type libraryDependencyKind int
773
774const (
775 headerLibraryDependency = iota
776 sharedLibraryDependency
777 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400778 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700779)
780
781func (k libraryDependencyKind) String() string {
782 switch k {
783 case headerLibraryDependency:
784 return "headerLibraryDependency"
785 case sharedLibraryDependency:
786 return "sharedLibraryDependency"
787 case staticLibraryDependency:
788 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400789 case rlibLibraryDependency:
790 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700791 default:
792 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
793 }
794}
795
796type libraryDependencyOrder int
797
798const (
799 earlyLibraryDependency = -1
800 normalLibraryDependency = 0
801 lateLibraryDependency = 1
802)
803
804func (o libraryDependencyOrder) String() string {
805 switch o {
806 case earlyLibraryDependency:
807 return "earlyLibraryDependency"
808 case normalLibraryDependency:
809 return "normalLibraryDependency"
810 case lateLibraryDependency:
811 return "lateLibraryDependency"
812 default:
813 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
814 }
815}
816
817// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
818// tags that have a set of predefined tag objects that are reused for each dependency, a
819// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
820// That means that comparing a libraryDependencyTag for equality will only be equal if all
821// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
822// then check individual metadata fields instead.
823type libraryDependencyTag struct {
824 blueprint.BaseDependencyTag
825
826 // These are exported so that fmt.Printf("%#v") can call their String methods.
827 Kind libraryDependencyKind
828 Order libraryDependencyOrder
829
830 wholeStatic bool
831
832 reexportFlags bool
833 explicitlyVersioned bool
834 dataLib bool
835 ndk bool
836
837 staticUnwinder bool
838
839 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900840
Cindy Zhou18417cb2020-12-10 07:12:38 -0800841 // Whether or not this dependency should skip the apex dependency check
842 skipApexAllowedDependenciesCheck bool
843
Jiyong Parke3867542020-12-03 17:28:25 +0900844 // Whether or not this dependency has to be followed for the apex variants
845 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900846 // Whether or not this dependency has to be followed for the non-apex variants
847 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000848
849 // If true, don't automatically export symbols from the static library into a shared library.
850 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700851}
852
853// header returns true if the libraryDependencyTag is tagging a header lib dependency.
854func (d libraryDependencyTag) header() bool {
855 return d.Kind == headerLibraryDependency
856}
857
858// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
859func (d libraryDependencyTag) shared() bool {
860 return d.Kind == sharedLibraryDependency
861}
862
863// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
864func (d libraryDependencyTag) static() bool {
865 return d.Kind == staticLibraryDependency
866}
867
Colin Cross65cb3142021-12-10 23:05:02 +0000868func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
869 if d.shared() {
870 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
871 }
872 return nil
873}
874
875var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
876
Colin Crosse9fe2942020-11-10 18:12:15 -0800877// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
878// binaries or other shared libraries are installed as dependencies.
879func (d libraryDependencyTag) InstallDepNeeded() bool {
880 return d.shared()
881}
882
883var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
884
Yu Liu67a28422024-03-05 00:36:31 +0000885func (d libraryDependencyTag) PropagateAconfigValidation() bool {
886 return d.static()
887}
888
889var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
890
Colin Crosse9fe2942020-11-10 18:12:15 -0800891// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700892// libraryDependencyTag. Each tag object is created globally and reused for multiple
893// dependencies (although since the object contains no references, assigning a tag to a
894// variable and modifying it will not modify the original). Users can compare the tag
895// returned by ctx.OtherModuleDependencyTag against the global original
896type dependencyTag struct {
897 blueprint.BaseDependencyTag
898 name string
899}
900
Colin Crosse9fe2942020-11-10 18:12:15 -0800901// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
902// libraryDependencyTag, but where the dependency needs to be installed when the parent is
903// installed.
904type installDependencyTag struct {
905 blueprint.BaseDependencyTag
906 android.InstallAlwaysNeededDependencyTag
907 name string
908}
909
Colin Crossc99deeb2016-04-11 15:06:20 -0700910var (
Colin Cross6e511a92020-07-27 21:26:48 -0700911 genSourceDepTag = dependencyTag{name: "gen source"}
912 genHeaderDepTag = dependencyTag{name: "gen header"}
913 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
914 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900915 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700916 reuseObjTag = dependencyTag{name: "reuse objects"}
917 staticVariantTag = dependencyTag{name: "static variant"}
918 vndkExtDepTag = dependencyTag{name: "vndk extends"}
919 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700920 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800921 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000922 StubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000923 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500924 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400925 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800926 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700927)
928
Roland Levillainf89cd092019-07-29 16:22:59 +0100929func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700930 ccLibDepTag, ok := depTag.(libraryDependencyTag)
931 return ok && ccLibDepTag.shared()
932}
933
934func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
935 ccLibDepTag, ok := depTag.(libraryDependencyTag)
936 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100937}
938
Zach Johnson3df4e632020-11-06 11:56:27 -0800939func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
940 ccLibDepTag, ok := depTag.(libraryDependencyTag)
941 return ok && ccLibDepTag.header()
942}
943
Roland Levillainf89cd092019-07-29 16:22:59 +0100944func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800945 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100946}
947
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000948func ExcludeInApexDepTag(depTag blueprint.DependencyTag) bool {
949 ccLibDepTag, ok := depTag.(libraryDependencyTag)
950 return ok && ccLibDepTag.excludeInApex
951}
952
Colin Crossca860ac2016-01-04 14:34:37 -0800953// Module contains the properties and members used by all C/C++ module types, and implements
954// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500955// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
956// interface.
957//
958// To define a C/C++ related module, construct a new Module object and point its delegates to
959// type-specific structs. These delegates will be invoked to register module-specific build
960// statements which may be unique to the module type. For example, module.compiler.compile() should
961// be defined so as to register build statements which are responsible for compiling the module.
962//
963// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
964// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
965// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
966// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800967type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700968 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700969
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700970 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700971 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -0700972 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700973
Colin Crossca860ac2016-01-04 14:34:37 -0800974 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +0000975 hod android.HostOrDeviceSupported
976 multilib android.Multilib
977 testModule bool
978 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -0700979
Paul Duffina0843f62019-12-13 19:50:38 +0000980 // Allowable SdkMemberTypes of this module type.
981 sdkMemberTypes []android.SdkMemberType
982
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500983 // decorator delegates, initialize before calling Init
984 // these may contain module-specific implementations, and effectively allow for custom
985 // type-specific logic. These members may reference different objects or the same object.
986 // Functions of these decorators will be invoked to initialize and register type-specific
987 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800988 generators []Generator
989 compiler compiler
990 linker linker
991 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500992
Spandan Dase12d2522023-09-12 21:42:31 +0000993 features []feature
994 stl *stl
995 sanitize *sanitize
996 coverage *coverage
997 fuzzer *fuzzer
998 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +0000999 lto *lto
1000 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001001 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -08001002
Colin Cross31076b32020-10-23 17:22:06 -07001003 library libraryInterface
1004
Colin Cross635c3b02016-05-18 15:37:25 -07001005 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -08001006
Colin Crossb98c8b02016-07-29 13:44:28 -07001007 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -07001008
Yu Liue70976d2024-10-15 20:45:35 +00001009 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001010
1011 // Flags used to compile this module
1012 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -07001013
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001014 // Shared flags among build rules of this module
1015 sharedFlags SharedFlags
1016
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08001017 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -07001018 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +09001019
1020 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +09001021
1022 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -07001023 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07001024
1025 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -08001026
Inseob Kim37e0bb02024-04-29 15:54:44 +09001027 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001028
1029 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -07001030
1031 hasAidl bool
1032 hasLex bool
1033 hasProto bool
1034 hasRenderscript bool
1035 hasSysprop bool
1036 hasWinMsg bool
1037 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +00001038
1039 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -07001040}
1041
Yu Liu76d94462024-10-31 23:32:36 +00001042func (c *Module) IncrementalSupported() bool {
1043 return c.incremental
1044}
1045
1046var _ blueprint.Incremental = (*Module)(nil)
1047
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001048func (c *Module) AddJSONData(d *map[string]interface{}) {
1049 c.AndroidModuleBase().AddJSONData(d)
1050 (*d)["Cc"] = map[string]interface{}{
1051 "SdkVersion": c.SdkVersion(),
1052 "MinSdkVersion": c.MinSdkVersion(),
1053 "VndkVersion": c.VndkVersion(),
1054 "ProductSpecific": c.ProductSpecific(),
1055 "SocSpecific": c.SocSpecific(),
1056 "DeviceSpecific": c.DeviceSpecific(),
1057 "InProduct": c.InProduct(),
1058 "InVendor": c.InVendor(),
1059 "InRamdisk": c.InRamdisk(),
1060 "InVendorRamdisk": c.InVendorRamdisk(),
1061 "InRecovery": c.InRecovery(),
1062 "VendorAvailable": c.VendorAvailable(),
1063 "ProductAvailable": c.ProductAvailable(),
1064 "RamdiskAvailable": c.RamdiskAvailable(),
1065 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1066 "RecoveryAvailable": c.RecoveryAvailable(),
1067 "OdmAvailable": c.OdmAvailable(),
1068 "InstallInData": c.InstallInData(),
1069 "InstallInRamdisk": c.InstallInRamdisk(),
1070 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1071 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1072 "InstallInRecovery": c.InstallInRecovery(),
1073 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001074 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001075 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1076 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001077 "AidlSrcs": c.hasAidl,
1078 "LexSrcs": c.hasLex,
1079 "ProtoSrcs": c.hasProto,
1080 "RenderscriptSrcs": c.hasRenderscript,
1081 "SyspropSrcs": c.hasSysprop,
1082 "WinMsgSrcs": c.hasWinMsg,
1083 "YaccSrsc": c.hasYacc,
1084 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001085 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001086 }
1087}
1088
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001089func (c *Module) SetPreventInstall() {
1090 c.Properties.PreventInstall = true
1091}
1092
1093func (c *Module) SetHideFromMake() {
1094 c.Properties.HideFromMake = true
1095}
1096
Ivan Lozanod7586b62021-04-01 09:49:36 -04001097func (c *Module) HiddenFromMake() bool {
1098 return c.Properties.HideFromMake
1099}
1100
Cole Fauste8a87832024-09-11 11:35:46 -07001101func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001102 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001103 if c.ImageVariation().Variation == android.CoreVariation {
1104 required = append(required, c.Properties.Target.Platform.Required...)
1105 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1106 } else if c.InRecovery() {
1107 required = append(required, c.Properties.Target.Recovery.Required...)
1108 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1109 }
1110 return android.FirstUniqueStrings(required)
1111}
1112
Ivan Lozano52767be2019-10-18 14:49:46 -07001113func (c *Module) Toc() android.OptionalPath {
1114 if c.linker != nil {
1115 if library, ok := c.linker.(libraryInterface); ok {
1116 return library.toc()
1117 }
1118 }
1119 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1120}
1121
1122func (c *Module) ApiLevel() string {
1123 if c.linker != nil {
1124 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001125 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001126 }
1127 }
1128 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1129}
1130
1131func (c *Module) Static() bool {
1132 if c.linker != nil {
1133 if library, ok := c.linker.(libraryInterface); ok {
1134 return library.static()
1135 }
1136 }
1137 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1138}
1139
1140func (c *Module) Shared() bool {
1141 if c.linker != nil {
1142 if library, ok := c.linker.(libraryInterface); ok {
1143 return library.shared()
1144 }
1145 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001146
Ivan Lozano52767be2019-10-18 14:49:46 -07001147 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1148}
1149
1150func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001151 if c.stl != nil {
1152 return c.stl.Properties.SelectedStl
1153 }
1154 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001155}
1156
Ivan Lozano52767be2019-10-18 14:49:46 -07001157func (c *Module) StubDecorator() bool {
1158 if _, ok := c.linker.(*stubDecorator); ok {
1159 return true
1160 }
1161 return false
1162}
1163
Yi Kong5786f5c2024-05-28 02:22:34 +09001164func (c *Module) OptimizeForSize() bool {
1165 return Bool(c.Properties.Optimize_for_size)
1166}
1167
Ivan Lozano52767be2019-10-18 14:49:46 -07001168func (c *Module) SdkVersion() string {
1169 return String(c.Properties.Sdk_version)
1170}
1171
Artur Satayev480e25b2020-04-27 18:53:18 +01001172func (c *Module) MinSdkVersion() string {
1173 return String(c.Properties.Min_sdk_version)
1174}
1175
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001176func (c *Module) SetSdkVersion(s string) {
1177 c.Properties.Sdk_version = StringPtr(s)
1178}
1179
1180func (c *Module) SetMinSdkVersion(s string) {
1181 c.Properties.Min_sdk_version = StringPtr(s)
1182}
1183
1184func (c *Module) SetStl(s string) {
1185 if c.stl != nil {
1186 c.stl.Properties.Stl = StringPtr(s)
1187 }
1188}
1189
1190func (c *Module) IsCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001191 if linker, ok := c.linker.(*objectLinker); ok {
1192 return linker.isCrt()
1193 }
1194 return false
1195}
1196
Jiyong Park5df7bd32021-08-25 16:18:46 +09001197func (c *Module) SplitPerApiLevel() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001198 return CanUseSdk(c) && c.IsCrt()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001199}
1200
Colin Crossc511bc52020-04-07 16:50:32 +00001201func (c *Module) AlwaysSdk() bool {
1202 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1203}
1204
Ivan Lozano183a3212019-10-18 14:18:45 -07001205func (c *Module) CcLibrary() bool {
1206 if c.linker != nil {
1207 if _, ok := c.linker.(*libraryDecorator); ok {
1208 return true
1209 }
Colin Crossd48fe732020-09-23 20:37:24 -07001210 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1211 return true
1212 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001213 }
1214 return false
1215}
1216
1217func (c *Module) CcLibraryInterface() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001218 if c.library != nil {
Ivan Lozano183a3212019-10-18 14:18:45 -07001219 return true
1220 }
1221 return false
1222}
1223
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001224func (c *Module) RlibStd() bool {
1225 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1226}
1227
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001228func (c *Module) RustLibraryInterface() bool {
1229 return false
1230}
1231
Ivan Lozano0a468a42024-05-13 21:03:34 -04001232func (c *Module) CrateName() string {
1233 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1234}
1235
1236func (c *Module) ExportedCrateLinkDirs() []string {
1237 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1238}
1239
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001240func (c *Module) IsFuzzModule() bool {
1241 if _, ok := c.compiler.(*fuzzBinary); ok {
1242 return true
1243 }
1244 return false
1245}
1246
1247func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1248 return c.FuzzModule
1249}
1250
1251func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1252 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1253 return fuzzer.fuzzPackagedModule
1254 }
1255 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1256}
1257
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001258func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001259 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1260 return fuzzer.sharedLibraries
1261 }
1262 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1263}
1264
Ivan Lozano2b262972019-11-21 12:30:50 -08001265func (c *Module) NonCcVariants() bool {
1266 return false
1267}
1268
Ivan Lozano183a3212019-10-18 14:18:45 -07001269func (c *Module) SetStatic() {
1270 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001271 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001272 library.setStatic()
1273 return
1274 }
1275 }
1276 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1277}
1278
1279func (c *Module) SetShared() {
1280 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001281 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001282 library.setShared()
1283 return
1284 }
1285 }
1286 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1287}
1288
1289func (c *Module) BuildStaticVariant() bool {
1290 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001291 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001292 return library.buildStatic()
1293 }
1294 }
1295 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1296}
1297
1298func (c *Module) BuildSharedVariant() bool {
1299 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001300 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001301 return library.buildShared()
1302 }
1303 }
1304 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1305}
1306
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001307func (c *Module) BuildRlibVariant() bool {
1308 // cc modules can never build rlib variants
1309 return false
1310}
1311
Ivan Lozano183a3212019-10-18 14:18:45 -07001312func (c *Module) Module() android.Module {
1313 return c
1314}
1315
Jiyong Parkc20eee32018-09-05 22:36:17 +09001316func (c *Module) OutputFile() android.OptionalPath {
1317 return c.outputFile
1318}
1319
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001320func (c *Module) CoverageFiles() android.Paths {
1321 if c.linker != nil {
1322 if library, ok := c.linker.(libraryInterface); ok {
1323 return library.objs().coverageFiles
1324 }
1325 }
1326 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1327}
1328
Ivan Lozano183a3212019-10-18 14:18:45 -07001329var _ LinkableInterface = (*Module)(nil)
1330
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001331func (c *Module) VersionedInterface() VersionedInterface {
1332 if c.library != nil {
1333 return c.library
1334 }
1335 return nil
1336}
1337
Jiyong Park719b4462019-01-13 00:39:51 +09001338func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001339 if c.linker != nil {
1340 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001341 }
1342 return nil
1343}
1344
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001345func (c *Module) CoverageOutputFile() android.OptionalPath {
1346 if c.linker != nil {
1347 return c.linker.coverageOutputFilePath()
1348 }
1349 return android.OptionalPath{}
1350}
1351
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001352func (c *Module) RelativeInstallPath() string {
1353 if c.installer != nil {
1354 return c.installer.relativeInstallPath()
1355 }
1356 return ""
1357}
1358
Jooyung Han344d5432019-08-23 11:17:39 +09001359func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001360 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001361}
1362
Colin Cross36242852017-06-23 15:06:31 -07001363func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001364 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001365 for _, generator := range c.generators {
1366 c.AddProperties(generator.GeneratorProps()...)
1367 }
Colin Crossca860ac2016-01-04 14:34:37 -08001368 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001369 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001370 }
1371 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001372 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001373 }
1374 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001375 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001376 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001377 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001378 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001379 }
Colin Cross16b23492016-01-06 14:41:07 -08001380 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001381 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001382 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001383 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001384 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001385 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001386 if c.fuzzer != nil {
1387 c.AddProperties(c.fuzzer.props()...)
1388 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001389 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001390 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001391 }
Stephen Craneba090d12017-05-09 15:44:35 -07001392 if c.lto != nil {
1393 c.AddProperties(c.lto.props()...)
1394 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001395 if c.afdo != nil {
1396 c.AddProperties(c.afdo.props()...)
1397 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001398 if c.orderfile != nil {
1399 c.AddProperties(c.orderfile.props()...)
1400 }
Colin Crossca860ac2016-01-04 14:34:37 -08001401 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001402 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001403 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001404 // Allow test-only on libraries that are not cc_test_library
1405 if c.library != nil && !c.testLibrary() {
1406 c.AddProperties(&c.sourceProperties)
1407 }
Colin Crossc472d572015-03-17 15:06:21 -07001408
Colin Cross36242852017-06-23 15:06:31 -07001409 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001410 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001411 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001412
Colin Cross36242852017-06-23 15:06:31 -07001413 return c
Colin Crossc472d572015-03-17 15:06:21 -07001414}
1415
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001416// UseVndk() returns true if this module is built against VNDK.
1417// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001418func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001419 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001420}
1421
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001422func CanUseSdk(c LinkableInterface) bool {
1423 return c.Module().Target().Os == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001424 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001425}
1426
1427func (c *Module) UseSdk() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001428 if CanUseSdk(c) {
Colin Cross1348ce32020-10-01 13:37:16 -07001429 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001430 }
1431 return false
1432}
1433
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001434func (c *Module) isCoverageVariant() bool {
1435 return c.coverage.Properties.IsCoverageVariant
1436}
1437
Colin Cross95f1ca02020-10-29 20:47:22 -07001438func (c *Module) IsNdk(config android.Config) bool {
1439 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001440}
1441
Colin Cross127bb8b2020-12-16 16:46:01 -08001442func (c *Module) IsLlndk() bool {
1443 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001444}
1445
Colin Cross1f3f1302021-04-26 18:37:44 -07001446func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001447 lib := moduleVersionedInterface(m)
1448 return lib != nil && (lib.HasLLNDKStubs() || lib.HasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001449}
1450
Colin Cross5271fea2021-04-27 13:06:04 -07001451func (m *Module) NeedsVendorPublicLibraryVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001452 lib := moduleVersionedInterface(m)
1453 return lib != nil && (lib.HasVendorPublicLibrary())
Colin Cross5271fea2021-04-27 13:06:04 -07001454}
1455
1456// IsVendorPublicLibrary returns true for vendor public libraries.
1457func (c *Module) IsVendorPublicLibrary() bool {
1458 return c.VendorProperties.IsVendorPublicLibrary
1459}
1460
Ivan Lozanof1868af2022-04-12 13:08:36 -04001461func (c *Module) IsVndkPrebuiltLibrary() bool {
1462 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1463 return true
1464 }
1465 return false
1466}
1467
1468func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1469 return c.Properties.SdkAndPlatformVariantVisibleToMake
1470}
1471
Ivan Lozanod7586b62021-04-01 09:49:36 -04001472func (c *Module) HasLlndkStubs() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001473 lib := moduleVersionedInterface(c)
1474 return lib != nil && lib.HasLLNDKStubs()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001475}
1476
1477func (c *Module) StubsVersion() string {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001478 if lib, ok := c.linker.(VersionedInterface); ok {
1479 return lib.StubsVersion()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001480 }
1481 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1482}
1483
Colin Cross127bb8b2020-12-16 16:46:01 -08001484// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1485// and does not set llndk.vendor_available: false.
1486func (c *Module) isImplementationForLLNDKPublic() bool {
1487 library, _ := c.library.(*libraryDecorator)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001488 return library != nil && library.HasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001489 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001490}
1491
Colin Cross3513fb12024-01-24 14:44:47 -08001492func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001493 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001494 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001495 }
1496 return false
1497}
1498
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001499func (c *Module) isOrderfileCompile() bool {
1500 if orderfile := c.orderfile; orderfile != nil {
1501 return orderfile.Properties.OrderfileLoad
1502 }
1503 return false
1504}
1505
Yi Kongc702ebd2022-08-19 16:02:45 +08001506func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001507 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001508}
1509
Yi Konged79fa32023-06-04 17:15:42 +09001510func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001511 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001512}
1513
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001514func (c *Module) isNDKStubLibrary() bool {
1515 if _, ok := c.compiler.(*stubDecorator); ok {
1516 return true
1517 }
1518 return false
1519}
1520
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001521func (c *Module) SubName() string {
1522 return c.Properties.SubName
1523}
1524
Jiyong Park25fc6a92018-11-18 18:02:45 +09001525func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001526 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001527 return lib.BuildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001528 }
1529 return false
1530}
1531
1532func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001533 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001534 return lib.HasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001535 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001536 return false
1537}
1538
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001539func (c *Module) RustApexExclude() bool {
1540 return false
1541}
1542
Alan Stokes73feba32022-11-14 12:21:24 +00001543func (c *Module) IsStubsImplementationRequired() bool {
1544 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001545 return lib.IsStubsImplementationRequired()
Alan Stokes73feba32022-11-14 12:21:24 +00001546 }
1547 return false
1548}
1549
Colin Cross0477b422020-10-13 18:43:54 -07001550// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1551// the implementation. If it is an implementation library it returns its own name.
1552func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1553 name := ctx.OtherModuleName(c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001554 if versioned, ok := c.linker.(VersionedInterface); ok {
1555 name = versioned.ImplementationModuleName(name)
Colin Cross0477b422020-10-13 18:43:54 -07001556 }
1557 return name
1558}
1559
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001560// Similar to ImplementationModuleNameByCtx, but uses the Make variant of the module
Martin Stjernholm2856c662020-12-02 15:03:42 +00001561// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1562// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1563// under the premise that the prebuilt module overrides its source counterpart
1564// if it is exposed to Make).
1565func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1566 name := c.BaseModuleName()
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001567 if versioned, ok := c.linker.(VersionedInterface); ok {
1568 name = versioned.ImplementationModuleName(name)
Martin Stjernholm2856c662020-12-02 15:03:42 +00001569 }
1570 return name
1571}
1572
Jiyong Park7d55b612021-06-11 17:22:09 +09001573func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001574 return Bool(c.Properties.Bootstrap)
1575}
1576
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001577func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001578 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1579 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1580 return false
1581 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001582 return c.linker != nil && c.linker.nativeCoverage()
1583}
1584
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001585func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001586 if p, ok := c.linker.(SnapshotInterface); ok {
1587 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001588 }
1589 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001590}
1591
Jiyong Parkf1194352019-02-25 11:05:47 +09001592func isBionic(name string) bool {
1593 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001594 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001595 return true
1596 }
1597 return false
1598}
1599
Martin Stjernholm279de572019-09-10 23:18:20 +01001600func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001601 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001602 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001603 }
1604 return isBionic(name)
1605}
1606
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001607func (c *Module) isCfiAssemblySupportEnabled() bool {
1608 return c.sanitize != nil &&
1609 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1610}
1611
Inseob Kim800d1142021-06-14 12:03:51 +09001612func (c *Module) InstallInRoot() bool {
1613 return c.installer != nil && c.installer.installInRoot()
1614}
1615
Colin Crossca860ac2016-01-04 14:34:37 -08001616type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001617 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001618 moduleContextImpl
1619}
1620
Colin Cross37047f12016-12-13 17:06:13 -08001621type depsContext struct {
1622 android.BottomUpMutatorContext
1623 moduleContextImpl
1624}
1625
Colin Crossca860ac2016-01-04 14:34:37 -08001626type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001627 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001628 moduleContextImpl
1629}
1630
1631type moduleContextImpl struct {
1632 mod *Module
1633 ctx BaseModuleContext
1634}
1635
Colin Crossb98c8b02016-07-29 13:44:28 -07001636func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001637 return ctx.mod.toolchain(ctx.ctx)
1638}
1639
1640func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001641 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001642}
1643
1644func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001645 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001646}
1647
Colin Cross6a730042024-12-05 13:53:43 -08001648func (ctx *moduleContextImpl) staticLibrary() bool {
1649 return ctx.mod.staticLibrary()
1650}
1651
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001652func (ctx *moduleContextImpl) testBinary() bool {
1653 return ctx.mod.testBinary()
1654}
1655
Yi Kong56fc1b62022-09-06 16:24:00 +08001656func (ctx *moduleContextImpl) testLibrary() bool {
1657 return ctx.mod.testLibrary()
1658}
1659
Jiyong Park1d1119f2019-07-29 21:27:18 +09001660func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001661 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001662}
1663
Inseob Kim7f283f42020-06-01 21:53:49 +09001664func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001665 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001666}
1667
Inseob Kim1042d292020-06-01 23:23:05 +09001668func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001669 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001670}
1671
Yi Kong5786f5c2024-05-28 02:22:34 +09001672func (ctx *moduleContextImpl) optimizeForSize() bool {
1673 return ctx.mod.OptimizeForSize()
1674}
1675
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001676func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001677 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001678}
1679
1680func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001681 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001682 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001683 }
1684 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001685}
1686
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001687func MinSdkVersion(mod VersionedLinkableInterface, ctxIsForPlatform bool, device bool,
1688 platformSdkVersion string) string {
1689
1690 ver := mod.MinSdkVersion()
1691 if ver == "apex_inherit" && !ctxIsForPlatform {
1692 ver = mod.ApexSdkVersion().String()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001693 }
1694 if ver == "apex_inherit" || ver == "" {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001695 ver = mod.SdkVersion()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001696 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001697
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001698 if device {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001699 // When building for vendor/product, use the latest _stable_ API as "current".
1700 // This is passed to clang/aidl compilers so that compiled/generated code works
1701 // with the system.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001702 if (mod.InVendor() || mod.InProduct()) && (ver == "" || ver == "current") {
1703 ver = platformSdkVersion
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001704 }
1705 }
1706
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001707 // For crt objects, the meaning of min_sdk_version is very different from other types of
1708 // module. For them, min_sdk_version defines the oldest version that the build system will
1709 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1710 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1711 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001712 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1713 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1714 // support such an old version. The version is set to the later version in case when the
1715 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1716 // it's for an APEX.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001717 if mod.IsCrt() && !mod.IsSdkVariant() {
1718 if ctxIsForPlatform {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001719 ver = strconv.Itoa(android.FutureApiLevelInt)
1720 } else { // for apex
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001721 ver = mod.ApexSdkVersion().String()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001722 if ver == "" { // in case when min_sdk_version was not set by the APEX
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001723 ver = mod.SdkVersion()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001724 }
1725 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001726 }
1727
Jiyong Parkb35a8192020-08-10 15:59:36 +09001728 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001729 sdkVersionInt, err := strconv.Atoi(mod.SdkVersion())
Jiyong Parkb35a8192020-08-10 15:59:36 +09001730 minSdkVersionInt, err2 := strconv.Atoi(ver)
1731 if err == nil && err2 == nil {
1732 if sdkVersionInt < minSdkVersionInt {
1733 return strconv.Itoa(sdkVersionInt)
1734 }
1735 }
1736 return ver
1737}
1738
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001739func (ctx *moduleContextImpl) minSdkVersion() string {
1740 platformSdkVersion := ""
1741 if ctx.ctx.Device() {
1742 platformSdkVersion = ctx.ctx.Config().PlatformSdkVersion().String()
1743 }
1744 return MinSdkVersion(ctx.mod, CtxIsForPlatform(ctx.ctx), ctx.ctx.Device(), platformSdkVersion)
1745}
1746
Jiyong Parkb35a8192020-08-10 15:59:36 +09001747func (ctx *moduleContextImpl) isSdkVariant() bool {
1748 return ctx.mod.IsSdkVariant()
1749}
1750
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001751func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001752 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001753}
Justin Yun8effde42017-06-23 19:24:43 +09001754
Kiyoung Kimaa394802024-01-08 12:55:45 +09001755func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1756 return ctx.mod.InVendorOrProduct()
1757}
1758
Colin Cross95f1ca02020-10-29 20:47:22 -07001759func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1760 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001761}
1762
Colin Cross127bb8b2020-12-16 16:46:01 -08001763func (ctx *moduleContextImpl) IsLlndk() bool {
1764 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001765}
1766
Colin Cross127bb8b2020-12-16 16:46:01 -08001767func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1768 return ctx.mod.isImplementationForLLNDKPublic()
1769}
1770
Colin Cross3513fb12024-01-24 14:44:47 -08001771func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1772 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001773}
1774
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001775func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1776 return ctx.mod.isOrderfileCompile()
1777}
1778
Yi Kongc702ebd2022-08-19 16:02:45 +08001779func (ctx *moduleContextImpl) isCfi() bool {
1780 return ctx.mod.isCfi()
1781}
1782
Yi Konged79fa32023-06-04 17:15:42 +09001783func (ctx *moduleContextImpl) isFuzzer() bool {
1784 return ctx.mod.isFuzzer()
1785}
1786
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001787func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1788 return ctx.mod.isNDKStubLibrary()
1789}
1790
Colin Cross5271fea2021-04-27 13:06:04 -07001791func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1792 return ctx.mod.IsVendorPublicLibrary()
1793}
1794
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001795func (ctx *moduleContextImpl) selectedStl() string {
1796 if stl := ctx.mod.stl; stl != nil {
1797 return stl.Properties.SelectedStl
1798 }
1799 return ""
1800}
1801
Ivan Lozanobd721262018-11-27 14:33:03 -08001802func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1803 return ctx.mod.linker.useClangLld(actx)
1804}
1805
Colin Crossce75d2c2016-10-06 16:12:58 -07001806func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001807 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001808}
1809
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001810func CtxIsForPlatform(ctx android.BaseModuleContext) bool {
1811 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Colin Crossff694a82023-12-13 15:54:49 -08001812 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001813}
1814
Colin Crosse07f2312020-08-13 11:24:56 -07001815func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001816 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1817 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001818}
1819
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001820func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001821 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001822}
1823
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001824func (ctx *moduleContextImpl) nativeCoverage() bool {
1825 return ctx.mod.nativeCoverage()
1826}
1827
Colin Cross95b07f22020-12-16 11:06:50 -08001828func (ctx *moduleContextImpl) isPreventInstall() bool {
1829 return ctx.mod.Properties.PreventInstall
1830}
1831
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001832func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1833 shared := &ctx.mod.sharedFlags
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001834 if shared.FlagsMap == nil {
1835 shared.NumSharedFlags = 0
1836 shared.FlagsMap = make(map[string]string)
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001837 }
1838 return shared
1839}
1840
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001841func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1842 return ctx.mod.isCfiAssemblySupportEnabled()
1843}
1844
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001845func (ctx *moduleContextImpl) notInPlatform() bool {
1846 return ctx.mod.NotInPlatform()
1847}
1848
Yu Liu76d94462024-10-31 23:32:36 +00001849func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1850 if ctx.mod.makeVarsInfo == nil {
1851 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1852 }
1853 return ctx.mod.makeVarsInfo
1854}
1855
Colin Cross635c3b02016-05-18 15:37:25 -07001856func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001857 return &Module{
1858 hod: hod,
1859 multilib: multilib,
1860 }
1861}
1862
Colin Cross635c3b02016-05-18 15:37:25 -07001863func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001864 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001865 module.features = []feature{
1866 &tidyFeature{},
1867 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001868 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001869 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001870 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001871 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001872 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001873 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001874 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001875 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001876 return module
1877}
1878
Colin Crossce75d2c2016-10-06 16:12:58 -07001879func (c *Module) Prebuilt() *android.Prebuilt {
1880 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1881 return p.prebuilt()
1882 }
1883 return nil
1884}
1885
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001886func (c *Module) IsPrebuilt() bool {
1887 return c.Prebuilt() != nil
1888}
1889
Colin Crossce75d2c2016-10-06 16:12:58 -07001890func (c *Module) Name() string {
1891 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001892 if p, ok := c.linker.(interface {
1893 Name(string) string
1894 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001895 name = p.Name(name)
1896 }
1897 return name
1898}
1899
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001900func (c *Module) Multilib() string {
1901 return c.Arch().ArchType.Multilib
1902}
1903
1904func (c *Module) ApexSdkVersion() android.ApiLevel {
1905 return c.apexSdkVersion
1906}
1907
Alex Light3d673592019-01-18 14:37:31 -08001908func (c *Module) Symlinks() []string {
1909 if p, ok := c.installer.(interface {
1910 symlinkList() []string
1911 }); ok {
1912 return p.symlinkList()
1913 }
1914 return nil
1915}
1916
Chris Parsons216e10a2020-07-09 17:12:52 -04001917func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001918 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001919 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001920 }); ok {
1921 return p.dataPaths()
1922 }
1923 return nil
1924}
1925
Ivan Lozanof1868af2022-04-12 13:08:36 -04001926func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001927 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1928 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001929 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001930 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001931 if c.ProductSpecific() {
1932 // If the module is product specific with 'product_specific: true',
1933 // do not add a name suffix because it is a base module.
1934 return ""
1935 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001936 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001937 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001938 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001939 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001940 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001941 // add version suffix only if the module is using different vndk version than the
1942 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001943 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001944 }
1945 return nameSuffix
1946}
1947
Ivan Lozanof1868af2022-04-12 13:08:36 -04001948func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1949 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001950
1951 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001952 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001953 }
1954
Colin Cross127bb8b2020-12-16 16:46:01 -08001955 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001956 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001957 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1958 // added for product variant only when we have vendor and product variants with core
1959 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001960 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001961 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001962 subName += vendorPublicLibrarySuffix
1963 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001964 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1965 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001966 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001967 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001968 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001969 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001970 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001971 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001972 subName += RecoverySuffix
1973 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1974 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001975 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001976 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001977 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001978 } else if c.IsStubs() && c.IsSdkVariant() {
1979 // Public API surface (NDK)
1980 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1981 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001982 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001983
1984 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001985}
1986
Sam Delmerico75dbca22023-04-20 13:13:25 +00001987func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1988 ctx := &moduleContext{
1989 ModuleContext: actx,
1990 moduleContextImpl: moduleContextImpl{
1991 mod: c,
1992 },
1993 }
1994 ctx.ctx = ctx
1995 return ctx
1996}
1997
Spandan Das20fce2d2023-04-12 17:21:39 +00001998// TODO (b/277651159): Remove this allowlist
1999var (
2000 skipStubLibraryMultipleApexViolation = map[string]bool{
2001 "libclang_rt.asan": true,
2002 "libclang_rt.hwasan": true,
2003 // runtime apex
2004 "libc": true,
2005 "libc_hwasan": true,
2006 "libdl_android": true,
2007 "libm": true,
2008 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00002009 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00002010 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01002011 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00002012 "libandroidio": true,
2013 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01002014 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00002015 "libnativebridge": true,
2016 "libnativehelper": true,
2017 "libnativeloader": true,
2018 "libsigchain": true,
2019 }
2020)
2021
2022// Returns true if a stub library could be installed in multiple apexes
2023func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2024 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08002025 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00002026 return false
2027 }
2028 // If this is not a stub library, no check necessary
2029 if !c.HasStubsVariants() {
2030 return false
2031 }
2032 // Skip the allowlist
2033 // Use BaseModuleName so that this matches prebuilts.
2034 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2035 return false
2036 }
2037
Spandan Das20fce2d2023-04-12 17:21:39 +00002038 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08002039 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
2040 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00002041 return true
2042 }
2043 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08002044 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00002045 return true
2046 }
2047 // Default: no violation
2048 return false
2049}
2050
Chris Parsons8d6e4332021-02-22 16:13:50 -05002051func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002052 ctx := moduleContextFromAndroidModuleContext(actx, c)
2053
Inseob Kim37e0bb02024-04-29 15:54:44 +09002054 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2055 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2056 Logtags: c.logtagsPaths,
2057 })
2058
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002059 // If Test_only is set on a module in bp file, respect the setting, otherwise
2060 // see if is a known test module type.
2061 testOnly := c.testModule || c.testLibrary()
2062 if c.sourceProperties.Test_only != nil {
2063 testOnly = Bool(c.sourceProperties.Test_only)
2064 }
2065 // Keep before any early returns.
2066 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2067 TestOnly: testOnly,
2068 TopLevelTarget: c.testModule,
2069 })
2070
Ivan Lozanof1868af2022-04-12 13:08:36 -04002071 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002072 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002073 if !apexInfo.IsForPlatform() {
2074 c.hideApexVariantFromMake = true
2075 }
2076
Chris Parsonseefc9e62021-04-02 17:36:47 -04002077 c.makeLinkType = GetMakeLinkType(actx, c)
2078
Colin Crossf18e1102017-11-16 14:33:08 -08002079 deps := c.depsToPaths(ctx)
2080 if ctx.Failed() {
2081 return
2082 }
2083
Joe Onorato37f900c2023-07-18 16:58:16 -07002084 for _, generator := range c.generators {
2085 gen := generator.GeneratorSources(ctx)
2086 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2087 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2088 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2089 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2090 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2091 if len(deps.Objs.objFiles) == 0 {
2092 // If we are reusuing object files (which happens when we're a shared library and we're
2093 // reusing our static variant's object files), then skip adding the actual source files,
2094 // because we already have the object for it.
2095 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2096 }
2097 }
2098
2099 if ctx.Failed() {
2100 return
2101 }
2102
Spandan Das20fce2d2023-04-12 17:21:39 +00002103 if c.stubLibraryMultipleApexViolation(actx) {
2104 actx.PropertyErrorf("apex_available",
2105 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2106 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002107 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2108 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002109 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2110 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002111 }
2112
Colin Crossca860ac2016-01-04 14:34:37 -08002113 flags := Flags{
2114 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002115 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002116 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002117 for _, generator := range c.generators {
2118 flags = generator.GeneratorFlags(ctx, flags, deps)
2119 }
Colin Crossca860ac2016-01-04 14:34:37 -08002120 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002121 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002122 }
2123 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002124 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002125 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002126 if c.stl != nil {
2127 flags = c.stl.flags(ctx, flags)
2128 }
Colin Cross16b23492016-01-06 14:41:07 -08002129 if c.sanitize != nil {
2130 flags = c.sanitize.flags(ctx, flags)
2131 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002132 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002133 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002134 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002135 if c.fuzzer != nil {
2136 flags = c.fuzzer.flags(ctx, flags)
2137 }
Stephen Craneba090d12017-05-09 15:44:35 -07002138 if c.lto != nil {
2139 flags = c.lto.flags(ctx, flags)
2140 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002141 if c.afdo != nil {
2142 flags = c.afdo.flags(ctx, flags)
2143 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002144 if c.orderfile != nil {
2145 flags = c.orderfile.flags(ctx, flags)
2146 }
Colin Crossca860ac2016-01-04 14:34:37 -08002147 for _, feature := range c.features {
2148 flags = feature.flags(ctx, flags)
2149 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002150 if ctx.Failed() {
2151 return
2152 }
2153
Colin Cross4af21ed2019-11-04 09:37:55 -08002154 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2155 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2156 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002157
Colin Cross4af21ed2019-11-04 09:37:55 -08002158 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002159
2160 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002161 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002162 }
2163 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002164 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002165 }
2166
Colin Cross3e5e7782022-06-17 22:17:05 +00002167 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2168
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002169 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002170 // We need access to all the flags seen by a source file.
2171 if c.sabi != nil {
2172 flags = c.sabi.flags(ctx, flags)
2173 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002174
Colin Cross4af21ed2019-11-04 09:37:55 -08002175 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002176
Joe Onorato37f900c2023-07-18 16:58:16 -07002177 for _, generator := range c.generators {
2178 generator.GeneratorBuildActions(ctx, flags, deps)
2179 }
2180
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002181 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002182 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002183 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002184 if ctx.Failed() {
2185 return
2186 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002187 }
2188
Colin Crossca860ac2016-01-04 14:34:37 -08002189 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002190 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002191 if ctx.Failed() {
2192 return
2193 }
Colin Cross635c3b02016-05-18 15:37:25 -07002194 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002195
Chris Parsons94a0bba2021-06-04 15:03:47 -04002196 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002197
2198 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2199 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2200 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002201 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002202
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002203 if Bool(c.Properties.Cmake_snapshot_supported) {
2204 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2205 }
2206
Chris Parsons94a0bba2021-06-04 15:03:47 -04002207 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002208
2209 if c.linker != nil {
2210 moduleInfoJSON := ctx.ModuleInfoJSON()
2211 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2212 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2213 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2214 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2215 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2216
2217 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2218 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2219 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2220 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2221
2222 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2223 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2224 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2225 moduleInfoJSON.SubName += ".cfi"
2226 }
2227 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2228 moduleInfoJSON.SubName += ".hwasan"
2229 }
2230 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2231 moduleInfoJSON.SubName += ".scs"
2232 }
2233 }
2234 moduleInfoJSON.SubName += c.Properties.SubName
2235
2236 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2237 moduleInfoJSON.Uninstallable = true
2238 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002239 }
Wei Lia1aa2972024-06-21 13:08:51 -07002240
2241 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002242
Cole Faust96a692b2024-08-08 14:47:51 -07002243 if b, ok := c.compiler.(*baseCompiler); ok {
2244 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2245 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2246 c.hasProto = b.hasSrcExt(ctx, ".proto")
2247 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2248 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2249 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2250 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2251 }
2252
Yu Liuec7043d2024-11-05 18:22:20 +00002253 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002254 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002255 }
2256 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002257 ccObjectInfo.ObjFiles = objs.objFiles
2258 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002259 }
Yu Liu4f825132024-12-18 00:35:39 +00002260 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002261 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2262 }
2263
Yu Liu8024b922024-12-20 23:31:32 +00002264 linkableInfo := CreateCommonLinkableInfo(c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002265 if lib, ok := c.linker.(VersionedInterface); ok {
2266 linkableInfo.StubsVersion = lib.StubsVersion()
Yu Liu8024b922024-12-20 23:31:32 +00002267 }
2268 if c.linker != nil {
2269 if library, ok := c.linker.(libraryInterface); ok {
2270 linkableInfo.Static = library.static()
Yu Liu8a8d5b42025-01-07 00:48:08 +00002271 linkableInfo.Shared = library.shared()
Yu Liu8024b922024-12-20 23:31:32 +00002272 linkableInfo.CoverageFiles = library.objs().coverageFiles
2273 linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles
2274 }
2275 }
2276 android.SetProvider(ctx, LinkableInfoProvider, linkableInfo)
Yu Liu986d98c2024-11-12 00:28:11 +00002277
Yu Liu323d77a2024-12-16 23:13:57 +00002278 ccInfo := CcInfo{
Yu Liu323d77a2024-12-16 23:13:57 +00002279 IsPrebuilt: c.IsPrebuilt(),
2280 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
Yu Liu68a70b72025-01-08 22:54:44 +00002281 HasLlndkStubs: c.HasLlndkStubs(),
Yu Liu323d77a2024-12-16 23:13:57 +00002282 }
2283 if c.compiler != nil {
2284 ccInfo.CompilerInfo = &CompilerInfo{
2285 Srcs: c.compiler.(CompiledInterface).Srcs(),
2286 Cflags: c.compiler.baseCompilerProps().Cflags,
2287 AidlInterfaceInfo: AidlInterfaceInfo{
2288 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2289 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2290 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2291 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2292 },
2293 }
2294 switch decorator := c.compiler.(type) {
2295 case *libraryDecorator:
2296 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002297 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs,
Yu Liu323d77a2024-12-16 23:13:57 +00002298 }
2299 }
2300 }
2301 if c.linker != nil {
2302 ccInfo.LinkerInfo = &LinkerInfo{
Yu Liu8024b922024-12-20 23:31:32 +00002303 WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs,
2304 StaticLibs: c.linker.baseLinkerProps().Static_libs,
2305 SharedLibs: c.linker.baseLinkerProps().Shared_libs,
2306 HeaderLibs: c.linker.baseLinkerProps().Header_libs,
Yu Liu323d77a2024-12-16 23:13:57 +00002307 }
2308 switch decorator := c.linker.(type) {
2309 case *binaryDecorator:
2310 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2311 case *libraryDecorator:
Yu Liu116610a2025-01-06 21:54:48 +00002312 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
2313 InjectBsslHash: Bool(c.linker.(*libraryDecorator).Properties.Inject_bssl_hash),
2314 }
Yu Liu323d77a2024-12-16 23:13:57 +00002315 case *testBinary:
2316 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2317 Gtest: decorator.testDecorator.gtest(),
2318 }
2319 case *benchmarkDecorator:
2320 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2321 case *objectLinker:
2322 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{}
Yu Liu8a8d5b42025-01-07 00:48:08 +00002323 case *stubDecorator:
2324 ccInfo.LinkerInfo.StubDecoratorInfo = &StubDecoratorInfo{}
Yu Liu323d77a2024-12-16 23:13:57 +00002325 }
Yu Liu8024b922024-12-20 23:31:32 +00002326
2327 if s, ok := c.linker.(SnapshotInterface); ok {
2328 ccInfo.SnapshotInfo = &SnapshotInfo{
2329 SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(),
2330 }
Yu Liuffe86322024-12-18 18:53:12 +00002331 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002332 if v, ok := c.linker.(VersionedInterface); ok {
2333 name := v.ImplementationModuleName(ctx.OtherModuleName(c))
Yu Liu68a70b72025-01-08 22:54:44 +00002334 ccInfo.LinkerInfo.ImplementationModuleName = &name
2335 }
Yu Liuffe86322024-12-18 18:53:12 +00002336 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002337 if c.library != nil {
2338 ccInfo.LibraryInfo = &LibraryInfo{
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002339 BuildStubs: c.library.BuildStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002340 }
2341 }
Yu Liu8024b922024-12-20 23:31:32 +00002342 android.SetProvider(ctx, CcInfoProvider, &ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002343
mrziwangabdb2932024-06-18 12:43:41 -07002344 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002345
2346 if c.makeVarsInfo != nil {
2347 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2348 }
mrziwangabdb2932024-06-18 12:43:41 -07002349}
2350
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002351func CreateCommonLinkableInfo(mod VersionedLinkableInterface) *LinkableInfo {
Yu Liu8024b922024-12-20 23:31:32 +00002352 return &LinkableInfo{
2353 StaticExecutable: mod.StaticExecutable(),
2354 HasStubsVariants: mod.HasStubsVariants(),
2355 OutputFile: mod.OutputFile(),
2356 UnstrippedOutputFile: mod.UnstrippedOutputFile(),
2357 IsStubs: mod.IsStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002358 CcLibrary: mod.CcLibrary(),
Yu Liu8024b922024-12-20 23:31:32 +00002359 CcLibraryInterface: mod.CcLibraryInterface(),
2360 RustLibraryInterface: mod.RustLibraryInterface(),
2361 BaseModuleName: mod.BaseModuleName(),
2362 IsLlndk: mod.IsLlndk(),
2363 HasNonSystemVariants: mod.HasNonSystemVariants(),
2364 SubName: mod.SubName(),
2365 InVendorOrProduct: mod.InVendorOrProduct(),
2366 InRamdisk: mod.InRamdisk(),
2367 OnlyInRamdisk: mod.OnlyInRamdisk(),
2368 InVendorRamdisk: mod.InVendorRamdisk(),
2369 OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(),
2370 InRecovery: mod.InRecovery(),
2371 OnlyInRecovery: mod.OnlyInRecovery(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002372 Installable: mod.Installable(),
Yu Liu97880e12025-01-07 19:03:34 +00002373 RelativeInstallPath: mod.RelativeInstallPath(),
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002374 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
2375 RustApexExclude: mod.RustApexExclude(),
Yu Liu8024b922024-12-20 23:31:32 +00002376 }
2377}
2378
Yu Liuec7043d2024-11-05 18:22:20 +00002379func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2380 if len(files) > 0 {
2381 ctx.SetOutputFiles(files, tag)
2382 }
2383}
2384
mrziwangabdb2932024-06-18 12:43:41 -07002385func (c *Module) setOutputFiles(ctx ModuleContext) {
2386 if c.outputFile.Valid() {
2387 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2388 } else {
2389 ctx.SetOutputFiles(android.Paths{}, "")
2390 }
2391 if c.linker != nil {
2392 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2393 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2394 }
Wei Lia1aa2972024-06-21 13:08:51 -07002395}
2396
2397func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2398 // Dump metadata that can not be done in android/compliance-metadata.go
2399 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
2400 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static()))
2401 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2402
2403 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002404 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002405 staticDepNames := make([]string, 0, len(staticDeps))
2406 for _, dep := range staticDeps {
2407 staticDepNames = append(staticDepNames, dep.Name())
2408 }
2409
2410 staticDepPaths := make([]string, 0, len(deps.StaticLibs))
2411 for _, dep := range deps.StaticLibs {
2412 staticDepPaths = append(staticDepPaths, dep.String())
2413 }
2414 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2415 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2416
2417 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002418 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002419 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2420 for _, dep := range wholeStaticDeps {
2421 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2422 }
2423
2424 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2425 for _, dep := range deps.WholeStaticLibs {
2426 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2427 }
2428 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2429 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002430}
2431
2432func (c *Module) maybeUnhideFromMake() {
2433 // If a lib is directly included in any of the APEXes or is not available to the
2434 // platform (which is often the case when the stub is provided as a prebuilt),
2435 // unhide the stubs variant having the latest version gets visible to make. In
2436 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2437 // force anything in the make world to link against the stubs library. (unless it
2438 // is explicitly referenced via .bootstrap suffix or the module is marked with
2439 // 'bootstrap: true').
2440 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002441 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002442 c.IsStubs() && !c.InVendorRamdisk() {
2443 c.Properties.HideFromMake = false // unhide
2444 // Note: this is still non-installable
2445 }
2446}
2447
Colin Cross8ff10582023-12-07 13:10:56 -08002448// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2449// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002450func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002451 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002452 // If the module has been specifically configure to not be installed then
2453 // hide from make as otherwise it will break when running inside make
2454 // as the output path to install will not be specified. Not all uninstallable
2455 // modules can be hidden from make as some are needed for resolving make side
2456 // dependencies.
2457 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002458 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002459 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002460 c.SkipInstall()
2461 }
2462
2463 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2464 // to allow using the outputs in a genrule.
2465 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002466 c.installer.install(ctx, c.outputFile.Path())
2467 if ctx.Failed() {
2468 return
Colin Crossca860ac2016-01-04 14:34:37 -08002469 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002470 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002471}
2472
Colin Cross0ea8ba82019-06-06 14:33:29 -07002473func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002474 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002475 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002476 }
Colin Crossca860ac2016-01-04 14:34:37 -08002477 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002478}
2479
Colin Crossca860ac2016-01-04 14:34:37 -08002480func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002481 for _, generator := range c.generators {
2482 generator.GeneratorInit(ctx)
2483 }
Colin Crossca860ac2016-01-04 14:34:37 -08002484 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002485 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002486 }
Colin Crossca860ac2016-01-04 14:34:37 -08002487 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002488 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002489 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002490 if c.stl != nil {
2491 c.stl.begin(ctx)
2492 }
Colin Cross16b23492016-01-06 14:41:07 -08002493 if c.sanitize != nil {
2494 c.sanitize.begin(ctx)
2495 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002496 if c.coverage != nil {
2497 c.coverage.begin(ctx)
2498 }
Yi Kong9723e332023-12-04 14:52:53 +09002499 if c.afdo != nil {
2500 c.afdo.begin(ctx)
2501 }
Stephen Craneba090d12017-05-09 15:44:35 -07002502 if c.lto != nil {
2503 c.lto.begin(ctx)
2504 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002505 if c.orderfile != nil {
2506 c.orderfile.begin(ctx)
2507 }
Dan Albert92fe7402020-07-15 13:33:30 -07002508 if ctx.useSdk() && c.IsSdkVariant() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002509 version, err := NativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002510 if err != nil {
2511 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002512 c.Properties.Sdk_version = nil
2513 } else {
2514 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002515 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002516 }
Colin Crossca860ac2016-01-04 14:34:37 -08002517}
2518
Colin Cross37047f12016-12-13 17:06:13 -08002519func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002520 deps := Deps{}
2521
Joe Onorato37f900c2023-07-18 16:58:16 -07002522 for _, generator := range c.generators {
2523 deps = generator.GeneratorDeps(ctx, deps)
2524 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002525 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002526 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002527 }
2528 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002529 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002530 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002531 if c.stl != nil {
2532 deps = c.stl.deps(ctx, deps)
2533 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002534 if c.coverage != nil {
2535 deps = c.coverage.deps(ctx, deps)
2536 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002537
Colin Crossb6715442017-10-24 11:13:31 -07002538 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2539 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2540 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2541 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2542 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2543 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002544 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002545 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002546
Colin Cross516c5452024-10-28 13:45:21 -07002547 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2548 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2549 }
2550
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002551 for _, lib := range deps.ReexportSharedLibHeaders {
2552 if !inList(lib, deps.SharedLibs) {
2553 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2554 }
2555 }
2556
2557 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002558 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2559 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 -07002560 }
2561 }
2562
Colin Cross5950f382016-12-13 12:50:57 -08002563 for _, lib := range deps.ReexportHeaderLibHeaders {
2564 if !inList(lib, deps.HeaderLibs) {
2565 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2566 }
2567 }
2568
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002569 for _, gen := range deps.ReexportGeneratedHeaders {
2570 if !inList(gen, deps.GeneratedHeaders) {
2571 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2572 }
2573 }
2574
Colin Crossc99deeb2016-04-11 15:06:20 -07002575 return deps
2576}
2577
Colin Cross516c5452024-10-28 13:45:21 -07002578func checkConflictingExplicitVersions(libs []string) error {
2579 withoutVersion := func(s string) string {
2580 name, _ := StubsLibNameAndVersion(s)
2581 return name
2582 }
2583 var errs []error
2584 for i, lib := range libs {
2585 libName := withoutVersion(lib)
2586 libsToCompare := libs[i+1:]
2587 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2588 return withoutVersion(s) == libName
2589 })
2590 if j >= 0 {
2591 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2592 lib, libsToCompare[j]))
2593 }
2594 }
2595 return errors.Join(errs...)
2596}
2597
Dan Albert7e9d2952016-08-04 13:02:36 -07002598func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002599 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002600 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002601 moduleContextImpl: moduleContextImpl{
2602 mod: c,
2603 },
2604 }
2605 ctx.ctx = ctx
2606
Colin Crossca860ac2016-01-04 14:34:37 -08002607 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002608}
2609
Jiyong Park7ed9de32018-10-15 22:25:07 +09002610// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002611func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002612 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2613 version := name[sharp+1:]
2614 libname := name[:sharp]
2615 return libname, version
2616 }
2617 return name, ""
2618}
2619
Dan Albert92fe7402020-07-15 13:33:30 -07002620func GetCrtVariations(ctx android.BottomUpMutatorContext,
2621 m LinkableInterface) []blueprint.Variation {
2622 if ctx.Os() != android.Android {
2623 return nil
2624 }
2625 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002626 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2627 minSdkVersion := m.MinSdkVersion()
2628 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2629 minSdkVersion = m.SdkVersion()
2630 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002631 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2632 if err != nil {
2633 ctx.PropertyErrorf("min_sdk_version", err.Error())
2634 }
Colin Cross363ec762023-01-13 13:45:14 -08002635
2636 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002637 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002638 if apiLevel.LessThan(minApiForArch) {
2639 apiLevel = minApiForArch
2640 }
2641
Dan Albert92fe7402020-07-15 13:33:30 -07002642 return []blueprint.Variation{
2643 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002644 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002645 }
2646 }
2647 return []blueprint.Variation{
2648 {Mutator: "sdk", Variation: ""},
2649 }
2650}
2651
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002652func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2653 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002654
2655 variations = append([]blueprint.Variation(nil), variations...)
2656
Liz Kammer23942242022-04-08 15:41:00 -04002657 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002658 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002659 if version == "impl" {
2660 version = ""
2661 }
Colin Crosse7257d22020-09-24 09:56:18 -07002662 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002663 if tag, ok := depTag.(libraryDependencyTag); ok {
2664 tag.explicitlyVersioned = true
Colin Crossafcdce82024-10-22 13:59:33 -07002665 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2666 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2667 // the modified copy to depTag.
2668 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002669 } else {
2670 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2671 }
Colin Crosse7257d22020-09-24 09:56:18 -07002672 }
Colin Crosse7257d22020-09-24 09:56:18 -07002673
Colin Cross0de8a1e2020-09-18 14:15:30 -07002674 if far {
2675 ctx.AddFarVariationDependencies(variations, depTag, name)
2676 } else {
2677 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002678 }
2679}
2680
Kiyoung Kim487689e2022-07-26 09:48:22 +09002681func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2682 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002683 return snapshot
2684 }
2685
2686 return lib
2687}
2688
Kiyoung Kim37693d02024-04-04 09:56:15 +09002689// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002690// of names:
2691//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002692// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002693//
2694// For each of these, it adds the name of the ndk_library module to the list of
2695// variant libs.
2696//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002697// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002698//
2699// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002700//
2701// The caller can then know to add the variantLibs dependencies differently from the
2702// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002703func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002704 variantLibs = []string{}
2705
2706 nonvariantLibs = []string{}
2707 for _, entry := range list {
2708 // strip #version suffix out
2709 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002710 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002711 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002712 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002713 nonvariantLibs = append(nonvariantLibs, entry)
2714 }
2715 }
2716 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002717
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002718}
2719
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002720func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2721 nonVariantLibs := []string{}
2722 variantLibs := []string{}
2723
2724 for _, lib := range libs {
2725 replaceLibName := GetReplaceModuleName(lib, replaceList)
2726 if replaceLibName == lib {
2727 // Do not handle any libs which are not in API imports
2728 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2729 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2730 variantLibs = append(variantLibs, replaceLibName)
2731 } else {
2732 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2733 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002734 }
2735
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002736 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002737}
2738
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002739func (c *Module) shouldUseApiSurface() bool {
2740 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2741 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2742 // LLNDK Variant
2743 return true
2744 }
2745
2746 if c.Properties.IsSdkVariant {
2747 // NDK Variant
2748 return true
2749 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002750 }
2751
2752 return false
2753}
2754
Colin Cross1e676be2016-10-12 14:38:15 -07002755func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002756 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002757 return
2758 }
2759
Colin Cross37047f12016-12-13 17:06:13 -08002760 ctx := &depsContext{
2761 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002762 moduleContextImpl: moduleContextImpl{
2763 mod: c,
2764 },
2765 }
2766 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002767
Colin Crossc99deeb2016-04-11 15:06:20 -07002768 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002769
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002770 apiNdkLibs := []string{}
2771 apiLateNdkLibs := []string{}
2772
Yo Chiang219968c2020-09-22 18:45:04 +08002773 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2774
Dan Albert914449f2016-06-17 16:45:24 -07002775 variantNdkLibs := []string{}
2776 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002777 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002778 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2779 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2780 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002781 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002782
Colin Cross32ec36c2016-12-15 07:39:51 -08002783 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002784 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002785 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002786 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002787 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002788
Spandan Das73bcafc2022-08-18 23:26:00 +00002789 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002790 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2791 if variationExists {
2792 actx.AddVariationDependencies(nil, depTag, lib)
2793 } else {
2794 // dependencies to ndk_headers fall here as ndk_headers do not have
2795 // any variants.
2796 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2797 }
Spandan Dasff665182024-09-11 18:48:44 +00002798 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002799 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002800 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002801 } else {
2802 actx.AddVariationDependencies(nil, depTag, lib)
2803 }
2804 }
2805
Dan Albertf1d14c72020-07-30 14:32:55 -07002806 if c.isNDKStubLibrary() {
2807 // NDK stubs depend on their implementation because the ABI dumps are
2808 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002809
Spandan Das8b08aea2023-03-14 19:29:34 +00002810 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2811 c.ImageVariation(),
2812 blueprint.Variation{Mutator: "link", Variation: "shared"},
2813 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002814 }
2815
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002816 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2817 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2818 c.Target().NativeBridge == android.NativeBridgeDisabled {
2819 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002820 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002821 llndkHeaderLibTag,
2822 deps.LlndkHeaderLibs...)
2823 }
2824
Jiyong Park5d1598f2019-02-25 22:14:17 +09002825 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002826 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002827
Jiyong Park5d1598f2019-02-25 22:14:17 +09002828 actx.AddVariationDependencies([]blueprint.Variation{
2829 {Mutator: "link", Variation: "static"},
2830 }, depTag, lib)
2831 }
2832
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002833 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002834 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002835 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002836
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002837 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002838 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002839 }
Jiyong Parke3867542020-12-03 17:28:25 +09002840 if inList(lib, deps.ExcludeLibsForApex) {
2841 depTag.excludeInApex = true
2842 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002843 actx.AddVariationDependencies([]blueprint.Variation{
2844 {Mutator: "link", Variation: "static"},
2845 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002846 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002847
Jooyung Han75568392020-03-20 04:29:24 +09002848 // staticUnwinderDep is treated as staticDep for Q apexes
2849 // so that native libraries/binaries are linked with static unwinder
2850 // because Q libc doesn't have unwinder APIs
2851 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002852 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002853 actx.AddVariationDependencies([]blueprint.Variation{
2854 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002855 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002856 }
2857
Jiyong Park7ed9de32018-10-15 22:25:07 +09002858 // shared lib names without the #version suffix
2859 var sharedLibNames []string
2860
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002861 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002862 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002863 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002864 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002865 }
Jiyong Parke3867542020-12-03 17:28:25 +09002866 if inList(lib, deps.ExcludeLibsForApex) {
2867 depTag.excludeInApex = true
2868 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002869 if inList(lib, deps.ExcludeLibsForNonApex) {
2870 depTag.excludeInNonApex = true
2871 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002872
Jiyong Park73c54ee2019-10-22 20:31:18 +09002873 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002874 sharedLibNames = append(sharedLibNames, name)
2875
Colin Crosse7257d22020-09-24 09:56:18 -07002876 variations := []blueprint.Variation{
2877 {Mutator: "link", Variation: "shared"},
2878 }
Spandan Dasff665182024-09-11 18:48:44 +00002879 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002880 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002881
Colin Crossfe9acfe2021-06-14 16:13:03 -07002882 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002883 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002884 actx.AddVariationDependencies([]blueprint.Variation{
2885 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002886 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002887 }
2888
Colin Cross3e5e7782022-06-17 22:17:05 +00002889 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002890 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002891 actx.AddVariationDependencies([]blueprint.Variation{
2892 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002893 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002894 }
2895
Jiyong Park7ed9de32018-10-15 22:25:07 +09002896 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002897 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002898 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2899 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2900 // linking against both the stubs lib and the non-stubs lib at the same time.
2901 continue
2902 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002903 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002904 variations := []blueprint.Variation{
2905 {Mutator: "link", Variation: "shared"},
2906 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002907 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002908 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002909
Dan Willemsen59339a22018-07-22 21:18:45 -07002910 actx.AddVariationDependencies([]blueprint.Variation{
2911 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002912 }, dataLibDepTag, deps.DataLibs...)
2913
Colin Crossc8caa062021-09-24 16:50:14 -07002914 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2915
Chris Parsons79d66a52020-06-05 17:26:16 -04002916 actx.AddVariationDependencies([]blueprint.Variation{
2917 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002918 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002919
Colin Cross68861832016-07-08 10:41:41 -07002920 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002921
2922 for _, gen := range deps.GeneratedHeaders {
2923 depTag := genHeaderDepTag
2924 if inList(gen, deps.ReexportGeneratedHeaders) {
2925 depTag = genHeaderExportDepTag
2926 }
2927 actx.AddDependency(c, depTag, gen)
2928 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002929
Cole Faust65cb40a2024-10-21 15:41:42 -07002930 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2931 depTag := genHeaderDepTag
2932 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2933 }
2934
Dan Albert92fe7402020-07-15 13:33:30 -07002935 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002936 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002937 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002938 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002939 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002940 }
Colin Crossc465efd2021-06-11 18:00:04 -07002941 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002942 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002943 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002944 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002945 if deps.DynamicLinker != "" {
2946 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002947 }
Dan Albert914449f2016-06-17 16:45:24 -07002948
2949 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002950
Colin Cross8acea3e2024-12-12 14:53:30 -08002951 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002952 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002953 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002954 {Mutator: "link", Variation: "shared"},
2955 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002956 actx.AddVariationDependencies([]blueprint.Variation{
2957 {Mutator: "version", Variation: version},
2958 {Mutator: "link", Variation: "shared"},
2959 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002960
Colin Cross8acea3e2024-12-12 14:53:30 -08002961 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002962 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002963 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002964 {Mutator: "link", Variation: "shared"},
2965 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002966 actx.AddVariationDependencies([]blueprint.Variation{
2967 {Mutator: "version", Variation: version},
2968 {Mutator: "link", Variation: "shared"},
2969 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002970
Vinh Tran367d89d2023-04-28 11:21:25 -04002971 if len(deps.AidlLibs) > 0 {
2972 actx.AddDependency(
2973 c,
2974 aidlLibraryTag,
2975 deps.AidlLibs...,
2976 )
2977 }
2978
Colin Cross6362e272015-10-29 15:25:03 -07002979}
Colin Cross21b9a242015-03-24 14:15:58 -07002980
Colin Crosse40b4ea2018-10-02 22:25:58 -07002981func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002982 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002983 c.beginMutator(ctx)
2984 }
2985}
2986
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002987// Whether a module can link to another module, taking into
2988// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002989func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002990 tag blueprint.DependencyTag) {
2991
2992 switch t := tag.(type) {
2993 case dependencyTag:
2994 if t != vndkExtDepTag {
2995 return
2996 }
2997 case libraryDependencyTag:
2998 default:
2999 return
3000 }
3001
Ivan Lozanof9e21722020-12-02 09:00:51 -05003002 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003003 // Host code is not restricted
3004 return
3005 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003006
Ivan Lozano52767be2019-10-18 14:49:46 -07003007 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003008 // Platform code can link to anything
3009 return
3010 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08003011 if from.InRamdisk() {
3012 // Ramdisk code is not NDK
3013 return
3014 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003015 if from.InVendorRamdisk() {
3016 // Vendor ramdisk code is not NDK
3017 return
3018 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003019 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09003020 // Recovery code is not NDK
3021 return
3022 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003023 // Change this to LinkableInterface if Rust gets NDK support, which stubDecorators are for
Colin Cross31076b32020-10-23 17:22:06 -07003024 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07003025 if c.StubDecorator() {
3026 // These aren't real libraries, but are the stub shared libraries that are included in
3027 // the NDK.
3028 return
3029 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003030 }
Logan Chien834b9a62019-01-14 15:39:03 +08003031
Ivan Lozano52767be2019-10-18 14:49:46 -07003032 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003033 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3034 // to link to libc++ (non-NDK and without sdk_version).
3035 return
3036 }
3037
Ivan Lozano52767be2019-10-18 14:49:46 -07003038 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003039 // NDK code linking to platform code is never okay.
3040 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003041 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003042 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003043 }
3044
3045 // At this point we know we have two NDK libraries, but we need to
3046 // check that we're not linking against anything built against a higher
3047 // API level, as it is only valid to link against older or equivalent
3048 // APIs.
3049
Inseob Kim01a28722018-04-11 09:48:45 +09003050 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003051 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003052 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003053 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003054 // Current can't be linked against by anything else.
3055 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003056 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003057 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003058 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003059 if err != nil {
3060 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003061 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003062 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003063 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003064 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003065 if err != nil {
3066 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003067 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003068 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003069 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003070
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003071 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003072 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003073 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003074 }
3075 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003076 }
Dan Albert202fe492017-12-15 13:56:59 -08003077
3078 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003079 fromStl := from.SelectedStl()
3080 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003081 if fromStl == "" || toStl == "" {
3082 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003083 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003084 // We can be permissive with the system "STL" since it is only the C++
3085 // ABI layer, but in the future we should make sure that everyone is
3086 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003087 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003088 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003089 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3090 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003091 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003092}
3093
Jooyung Han479ca172020-10-19 18:51:07 +09003094func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3095 if c, ok := ctx.Module().(*Module); ok {
3096 ctx.VisitDirectDeps(func(dep android.Module) {
3097 depTag := ctx.OtherModuleDependencyTag(dep)
3098 ccDep, ok := dep.(LinkableInterface)
3099 if ok {
3100 checkLinkType(ctx, c, ccDep, depTag)
3101 }
3102 })
3103 }
3104}
3105
Jiyong Park5fb8c102018-04-09 12:03:06 +09003106// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003107// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3108// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003109// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003110func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003111 check := func(child, parent android.Module) bool {
3112 to, ok := child.(*Module)
3113 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003114 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003115 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003116
Jooyung Hana70f0672019-01-18 15:20:43 +09003117 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3118 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003119 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003120
Jiyong Park0474e1f2021-01-14 14:26:06 +09003121 // These dependencies are not excercised at runtime. Tracking these will give us
3122 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003123 depTag := ctx.OtherModuleDependencyTag(child)
3124 if IsHeaderDepTag(depTag) {
3125 return false
3126 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003127 if depTag == staticVariantTag {
3128 return false
3129 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003130 if depTag == StubImplDepTag {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003131 return false
3132 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003133 if depTag == android.RequiredDepTag {
3134 return false
3135 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003136
Justin Yun63e9ec72020-10-29 16:49:43 +09003137 // Even if target lib has no vendor variant, keep checking dependency
3138 // graph in case it depends on vendor_available or product_available
3139 // but not double_loadable transtively.
3140 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003141 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003142 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003143
Jiyong Park0474e1f2021-01-14 14:26:06 +09003144 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3145 // one.
3146 if Bool(to.VendorProperties.Double_loadable) {
3147 return true
3148 }
3149
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003150 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003151 return false
3152 }
3153
Jooyung Hana70f0672019-01-18 15:20:43 +09003154 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3155 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003156 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003157 return false
3158 }
3159 if module, ok := ctx.Module().(*Module); ok {
3160 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003161 if lib.HasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003162 ctx.WalkDeps(check)
3163 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003164 }
3165 }
3166}
3167
Yu Liue4312402023-01-18 09:15:31 -08003168func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3169 // For the dependency from platform to apex, use the latest stubs
3170 apexSdkVersion := android.FutureApiLevel
3171 if !apexInfo.IsForPlatform() {
3172 apexSdkVersion = apexInfo.MinSdkVersion
3173 }
3174
3175 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3176 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3177 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3178 // (b/144430859)
3179 apexSdkVersion = android.FutureApiLevel
3180 }
3181
3182 return apexSdkVersion
3183}
3184
Colin Crossc99deeb2016-04-11 15:06:20 -07003185// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003186func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003187 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003188
Colin Cross0de8a1e2020-09-18 14:15:30 -07003189 var directStaticDeps []StaticLibraryInfo
3190 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003191
Colin Cross0de8a1e2020-09-18 14:15:30 -07003192 reexportExporter := func(exporter FlagExporterInfo) {
3193 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3194 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3195 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3196 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3197 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003198 }
3199
Colin Crossff694a82023-12-13 15:54:49 -08003200 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003201 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003202
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003203 skipModuleList := map[string]bool{}
3204
Yu Liu8024b922024-12-20 23:31:32 +00003205 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003206 depName := ctx.OtherModuleName(dep)
3207 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003208
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003209 if _, ok := skipModuleList[depName]; ok {
3210 // skip this module because original module or API imported module matching with this should be used instead.
3211 return
3212 }
3213
Yu Liu8024b922024-12-20 23:31:32 +00003214 var ccInfo *CcInfo
3215 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3216 if hasCcInfo {
3217 ccInfo = v
3218 }
3219 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003220 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003221 if !hasCcInfo {
3222 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3223 }
3224 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003225 return
3226 }
3227
Vinh Tran367d89d2023-04-28 11:21:25 -04003228 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003229 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003230 depPaths.AidlLibraryInfos = append(
3231 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003232 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003233 )
3234 }
3235 }
3236
Yu Liu8024b922024-12-20 23:31:32 +00003237 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003238 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003239 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003240 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003241 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003242 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003243 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003244 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003245 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003246 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003247 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003248 // Support exported headers from a generated_sources dependency
3249 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003250 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003251 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003252 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003253 genRule.GeneratedDeps...)
3254 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003255 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003256 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003257 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003258 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003259 genRule.GeneratedSourceFiles...)
3260 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003261 // 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 +09003262 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003263 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003264 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003265 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003266 }
Colin Crosscef792e2021-06-11 18:01:26 -07003267 case CrtBeginDepTag:
3268 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3269 case CrtEndDepTag:
3270 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003271 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003272 return
3273 }
3274
Colin Crossfe17f6f2019-03-28 19:30:56 -07003275 if depTag == android.ProtoPluginDepTag {
3276 return
3277 }
3278
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003279 if depTag == android.RequiredDepTag {
3280 return
3281 }
3282
Yu Liu8024b922024-12-20 23:31:32 +00003283 commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey)
3284 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003285 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 -07003286 return
3287 }
Yu Liu8024b922024-12-20 23:31:32 +00003288 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003289 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003290 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003291 return
3292 }
3293
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003294 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003295 // Skip reused objects for stub libraries, they use their own stub object file instead.
3296 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3297 // version mutator, so the stubs variant is created from the shared variant that
3298 // already has the reuseObjTag dependency on the static variant.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003299 if !c.library.BuildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003300 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003301 objs := staticAnalogue.ReuseObjects
3302 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003303 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003304 reexportExporter(depExporterInfo)
3305 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003306 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003307 }
3308
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003309 if depTag == llndkHeaderLibTag {
3310 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3311 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3312 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3313 }
3314
Yu Liu8024b922024-12-20 23:31:32 +00003315 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003316
3317 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3318 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003319 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003320 return
3321 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003322
Jiyong Parke3867542020-12-03 17:28:25 +09003323 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3324 return
3325 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003326 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3327 return
3328 }
Jiyong Parke3867542020-12-03 17:28:25 +09003329
Colin Cross313aa542023-12-13 13:47:44 -08003330 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003331
Colin Cross6e511a92020-07-27 21:26:48 -07003332 var ptr *android.Paths
3333 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003334
Colin Cross6e511a92020-07-27 21:26:48 -07003335 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003336
Colin Cross6e511a92020-07-27 21:26:48 -07003337 switch {
3338 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003339 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003340 if !ctx.Config().AllowMissingDependencies() {
3341 ctx.ModuleErrorf("module %q is not a header library", depName)
3342 } else {
3343 ctx.AddMissingDependencies([]string{depName})
3344 }
3345 return
3346 }
Colin Cross6e511a92020-07-27 21:26:48 -07003347 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003348 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003349 if !ctx.Config().AllowMissingDependencies() {
3350 ctx.ModuleErrorf("module %q is not a shared library", depName)
3351 } else {
3352 ctx.AddMissingDependencies([]string{depName})
3353 }
3354 return
3355 }
Jiyong Parke3867542020-12-03 17:28:25 +09003356
Jiyong Park7d55b612021-06-11 17:22:09 +09003357 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3358 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003359
Jiyong Park1ad8e162020-12-01 23:40:09 +09003360 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3361 // linkFile, depFile, and ptr.
3362 if c.IsStubs() {
3363 break
3364 }
3365
Colin Cross0de8a1e2020-09-18 14:15:30 -07003366 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3367 depFile = sharedLibraryInfo.TableOfContents
3368
Colin Crossb614cd42024-10-11 12:52:21 -07003369 if !sharedLibraryInfo.IsStubs {
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003370 // TODO(b/362509506): remove this additional check once all apex_exclude uses are switched to stubs.
3371 if !linkableInfo.RustApexExclude {
3372 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3373 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3374 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3375 }
Colin Crossb614cd42024-10-11 12:52:21 -07003376 }
3377 }
3378
Colin Cross6e511a92020-07-27 21:26:48 -07003379 ptr = &depPaths.SharedLibs
3380 switch libDepTag.Order {
3381 case earlyLibraryDependency:
3382 ptr = &depPaths.EarlySharedLibs
3383 depPtr = &depPaths.EarlySharedLibsDeps
3384 case normalLibraryDependency:
3385 ptr = &depPaths.SharedLibs
3386 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003387 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003388 case lateLibraryDependency:
3389 ptr = &depPaths.LateSharedLibs
3390 depPtr = &depPaths.LateSharedLibsDeps
3391 default:
3392 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003393 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003394
Colin Cross6e511a92020-07-27 21:26:48 -07003395 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003396 if linkableInfo.RustLibraryInterface {
3397 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003398 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3399 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3400 if libDepTag.wholeStatic {
3401 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3402 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003403
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003404 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3405 // exported functions from the rust generated staticlib still exported.
3406 if c.CcLibrary() && c.Shared() {
3407 c.WholeRustStaticlib = true
3408 }
Colin Cross6e511a92020-07-27 21:26:48 -07003409 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003410
Colin Cross6e511a92020-07-27 21:26:48 -07003411 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003412 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3413 if !isStaticLib {
3414 if !ctx.Config().AllowMissingDependencies() {
3415 ctx.ModuleErrorf("module %q is not a static library", depName)
3416 } else {
3417 ctx.AddMissingDependencies([]string{depName})
3418 }
3419 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003420 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003421
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003422 // Stubs lib doesn't link to the static lib dependencies. Don't set
3423 // linkFile, depFile, and ptr.
3424 if c.IsStubs() {
3425 break
3426 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003427
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003428 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3429 if libDepTag.wholeStatic {
3430 ptr = &depPaths.WholeStaticLibs
3431 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3432 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3433 } else {
3434 // This case normally catches prebuilt static
3435 // libraries, but it can also occur when
3436 // AllowMissingDependencies is on and the
3437 // dependencies has no sources of its own
3438 // but has a whole_static_libs dependency
3439 // on a missing library. We want to depend
3440 // on the .a file so that there is something
3441 // in the dependency tree that contains the
3442 // error rule for the missing transitive
3443 // dependency.
3444 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3445 }
3446 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3447 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3448 } else {
3449 switch libDepTag.Order {
3450 case earlyLibraryDependency:
3451 panic(fmt.Errorf("early static libs not supported"))
3452 case normalLibraryDependency:
3453 // static dependencies will be handled separately so they can be ordered
3454 // using transitive dependencies.
3455 ptr = nil
3456 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3457 case lateLibraryDependency:
3458 ptr = &depPaths.LateStaticLibs
3459 default:
3460 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3461 }
3462 }
3463
3464 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3465 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3466
3467 if libDepTag.unexportedSymbols {
3468 depPaths.LdFlags = append(depPaths.LdFlags,
3469 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3470 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003471 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003472 }
3473
Yu Liu8024b922024-12-20 23:31:32 +00003474 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3475 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003476 ctx.ModuleErrorf("module %q not a static library", depName)
3477 return
3478 }
Logan Chien43d34c32017-12-20 01:17:32 +08003479
Colin Cross6e511a92020-07-27 21:26:48 -07003480 // When combining coverage files for shared libraries and executables, coverage files
3481 // in static libraries act as if they were whole static libraries. The same goes for
3482 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003483 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003484 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003485 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003486 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003487 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003488 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003489 // Handle non-CC modules here
3490 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003491 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003492 }
3493 }
3494
Colin Cross6e511a92020-07-27 21:26:48 -07003495 if ptr != nil {
3496 if !linkFile.Valid() {
3497 if !ctx.Config().AllowMissingDependencies() {
3498 ctx.ModuleErrorf("module %q missing output file", depName)
3499 } else {
3500 ctx.AddMissingDependencies([]string{depName})
3501 }
3502 return
3503 }
3504 *ptr = append(*ptr, linkFile.Path())
3505 }
3506
3507 if depPtr != nil {
3508 dep := depFile
3509 if !dep.Valid() {
3510 dep = linkFile
3511 }
3512 *depPtr = append(*depPtr, dep.Path())
3513 }
3514
Colin Cross0de8a1e2020-09-18 14:15:30 -07003515 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3516 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3517 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3518 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003519 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3520
3521 // Only re-export RustRlibDeps for cc static libs
3522 if c.static() {
3523 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3524 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003525
3526 if libDepTag.reexportFlags {
3527 reexportExporter(depExporterInfo)
3528 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3529 // Re-exported shared library headers must be included as well since they can help us with type information
3530 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003531 c.sabi.Properties.ReexportedIncludes = append(
3532 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003533 c.sabi.Properties.ReexportedSystemIncludes = append(
3534 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003535 }
3536
Yu Liu8024b922024-12-20 23:31:32 +00003537 makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003538 switch {
3539 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003540 c.Properties.AndroidMkHeaderLibs = append(
3541 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003542 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003543 // Note: the order of libs in this list is not important because
3544 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003545 c.Properties.AndroidMkSharedLibs = append(
3546 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003547 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003548 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003549 if libDepTag.wholeStatic {
3550 c.Properties.AndroidMkWholeStaticLibs = append(
3551 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3552 } else {
3553 c.Properties.AndroidMkStaticLibs = append(
3554 c.Properties.AndroidMkStaticLibs, makeLibName)
3555 }
Colin Cross6e511a92020-07-27 21:26:48 -07003556 }
3557 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003558 } else if !c.IsStubs() {
3559 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3560
Colin Cross6e511a92020-07-27 21:26:48 -07003561 switch depTag {
3562 case runtimeDepTag:
3563 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liu8024b922024-12-20 23:31:32 +00003564 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003565 case objDepTag:
3566 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3567 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003568 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003569 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003570 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003571 case dynamicLinkerDepTag:
3572 depPaths.DynamicLinker = linkFile
3573 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003574 }
Colin Crossca860ac2016-01-04 14:34:37 -08003575 })
3576
Jeff Gaston294356f2017-09-27 17:05:30 -07003577 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003578 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3579 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3580 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003581
Colin Crossdd84e052017-05-17 13:44:16 -07003582 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003583 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003584 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3585 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003586 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003587 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3588
Jiyong Park74955042019-10-22 20:19:51 +09003589 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3590 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003591 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003592 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003593 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003594 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003595
3596 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003597 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003598 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003599 }
Colin Crossdd84e052017-05-17 13:44:16 -07003600
Colin Crossca860ac2016-01-04 14:34:37 -08003601 return depPaths
3602}
3603
Spandan Das10c41362024-12-03 01:33:09 +00003604func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003605 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003606 bootstrap := false
Spandan Das10c41362024-12-03 01:33:09 +00003607 if linkable, ok := parent.(LinkableInterface); !ok {
3608 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
Jiyong Park7d55b612021-06-11 17:22:09 +09003609 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003610 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003611 bootstrap = linkable.Bootstrap()
3612 }
3613
Spandan Das10c41362024-12-03 01:33:09 +00003614 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003615
3616 useStubs := false
3617
Yu Liu8024b922024-12-20 23:31:32 +00003618 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003619 if !apexInfo.IsForPlatform() {
3620 // For platform libraries, use current version of LLNDK
3621 // If this is for use_vendor apex we will apply the same rules
3622 // of apex sdk enforcement below to choose right version.
3623 useStubs = true
3624 }
3625 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3626 // If not building for APEX or the containing APEX allows the use of
3627 // platform APIs, use stubs only when it is from an APEX (and not from
3628 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3629 // bootstrap modules, always link to non-stub variant
Yu Liu8024b922024-12-20 23:31:32 +00003630 isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003631
Spandan Dasff665182024-09-11 18:48:44 +00003632 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003633 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003634 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3635 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003636 }
3637
3638 return useStubs
3639}
3640
3641// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3642// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3643// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3644// has different level of updatability. For example, if a library foo in an APEX depends on a
3645// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3646// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3647// same APEX as foo, the non-stub variant of bar is used.
3648func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3649 depTag := ctx.OtherModuleDependencyTag(dep)
3650 libDepTag, ok := depTag.(libraryDependencyTag)
3651 if !ok || !libDepTag.shared() {
3652 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3653 }
3654
Colin Cross313aa542023-12-13 13:47:44 -08003655 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3656 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3657 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003658
3659 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003660 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003661 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003662 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3663 toUse := stubs[len(stubs)-1]
3664 sharedLibraryInfo = toUse.SharedLibraryInfo
3665 depExporterInfo = toUse.FlagExporterInfo
3666 }
3667 }
3668 return sharedLibraryInfo, depExporterInfo
3669}
3670
Colin Cross0de8a1e2020-09-18 14:15:30 -07003671// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3672// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003673// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003674// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003675func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3676 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003677 var staticPaths android.Paths
3678 for _, staticDep := range staticDeps {
3679 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3680 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3681 }
3682 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003683 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003684 }
3685 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3686
3687 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3688
3689 // reorder the dependencies based on transitive dependencies
3690 staticPaths = android.FirstUniquePaths(staticPaths)
3691 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3692
3693 if len(orderedStaticPaths) != len(staticPaths) {
3694 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3695 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3696 }
3697
3698 return orderedStaticPaths, transitiveStaticLibs
3699}
3700
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003701// BaseLibName trims known prefixes and suffixes
3702func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003703 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3704 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003705 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003706 return libName
3707}
3708
Yu Liu8024b922024-12-20 23:31:32 +00003709func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003710 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003711 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3712 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003713
Yu Liu8024b922024-12-20 23:31:32 +00003714 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003715 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003716 if ccInfo.SnapshotInfo != nil {
3717 return linkableInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003718 }
3719 }
3720
Yu Liu8024b922024-12-20 23:31:32 +00003721 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003722 // The vendor and product modules in Make will have been renamed to not conflict with the
3723 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003724 return libName + linkableInfo.SubName
3725 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003726 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003727 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003728 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003729 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003730 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003731 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003732 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003733 } else {
3734 return libName
3735 }
3736}
3737
Colin Crossca860ac2016-01-04 14:34:37 -08003738func (c *Module) InstallInData() bool {
3739 if c.installer == nil {
3740 return false
3741 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003742 return c.installer.inData()
3743}
3744
3745func (c *Module) InstallInSanitizerDir() bool {
3746 if c.installer == nil {
3747 return false
3748 }
3749 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003750 return true
3751 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003752 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003753}
3754
Yifan Hong1b3348d2020-01-21 15:53:22 -08003755func (c *Module) InstallInRamdisk() bool {
3756 return c.InRamdisk()
3757}
3758
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003759func (c *Module) InstallInVendorRamdisk() bool {
3760 return c.InVendorRamdisk()
3761}
3762
Jiyong Parkf9332f12018-02-01 00:54:12 +09003763func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003764 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003765}
3766
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003767func (c *Module) MakeUninstallable() {
3768 if c.installer == nil {
3769 c.ModuleBase.MakeUninstallable()
3770 return
3771 }
3772 c.installer.makeUninstallable(c)
3773}
3774
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003775func (c *Module) HostToolPath() android.OptionalPath {
3776 if c.installer == nil {
3777 return android.OptionalPath{}
3778 }
3779 return c.installer.hostToolPath()
3780}
3781
Nan Zhangd4e641b2017-07-12 12:55:28 -07003782func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3783 return c.outputFile
3784}
3785
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003786func (c *Module) static() bool {
3787 if static, ok := c.linker.(interface {
3788 static() bool
3789 }); ok {
3790 return static.static()
3791 }
3792 return false
3793}
3794
Colin Cross6a730042024-12-05 13:53:43 -08003795func (c *Module) staticLibrary() bool {
3796 if static, ok := c.linker.(interface {
3797 staticLibrary() bool
3798 }); ok {
3799 return static.staticLibrary()
3800 }
3801 return false
3802}
3803
Jiyong Park379de2f2018-12-19 02:47:14 +09003804func (c *Module) staticBinary() bool {
3805 if static, ok := c.linker.(interface {
3806 staticBinary() bool
3807 }); ok {
3808 return static.staticBinary()
3809 }
3810 return false
3811}
3812
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003813func (c *Module) testBinary() bool {
3814 if test, ok := c.linker.(interface {
3815 testBinary() bool
3816 }); ok {
3817 return test.testBinary()
3818 }
3819 return false
3820}
3821
Jingwen Chen537242c2022-08-24 11:53:27 +00003822func (c *Module) testLibrary() bool {
3823 if test, ok := c.linker.(interface {
3824 testLibrary() bool
3825 }); ok {
3826 return test.testLibrary()
3827 }
3828 return false
3829}
3830
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003831func (c *Module) benchmarkBinary() bool {
3832 if b, ok := c.linker.(interface {
3833 benchmarkBinary() bool
3834 }); ok {
3835 return b.benchmarkBinary()
3836 }
3837 return false
3838}
3839
3840func (c *Module) fuzzBinary() bool {
3841 if f, ok := c.linker.(interface {
3842 fuzzBinary() bool
3843 }); ok {
3844 return f.fuzzBinary()
3845 }
3846 return false
3847}
3848
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003849// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3850func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003851 if h, ok := c.linker.(interface {
3852 header() bool
3853 }); ok {
3854 return h.header()
3855 }
3856 return false
3857}
3858
Ivan Lozanod7586b62021-04-01 09:49:36 -04003859func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003860 if b, ok := c.linker.(interface {
3861 binary() bool
3862 }); ok {
3863 return b.binary()
3864 }
3865 return false
3866}
3867
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003868func (c *Module) ForceDisableSanitizers() {
3869 c.sanitize.Properties.ForceDisable = true
3870}
3871
Justin Yun5e035862021-06-29 20:50:37 +09003872func (c *Module) StaticExecutable() bool {
3873 if b, ok := c.linker.(*binaryDecorator); ok {
3874 return b.static()
3875 }
3876 return false
3877}
3878
Ivan Lozanod7586b62021-04-01 09:49:36 -04003879func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003880 if o, ok := c.linker.(interface {
3881 object() bool
3882 }); ok {
3883 return o.object()
3884 }
3885 return false
3886}
3887
Kiyoung Kim37693d02024-04-04 09:56:15 +09003888func (m *Module) Dylib() bool {
3889 return false
3890}
3891
3892func (m *Module) Rlib() bool {
3893 return false
3894}
3895
Ivan Lozanof9e21722020-12-02 09:00:51 -05003896func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003897 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003898 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003899 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003900 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003901 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003902 return "native:product"
3903 }
Jooyung Han38002912019-05-16 04:01:54 +09003904 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003905 } else if c.InRamdisk() {
3906 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003907 } else if c.InVendorRamdisk() {
3908 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003909 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003910 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003911 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003912 return "native:ndk:none:none"
3913 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3914 //family, link := getNdkStlFamilyAndLinkType(c)
3915 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3916 } else {
3917 return "native:platform"
3918 }
3919}
3920
Jiyong Park9d452992018-10-03 00:38:19 +09003921// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003922// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003923func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003924 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003925 // Stub libs and prebuilt libs in a versioned SDK are not
3926 // installable to APEX even though they are shared libs.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003927 return lib.shared() && !lib.BuildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003928 }
3929 return false
3930}
3931
Jiyong Parka90ca002019-10-07 15:47:24 +09003932func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003933 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3934}
3935
3936func (c *Module) ApexAvailableFor() []string {
3937 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003938 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003939 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003940 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003941 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003942 }
Yu Liub73c3a62024-12-10 00:58:06 +00003943
3944 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09003945}
3946
Paul Duffin0cb37b92020-03-04 14:52:46 +00003947func (c *Module) EverInstallable() bool {
3948 return c.installer != nil &&
3949 // Check to see whether the module is actually ever installable.
3950 c.installer.everInstallable()
3951}
3952
Ivan Lozanod7586b62021-04-01 09:49:36 -04003953func (c *Module) PreventInstall() bool {
3954 return c.Properties.PreventInstall
3955}
3956
3957func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003958 if c.library != nil {
3959 if i := c.library.installable(); i != nil {
3960 return i
3961 }
3962 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003963 return c.Properties.Installable
3964}
3965
3966func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003967 ret := c.EverInstallable() &&
3968 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003969 proptools.BoolDefault(c.Installable(), true) &&
3970 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003971
3972 // The platform variant doesn't need further condition. Apex variants however might not
3973 // be installable because it will likely to be included in the APEX and won't appear
3974 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003975 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003976 return ret
3977 }
3978
3979 // Special case for modules that are configured to be installed to /data, which includes
3980 // test modules. For these modules, both APEX and non-APEX variants are considered as
3981 // installable. This is because even the APEX variants won't be included in the APEX, but
3982 // will anyway be installed to /data/*.
3983 // See b/146995717
3984 if c.InstallInData() {
3985 return ret
3986 }
3987
3988 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003989}
3990
Logan Chien41eabe62019-04-10 13:33:58 +08003991func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3992 if c.linker != nil {
3993 if library, ok := c.linker.(*libraryDecorator); ok {
3994 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3995 }
3996 }
3997}
3998
Jiyong Park45bf82e2020-12-15 22:29:02 +09003999var _ android.ApexModule = (*Module)(nil)
4000
4001// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004002func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004003 if depTag == StubImplDepTag {
Colin Crossc1b36442021-05-06 13:42:48 -07004004 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09004005 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004006 }
Jiyong Park12177fc2021-01-05 14:37:15 +09004007 if depTag == staticVariantTag {
4008 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
4009 // actually mean that the static lib (and its dependencies) are copied into the
4010 // APEX.
4011 return false
4012 }
Colin Cross8acea3e2024-12-12 14:53:30 -08004013
4014 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
4015 if isLibDepTag && c.static() && libDepTag.shared() {
4016 // shared_lib dependency from a static lib is considered as crossing
4017 // the APEX boundary because the dependency doesn't actually is
4018 // linked; the dependency is used only during the compilation phase.
4019 return false
4020 }
4021
4022 if isLibDepTag && libDepTag.excludeInApex {
4023 return false
4024 }
4025
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004026 return true
4027}
4028
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004029func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004030 if c.HasStubsVariants() {
4031 if IsSharedDepTag(depTag) {
4032 // dynamic dep to a stubs lib crosses APEX boundary
4033 return false
4034 }
4035 if IsRuntimeDepTag(depTag) {
4036 // runtime dep to a stubs lib also crosses APEX boundary
4037 return false
4038 }
4039 if IsHeaderDepTag(depTag) {
4040 return false
4041 }
4042 }
4043 if c.IsLlndk() {
4044 return false
4045 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004046
4047 return true
4048}
4049
Jiyong Park45bf82e2020-12-15 22:29:02 +09004050// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07004051func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
4052 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09004053 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4054 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
4055 return nil
4056 }
Jooyung Han749dc692020-04-15 11:03:39 +09004057 // We don't check for prebuilt modules
4058 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4059 return nil
4060 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004061
Jooyung Han749dc692020-04-15 11:03:39 +09004062 minSdkVersion := c.MinSdkVersion()
4063 if minSdkVersion == "apex_inherit" {
4064 return nil
4065 }
4066 if minSdkVersion == "" {
4067 // JNI libs within APK-in-APEX fall into here
4068 // Those are okay to set sdk_version instead
4069 // We don't have to check if this is a SDK variant because
4070 // non-SDK variant resets sdk_version, which works too.
4071 minSdkVersion = c.SdkVersion()
4072 }
Dan Albertc8060532020-07-22 22:32:17 -07004073 if minSdkVersion == "" {
4074 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4075 }
4076 // Not using nativeApiLevelFromUser because the context here is not
4077 // necessarily a native context.
4078 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004079 if err != nil {
4080 return err
4081 }
Dan Albertc8060532020-07-22 22:32:17 -07004082
Colin Cross8ca61c12022-10-06 21:00:14 -07004083 // A dependency only needs to support a min_sdk_version at least
4084 // as high as the api level that the architecture was introduced in.
4085 // This allows introducing new architectures in the platform that
4086 // need to be included in apexes that normally require an older
4087 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004088 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004089 if sdkVersion.LessThan(minApiForArch) {
4090 sdkVersion = minApiForArch
4091 }
4092
Dan Albertc8060532020-07-22 22:32:17 -07004093 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004094 return fmt.Errorf("newer SDK(%v)", ver)
4095 }
4096 return nil
4097}
4098
Paul Duffinb5769c12021-05-12 16:16:51 +01004099// Implements android.ApexModule
4100func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4101 // stub libraries and native bridge libraries are always available to platform
4102 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4103}
4104
Inseob Kima1888ce2022-10-04 14:42:02 +09004105func (c *Module) overriddenModules() []string {
4106 if o, ok := c.linker.(overridable); ok {
4107 return o.overriddenModules()
4108 }
4109 return nil
4110}
4111
Liz Kammer35ca77e2021-12-22 15:31:40 -05004112type moduleType int
4113
4114const (
4115 unknownType moduleType = iota
4116 binary
4117 object
4118 fullLibrary
4119 staticLibrary
4120 sharedLibrary
4121 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004122 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004123 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004124)
4125
4126func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004127 if c.testBinary() {
4128 // testBinary is also a binary, so this comes before the c.Binary()
4129 // conditional. A testBinary has additional implicit dependencies and
4130 // other test-only semantics.
4131 return testBin
4132 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004133 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004134 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004135 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004136 } else if c.testLibrary() {
4137 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4138 // will let them add implicit compile deps on gtest, for example.
4139 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004140 // For now, treat them as regular libraries.
4141 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004142 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004143 static := false
4144 shared := false
4145 if library, ok := c.linker.(*libraryDecorator); ok {
4146 static = library.MutatedProperties.BuildStatic
4147 shared = library.MutatedProperties.BuildShared
4148 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4149 static = library.MutatedProperties.BuildStatic
4150 shared = library.MutatedProperties.BuildShared
4151 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004152 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004153 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004154 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004155 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004156 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004157 return staticLibrary
4158 }
4159 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004160 } else if c.isNDKStubLibrary() {
4161 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004162 }
4163 return unknownType
4164}
4165
Colin Crosscfad1192015-11-02 16:43:11 -08004166// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004167type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004168 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004169 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004170 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004171}
4172
Patrice Arrudac249c712019-03-19 17:00:29 -07004173// cc_defaults provides a set of properties that can be inherited by other cc
4174// modules. A module can use the properties from a cc_defaults using
4175// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4176// merged (when possible) by prepending the default module's values to the
4177// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004178func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004179 return DefaultsFactory()
4180}
4181
Colin Cross36242852017-06-23 15:06:31 -07004182func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004183 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004184
Colin Cross36242852017-06-23 15:06:31 -07004185 module.AddProperties(props...)
4186 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004187 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004188 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004189 &BaseCompilerProperties{},
4190 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004191 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004192 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004193 &StaticProperties{},
4194 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004195 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004196 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004197 &TestLinkerProperties{},
4198 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004199 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004200 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004201 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004202 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004203 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004204 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004205 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004206 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004207 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004208 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004209 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004210 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004211 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004212 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004213 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4214 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004215 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004216 )
Colin Crosscfad1192015-11-02 16:43:11 -08004217
Jooyung Hancc372c52019-09-25 15:18:44 +09004218 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004219
4220 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004221}
4222
Jiyong Park2286afd2020-06-16 21:58:53 +09004223func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004224 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004225}
4226
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004227func kytheExtractAllFactory() android.Singleton {
4228 return &kytheExtractAllSingleton{}
4229}
4230
4231type kytheExtractAllSingleton struct {
4232}
4233
4234func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4235 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004236 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004237 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004238 if len(files) > 0 {
4239 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004240 }
4241 })
4242 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4243 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004244 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004245 }
4246}
4247
Jihoon Kangf78a8902022-09-01 22:47:07 +00004248func (c *Module) Partition() string {
4249 if p, ok := c.installer.(interface {
4250 getPartition() string
4251 }); ok {
4252 return p.getPartition()
4253 }
4254 return ""
4255}
4256
Spandan Das2b6dfb52024-01-19 00:22:22 +00004257type sourceModuleName interface {
4258 sourceModuleName() string
4259}
4260
4261func (c *Module) BaseModuleName() string {
4262 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4263 // if the prebuilt module sets a source_module_name in Android.bp, use that
4264 return smn.sourceModuleName()
4265 }
4266 return c.ModuleBase.BaseModuleName()
4267}
4268
Spandan Dase20c56c2024-07-23 21:34:24 +00004269func (c *Module) stubsSymbolFilePath() android.Path {
4270 if library, ok := c.linker.(*libraryDecorator); ok {
4271 return library.stubsSymbolFilePath
4272 }
4273 return android.OptionalPath{}.Path()
4274}
4275
Colin Cross06a931b2015-10-28 17:23:31 -07004276var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004277var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004278var BoolPtr = proptools.BoolPtr
4279var String = proptools.String
4280var StringPtr = proptools.StringPtr