blob: 0db5c40559f8d93f6875b09f19a844fecae8a606 [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
Yu Liu986d98c2024-11-12 00:28:11 +0000163}
164
Yu Liu8024b922024-12-20 23:31:32 +0000165var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]()
Yu Liu986d98c2024-11-12 00:28:11 +0000166
Colin Cross463a90e2015-06-17 14:20:06 -0700167func init() {
Paul Duffin036e7002019-12-19 19:16:28 +0000168 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -0700169
Inseob Kim3b244062023-07-11 13:31:36 +0900170 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +0000171 pctx.Import("android/soong/cc/config")
172}
173
174func RegisterCCBuildComponents(ctx android.RegistrationContext) {
175 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
176
177 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -0700178 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700179 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -0700180 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -0700181 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700182 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -0700183 })
Colin Cross16b23492016-01-06 14:41:07 -0800184
Paul Duffin036e7002019-12-19 19:16:28 +0000185 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -0400186 for _, san := range Sanitizers {
187 san.registerMutators(ctx)
188 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800189
Colin Cross8a962802024-10-09 15:29:27 -0700190 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
191 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -0800192
Colin Cross597bad62024-10-08 15:10:55 -0700193 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +0000194
Colin Crossf5f4ad32024-01-19 15:41:48 -0800195 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -0700196
Colin Crossd38feb02024-01-23 16:38:06 -0800197 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800198
Colin Cross33e0c812024-01-23 16:36:07 -0800199 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000200
Colin Cross6ac83a82024-01-23 11:23:10 -0800201 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900202
Colin Cross8a962802024-10-09 15:29:27 -0700203 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
204 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700205 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700206
Colin Cross91ae5ec2024-10-01 14:03:40 -0700207 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800208 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700209 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800210 })
211
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000212 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700213}
214
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500215// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
216// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
217// edges to these modules.
218// This object is constructed in DepsMutator, by calling to various module delegates to set
219// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
220// dependencies.
221// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
222// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800223type Deps struct {
224 SharedLibs, LateSharedLibs []string
225 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800226 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800227 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700228
Colin Cross3e5e7782022-06-17 22:17:05 +0000229 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
230 // prevent automatically exporting symbols.
231 UnexportedStaticLibs []string
232
Chris Parsons79d66a52020-06-05 17:26:16 -0400233 // Used for data dependencies adjacent to tests
234 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700235 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400236
Yo Chiang219968c2020-09-22 18:45:04 +0800237 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
238 SystemSharedLibs []string
239
Vinh Tran367d89d2023-04-28 11:21:25 -0400240 // Used by DepMutator to pass aidl_library modules to aidl compiler
241 AidlLibs []string
242
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500243 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800244 StaticUnwinderIfLegacy bool
245
Colin Cross5950f382016-12-13 12:50:57 -0800246 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700247
Colin Cross81413472016-04-11 14:37:39 -0700248 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700249
Cole Faust65cb40a2024-10-21 15:41:42 -0700250 GeneratedSources []string
251 GeneratedHeaders []string
252 DeviceFirstGeneratedHeaders []string
253 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700254
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700255 ReexportGeneratedHeaders []string
256
Colin Crossc465efd2021-06-11 18:00:04 -0700257 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700258
259 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700260 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900261
262 // List of libs that need to be excluded for APEX variant
263 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900264 // List of libs that need to be excluded for non-APEX variant
265 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800266
267 // LLNDK headers for the ABI checker to check LLNDK implementation library.
268 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700269 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800270 // Instead, the LLNDK implementation depends on the LLNDK header libs.
271 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700272}
273
Ivan Lozano0a468a42024-05-13 21:03:34 -0400274// A struct which to collect flags for rlib dependencies
275type RustRlibDep struct {
276 LibPath android.Path // path to the rlib
277 LinkDirs []string // flags required for dependency (e.g. -L flags)
278 CrateName string // crateNames associated with rlibDeps
279}
280
281func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
282 return a.LibPath == b.LibPath
283}
284
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500285// PathDeps is a struct containing file paths to dependencies of a module.
286// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
287// It's used to construct flags for various build statements (such as for compiling and linking).
288// It is then passed to module decorator functions responsible for registering build statements
289// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800290type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700291 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900292 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700293 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900294 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700295 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700296 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400297 // Paths and crateNames for RustStaticLib dependencies
298 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700299
Colin Cross0de8a1e2020-09-18 14:15:30 -0700300 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700301 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700302
Colin Cross26c34ed2016-09-30 17:10:16 -0700303 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100304 Objs Objects
305 // Paths to .o files in dependencies that provide them. Note that these lists
306 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800307 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700308 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700309
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100310 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
311 // the libs from all whole_static_lib dependencies.
312 WholeStaticLibsFromPrebuilts android.Paths
313
Colin Cross26c34ed2016-09-30 17:10:16 -0700314 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700315 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900316 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700317
Inseob Kimd110f872019-12-06 13:15:38 +0900318 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000319 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900320 IncludeDirs android.Paths
321 SystemIncludeDirs android.Paths
322 ReexportedDirs android.Paths
323 ReexportedSystemDirs android.Paths
324 ReexportedFlags []string
325 ReexportedGeneratedHeaders android.Paths
326 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400327 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700328
Colin Cross26c34ed2016-09-30 17:10:16 -0700329 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700330 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700331
Dan Willemsena0790e32018-10-12 00:24:23 -0700332 // Path to the dynamic linker binary
333 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700334
335 // For Darwin builds, the path to the second architecture's output that should
336 // be combined with this architectures's output into a FAT MachO file.
337 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400338
339 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
340 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800341
342 // LLNDK headers for the ABI checker to check LLNDK implementation library.
343 LlndkIncludeDirs android.Paths
344 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700345
346 directImplementationDeps android.Paths
347 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700348}
349
Colin Cross4af21ed2019-11-04 09:37:55 -0800350// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
351// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
352// command line so they can be overridden by the local module flags).
353type LocalOrGlobalFlags struct {
354 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700355 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800356 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700357 CFlags []string // Flags that apply to C and C++ source files
358 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
359 ConlyFlags []string // Flags that apply to C source files
360 CppFlags []string // Flags that apply to C++ source files
361 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700362 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800363}
364
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500365// Flags contains various types of command line flags (and settings) for use in building build
366// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800367type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500368 // Local flags (which individual modules are responsible for). These may override global flags.
369 Local LocalOrGlobalFlags
370 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700371 Global LocalOrGlobalFlags
372 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800373
374 aidlFlags []string // Flags that apply to aidl source files
375 rsFlags []string // Flags that apply to renderscript source files
376 libFlags []string // Flags to add libraries early to the link order
377 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
378 TidyFlags []string // Flags that apply to clang-tidy
379 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700380
Colin Crossc3199482017-03-30 15:03:04 -0700381 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800382 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700383 SystemIncludeFlags []string
384
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800385 Toolchain config.Toolchain
386 Tidy bool // True if ninja .tidy rules should be generated.
387 NeedTidyFiles bool // True if module link should depend on .tidy files
388 GcovCoverage bool // True if coverage files should be generated.
389 SAbiDump bool // True if header abi dumps should be generated.
390 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800391 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800392
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500393 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800394 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500395 // The target-device system path to the dynamic linker.
396 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800397
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700398 CFlagsDeps android.Paths // Files depended on by compiler flags
399 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800400
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500401 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700402 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800403
Colin Cross19878da2019-03-28 14:45:07 -0700404 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700405 protoC bool // Whether to use C instead of C++
406 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700407
408 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200409 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700410}
411
Colin Crossca860ac2016-01-04 14:34:37 -0800412// Properties used to compile all C or C++ modules
413type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700414 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800415 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700416
Yi Kong5786f5c2024-05-28 02:22:34 +0900417 // Aggresively trade performance for smaller binary size.
418 // This should only be used for on-device binaries that are rarely executed and not
419 // performance critical.
420 Optimize_for_size *bool `android:"arch_variant"`
421
Jiyong Parkb35a8192020-08-10 15:59:36 +0900422 // The API level that this module is built against. The APIs of this API level will be
423 // visible at build time, but use of any APIs newer than min_sdk_version will render the
424 // module unloadable on older devices. In the future it will be possible to weakly-link new
425 // APIs, making the behavior match Java: such modules will load on older devices, but
426 // calling new APIs on devices that do not support them will result in a crash.
427 //
428 // This property has the same behavior as sdk_version does for Java modules. For those
429 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
430 // does for Java code.
431 //
432 // In addition, setting this property causes two variants to be built, one for the platform
433 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800434 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700435
Jiyong Parkb35a8192020-08-10 15:59:36 +0900436 // Minimum OS API level supported by this C or C++ module. This property becomes the value
437 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
438 // this property is also used to ensure that the min_sdk_version of the containing module is
439 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
440 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
441 // min_sdk_version of the containing APEX. When the module
442 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900443 Min_sdk_version *string
444
Colin Crossc511bc52020-04-07 16:50:32 +0000445 // If true, always create an sdk variant and don't create a platform variant.
446 Sdk_variant_only *bool
447
Colin Cross4297f402024-11-20 15:20:09 -0800448 AndroidMkSharedLibs []string `blueprint:"mutated"`
449 AndroidMkStaticLibs []string `blueprint:"mutated"`
450 AndroidMkRlibs []string `blueprint:"mutated"`
451 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
452 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
453 AndroidMkHeaderLibs []string `blueprint:"mutated"`
454 HideFromMake bool `blueprint:"mutated"`
455 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700456
Yo Chiang219968c2020-09-22 18:45:04 +0800457 // Set by DepsMutator.
458 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
459
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900460 // The name of the image this module is built for
461 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200462
463 // The VNDK version this module is built against. If empty, the module is not
464 // build against the VNDK.
465 VndkVersion string `blueprint:"mutated"`
466
467 // Suffix for the name of Android.mk entries generated by this module
468 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800469
470 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
471 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900472 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900473
Yifan Hong39143a92020-10-26 12:43:12 -0700474 // Make this module available when building for ramdisk.
475 // On device without a dedicated recovery partition, the module is only
476 // available after switching root into
477 // /first_stage_ramdisk. To expose the module before switching root, install
478 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800479 Ramdisk_available *bool
480
Yifan Hong39143a92020-10-26 12:43:12 -0700481 // Make this module available when building for vendor ramdisk.
482 // On device without a dedicated recovery partition, the module is only
483 // available after switching root into
484 // /first_stage_ramdisk. To expose the module before switching root, install
485 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700486 Vendor_ramdisk_available *bool
487
Jiyong Parkf9332f12018-02-01 00:54:12 +0900488 // Make this module available when building for recovery
489 Recovery_available *bool
490
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200491 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000492 VendorVariantNeeded bool `blueprint:"mutated"`
493 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200494 CoreVariantNeeded bool `blueprint:"mutated"`
495 RamdiskVariantNeeded bool `blueprint:"mutated"`
496 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
497 RecoveryVariantNeeded bool `blueprint:"mutated"`
498
499 // A list of variations for the "image" mutator of the form
500 //<image name> '.' <version char>, for example, 'vendor.S'
501 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900502
503 // Allows this module to use non-APEX version of libraries. Useful
504 // for building binaries that are started before APEXes are activated.
505 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900506
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000507 // Allows this module to be included in CMake release snapshots to be built outside of Android
508 // build system and source tree.
509 Cmake_snapshot_supported *bool
510
Colin Cross1bc94122021-10-28 13:25:54 -0700511 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000512
513 // Set by factories of module types that can only be referenced from variants compiled against
514 // the SDK.
515 AlwaysSdk bool `blueprint:"mutated"`
516
517 // Variant is an SDK variant created by sdkMutator
518 IsSdkVariant bool `blueprint:"mutated"`
519 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
520 // variant to have a ".sdk" suffix.
521 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700522
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800523 Target struct {
524 Platform struct {
525 // List of modules required by the core variant.
526 Required []string `android:"arch_variant"`
527
528 // List of modules not required by the core variant.
529 Exclude_required []string `android:"arch_variant"`
530 } `android:"arch_variant"`
531
532 Recovery struct {
533 // List of modules required by the recovery variant.
534 Required []string `android:"arch_variant"`
535
536 // List of modules not required by the recovery variant.
537 Exclude_required []string `android:"arch_variant"`
538 } `android:"arch_variant"`
539 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700540}
541
542type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900543 // whether this module should be allowed to be directly depended by other
544 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900545 // If set to true, two variants will be built separately, one like
546 // normal, and the other limited to the set of libraries and headers
547 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700548 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900549 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700550 // so it shouldn't have any unversioned runtime dependencies, or
551 // make assumptions about the system that may not be true in the
552 // future.
553 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900554 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900555 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900556 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900557 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900558 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700559 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
560 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900561
Justin Yunebcf0c52021-01-08 18:00:19 +0900562 // This is the same as the "vendor_available" except that the install path
563 // of the vendor variant is /odm or /vendor/odm.
564 // By replacing "vendor_available: true" with "odm_available: true", the
565 // module will install its vendor variant to the /odm partition or /vendor/odm.
566 // As the modules with "odm_available: true" still create the vendor variants,
567 // they can link to the other vendor modules as the vendor_available modules do.
568 // Also, the vendor modules can link to odm_available modules.
569 //
570 // It may not be used for VNDK modules.
571 Odm_available *bool
572
Justin Yun63e9ec72020-10-29 16:49:43 +0900573 // whether this module should be allowed to be directly depended by other
574 // modules with `product_specific: true` or `product_available: true`.
575 // If set to true, an additional product variant will be built separately
576 // that is limited to the set of libraries and headers that are exposed to
577 // /product modules.
578 //
579 // The product variant may be used with a different (newer) /system,
580 // so it shouldn't have any unversioned runtime dependencies, or
581 // make assumptions about the system that may not be true in the
582 // future.
583 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900584 // If set to false, this module becomes inaccessible from /product modules.
585 //
586 // Different from the 'vendor_available' property, the modules with
587 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
588 // library without 'product_available' may not be depended on by any other
589 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900590 //
591 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
592 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
593 Product_available *bool
594
Jiyong Park5fb8c102018-04-09 12:03:06 +0900595 // whether this module is capable of being loaded with other instance
596 // (possibly an older version) of the same module in the same process.
597 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
598 // can be double loaded in a vendor process if the library is also a
599 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
600 // explicitly marked as `double_loadable: true` by the owner, or the dependency
601 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
602 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800603
604 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
605 IsLLNDK bool `blueprint:"mutated"`
606
Colin Cross5271fea2021-04-27 13:06:04 -0700607 // IsVendorPublicLibrary is set for the core and product variants of a library that has
608 // vendor_public_library stubs.
609 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800610}
611
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500612// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
613// to understanding details about the type of the current module.
614// For example, one might call these functions to determine whether the current module is a static
615// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800616type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800617 static() bool
618 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800619 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700620 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800621 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900622 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900623 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900624 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700625 toolchain() config.Toolchain
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700626 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800627 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900628 minSdkVersion() string
629 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700630 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700631 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800632 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800633 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700634 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900635 inProduct() bool
636 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800637 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700638 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900639 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900640 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700641 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700642 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800643 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000644 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800645 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900646 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800647 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800648 useClangLld(actx ModuleContext) bool
Colin Crosse07f2312020-08-13 11:24:56 -0700649 apexVariationName() string
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900650 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700651 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800652 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800653 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800654 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800655 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900656 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000657 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800658}
659
660type SharedFlags struct {
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000661 NumSharedFlags int
662 FlagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800663}
664
665type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700666 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800667 ModuleContextIntf
668}
669
670type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700671 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800672 ModuleContextIntf
673}
674
Colin Cross37047f12016-12-13 17:06:13 -0800675type DepsContext interface {
676 android.BottomUpMutatorContext
677 ModuleContextIntf
678}
679
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500680// feature represents additional (optional) steps to building cc-related modules, such as invocation
681// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800682type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800683 flags(ctx ModuleContext, flags Flags) Flags
684 props() []interface{}
685}
686
Joe Onorato37f900c2023-07-18 16:58:16 -0700687// Information returned from Generator about the source code it's generating
688type GeneratedSource struct {
689 IncludeDirs android.Paths
690 Sources android.Paths
691 Headers android.Paths
692 ReexportedDirs android.Paths
693}
694
695// generator allows injection of generated code
696type Generator interface {
697 GeneratorProps() []interface{}
698 GeneratorInit(ctx BaseModuleContext)
699 GeneratorDeps(ctx DepsContext, deps Deps) Deps
700 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
701 GeneratorSources(ctx ModuleContext) GeneratedSource
702 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
703}
704
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500705// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500706// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800707type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700708 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800709 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800710 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700711 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000712 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700713
Colin Cross76fada02016-07-27 10:31:13 -0700714 appendCflags([]string)
715 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700716 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800717}
718
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500719// linker is the interface for a linker decorator object. Individual module types can provide
720// their own implementation for this decorator, and thus specify custom logic regarding build
721// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800722type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700723 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800724 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700725 linkerFlags(ctx ModuleContext, flags Flags) Flags
726 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000727 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800728 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700729
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700730 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700731 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900732 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800733 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700734
735 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900736 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000737
738 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700739 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800740
741 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000742}
743
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500744// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000745type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500746 sharedLibs []string
747 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
748 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700749 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800750}
751
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500752// installer is the interface for an installer helper object. This helper is responsible for
753// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800754type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700755 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700756 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000757 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800758 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700759 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700760 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900761 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000762 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900763 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800764}
765
Inseob Kima1888ce2022-10-04 14:42:02 +0900766type overridable interface {
767 overriddenModules() []string
768}
769
Colin Cross6e511a92020-07-27 21:26:48 -0700770type libraryDependencyKind int
771
772const (
773 headerLibraryDependency = iota
774 sharedLibraryDependency
775 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400776 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700777)
778
779func (k libraryDependencyKind) String() string {
780 switch k {
781 case headerLibraryDependency:
782 return "headerLibraryDependency"
783 case sharedLibraryDependency:
784 return "sharedLibraryDependency"
785 case staticLibraryDependency:
786 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400787 case rlibLibraryDependency:
788 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700789 default:
790 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
791 }
792}
793
794type libraryDependencyOrder int
795
796const (
797 earlyLibraryDependency = -1
798 normalLibraryDependency = 0
799 lateLibraryDependency = 1
800)
801
802func (o libraryDependencyOrder) String() string {
803 switch o {
804 case earlyLibraryDependency:
805 return "earlyLibraryDependency"
806 case normalLibraryDependency:
807 return "normalLibraryDependency"
808 case lateLibraryDependency:
809 return "lateLibraryDependency"
810 default:
811 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
812 }
813}
814
815// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
816// tags that have a set of predefined tag objects that are reused for each dependency, a
817// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
818// That means that comparing a libraryDependencyTag for equality will only be equal if all
819// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
820// then check individual metadata fields instead.
821type libraryDependencyTag struct {
822 blueprint.BaseDependencyTag
823
824 // These are exported so that fmt.Printf("%#v") can call their String methods.
825 Kind libraryDependencyKind
826 Order libraryDependencyOrder
827
828 wholeStatic bool
829
830 reexportFlags bool
831 explicitlyVersioned bool
832 dataLib bool
833 ndk bool
834
835 staticUnwinder bool
836
837 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900838
Cindy Zhou18417cb2020-12-10 07:12:38 -0800839 // Whether or not this dependency should skip the apex dependency check
840 skipApexAllowedDependenciesCheck bool
841
Jiyong Parke3867542020-12-03 17:28:25 +0900842 // Whether or not this dependency has to be followed for the apex variants
843 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900844 // Whether or not this dependency has to be followed for the non-apex variants
845 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000846
847 // If true, don't automatically export symbols from the static library into a shared library.
848 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700849}
850
851// header returns true if the libraryDependencyTag is tagging a header lib dependency.
852func (d libraryDependencyTag) header() bool {
853 return d.Kind == headerLibraryDependency
854}
855
856// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
857func (d libraryDependencyTag) shared() bool {
858 return d.Kind == sharedLibraryDependency
859}
860
861// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
862func (d libraryDependencyTag) static() bool {
863 return d.Kind == staticLibraryDependency
864}
865
Colin Cross65cb3142021-12-10 23:05:02 +0000866func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
867 if d.shared() {
868 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
869 }
870 return nil
871}
872
873var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
874
Colin Crosse9fe2942020-11-10 18:12:15 -0800875// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
876// binaries or other shared libraries are installed as dependencies.
877func (d libraryDependencyTag) InstallDepNeeded() bool {
878 return d.shared()
879}
880
881var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
882
Yu Liu67a28422024-03-05 00:36:31 +0000883func (d libraryDependencyTag) PropagateAconfigValidation() bool {
884 return d.static()
885}
886
887var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
888
Colin Crosse9fe2942020-11-10 18:12:15 -0800889// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700890// libraryDependencyTag. Each tag object is created globally and reused for multiple
891// dependencies (although since the object contains no references, assigning a tag to a
892// variable and modifying it will not modify the original). Users can compare the tag
893// returned by ctx.OtherModuleDependencyTag against the global original
894type dependencyTag struct {
895 blueprint.BaseDependencyTag
896 name string
897}
898
Colin Crosse9fe2942020-11-10 18:12:15 -0800899// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
900// libraryDependencyTag, but where the dependency needs to be installed when the parent is
901// installed.
902type installDependencyTag struct {
903 blueprint.BaseDependencyTag
904 android.InstallAlwaysNeededDependencyTag
905 name string
906}
907
Colin Crossc99deeb2016-04-11 15:06:20 -0700908var (
Colin Cross6e511a92020-07-27 21:26:48 -0700909 genSourceDepTag = dependencyTag{name: "gen source"}
910 genHeaderDepTag = dependencyTag{name: "gen header"}
911 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
912 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900913 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700914 reuseObjTag = dependencyTag{name: "reuse objects"}
915 staticVariantTag = dependencyTag{name: "static variant"}
916 vndkExtDepTag = dependencyTag{name: "vndk extends"}
917 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700918 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800919 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000920 StubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000921 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500922 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400923 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800924 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700925)
926
Roland Levillainf89cd092019-07-29 16:22:59 +0100927func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700928 ccLibDepTag, ok := depTag.(libraryDependencyTag)
929 return ok && ccLibDepTag.shared()
930}
931
932func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
933 ccLibDepTag, ok := depTag.(libraryDependencyTag)
934 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100935}
936
Zach Johnson3df4e632020-11-06 11:56:27 -0800937func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
938 ccLibDepTag, ok := depTag.(libraryDependencyTag)
939 return ok && ccLibDepTag.header()
940}
941
Roland Levillainf89cd092019-07-29 16:22:59 +0100942func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800943 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100944}
945
Colin Crossca860ac2016-01-04 14:34:37 -0800946// Module contains the properties and members used by all C/C++ module types, and implements
947// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500948// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
949// interface.
950//
951// To define a C/C++ related module, construct a new Module object and point its delegates to
952// type-specific structs. These delegates will be invoked to register module-specific build
953// statements which may be unique to the module type. For example, module.compiler.compile() should
954// be defined so as to register build statements which are responsible for compiling the module.
955//
956// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
957// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
958// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
959// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800960type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700961 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700962
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700963 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700964 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -0700965 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700966
Colin Crossca860ac2016-01-04 14:34:37 -0800967 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +0000968 hod android.HostOrDeviceSupported
969 multilib android.Multilib
970 testModule bool
971 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -0700972
Paul Duffina0843f62019-12-13 19:50:38 +0000973 // Allowable SdkMemberTypes of this module type.
974 sdkMemberTypes []android.SdkMemberType
975
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500976 // decorator delegates, initialize before calling Init
977 // these may contain module-specific implementations, and effectively allow for custom
978 // type-specific logic. These members may reference different objects or the same object.
979 // Functions of these decorators will be invoked to initialize and register type-specific
980 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800981 generators []Generator
982 compiler compiler
983 linker linker
984 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500985
Spandan Dase12d2522023-09-12 21:42:31 +0000986 features []feature
987 stl *stl
988 sanitize *sanitize
989 coverage *coverage
990 fuzzer *fuzzer
991 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +0000992 lto *lto
993 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000994 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800995
Colin Cross31076b32020-10-23 17:22:06 -0700996 library libraryInterface
997
Colin Cross635c3b02016-05-18 15:37:25 -0700998 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800999
Colin Crossb98c8b02016-07-29 13:44:28 -07001000 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -07001001
Yu Liue70976d2024-10-15 20:45:35 +00001002 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001003
1004 // Flags used to compile this module
1005 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -07001006
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001007 // Shared flags among build rules of this module
1008 sharedFlags SharedFlags
1009
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08001010 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -07001011 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +09001012
1013 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +09001014
1015 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -07001016 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07001017
1018 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -08001019
Inseob Kim37e0bb02024-04-29 15:54:44 +09001020 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001021
1022 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -07001023
1024 hasAidl bool
1025 hasLex bool
1026 hasProto bool
1027 hasRenderscript bool
1028 hasSysprop bool
1029 hasWinMsg bool
1030 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +00001031
1032 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -07001033}
1034
Yu Liu76d94462024-10-31 23:32:36 +00001035func (c *Module) IncrementalSupported() bool {
1036 return c.incremental
1037}
1038
1039var _ blueprint.Incremental = (*Module)(nil)
1040
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001041func (c *Module) AddJSONData(d *map[string]interface{}) {
1042 c.AndroidModuleBase().AddJSONData(d)
1043 (*d)["Cc"] = map[string]interface{}{
1044 "SdkVersion": c.SdkVersion(),
1045 "MinSdkVersion": c.MinSdkVersion(),
1046 "VndkVersion": c.VndkVersion(),
1047 "ProductSpecific": c.ProductSpecific(),
1048 "SocSpecific": c.SocSpecific(),
1049 "DeviceSpecific": c.DeviceSpecific(),
1050 "InProduct": c.InProduct(),
1051 "InVendor": c.InVendor(),
1052 "InRamdisk": c.InRamdisk(),
1053 "InVendorRamdisk": c.InVendorRamdisk(),
1054 "InRecovery": c.InRecovery(),
1055 "VendorAvailable": c.VendorAvailable(),
1056 "ProductAvailable": c.ProductAvailable(),
1057 "RamdiskAvailable": c.RamdiskAvailable(),
1058 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1059 "RecoveryAvailable": c.RecoveryAvailable(),
1060 "OdmAvailable": c.OdmAvailable(),
1061 "InstallInData": c.InstallInData(),
1062 "InstallInRamdisk": c.InstallInRamdisk(),
1063 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1064 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1065 "InstallInRecovery": c.InstallInRecovery(),
1066 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001067 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001068 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1069 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001070 "AidlSrcs": c.hasAidl,
1071 "LexSrcs": c.hasLex,
1072 "ProtoSrcs": c.hasProto,
1073 "RenderscriptSrcs": c.hasRenderscript,
1074 "SyspropSrcs": c.hasSysprop,
1075 "WinMsgSrcs": c.hasWinMsg,
1076 "YaccSrsc": c.hasYacc,
1077 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001078 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001079 }
1080}
1081
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001082func (c *Module) SetPreventInstall() {
1083 c.Properties.PreventInstall = true
1084}
1085
1086func (c *Module) SetHideFromMake() {
1087 c.Properties.HideFromMake = true
1088}
1089
Ivan Lozanod7586b62021-04-01 09:49:36 -04001090func (c *Module) HiddenFromMake() bool {
1091 return c.Properties.HideFromMake
1092}
1093
Cole Fauste8a87832024-09-11 11:35:46 -07001094func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001095 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001096 if c.ImageVariation().Variation == android.CoreVariation {
1097 required = append(required, c.Properties.Target.Platform.Required...)
1098 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1099 } else if c.InRecovery() {
1100 required = append(required, c.Properties.Target.Recovery.Required...)
1101 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1102 }
1103 return android.FirstUniqueStrings(required)
1104}
1105
Ivan Lozano52767be2019-10-18 14:49:46 -07001106func (c *Module) Toc() android.OptionalPath {
1107 if c.linker != nil {
1108 if library, ok := c.linker.(libraryInterface); ok {
1109 return library.toc()
1110 }
1111 }
1112 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1113}
1114
1115func (c *Module) ApiLevel() string {
1116 if c.linker != nil {
1117 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001118 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001119 }
1120 }
1121 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1122}
1123
1124func (c *Module) Static() bool {
1125 if c.linker != nil {
1126 if library, ok := c.linker.(libraryInterface); ok {
1127 return library.static()
1128 }
1129 }
1130 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1131}
1132
1133func (c *Module) Shared() bool {
1134 if c.linker != nil {
1135 if library, ok := c.linker.(libraryInterface); ok {
1136 return library.shared()
1137 }
1138 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001139
Ivan Lozano52767be2019-10-18 14:49:46 -07001140 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1141}
1142
1143func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001144 if c.stl != nil {
1145 return c.stl.Properties.SelectedStl
1146 }
1147 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001148}
1149
Ivan Lozano52767be2019-10-18 14:49:46 -07001150func (c *Module) StubDecorator() bool {
1151 if _, ok := c.linker.(*stubDecorator); ok {
1152 return true
1153 }
1154 return false
1155}
1156
Yi Kong5786f5c2024-05-28 02:22:34 +09001157func (c *Module) OptimizeForSize() bool {
1158 return Bool(c.Properties.Optimize_for_size)
1159}
1160
Ivan Lozano52767be2019-10-18 14:49:46 -07001161func (c *Module) SdkVersion() string {
1162 return String(c.Properties.Sdk_version)
1163}
1164
Artur Satayev480e25b2020-04-27 18:53:18 +01001165func (c *Module) MinSdkVersion() string {
1166 return String(c.Properties.Min_sdk_version)
1167}
1168
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001169func (c *Module) SetSdkVersion(s string) {
1170 c.Properties.Sdk_version = StringPtr(s)
1171}
1172
1173func (c *Module) SetMinSdkVersion(s string) {
1174 c.Properties.Min_sdk_version = StringPtr(s)
1175}
1176
1177func (c *Module) SetStl(s string) {
1178 if c.stl != nil {
1179 c.stl.Properties.Stl = StringPtr(s)
1180 }
1181}
1182
1183func (c *Module) IsCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001184 if linker, ok := c.linker.(*objectLinker); ok {
1185 return linker.isCrt()
1186 }
1187 return false
1188}
1189
Jiyong Park5df7bd32021-08-25 16:18:46 +09001190func (c *Module) SplitPerApiLevel() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001191 return CanUseSdk(c) && c.IsCrt()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001192}
1193
Colin Crossc511bc52020-04-07 16:50:32 +00001194func (c *Module) AlwaysSdk() bool {
1195 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1196}
1197
Ivan Lozano183a3212019-10-18 14:18:45 -07001198func (c *Module) CcLibrary() bool {
1199 if c.linker != nil {
1200 if _, ok := c.linker.(*libraryDecorator); ok {
1201 return true
1202 }
Colin Crossd48fe732020-09-23 20:37:24 -07001203 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1204 return true
1205 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001206 }
1207 return false
1208}
1209
1210func (c *Module) CcLibraryInterface() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001211 if c.library != nil {
Ivan Lozano183a3212019-10-18 14:18:45 -07001212 return true
1213 }
1214 return false
1215}
1216
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001217func (c *Module) RlibStd() bool {
1218 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1219}
1220
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001221func (c *Module) RustLibraryInterface() bool {
1222 return false
1223}
1224
Ivan Lozano0a468a42024-05-13 21:03:34 -04001225func (c *Module) CrateName() string {
1226 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1227}
1228
1229func (c *Module) ExportedCrateLinkDirs() []string {
1230 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1231}
1232
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001233func (c *Module) IsFuzzModule() bool {
1234 if _, ok := c.compiler.(*fuzzBinary); ok {
1235 return true
1236 }
1237 return false
1238}
1239
1240func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1241 return c.FuzzModule
1242}
1243
1244func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1245 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1246 return fuzzer.fuzzPackagedModule
1247 }
1248 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1249}
1250
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001251func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001252 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1253 return fuzzer.sharedLibraries
1254 }
1255 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1256}
1257
Ivan Lozano2b262972019-11-21 12:30:50 -08001258func (c *Module) NonCcVariants() bool {
1259 return false
1260}
1261
Ivan Lozano183a3212019-10-18 14:18:45 -07001262func (c *Module) SetStatic() {
1263 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001264 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001265 library.setStatic()
1266 return
1267 }
1268 }
1269 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1270}
1271
1272func (c *Module) SetShared() {
1273 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001274 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001275 library.setShared()
1276 return
1277 }
1278 }
1279 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1280}
1281
1282func (c *Module) BuildStaticVariant() bool {
1283 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001284 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001285 return library.buildStatic()
1286 }
1287 }
1288 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1289}
1290
1291func (c *Module) BuildSharedVariant() bool {
1292 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001293 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001294 return library.buildShared()
1295 }
1296 }
1297 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1298}
1299
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001300func (c *Module) BuildRlibVariant() bool {
1301 // cc modules can never build rlib variants
1302 return false
1303}
1304
Ivan Lozano183a3212019-10-18 14:18:45 -07001305func (c *Module) Module() android.Module {
1306 return c
1307}
1308
Jiyong Parkc20eee32018-09-05 22:36:17 +09001309func (c *Module) OutputFile() android.OptionalPath {
1310 return c.outputFile
1311}
1312
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001313func (c *Module) CoverageFiles() android.Paths {
1314 if c.linker != nil {
1315 if library, ok := c.linker.(libraryInterface); ok {
1316 return library.objs().coverageFiles
1317 }
1318 }
1319 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1320}
1321
Ivan Lozano183a3212019-10-18 14:18:45 -07001322var _ LinkableInterface = (*Module)(nil)
1323
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001324func (c *Module) VersionedInterface() VersionedInterface {
1325 if c.library != nil {
1326 return c.library
1327 }
1328 return nil
1329}
1330
Jiyong Park719b4462019-01-13 00:39:51 +09001331func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001332 if c.linker != nil {
1333 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001334 }
1335 return nil
1336}
1337
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001338func (c *Module) CoverageOutputFile() android.OptionalPath {
1339 if c.linker != nil {
1340 return c.linker.coverageOutputFilePath()
1341 }
1342 return android.OptionalPath{}
1343}
1344
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001345func (c *Module) RelativeInstallPath() string {
1346 if c.installer != nil {
1347 return c.installer.relativeInstallPath()
1348 }
1349 return ""
1350}
1351
Jooyung Han344d5432019-08-23 11:17:39 +09001352func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001353 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001354}
1355
Colin Cross36242852017-06-23 15:06:31 -07001356func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001357 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001358 for _, generator := range c.generators {
1359 c.AddProperties(generator.GeneratorProps()...)
1360 }
Colin Crossca860ac2016-01-04 14:34:37 -08001361 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001362 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001363 }
1364 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001365 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001366 }
1367 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001368 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001369 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001370 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001371 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001372 }
Colin Cross16b23492016-01-06 14:41:07 -08001373 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001374 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001375 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001376 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001377 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001378 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001379 if c.fuzzer != nil {
1380 c.AddProperties(c.fuzzer.props()...)
1381 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001382 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001383 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001384 }
Stephen Craneba090d12017-05-09 15:44:35 -07001385 if c.lto != nil {
1386 c.AddProperties(c.lto.props()...)
1387 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001388 if c.afdo != nil {
1389 c.AddProperties(c.afdo.props()...)
1390 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001391 if c.orderfile != nil {
1392 c.AddProperties(c.orderfile.props()...)
1393 }
Colin Crossca860ac2016-01-04 14:34:37 -08001394 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001395 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001396 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001397 // Allow test-only on libraries that are not cc_test_library
1398 if c.library != nil && !c.testLibrary() {
1399 c.AddProperties(&c.sourceProperties)
1400 }
Colin Crossc472d572015-03-17 15:06:21 -07001401
Colin Cross36242852017-06-23 15:06:31 -07001402 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001403 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001404 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001405
Colin Cross36242852017-06-23 15:06:31 -07001406 return c
Colin Crossc472d572015-03-17 15:06:21 -07001407}
1408
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001409// UseVndk() returns true if this module is built against VNDK.
1410// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001411func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001412 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001413}
1414
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001415func CanUseSdk(c LinkableInterface) bool {
1416 return c.Module().Target().Os == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001417 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001418}
1419
1420func (c *Module) UseSdk() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001421 if CanUseSdk(c) {
Colin Cross1348ce32020-10-01 13:37:16 -07001422 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001423 }
1424 return false
1425}
1426
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001427func (c *Module) isCoverageVariant() bool {
1428 return c.coverage.Properties.IsCoverageVariant
1429}
1430
Colin Cross95f1ca02020-10-29 20:47:22 -07001431func (c *Module) IsNdk(config android.Config) bool {
1432 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001433}
1434
Colin Cross127bb8b2020-12-16 16:46:01 -08001435func (c *Module) IsLlndk() bool {
1436 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001437}
1438
Colin Cross1f3f1302021-04-26 18:37:44 -07001439func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001440 lib := moduleVersionedInterface(m)
1441 return lib != nil && (lib.HasLLNDKStubs() || lib.HasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001442}
1443
Colin Cross5271fea2021-04-27 13:06:04 -07001444func (m *Module) NeedsVendorPublicLibraryVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001445 lib := moduleVersionedInterface(m)
1446 return lib != nil && (lib.HasVendorPublicLibrary())
Colin Cross5271fea2021-04-27 13:06:04 -07001447}
1448
1449// IsVendorPublicLibrary returns true for vendor public libraries.
1450func (c *Module) IsVendorPublicLibrary() bool {
1451 return c.VendorProperties.IsVendorPublicLibrary
1452}
1453
Ivan Lozanof1868af2022-04-12 13:08:36 -04001454func (c *Module) IsVndkPrebuiltLibrary() bool {
1455 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1456 return true
1457 }
1458 return false
1459}
1460
1461func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1462 return c.Properties.SdkAndPlatformVariantVisibleToMake
1463}
1464
Ivan Lozanod7586b62021-04-01 09:49:36 -04001465func (c *Module) HasLlndkStubs() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001466 lib := moduleVersionedInterface(c)
1467 return lib != nil && lib.HasLLNDKStubs()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001468}
1469
1470func (c *Module) StubsVersion() string {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001471 if lib, ok := c.linker.(VersionedInterface); ok {
1472 return lib.StubsVersion()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001473 }
1474 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1475}
1476
Colin Cross127bb8b2020-12-16 16:46:01 -08001477// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1478// and does not set llndk.vendor_available: false.
1479func (c *Module) isImplementationForLLNDKPublic() bool {
1480 library, _ := c.library.(*libraryDecorator)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001481 return library != nil && library.HasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001482 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001483}
1484
Colin Cross3513fb12024-01-24 14:44:47 -08001485func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001486 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001487 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001488 }
1489 return false
1490}
1491
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001492func (c *Module) isOrderfileCompile() bool {
1493 if orderfile := c.orderfile; orderfile != nil {
1494 return orderfile.Properties.OrderfileLoad
1495 }
1496 return false
1497}
1498
Yi Kongc702ebd2022-08-19 16:02:45 +08001499func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001500 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001501}
1502
Yi Konged79fa32023-06-04 17:15:42 +09001503func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001504 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001505}
1506
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001507func (c *Module) isNDKStubLibrary() bool {
1508 if _, ok := c.compiler.(*stubDecorator); ok {
1509 return true
1510 }
1511 return false
1512}
1513
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001514func (c *Module) SubName() string {
1515 return c.Properties.SubName
1516}
1517
Jiyong Park25fc6a92018-11-18 18:02:45 +09001518func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001519 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001520 return lib.BuildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001521 }
1522 return false
1523}
1524
1525func (c *Module) HasStubsVariants() 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.HasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001528 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001529 return false
1530}
1531
Alan Stokes73feba32022-11-14 12:21:24 +00001532func (c *Module) IsStubsImplementationRequired() bool {
1533 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001534 return lib.IsStubsImplementationRequired()
Alan Stokes73feba32022-11-14 12:21:24 +00001535 }
1536 return false
1537}
1538
Colin Cross0477b422020-10-13 18:43:54 -07001539// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1540// the implementation. If it is an implementation library it returns its own name.
1541func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1542 name := ctx.OtherModuleName(c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001543 if versioned, ok := c.linker.(VersionedInterface); ok {
1544 name = versioned.ImplementationModuleName(name)
Colin Cross0477b422020-10-13 18:43:54 -07001545 }
1546 return name
1547}
1548
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001549// Similar to ImplementationModuleNameByCtx, but uses the Make variant of the module
Martin Stjernholm2856c662020-12-02 15:03:42 +00001550// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1551// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1552// under the premise that the prebuilt module overrides its source counterpart
1553// if it is exposed to Make).
1554func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1555 name := c.BaseModuleName()
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001556 if versioned, ok := c.linker.(VersionedInterface); ok {
1557 name = versioned.ImplementationModuleName(name)
Martin Stjernholm2856c662020-12-02 15:03:42 +00001558 }
1559 return name
1560}
1561
Jiyong Park7d55b612021-06-11 17:22:09 +09001562func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001563 return Bool(c.Properties.Bootstrap)
1564}
1565
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001566func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001567 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1568 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1569 return false
1570 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001571 return c.linker != nil && c.linker.nativeCoverage()
1572}
1573
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001574func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001575 if p, ok := c.linker.(SnapshotInterface); ok {
1576 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001577 }
1578 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001579}
1580
Jiyong Parkf1194352019-02-25 11:05:47 +09001581func isBionic(name string) bool {
1582 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001583 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001584 return true
1585 }
1586 return false
1587}
1588
Martin Stjernholm279de572019-09-10 23:18:20 +01001589func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001590 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001591 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001592 }
1593 return isBionic(name)
1594}
1595
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001596func (c *Module) isCfiAssemblySupportEnabled() bool {
1597 return c.sanitize != nil &&
1598 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1599}
1600
Inseob Kim800d1142021-06-14 12:03:51 +09001601func (c *Module) InstallInRoot() bool {
1602 return c.installer != nil && c.installer.installInRoot()
1603}
1604
Colin Crossca860ac2016-01-04 14:34:37 -08001605type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001606 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001607 moduleContextImpl
1608}
1609
Colin Cross37047f12016-12-13 17:06:13 -08001610type depsContext struct {
1611 android.BottomUpMutatorContext
1612 moduleContextImpl
1613}
1614
Colin Crossca860ac2016-01-04 14:34:37 -08001615type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001616 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001617 moduleContextImpl
1618}
1619
1620type moduleContextImpl struct {
1621 mod *Module
1622 ctx BaseModuleContext
1623}
1624
Colin Crossb98c8b02016-07-29 13:44:28 -07001625func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001626 return ctx.mod.toolchain(ctx.ctx)
1627}
1628
1629func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001630 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001631}
1632
1633func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001634 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001635}
1636
Colin Cross6a730042024-12-05 13:53:43 -08001637func (ctx *moduleContextImpl) staticLibrary() bool {
1638 return ctx.mod.staticLibrary()
1639}
1640
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001641func (ctx *moduleContextImpl) testBinary() bool {
1642 return ctx.mod.testBinary()
1643}
1644
Yi Kong56fc1b62022-09-06 16:24:00 +08001645func (ctx *moduleContextImpl) testLibrary() bool {
1646 return ctx.mod.testLibrary()
1647}
1648
Jiyong Park1d1119f2019-07-29 21:27:18 +09001649func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001650 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001651}
1652
Inseob Kim7f283f42020-06-01 21:53:49 +09001653func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001654 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001655}
1656
Inseob Kim1042d292020-06-01 23:23:05 +09001657func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001658 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001659}
1660
Yi Kong5786f5c2024-05-28 02:22:34 +09001661func (ctx *moduleContextImpl) optimizeForSize() bool {
1662 return ctx.mod.OptimizeForSize()
1663}
1664
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001665func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001666 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001667}
1668
1669func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001670 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001671 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001672 }
1673 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001674}
1675
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001676func MinSdkVersion(mod VersionedLinkableInterface, ctxIsForPlatform bool, device bool,
1677 platformSdkVersion string) string {
1678
1679 ver := mod.MinSdkVersion()
1680 if ver == "apex_inherit" && !ctxIsForPlatform {
1681 ver = mod.ApexSdkVersion().String()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001682 }
1683 if ver == "apex_inherit" || ver == "" {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001684 ver = mod.SdkVersion()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001685 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001686
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001687 if device {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001688 // When building for vendor/product, use the latest _stable_ API as "current".
1689 // This is passed to clang/aidl compilers so that compiled/generated code works
1690 // with the system.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001691 if (mod.InVendor() || mod.InProduct()) && (ver == "" || ver == "current") {
1692 ver = platformSdkVersion
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001693 }
1694 }
1695
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001696 // For crt objects, the meaning of min_sdk_version is very different from other types of
1697 // module. For them, min_sdk_version defines the oldest version that the build system will
1698 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1699 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1700 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001701 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1702 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1703 // support such an old version. The version is set to the later version in case when the
1704 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1705 // it's for an APEX.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001706 if mod.IsCrt() && !mod.IsSdkVariant() {
1707 if ctxIsForPlatform {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001708 ver = strconv.Itoa(android.FutureApiLevelInt)
1709 } else { // for apex
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001710 ver = mod.ApexSdkVersion().String()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001711 if ver == "" { // in case when min_sdk_version was not set by the APEX
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001712 ver = mod.SdkVersion()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001713 }
1714 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001715 }
1716
Jiyong Parkb35a8192020-08-10 15:59:36 +09001717 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001718 sdkVersionInt, err := strconv.Atoi(mod.SdkVersion())
Jiyong Parkb35a8192020-08-10 15:59:36 +09001719 minSdkVersionInt, err2 := strconv.Atoi(ver)
1720 if err == nil && err2 == nil {
1721 if sdkVersionInt < minSdkVersionInt {
1722 return strconv.Itoa(sdkVersionInt)
1723 }
1724 }
1725 return ver
1726}
1727
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001728func (ctx *moduleContextImpl) minSdkVersion() string {
1729 platformSdkVersion := ""
1730 if ctx.ctx.Device() {
1731 platformSdkVersion = ctx.ctx.Config().PlatformSdkVersion().String()
1732 }
1733 return MinSdkVersion(ctx.mod, CtxIsForPlatform(ctx.ctx), ctx.ctx.Device(), platformSdkVersion)
1734}
1735
Jiyong Parkb35a8192020-08-10 15:59:36 +09001736func (ctx *moduleContextImpl) isSdkVariant() bool {
1737 return ctx.mod.IsSdkVariant()
1738}
1739
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001740func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001741 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001742}
Justin Yun8effde42017-06-23 19:24:43 +09001743
Kiyoung Kimaa394802024-01-08 12:55:45 +09001744func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1745 return ctx.mod.InVendorOrProduct()
1746}
1747
Colin Cross95f1ca02020-10-29 20:47:22 -07001748func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1749 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001750}
1751
Colin Cross127bb8b2020-12-16 16:46:01 -08001752func (ctx *moduleContextImpl) IsLlndk() bool {
1753 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001754}
1755
Colin Cross127bb8b2020-12-16 16:46:01 -08001756func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1757 return ctx.mod.isImplementationForLLNDKPublic()
1758}
1759
Colin Cross3513fb12024-01-24 14:44:47 -08001760func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1761 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001762}
1763
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001764func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1765 return ctx.mod.isOrderfileCompile()
1766}
1767
Yi Kongc702ebd2022-08-19 16:02:45 +08001768func (ctx *moduleContextImpl) isCfi() bool {
1769 return ctx.mod.isCfi()
1770}
1771
Yi Konged79fa32023-06-04 17:15:42 +09001772func (ctx *moduleContextImpl) isFuzzer() bool {
1773 return ctx.mod.isFuzzer()
1774}
1775
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001776func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1777 return ctx.mod.isNDKStubLibrary()
1778}
1779
Colin Cross5271fea2021-04-27 13:06:04 -07001780func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1781 return ctx.mod.IsVendorPublicLibrary()
1782}
1783
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001784func (ctx *moduleContextImpl) selectedStl() string {
1785 if stl := ctx.mod.stl; stl != nil {
1786 return stl.Properties.SelectedStl
1787 }
1788 return ""
1789}
1790
Ivan Lozanobd721262018-11-27 14:33:03 -08001791func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1792 return ctx.mod.linker.useClangLld(actx)
1793}
1794
Colin Crossce75d2c2016-10-06 16:12:58 -07001795func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001796 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001797}
1798
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001799func CtxIsForPlatform(ctx android.BaseModuleContext) bool {
1800 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Colin Crossff694a82023-12-13 15:54:49 -08001801 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001802}
1803
Colin Crosse07f2312020-08-13 11:24:56 -07001804func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001805 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1806 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001807}
1808
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001809func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001810 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001811}
1812
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001813func (ctx *moduleContextImpl) nativeCoverage() bool {
1814 return ctx.mod.nativeCoverage()
1815}
1816
Colin Cross95b07f22020-12-16 11:06:50 -08001817func (ctx *moduleContextImpl) isPreventInstall() bool {
1818 return ctx.mod.Properties.PreventInstall
1819}
1820
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001821func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1822 shared := &ctx.mod.sharedFlags
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001823 if shared.FlagsMap == nil {
1824 shared.NumSharedFlags = 0
1825 shared.FlagsMap = make(map[string]string)
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001826 }
1827 return shared
1828}
1829
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001830func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1831 return ctx.mod.isCfiAssemblySupportEnabled()
1832}
1833
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001834func (ctx *moduleContextImpl) notInPlatform() bool {
1835 return ctx.mod.NotInPlatform()
1836}
1837
Yu Liu76d94462024-10-31 23:32:36 +00001838func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1839 if ctx.mod.makeVarsInfo == nil {
1840 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1841 }
1842 return ctx.mod.makeVarsInfo
1843}
1844
Colin Cross635c3b02016-05-18 15:37:25 -07001845func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001846 return &Module{
1847 hod: hod,
1848 multilib: multilib,
1849 }
1850}
1851
Colin Cross635c3b02016-05-18 15:37:25 -07001852func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001853 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001854 module.features = []feature{
1855 &tidyFeature{},
1856 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001857 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001858 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001859 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001860 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001861 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001862 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001863 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001864 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001865 return module
1866}
1867
Colin Crossce75d2c2016-10-06 16:12:58 -07001868func (c *Module) Prebuilt() *android.Prebuilt {
1869 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1870 return p.prebuilt()
1871 }
1872 return nil
1873}
1874
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001875func (c *Module) IsPrebuilt() bool {
1876 return c.Prebuilt() != nil
1877}
1878
Colin Crossce75d2c2016-10-06 16:12:58 -07001879func (c *Module) Name() string {
1880 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001881 if p, ok := c.linker.(interface {
1882 Name(string) string
1883 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001884 name = p.Name(name)
1885 }
1886 return name
1887}
1888
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001889func (c *Module) Multilib() string {
1890 return c.Arch().ArchType.Multilib
1891}
1892
1893func (c *Module) ApexSdkVersion() android.ApiLevel {
1894 return c.apexSdkVersion
1895}
1896
Alex Light3d673592019-01-18 14:37:31 -08001897func (c *Module) Symlinks() []string {
1898 if p, ok := c.installer.(interface {
1899 symlinkList() []string
1900 }); ok {
1901 return p.symlinkList()
1902 }
1903 return nil
1904}
1905
Chris Parsons216e10a2020-07-09 17:12:52 -04001906func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001907 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001908 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001909 }); ok {
1910 return p.dataPaths()
1911 }
1912 return nil
1913}
1914
Ivan Lozanof1868af2022-04-12 13:08:36 -04001915func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001916 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1917 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001918 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001919 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001920 if c.ProductSpecific() {
1921 // If the module is product specific with 'product_specific: true',
1922 // do not add a name suffix because it is a base module.
1923 return ""
1924 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001925 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001926 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001927 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001928 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001929 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001930 // add version suffix only if the module is using different vndk version than the
1931 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001932 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001933 }
1934 return nameSuffix
1935}
1936
Ivan Lozanof1868af2022-04-12 13:08:36 -04001937func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1938 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001939
1940 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001941 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001942 }
1943
Colin Cross127bb8b2020-12-16 16:46:01 -08001944 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001945 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001946 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1947 // added for product variant only when we have vendor and product variants with core
1948 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001949 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001950 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001951 subName += vendorPublicLibrarySuffix
1952 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001953 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1954 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001955 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001956 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001957 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001958 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001959 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001960 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001961 subName += RecoverySuffix
1962 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1963 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001964 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001965 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001966 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001967 } else if c.IsStubs() && c.IsSdkVariant() {
1968 // Public API surface (NDK)
1969 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1970 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001971 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001972
1973 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001974}
1975
Sam Delmerico75dbca22023-04-20 13:13:25 +00001976func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1977 ctx := &moduleContext{
1978 ModuleContext: actx,
1979 moduleContextImpl: moduleContextImpl{
1980 mod: c,
1981 },
1982 }
1983 ctx.ctx = ctx
1984 return ctx
1985}
1986
Spandan Das20fce2d2023-04-12 17:21:39 +00001987// TODO (b/277651159): Remove this allowlist
1988var (
1989 skipStubLibraryMultipleApexViolation = map[string]bool{
1990 "libclang_rt.asan": true,
1991 "libclang_rt.hwasan": true,
1992 // runtime apex
1993 "libc": true,
1994 "libc_hwasan": true,
1995 "libdl_android": true,
1996 "libm": true,
1997 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00001998 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00001999 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01002000 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00002001 "libandroidio": true,
2002 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01002003 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00002004 "libnativebridge": true,
2005 "libnativehelper": true,
2006 "libnativeloader": true,
2007 "libsigchain": true,
2008 }
2009)
2010
2011// Returns true if a stub library could be installed in multiple apexes
2012func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2013 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08002014 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00002015 return false
2016 }
2017 // If this is not a stub library, no check necessary
2018 if !c.HasStubsVariants() {
2019 return false
2020 }
2021 // Skip the allowlist
2022 // Use BaseModuleName so that this matches prebuilts.
2023 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2024 return false
2025 }
2026
Spandan Das20fce2d2023-04-12 17:21:39 +00002027 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08002028 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
2029 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00002030 return true
2031 }
2032 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08002033 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00002034 return true
2035 }
2036 // Default: no violation
2037 return false
2038}
2039
Chris Parsons8d6e4332021-02-22 16:13:50 -05002040func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002041 ctx := moduleContextFromAndroidModuleContext(actx, c)
2042
Inseob Kim37e0bb02024-04-29 15:54:44 +09002043 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2044 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2045 Logtags: c.logtagsPaths,
2046 })
2047
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002048 // If Test_only is set on a module in bp file, respect the setting, otherwise
2049 // see if is a known test module type.
2050 testOnly := c.testModule || c.testLibrary()
2051 if c.sourceProperties.Test_only != nil {
2052 testOnly = Bool(c.sourceProperties.Test_only)
2053 }
2054 // Keep before any early returns.
2055 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2056 TestOnly: testOnly,
2057 TopLevelTarget: c.testModule,
2058 })
2059
Ivan Lozanof1868af2022-04-12 13:08:36 -04002060 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002061 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002062 if !apexInfo.IsForPlatform() {
2063 c.hideApexVariantFromMake = true
2064 }
2065
Chris Parsonseefc9e62021-04-02 17:36:47 -04002066 c.makeLinkType = GetMakeLinkType(actx, c)
2067
Colin Crossf18e1102017-11-16 14:33:08 -08002068 deps := c.depsToPaths(ctx)
2069 if ctx.Failed() {
2070 return
2071 }
2072
Joe Onorato37f900c2023-07-18 16:58:16 -07002073 for _, generator := range c.generators {
2074 gen := generator.GeneratorSources(ctx)
2075 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2076 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2077 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2078 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2079 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2080 if len(deps.Objs.objFiles) == 0 {
2081 // If we are reusuing object files (which happens when we're a shared library and we're
2082 // reusing our static variant's object files), then skip adding the actual source files,
2083 // because we already have the object for it.
2084 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2085 }
2086 }
2087
2088 if ctx.Failed() {
2089 return
2090 }
2091
Spandan Das20fce2d2023-04-12 17:21:39 +00002092 if c.stubLibraryMultipleApexViolation(actx) {
2093 actx.PropertyErrorf("apex_available",
2094 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2095 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002096 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2097 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002098 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2099 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002100 }
2101
Colin Crossca860ac2016-01-04 14:34:37 -08002102 flags := Flags{
2103 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002104 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002105 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002106 for _, generator := range c.generators {
2107 flags = generator.GeneratorFlags(ctx, flags, deps)
2108 }
Colin Crossca860ac2016-01-04 14:34:37 -08002109 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002110 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002111 }
2112 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002113 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002114 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002115 if c.stl != nil {
2116 flags = c.stl.flags(ctx, flags)
2117 }
Colin Cross16b23492016-01-06 14:41:07 -08002118 if c.sanitize != nil {
2119 flags = c.sanitize.flags(ctx, flags)
2120 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002121 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002122 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002123 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002124 if c.fuzzer != nil {
2125 flags = c.fuzzer.flags(ctx, flags)
2126 }
Stephen Craneba090d12017-05-09 15:44:35 -07002127 if c.lto != nil {
2128 flags = c.lto.flags(ctx, flags)
2129 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002130 if c.afdo != nil {
2131 flags = c.afdo.flags(ctx, flags)
2132 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002133 if c.orderfile != nil {
2134 flags = c.orderfile.flags(ctx, flags)
2135 }
Colin Crossca860ac2016-01-04 14:34:37 -08002136 for _, feature := range c.features {
2137 flags = feature.flags(ctx, flags)
2138 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002139 if ctx.Failed() {
2140 return
2141 }
2142
Colin Cross4af21ed2019-11-04 09:37:55 -08002143 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2144 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2145 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002146
Colin Cross4af21ed2019-11-04 09:37:55 -08002147 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002148
2149 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002150 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002151 }
2152 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002153 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002154 }
2155
Colin Cross3e5e7782022-06-17 22:17:05 +00002156 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2157
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002158 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002159 // We need access to all the flags seen by a source file.
2160 if c.sabi != nil {
2161 flags = c.sabi.flags(ctx, flags)
2162 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002163
Colin Cross4af21ed2019-11-04 09:37:55 -08002164 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002165
Joe Onorato37f900c2023-07-18 16:58:16 -07002166 for _, generator := range c.generators {
2167 generator.GeneratorBuildActions(ctx, flags, deps)
2168 }
2169
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002170 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002171 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002172 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002173 if ctx.Failed() {
2174 return
2175 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002176 }
2177
Colin Crossca860ac2016-01-04 14:34:37 -08002178 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002179 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002180 if ctx.Failed() {
2181 return
2182 }
Colin Cross635c3b02016-05-18 15:37:25 -07002183 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002184
Chris Parsons94a0bba2021-06-04 15:03:47 -04002185 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002186
2187 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2188 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2189 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002190 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002191
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002192 if Bool(c.Properties.Cmake_snapshot_supported) {
2193 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2194 }
2195
Chris Parsons94a0bba2021-06-04 15:03:47 -04002196 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002197
2198 if c.linker != nil {
2199 moduleInfoJSON := ctx.ModuleInfoJSON()
2200 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2201 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2202 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2203 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2204 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2205
2206 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2207 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2208 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2209 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2210
2211 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2212 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2213 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2214 moduleInfoJSON.SubName += ".cfi"
2215 }
2216 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2217 moduleInfoJSON.SubName += ".hwasan"
2218 }
2219 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2220 moduleInfoJSON.SubName += ".scs"
2221 }
2222 }
2223 moduleInfoJSON.SubName += c.Properties.SubName
2224
2225 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2226 moduleInfoJSON.Uninstallable = true
2227 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002228 }
Wei Lia1aa2972024-06-21 13:08:51 -07002229
2230 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002231
Cole Faust96a692b2024-08-08 14:47:51 -07002232 if b, ok := c.compiler.(*baseCompiler); ok {
2233 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2234 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2235 c.hasProto = b.hasSrcExt(ctx, ".proto")
2236 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2237 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2238 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2239 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2240 }
2241
Yu Liuec7043d2024-11-05 18:22:20 +00002242 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002243 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002244 }
2245 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002246 ccObjectInfo.ObjFiles = objs.objFiles
2247 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002248 }
Yu Liu4f825132024-12-18 00:35:39 +00002249 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002250 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2251 }
2252
Yu Liu8024b922024-12-20 23:31:32 +00002253 linkableInfo := CreateCommonLinkableInfo(c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002254 if lib, ok := c.linker.(VersionedInterface); ok {
2255 linkableInfo.StubsVersion = lib.StubsVersion()
Yu Liu8024b922024-12-20 23:31:32 +00002256 }
2257 if c.linker != nil {
2258 if library, ok := c.linker.(libraryInterface); ok {
2259 linkableInfo.Static = library.static()
Yu Liu8a8d5b42025-01-07 00:48:08 +00002260 linkableInfo.Shared = library.shared()
Yu Liu8024b922024-12-20 23:31:32 +00002261 linkableInfo.CoverageFiles = library.objs().coverageFiles
2262 linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles
2263 }
2264 }
2265 android.SetProvider(ctx, LinkableInfoProvider, linkableInfo)
Yu Liu986d98c2024-11-12 00:28:11 +00002266
Yu Liu323d77a2024-12-16 23:13:57 +00002267 ccInfo := CcInfo{
Yu Liu323d77a2024-12-16 23:13:57 +00002268 IsPrebuilt: c.IsPrebuilt(),
2269 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
Yu Liu68a70b72025-01-08 22:54:44 +00002270 HasLlndkStubs: c.HasLlndkStubs(),
Yu Liu323d77a2024-12-16 23:13:57 +00002271 }
2272 if c.compiler != nil {
2273 ccInfo.CompilerInfo = &CompilerInfo{
2274 Srcs: c.compiler.(CompiledInterface).Srcs(),
2275 Cflags: c.compiler.baseCompilerProps().Cflags,
2276 AidlInterfaceInfo: AidlInterfaceInfo{
2277 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2278 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2279 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2280 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2281 },
2282 }
2283 switch decorator := c.compiler.(type) {
2284 case *libraryDecorator:
2285 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002286 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs,
Yu Liu323d77a2024-12-16 23:13:57 +00002287 }
2288 }
2289 }
2290 if c.linker != nil {
2291 ccInfo.LinkerInfo = &LinkerInfo{
Yu Liu8024b922024-12-20 23:31:32 +00002292 WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs,
2293 StaticLibs: c.linker.baseLinkerProps().Static_libs,
2294 SharedLibs: c.linker.baseLinkerProps().Shared_libs,
2295 HeaderLibs: c.linker.baseLinkerProps().Header_libs,
Yu Liu323d77a2024-12-16 23:13:57 +00002296 }
2297 switch decorator := c.linker.(type) {
2298 case *binaryDecorator:
2299 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2300 case *libraryDecorator:
Yu Liu116610a2025-01-06 21:54:48 +00002301 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
2302 InjectBsslHash: Bool(c.linker.(*libraryDecorator).Properties.Inject_bssl_hash),
2303 }
Yu Liu323d77a2024-12-16 23:13:57 +00002304 case *testBinary:
2305 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2306 Gtest: decorator.testDecorator.gtest(),
2307 }
2308 case *benchmarkDecorator:
2309 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2310 case *objectLinker:
2311 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{}
Yu Liu8a8d5b42025-01-07 00:48:08 +00002312 case *stubDecorator:
2313 ccInfo.LinkerInfo.StubDecoratorInfo = &StubDecoratorInfo{}
Yu Liu323d77a2024-12-16 23:13:57 +00002314 }
Yu Liu8024b922024-12-20 23:31:32 +00002315
2316 if s, ok := c.linker.(SnapshotInterface); ok {
2317 ccInfo.SnapshotInfo = &SnapshotInfo{
2318 SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(),
2319 }
Yu Liuffe86322024-12-18 18:53:12 +00002320 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002321 if v, ok := c.linker.(VersionedInterface); ok {
2322 name := v.ImplementationModuleName(ctx.OtherModuleName(c))
Yu Liu68a70b72025-01-08 22:54:44 +00002323 ccInfo.LinkerInfo.ImplementationModuleName = &name
2324 }
Yu Liuffe86322024-12-18 18:53:12 +00002325 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002326 if c.library != nil {
2327 ccInfo.LibraryInfo = &LibraryInfo{
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002328 BuildStubs: c.library.BuildStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002329 }
2330 }
Yu Liu8024b922024-12-20 23:31:32 +00002331 android.SetProvider(ctx, CcInfoProvider, &ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002332
mrziwangabdb2932024-06-18 12:43:41 -07002333 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002334
2335 if c.makeVarsInfo != nil {
2336 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2337 }
mrziwangabdb2932024-06-18 12:43:41 -07002338}
2339
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002340func CreateCommonLinkableInfo(mod VersionedLinkableInterface) *LinkableInfo {
Yu Liu8024b922024-12-20 23:31:32 +00002341 return &LinkableInfo{
2342 StaticExecutable: mod.StaticExecutable(),
2343 HasStubsVariants: mod.HasStubsVariants(),
2344 OutputFile: mod.OutputFile(),
2345 UnstrippedOutputFile: mod.UnstrippedOutputFile(),
2346 IsStubs: mod.IsStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002347 CcLibrary: mod.CcLibrary(),
Yu Liu8024b922024-12-20 23:31:32 +00002348 CcLibraryInterface: mod.CcLibraryInterface(),
2349 RustLibraryInterface: mod.RustLibraryInterface(),
2350 BaseModuleName: mod.BaseModuleName(),
2351 IsLlndk: mod.IsLlndk(),
2352 HasNonSystemVariants: mod.HasNonSystemVariants(),
2353 SubName: mod.SubName(),
2354 InVendorOrProduct: mod.InVendorOrProduct(),
2355 InRamdisk: mod.InRamdisk(),
2356 OnlyInRamdisk: mod.OnlyInRamdisk(),
2357 InVendorRamdisk: mod.InVendorRamdisk(),
2358 OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(),
2359 InRecovery: mod.InRecovery(),
2360 OnlyInRecovery: mod.OnlyInRecovery(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002361 Installable: mod.Installable(),
Yu Liu97880e12025-01-07 19:03:34 +00002362 RelativeInstallPath: mod.RelativeInstallPath(),
Yu Liu8024b922024-12-20 23:31:32 +00002363 }
2364}
2365
Yu Liuec7043d2024-11-05 18:22:20 +00002366func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2367 if len(files) > 0 {
2368 ctx.SetOutputFiles(files, tag)
2369 }
2370}
2371
mrziwangabdb2932024-06-18 12:43:41 -07002372func (c *Module) setOutputFiles(ctx ModuleContext) {
2373 if c.outputFile.Valid() {
2374 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2375 } else {
2376 ctx.SetOutputFiles(android.Paths{}, "")
2377 }
2378 if c.linker != nil {
2379 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2380 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2381 }
Wei Lia1aa2972024-06-21 13:08:51 -07002382}
2383
2384func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2385 // Dump metadata that can not be done in android/compliance-metadata.go
2386 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
2387 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static()))
2388 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2389
2390 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002391 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002392 staticDepNames := make([]string, 0, len(staticDeps))
2393 for _, dep := range staticDeps {
2394 staticDepNames = append(staticDepNames, dep.Name())
2395 }
2396
2397 staticDepPaths := make([]string, 0, len(deps.StaticLibs))
2398 for _, dep := range deps.StaticLibs {
2399 staticDepPaths = append(staticDepPaths, dep.String())
2400 }
2401 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2402 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2403
2404 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002405 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002406 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2407 for _, dep := range wholeStaticDeps {
2408 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2409 }
2410
2411 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2412 for _, dep := range deps.WholeStaticLibs {
2413 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2414 }
2415 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2416 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002417}
2418
2419func (c *Module) maybeUnhideFromMake() {
2420 // If a lib is directly included in any of the APEXes or is not available to the
2421 // platform (which is often the case when the stub is provided as a prebuilt),
2422 // unhide the stubs variant having the latest version gets visible to make. In
2423 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2424 // force anything in the make world to link against the stubs library. (unless it
2425 // is explicitly referenced via .bootstrap suffix or the module is marked with
2426 // 'bootstrap: true').
2427 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002428 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002429 c.IsStubs() && !c.InVendorRamdisk() {
2430 c.Properties.HideFromMake = false // unhide
2431 // Note: this is still non-installable
2432 }
2433}
2434
Colin Cross8ff10582023-12-07 13:10:56 -08002435// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2436// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002437func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002438 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002439 // If the module has been specifically configure to not be installed then
2440 // hide from make as otherwise it will break when running inside make
2441 // as the output path to install will not be specified. Not all uninstallable
2442 // modules can be hidden from make as some are needed for resolving make side
2443 // dependencies.
2444 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002445 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002446 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002447 c.SkipInstall()
2448 }
2449
2450 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2451 // to allow using the outputs in a genrule.
2452 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002453 c.installer.install(ctx, c.outputFile.Path())
2454 if ctx.Failed() {
2455 return
Colin Crossca860ac2016-01-04 14:34:37 -08002456 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002457 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002458}
2459
Colin Cross0ea8ba82019-06-06 14:33:29 -07002460func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002461 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002462 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002463 }
Colin Crossca860ac2016-01-04 14:34:37 -08002464 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002465}
2466
Colin Crossca860ac2016-01-04 14:34:37 -08002467func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002468 for _, generator := range c.generators {
2469 generator.GeneratorInit(ctx)
2470 }
Colin Crossca860ac2016-01-04 14:34:37 -08002471 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002472 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002473 }
Colin Crossca860ac2016-01-04 14:34:37 -08002474 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002475 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002476 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002477 if c.stl != nil {
2478 c.stl.begin(ctx)
2479 }
Colin Cross16b23492016-01-06 14:41:07 -08002480 if c.sanitize != nil {
2481 c.sanitize.begin(ctx)
2482 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002483 if c.coverage != nil {
2484 c.coverage.begin(ctx)
2485 }
Yi Kong9723e332023-12-04 14:52:53 +09002486 if c.afdo != nil {
2487 c.afdo.begin(ctx)
2488 }
Stephen Craneba090d12017-05-09 15:44:35 -07002489 if c.lto != nil {
2490 c.lto.begin(ctx)
2491 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002492 if c.orderfile != nil {
2493 c.orderfile.begin(ctx)
2494 }
Dan Albert92fe7402020-07-15 13:33:30 -07002495 if ctx.useSdk() && c.IsSdkVariant() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002496 version, err := NativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002497 if err != nil {
2498 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002499 c.Properties.Sdk_version = nil
2500 } else {
2501 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002502 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002503 }
Colin Crossca860ac2016-01-04 14:34:37 -08002504}
2505
Colin Cross37047f12016-12-13 17:06:13 -08002506func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002507 deps := Deps{}
2508
Joe Onorato37f900c2023-07-18 16:58:16 -07002509 for _, generator := range c.generators {
2510 deps = generator.GeneratorDeps(ctx, deps)
2511 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002512 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002513 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002514 }
2515 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002516 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002517 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002518 if c.stl != nil {
2519 deps = c.stl.deps(ctx, deps)
2520 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002521 if c.coverage != nil {
2522 deps = c.coverage.deps(ctx, deps)
2523 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002524
Colin Crossb6715442017-10-24 11:13:31 -07002525 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2526 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2527 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2528 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2529 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2530 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002531 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002532 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002533
Colin Cross516c5452024-10-28 13:45:21 -07002534 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2535 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2536 }
2537
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002538 for _, lib := range deps.ReexportSharedLibHeaders {
2539 if !inList(lib, deps.SharedLibs) {
2540 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2541 }
2542 }
2543
2544 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002545 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2546 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 -07002547 }
2548 }
2549
Colin Cross5950f382016-12-13 12:50:57 -08002550 for _, lib := range deps.ReexportHeaderLibHeaders {
2551 if !inList(lib, deps.HeaderLibs) {
2552 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2553 }
2554 }
2555
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002556 for _, gen := range deps.ReexportGeneratedHeaders {
2557 if !inList(gen, deps.GeneratedHeaders) {
2558 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2559 }
2560 }
2561
Colin Crossc99deeb2016-04-11 15:06:20 -07002562 return deps
2563}
2564
Colin Cross516c5452024-10-28 13:45:21 -07002565func checkConflictingExplicitVersions(libs []string) error {
2566 withoutVersion := func(s string) string {
2567 name, _ := StubsLibNameAndVersion(s)
2568 return name
2569 }
2570 var errs []error
2571 for i, lib := range libs {
2572 libName := withoutVersion(lib)
2573 libsToCompare := libs[i+1:]
2574 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2575 return withoutVersion(s) == libName
2576 })
2577 if j >= 0 {
2578 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2579 lib, libsToCompare[j]))
2580 }
2581 }
2582 return errors.Join(errs...)
2583}
2584
Dan Albert7e9d2952016-08-04 13:02:36 -07002585func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002586 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002587 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002588 moduleContextImpl: moduleContextImpl{
2589 mod: c,
2590 },
2591 }
2592 ctx.ctx = ctx
2593
Colin Crossca860ac2016-01-04 14:34:37 -08002594 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002595}
2596
Jiyong Park7ed9de32018-10-15 22:25:07 +09002597// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002598func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002599 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2600 version := name[sharp+1:]
2601 libname := name[:sharp]
2602 return libname, version
2603 }
2604 return name, ""
2605}
2606
Dan Albert92fe7402020-07-15 13:33:30 -07002607func GetCrtVariations(ctx android.BottomUpMutatorContext,
2608 m LinkableInterface) []blueprint.Variation {
2609 if ctx.Os() != android.Android {
2610 return nil
2611 }
2612 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002613 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2614 minSdkVersion := m.MinSdkVersion()
2615 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2616 minSdkVersion = m.SdkVersion()
2617 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002618 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2619 if err != nil {
2620 ctx.PropertyErrorf("min_sdk_version", err.Error())
2621 }
Colin Cross363ec762023-01-13 13:45:14 -08002622
2623 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002624 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002625 if apiLevel.LessThan(minApiForArch) {
2626 apiLevel = minApiForArch
2627 }
2628
Dan Albert92fe7402020-07-15 13:33:30 -07002629 return []blueprint.Variation{
2630 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002631 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002632 }
2633 }
2634 return []blueprint.Variation{
2635 {Mutator: "sdk", Variation: ""},
2636 }
2637}
2638
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002639func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2640 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002641
2642 variations = append([]blueprint.Variation(nil), variations...)
2643
Liz Kammer23942242022-04-08 15:41:00 -04002644 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002645 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002646 if version == "impl" {
2647 version = ""
2648 }
Colin Crosse7257d22020-09-24 09:56:18 -07002649 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002650 if tag, ok := depTag.(libraryDependencyTag); ok {
2651 tag.explicitlyVersioned = true
Colin Crossafcdce82024-10-22 13:59:33 -07002652 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2653 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2654 // the modified copy to depTag.
2655 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002656 } else {
2657 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2658 }
Colin Crosse7257d22020-09-24 09:56:18 -07002659 }
Colin Crosse7257d22020-09-24 09:56:18 -07002660
Colin Cross0de8a1e2020-09-18 14:15:30 -07002661 if far {
2662 ctx.AddFarVariationDependencies(variations, depTag, name)
2663 } else {
2664 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002665 }
2666}
2667
Kiyoung Kim487689e2022-07-26 09:48:22 +09002668func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2669 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002670 return snapshot
2671 }
2672
2673 return lib
2674}
2675
Kiyoung Kim37693d02024-04-04 09:56:15 +09002676// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002677// of names:
2678//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002679// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002680//
2681// For each of these, it adds the name of the ndk_library module to the list of
2682// variant libs.
2683//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002684// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002685//
2686// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002687//
2688// The caller can then know to add the variantLibs dependencies differently from the
2689// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002690func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002691 variantLibs = []string{}
2692
2693 nonvariantLibs = []string{}
2694 for _, entry := range list {
2695 // strip #version suffix out
2696 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002697 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002698 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002699 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002700 nonvariantLibs = append(nonvariantLibs, entry)
2701 }
2702 }
2703 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002704
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002705}
2706
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002707func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2708 nonVariantLibs := []string{}
2709 variantLibs := []string{}
2710
2711 for _, lib := range libs {
2712 replaceLibName := GetReplaceModuleName(lib, replaceList)
2713 if replaceLibName == lib {
2714 // Do not handle any libs which are not in API imports
2715 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2716 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2717 variantLibs = append(variantLibs, replaceLibName)
2718 } else {
2719 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2720 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002721 }
2722
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002723 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002724}
2725
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002726func (c *Module) shouldUseApiSurface() bool {
2727 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2728 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2729 // LLNDK Variant
2730 return true
2731 }
2732
2733 if c.Properties.IsSdkVariant {
2734 // NDK Variant
2735 return true
2736 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002737 }
2738
2739 return false
2740}
2741
Colin Cross1e676be2016-10-12 14:38:15 -07002742func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002743 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002744 return
2745 }
2746
Colin Cross37047f12016-12-13 17:06:13 -08002747 ctx := &depsContext{
2748 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002749 moduleContextImpl: moduleContextImpl{
2750 mod: c,
2751 },
2752 }
2753 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002754
Colin Crossc99deeb2016-04-11 15:06:20 -07002755 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002756
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002757 apiNdkLibs := []string{}
2758 apiLateNdkLibs := []string{}
2759
Yo Chiang219968c2020-09-22 18:45:04 +08002760 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2761
Dan Albert914449f2016-06-17 16:45:24 -07002762 variantNdkLibs := []string{}
2763 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002764 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002765 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2766 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2767 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002768 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002769
Colin Cross32ec36c2016-12-15 07:39:51 -08002770 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002771 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002772 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002773 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002774 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002775
Spandan Das73bcafc2022-08-18 23:26:00 +00002776 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002777 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2778 if variationExists {
2779 actx.AddVariationDependencies(nil, depTag, lib)
2780 } else {
2781 // dependencies to ndk_headers fall here as ndk_headers do not have
2782 // any variants.
2783 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2784 }
Spandan Dasff665182024-09-11 18:48:44 +00002785 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002786 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002787 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002788 } else {
2789 actx.AddVariationDependencies(nil, depTag, lib)
2790 }
2791 }
2792
Dan Albertf1d14c72020-07-30 14:32:55 -07002793 if c.isNDKStubLibrary() {
2794 // NDK stubs depend on their implementation because the ABI dumps are
2795 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002796
Spandan Das8b08aea2023-03-14 19:29:34 +00002797 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2798 c.ImageVariation(),
2799 blueprint.Variation{Mutator: "link", Variation: "shared"},
2800 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002801 }
2802
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002803 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2804 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2805 c.Target().NativeBridge == android.NativeBridgeDisabled {
2806 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002807 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002808 llndkHeaderLibTag,
2809 deps.LlndkHeaderLibs...)
2810 }
2811
Jiyong Park5d1598f2019-02-25 22:14:17 +09002812 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002813 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002814
Jiyong Park5d1598f2019-02-25 22:14:17 +09002815 actx.AddVariationDependencies([]blueprint.Variation{
2816 {Mutator: "link", Variation: "static"},
2817 }, depTag, lib)
2818 }
2819
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002820 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002821 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002822 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002823
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002824 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002825 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002826 }
Jiyong Parke3867542020-12-03 17:28:25 +09002827 if inList(lib, deps.ExcludeLibsForApex) {
2828 depTag.excludeInApex = true
2829 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002830 actx.AddVariationDependencies([]blueprint.Variation{
2831 {Mutator: "link", Variation: "static"},
2832 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002833 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002834
Jooyung Han75568392020-03-20 04:29:24 +09002835 // staticUnwinderDep is treated as staticDep for Q apexes
2836 // so that native libraries/binaries are linked with static unwinder
2837 // because Q libc doesn't have unwinder APIs
2838 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002839 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002840 actx.AddVariationDependencies([]blueprint.Variation{
2841 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002842 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002843 }
2844
Jiyong Park7ed9de32018-10-15 22:25:07 +09002845 // shared lib names without the #version suffix
2846 var sharedLibNames []string
2847
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002848 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002849 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002850 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002851 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002852 }
Jiyong Parke3867542020-12-03 17:28:25 +09002853 if inList(lib, deps.ExcludeLibsForApex) {
2854 depTag.excludeInApex = true
2855 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002856 if inList(lib, deps.ExcludeLibsForNonApex) {
2857 depTag.excludeInNonApex = true
2858 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002859
Jiyong Park73c54ee2019-10-22 20:31:18 +09002860 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002861 sharedLibNames = append(sharedLibNames, name)
2862
Colin Crosse7257d22020-09-24 09:56:18 -07002863 variations := []blueprint.Variation{
2864 {Mutator: "link", Variation: "shared"},
2865 }
Spandan Dasff665182024-09-11 18:48:44 +00002866 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002867 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002868
Colin Crossfe9acfe2021-06-14 16:13:03 -07002869 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002870 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002871 actx.AddVariationDependencies([]blueprint.Variation{
2872 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002873 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002874 }
2875
Colin Cross3e5e7782022-06-17 22:17:05 +00002876 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002877 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002878 actx.AddVariationDependencies([]blueprint.Variation{
2879 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002880 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002881 }
2882
Jiyong Park7ed9de32018-10-15 22:25:07 +09002883 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002884 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002885 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2886 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2887 // linking against both the stubs lib and the non-stubs lib at the same time.
2888 continue
2889 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002890 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002891 variations := []blueprint.Variation{
2892 {Mutator: "link", Variation: "shared"},
2893 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002894 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002895 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002896
Dan Willemsen59339a22018-07-22 21:18:45 -07002897 actx.AddVariationDependencies([]blueprint.Variation{
2898 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002899 }, dataLibDepTag, deps.DataLibs...)
2900
Colin Crossc8caa062021-09-24 16:50:14 -07002901 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2902
Chris Parsons79d66a52020-06-05 17:26:16 -04002903 actx.AddVariationDependencies([]blueprint.Variation{
2904 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002905 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002906
Colin Cross68861832016-07-08 10:41:41 -07002907 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002908
2909 for _, gen := range deps.GeneratedHeaders {
2910 depTag := genHeaderDepTag
2911 if inList(gen, deps.ReexportGeneratedHeaders) {
2912 depTag = genHeaderExportDepTag
2913 }
2914 actx.AddDependency(c, depTag, gen)
2915 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002916
Cole Faust65cb40a2024-10-21 15:41:42 -07002917 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2918 depTag := genHeaderDepTag
2919 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2920 }
2921
Dan Albert92fe7402020-07-15 13:33:30 -07002922 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002923 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002924 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002925 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002926 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002927 }
Colin Crossc465efd2021-06-11 18:00:04 -07002928 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002929 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002930 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002931 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002932 if deps.DynamicLinker != "" {
2933 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002934 }
Dan Albert914449f2016-06-17 16:45:24 -07002935
2936 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002937
Colin Cross8acea3e2024-12-12 14:53:30 -08002938 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002939 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002940 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002941 {Mutator: "link", Variation: "shared"},
2942 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002943 actx.AddVariationDependencies([]blueprint.Variation{
2944 {Mutator: "version", Variation: version},
2945 {Mutator: "link", Variation: "shared"},
2946 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002947
Colin Cross8acea3e2024-12-12 14:53:30 -08002948 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002949 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002950 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002951 {Mutator: "link", Variation: "shared"},
2952 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002953 actx.AddVariationDependencies([]blueprint.Variation{
2954 {Mutator: "version", Variation: version},
2955 {Mutator: "link", Variation: "shared"},
2956 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002957
Vinh Tran367d89d2023-04-28 11:21:25 -04002958 if len(deps.AidlLibs) > 0 {
2959 actx.AddDependency(
2960 c,
2961 aidlLibraryTag,
2962 deps.AidlLibs...,
2963 )
2964 }
2965
Colin Cross6362e272015-10-29 15:25:03 -07002966}
Colin Cross21b9a242015-03-24 14:15:58 -07002967
Colin Crosse40b4ea2018-10-02 22:25:58 -07002968func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002969 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002970 c.beginMutator(ctx)
2971 }
2972}
2973
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002974// Whether a module can link to another module, taking into
2975// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002976func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002977 tag blueprint.DependencyTag) {
2978
2979 switch t := tag.(type) {
2980 case dependencyTag:
2981 if t != vndkExtDepTag {
2982 return
2983 }
2984 case libraryDependencyTag:
2985 default:
2986 return
2987 }
2988
Ivan Lozanof9e21722020-12-02 09:00:51 -05002989 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002990 // Host code is not restricted
2991 return
2992 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002993
Ivan Lozano52767be2019-10-18 14:49:46 -07002994 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002995 // Platform code can link to anything
2996 return
2997 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002998 if from.InRamdisk() {
2999 // Ramdisk code is not NDK
3000 return
3001 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003002 if from.InVendorRamdisk() {
3003 // Vendor ramdisk code is not NDK
3004 return
3005 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003006 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09003007 // Recovery code is not NDK
3008 return
3009 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003010 // Change this to LinkableInterface if Rust gets NDK support, which stubDecorators are for
Colin Cross31076b32020-10-23 17:22:06 -07003011 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07003012 if c.StubDecorator() {
3013 // These aren't real libraries, but are the stub shared libraries that are included in
3014 // the NDK.
3015 return
3016 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003017 }
Logan Chien834b9a62019-01-14 15:39:03 +08003018
Ivan Lozano52767be2019-10-18 14:49:46 -07003019 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003020 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3021 // to link to libc++ (non-NDK and without sdk_version).
3022 return
3023 }
3024
Ivan Lozano52767be2019-10-18 14:49:46 -07003025 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003026 // NDK code linking to platform code is never okay.
3027 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003028 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003029 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003030 }
3031
3032 // At this point we know we have two NDK libraries, but we need to
3033 // check that we're not linking against anything built against a higher
3034 // API level, as it is only valid to link against older or equivalent
3035 // APIs.
3036
Inseob Kim01a28722018-04-11 09:48:45 +09003037 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003038 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003039 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003040 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003041 // Current can't be linked against by anything else.
3042 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003043 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003044 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003045 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003046 if err != nil {
3047 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003048 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003049 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003050 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003051 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003052 if err != nil {
3053 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003054 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003055 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003056 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003057
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003058 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003059 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003060 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003061 }
3062 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003063 }
Dan Albert202fe492017-12-15 13:56:59 -08003064
3065 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003066 fromStl := from.SelectedStl()
3067 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003068 if fromStl == "" || toStl == "" {
3069 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003070 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003071 // We can be permissive with the system "STL" since it is only the C++
3072 // ABI layer, but in the future we should make sure that everyone is
3073 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003074 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003075 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003076 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3077 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003078 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003079}
3080
Jooyung Han479ca172020-10-19 18:51:07 +09003081func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3082 if c, ok := ctx.Module().(*Module); ok {
3083 ctx.VisitDirectDeps(func(dep android.Module) {
3084 depTag := ctx.OtherModuleDependencyTag(dep)
3085 ccDep, ok := dep.(LinkableInterface)
3086 if ok {
3087 checkLinkType(ctx, c, ccDep, depTag)
3088 }
3089 })
3090 }
3091}
3092
Jiyong Park5fb8c102018-04-09 12:03:06 +09003093// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003094// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3095// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003096// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003097func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003098 check := func(child, parent android.Module) bool {
3099 to, ok := child.(*Module)
3100 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003101 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003102 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003103
Jooyung Hana70f0672019-01-18 15:20:43 +09003104 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3105 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003106 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003107
Jiyong Park0474e1f2021-01-14 14:26:06 +09003108 // These dependencies are not excercised at runtime. Tracking these will give us
3109 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003110 depTag := ctx.OtherModuleDependencyTag(child)
3111 if IsHeaderDepTag(depTag) {
3112 return false
3113 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003114 if depTag == staticVariantTag {
3115 return false
3116 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003117 if depTag == StubImplDepTag {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003118 return false
3119 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003120 if depTag == android.RequiredDepTag {
3121 return false
3122 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003123
Justin Yun63e9ec72020-10-29 16:49:43 +09003124 // Even if target lib has no vendor variant, keep checking dependency
3125 // graph in case it depends on vendor_available or product_available
3126 // but not double_loadable transtively.
3127 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003128 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003129 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003130
Jiyong Park0474e1f2021-01-14 14:26:06 +09003131 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3132 // one.
3133 if Bool(to.VendorProperties.Double_loadable) {
3134 return true
3135 }
3136
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003137 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003138 return false
3139 }
3140
Jooyung Hana70f0672019-01-18 15:20:43 +09003141 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3142 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003143 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003144 return false
3145 }
3146 if module, ok := ctx.Module().(*Module); ok {
3147 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003148 if lib.HasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003149 ctx.WalkDeps(check)
3150 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003151 }
3152 }
3153}
3154
Yu Liue4312402023-01-18 09:15:31 -08003155func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3156 // For the dependency from platform to apex, use the latest stubs
3157 apexSdkVersion := android.FutureApiLevel
3158 if !apexInfo.IsForPlatform() {
3159 apexSdkVersion = apexInfo.MinSdkVersion
3160 }
3161
3162 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3163 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3164 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3165 // (b/144430859)
3166 apexSdkVersion = android.FutureApiLevel
3167 }
3168
3169 return apexSdkVersion
3170}
3171
Colin Crossc99deeb2016-04-11 15:06:20 -07003172// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003173func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003174 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003175
Colin Cross0de8a1e2020-09-18 14:15:30 -07003176 var directStaticDeps []StaticLibraryInfo
3177 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003178
Colin Cross0de8a1e2020-09-18 14:15:30 -07003179 reexportExporter := func(exporter FlagExporterInfo) {
3180 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3181 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3182 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3183 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3184 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003185 }
3186
Colin Crossff694a82023-12-13 15:54:49 -08003187 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003188 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003189
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003190 skipModuleList := map[string]bool{}
3191
Yu Liu8024b922024-12-20 23:31:32 +00003192 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003193 depName := ctx.OtherModuleName(dep)
3194 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003195
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003196 if _, ok := skipModuleList[depName]; ok {
3197 // skip this module because original module or API imported module matching with this should be used instead.
3198 return
3199 }
3200
Yu Liu8024b922024-12-20 23:31:32 +00003201 var ccInfo *CcInfo
3202 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3203 if hasCcInfo {
3204 ccInfo = v
3205 }
3206 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003207 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003208 if !hasCcInfo {
3209 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3210 }
3211 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003212 return
3213 }
3214
Vinh Tran367d89d2023-04-28 11:21:25 -04003215 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003216 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003217 depPaths.AidlLibraryInfos = append(
3218 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003219 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003220 )
3221 }
3222 }
3223
Yu Liu8024b922024-12-20 23:31:32 +00003224 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003225 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003226 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003227 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003228 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003229 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003230 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003231 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003232 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003233 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003234 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003235 // Support exported headers from a generated_sources dependency
3236 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003237 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003238 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003239 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003240 genRule.GeneratedDeps...)
3241 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003242 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003243 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003244 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003245 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003246 genRule.GeneratedSourceFiles...)
3247 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003248 // 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 +09003249 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003250 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003251 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003252 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003253 }
Colin Crosscef792e2021-06-11 18:01:26 -07003254 case CrtBeginDepTag:
3255 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3256 case CrtEndDepTag:
3257 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003258 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003259 return
3260 }
3261
Colin Crossfe17f6f2019-03-28 19:30:56 -07003262 if depTag == android.ProtoPluginDepTag {
3263 return
3264 }
3265
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003266 if depTag == android.RequiredDepTag {
3267 return
3268 }
3269
Yu Liu8024b922024-12-20 23:31:32 +00003270 commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey)
3271 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003272 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 -07003273 return
3274 }
Yu Liu8024b922024-12-20 23:31:32 +00003275 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003276 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003277 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003278 return
3279 }
3280
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003281 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003282 // Skip reused objects for stub libraries, they use their own stub object file instead.
3283 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3284 // version mutator, so the stubs variant is created from the shared variant that
3285 // already has the reuseObjTag dependency on the static variant.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003286 if !c.library.BuildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003287 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003288 objs := staticAnalogue.ReuseObjects
3289 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003290 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003291 reexportExporter(depExporterInfo)
3292 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003293 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003294 }
3295
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003296 if depTag == llndkHeaderLibTag {
3297 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3298 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3299 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3300 }
3301
Yu Liu8024b922024-12-20 23:31:32 +00003302 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003303
3304 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3305 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003306 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003307 return
3308 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003309
Jiyong Parke3867542020-12-03 17:28:25 +09003310 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3311 return
3312 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003313 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3314 return
3315 }
Jiyong Parke3867542020-12-03 17:28:25 +09003316
Colin Cross313aa542023-12-13 13:47:44 -08003317 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003318
Colin Cross6e511a92020-07-27 21:26:48 -07003319 var ptr *android.Paths
3320 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003321
Colin Cross6e511a92020-07-27 21:26:48 -07003322 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003323
Colin Cross6e511a92020-07-27 21:26:48 -07003324 switch {
3325 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003326 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003327 if !ctx.Config().AllowMissingDependencies() {
3328 ctx.ModuleErrorf("module %q is not a header library", depName)
3329 } else {
3330 ctx.AddMissingDependencies([]string{depName})
3331 }
3332 return
3333 }
Colin Cross6e511a92020-07-27 21:26:48 -07003334 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003335 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003336 if !ctx.Config().AllowMissingDependencies() {
3337 ctx.ModuleErrorf("module %q is not a shared library", depName)
3338 } else {
3339 ctx.AddMissingDependencies([]string{depName})
3340 }
3341 return
3342 }
Jiyong Parke3867542020-12-03 17:28:25 +09003343
Jiyong Park7d55b612021-06-11 17:22:09 +09003344 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3345 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003346
Jiyong Park1ad8e162020-12-01 23:40:09 +09003347 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3348 // linkFile, depFile, and ptr.
3349 if c.IsStubs() {
3350 break
3351 }
3352
Colin Cross0de8a1e2020-09-18 14:15:30 -07003353 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3354 depFile = sharedLibraryInfo.TableOfContents
3355
Colin Crossb614cd42024-10-11 12:52:21 -07003356 if !sharedLibraryInfo.IsStubs {
3357 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3358 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3359 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3360 }
3361 }
3362
Colin Cross6e511a92020-07-27 21:26:48 -07003363 ptr = &depPaths.SharedLibs
3364 switch libDepTag.Order {
3365 case earlyLibraryDependency:
3366 ptr = &depPaths.EarlySharedLibs
3367 depPtr = &depPaths.EarlySharedLibsDeps
3368 case normalLibraryDependency:
3369 ptr = &depPaths.SharedLibs
3370 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003371 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003372 case lateLibraryDependency:
3373 ptr = &depPaths.LateSharedLibs
3374 depPtr = &depPaths.LateSharedLibsDeps
3375 default:
3376 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003377 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003378
Colin Cross6e511a92020-07-27 21:26:48 -07003379 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003380 if linkableInfo.RustLibraryInterface {
3381 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003382 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3383 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3384 if libDepTag.wholeStatic {
3385 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3386 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003387
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003388 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3389 // exported functions from the rust generated staticlib still exported.
3390 if c.CcLibrary() && c.Shared() {
3391 c.WholeRustStaticlib = true
3392 }
Colin Cross6e511a92020-07-27 21:26:48 -07003393 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003394
Colin Cross6e511a92020-07-27 21:26:48 -07003395 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003396 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3397 if !isStaticLib {
3398 if !ctx.Config().AllowMissingDependencies() {
3399 ctx.ModuleErrorf("module %q is not a static library", depName)
3400 } else {
3401 ctx.AddMissingDependencies([]string{depName})
3402 }
3403 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003404 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003405
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003406 // Stubs lib doesn't link to the static lib dependencies. Don't set
3407 // linkFile, depFile, and ptr.
3408 if c.IsStubs() {
3409 break
3410 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003411
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003412 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3413 if libDepTag.wholeStatic {
3414 ptr = &depPaths.WholeStaticLibs
3415 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3416 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3417 } else {
3418 // This case normally catches prebuilt static
3419 // libraries, but it can also occur when
3420 // AllowMissingDependencies is on and the
3421 // dependencies has no sources of its own
3422 // but has a whole_static_libs dependency
3423 // on a missing library. We want to depend
3424 // on the .a file so that there is something
3425 // in the dependency tree that contains the
3426 // error rule for the missing transitive
3427 // dependency.
3428 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3429 }
3430 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3431 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3432 } else {
3433 switch libDepTag.Order {
3434 case earlyLibraryDependency:
3435 panic(fmt.Errorf("early static libs not supported"))
3436 case normalLibraryDependency:
3437 // static dependencies will be handled separately so they can be ordered
3438 // using transitive dependencies.
3439 ptr = nil
3440 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3441 case lateLibraryDependency:
3442 ptr = &depPaths.LateStaticLibs
3443 default:
3444 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3445 }
3446 }
3447
3448 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3449 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3450
3451 if libDepTag.unexportedSymbols {
3452 depPaths.LdFlags = append(depPaths.LdFlags,
3453 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3454 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003455 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003456 }
3457
Yu Liu8024b922024-12-20 23:31:32 +00003458 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3459 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003460 ctx.ModuleErrorf("module %q not a static library", depName)
3461 return
3462 }
Logan Chien43d34c32017-12-20 01:17:32 +08003463
Colin Cross6e511a92020-07-27 21:26:48 -07003464 // When combining coverage files for shared libraries and executables, coverage files
3465 // in static libraries act as if they were whole static libraries. The same goes for
3466 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003467 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003468 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003469 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003470 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003471 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003472 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003473 // Handle non-CC modules here
3474 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003475 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003476 }
3477 }
3478
Colin Cross6e511a92020-07-27 21:26:48 -07003479 if ptr != nil {
3480 if !linkFile.Valid() {
3481 if !ctx.Config().AllowMissingDependencies() {
3482 ctx.ModuleErrorf("module %q missing output file", depName)
3483 } else {
3484 ctx.AddMissingDependencies([]string{depName})
3485 }
3486 return
3487 }
3488 *ptr = append(*ptr, linkFile.Path())
3489 }
3490
3491 if depPtr != nil {
3492 dep := depFile
3493 if !dep.Valid() {
3494 dep = linkFile
3495 }
3496 *depPtr = append(*depPtr, dep.Path())
3497 }
3498
Colin Cross0de8a1e2020-09-18 14:15:30 -07003499 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3500 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3501 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3502 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003503 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3504
3505 // Only re-export RustRlibDeps for cc static libs
3506 if c.static() {
3507 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3508 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003509
3510 if libDepTag.reexportFlags {
3511 reexportExporter(depExporterInfo)
3512 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3513 // Re-exported shared library headers must be included as well since they can help us with type information
3514 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003515 c.sabi.Properties.ReexportedIncludes = append(
3516 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003517 c.sabi.Properties.ReexportedSystemIncludes = append(
3518 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003519 }
3520
Yu Liu8024b922024-12-20 23:31:32 +00003521 makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003522 switch {
3523 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003524 c.Properties.AndroidMkHeaderLibs = append(
3525 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003526 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003527 // Note: the order of libs in this list is not important because
3528 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003529 c.Properties.AndroidMkSharedLibs = append(
3530 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003531 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003532 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003533 if libDepTag.wholeStatic {
3534 c.Properties.AndroidMkWholeStaticLibs = append(
3535 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3536 } else {
3537 c.Properties.AndroidMkStaticLibs = append(
3538 c.Properties.AndroidMkStaticLibs, makeLibName)
3539 }
Colin Cross6e511a92020-07-27 21:26:48 -07003540 }
3541 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003542 } else if !c.IsStubs() {
3543 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3544
Colin Cross6e511a92020-07-27 21:26:48 -07003545 switch depTag {
3546 case runtimeDepTag:
3547 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liu8024b922024-12-20 23:31:32 +00003548 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003549 case objDepTag:
3550 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3551 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003552 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003553 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003554 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003555 case dynamicLinkerDepTag:
3556 depPaths.DynamicLinker = linkFile
3557 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003558 }
Colin Crossca860ac2016-01-04 14:34:37 -08003559 })
3560
Jeff Gaston294356f2017-09-27 17:05:30 -07003561 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003562 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3563 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3564 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003565
Colin Crossdd84e052017-05-17 13:44:16 -07003566 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003567 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003568 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3569 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003570 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003571 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3572
Jiyong Park74955042019-10-22 20:19:51 +09003573 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3574 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003575 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003576 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003577 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003578 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003579
3580 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003581 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003582 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003583 }
Colin Crossdd84e052017-05-17 13:44:16 -07003584
Colin Crossca860ac2016-01-04 14:34:37 -08003585 return depPaths
3586}
3587
Spandan Das10c41362024-12-03 01:33:09 +00003588func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003589 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003590 bootstrap := false
Spandan Das10c41362024-12-03 01:33:09 +00003591 if linkable, ok := parent.(LinkableInterface); !ok {
3592 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
Jiyong Park7d55b612021-06-11 17:22:09 +09003593 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003594 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003595 bootstrap = linkable.Bootstrap()
3596 }
3597
Spandan Das10c41362024-12-03 01:33:09 +00003598 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003599
3600 useStubs := false
3601
Yu Liu8024b922024-12-20 23:31:32 +00003602 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003603 if !apexInfo.IsForPlatform() {
3604 // For platform libraries, use current version of LLNDK
3605 // If this is for use_vendor apex we will apply the same rules
3606 // of apex sdk enforcement below to choose right version.
3607 useStubs = true
3608 }
3609 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3610 // If not building for APEX or the containing APEX allows the use of
3611 // platform APIs, use stubs only when it is from an APEX (and not from
3612 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3613 // bootstrap modules, always link to non-stub variant
Yu Liu8024b922024-12-20 23:31:32 +00003614 isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003615
Spandan Dasff665182024-09-11 18:48:44 +00003616 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003617 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003618 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3619 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003620 }
3621
3622 return useStubs
3623}
3624
3625// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3626// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3627// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3628// has different level of updatability. For example, if a library foo in an APEX depends on a
3629// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3630// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3631// same APEX as foo, the non-stub variant of bar is used.
3632func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3633 depTag := ctx.OtherModuleDependencyTag(dep)
3634 libDepTag, ok := depTag.(libraryDependencyTag)
3635 if !ok || !libDepTag.shared() {
3636 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3637 }
3638
Colin Cross313aa542023-12-13 13:47:44 -08003639 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3640 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3641 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003642
3643 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003644 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003645 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003646 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3647 toUse := stubs[len(stubs)-1]
3648 sharedLibraryInfo = toUse.SharedLibraryInfo
3649 depExporterInfo = toUse.FlagExporterInfo
3650 }
3651 }
3652 return sharedLibraryInfo, depExporterInfo
3653}
3654
Colin Cross0de8a1e2020-09-18 14:15:30 -07003655// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3656// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003657// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003658// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003659func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3660 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003661 var staticPaths android.Paths
3662 for _, staticDep := range staticDeps {
3663 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3664 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3665 }
3666 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003667 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003668 }
3669 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3670
3671 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3672
3673 // reorder the dependencies based on transitive dependencies
3674 staticPaths = android.FirstUniquePaths(staticPaths)
3675 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3676
3677 if len(orderedStaticPaths) != len(staticPaths) {
3678 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3679 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3680 }
3681
3682 return orderedStaticPaths, transitiveStaticLibs
3683}
3684
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003685// BaseLibName trims known prefixes and suffixes
3686func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003687 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3688 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003689 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003690 return libName
3691}
3692
Yu Liu8024b922024-12-20 23:31:32 +00003693func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003694 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003695 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3696 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003697
Yu Liu8024b922024-12-20 23:31:32 +00003698 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003699 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003700 if ccInfo.SnapshotInfo != nil {
3701 return linkableInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003702 }
3703 }
3704
Yu Liu8024b922024-12-20 23:31:32 +00003705 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003706 // The vendor and product modules in Make will have been renamed to not conflict with the
3707 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003708 return libName + linkableInfo.SubName
3709 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003710 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003711 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003712 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003713 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003714 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003715 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003716 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003717 } else {
3718 return libName
3719 }
3720}
3721
Colin Crossca860ac2016-01-04 14:34:37 -08003722func (c *Module) InstallInData() bool {
3723 if c.installer == nil {
3724 return false
3725 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003726 return c.installer.inData()
3727}
3728
3729func (c *Module) InstallInSanitizerDir() bool {
3730 if c.installer == nil {
3731 return false
3732 }
3733 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003734 return true
3735 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003736 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003737}
3738
Yifan Hong1b3348d2020-01-21 15:53:22 -08003739func (c *Module) InstallInRamdisk() bool {
3740 return c.InRamdisk()
3741}
3742
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003743func (c *Module) InstallInVendorRamdisk() bool {
3744 return c.InVendorRamdisk()
3745}
3746
Jiyong Parkf9332f12018-02-01 00:54:12 +09003747func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003748 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003749}
3750
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003751func (c *Module) MakeUninstallable() {
3752 if c.installer == nil {
3753 c.ModuleBase.MakeUninstallable()
3754 return
3755 }
3756 c.installer.makeUninstallable(c)
3757}
3758
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003759func (c *Module) HostToolPath() android.OptionalPath {
3760 if c.installer == nil {
3761 return android.OptionalPath{}
3762 }
3763 return c.installer.hostToolPath()
3764}
3765
Nan Zhangd4e641b2017-07-12 12:55:28 -07003766func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3767 return c.outputFile
3768}
3769
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003770func (c *Module) static() bool {
3771 if static, ok := c.linker.(interface {
3772 static() bool
3773 }); ok {
3774 return static.static()
3775 }
3776 return false
3777}
3778
Colin Cross6a730042024-12-05 13:53:43 -08003779func (c *Module) staticLibrary() bool {
3780 if static, ok := c.linker.(interface {
3781 staticLibrary() bool
3782 }); ok {
3783 return static.staticLibrary()
3784 }
3785 return false
3786}
3787
Jiyong Park379de2f2018-12-19 02:47:14 +09003788func (c *Module) staticBinary() bool {
3789 if static, ok := c.linker.(interface {
3790 staticBinary() bool
3791 }); ok {
3792 return static.staticBinary()
3793 }
3794 return false
3795}
3796
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003797func (c *Module) testBinary() bool {
3798 if test, ok := c.linker.(interface {
3799 testBinary() bool
3800 }); ok {
3801 return test.testBinary()
3802 }
3803 return false
3804}
3805
Jingwen Chen537242c2022-08-24 11:53:27 +00003806func (c *Module) testLibrary() bool {
3807 if test, ok := c.linker.(interface {
3808 testLibrary() bool
3809 }); ok {
3810 return test.testLibrary()
3811 }
3812 return false
3813}
3814
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003815func (c *Module) benchmarkBinary() bool {
3816 if b, ok := c.linker.(interface {
3817 benchmarkBinary() bool
3818 }); ok {
3819 return b.benchmarkBinary()
3820 }
3821 return false
3822}
3823
3824func (c *Module) fuzzBinary() bool {
3825 if f, ok := c.linker.(interface {
3826 fuzzBinary() bool
3827 }); ok {
3828 return f.fuzzBinary()
3829 }
3830 return false
3831}
3832
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003833// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3834func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003835 if h, ok := c.linker.(interface {
3836 header() bool
3837 }); ok {
3838 return h.header()
3839 }
3840 return false
3841}
3842
Ivan Lozanod7586b62021-04-01 09:49:36 -04003843func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003844 if b, ok := c.linker.(interface {
3845 binary() bool
3846 }); ok {
3847 return b.binary()
3848 }
3849 return false
3850}
3851
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003852func (c *Module) ForceDisableSanitizers() {
3853 c.sanitize.Properties.ForceDisable = true
3854}
3855
Justin Yun5e035862021-06-29 20:50:37 +09003856func (c *Module) StaticExecutable() bool {
3857 if b, ok := c.linker.(*binaryDecorator); ok {
3858 return b.static()
3859 }
3860 return false
3861}
3862
Ivan Lozanod7586b62021-04-01 09:49:36 -04003863func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003864 if o, ok := c.linker.(interface {
3865 object() bool
3866 }); ok {
3867 return o.object()
3868 }
3869 return false
3870}
3871
Kiyoung Kim37693d02024-04-04 09:56:15 +09003872func (m *Module) Dylib() bool {
3873 return false
3874}
3875
3876func (m *Module) Rlib() bool {
3877 return false
3878}
3879
Ivan Lozanof9e21722020-12-02 09:00:51 -05003880func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003881 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003882 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003883 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003884 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003885 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003886 return "native:product"
3887 }
Jooyung Han38002912019-05-16 04:01:54 +09003888 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003889 } else if c.InRamdisk() {
3890 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003891 } else if c.InVendorRamdisk() {
3892 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003893 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003894 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003895 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003896 return "native:ndk:none:none"
3897 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3898 //family, link := getNdkStlFamilyAndLinkType(c)
3899 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3900 } else {
3901 return "native:platform"
3902 }
3903}
3904
Jiyong Park9d452992018-10-03 00:38:19 +09003905// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003906// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003907func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003908 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003909 // Stub libs and prebuilt libs in a versioned SDK are not
3910 // installable to APEX even though they are shared libs.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003911 return lib.shared() && !lib.BuildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003912 }
3913 return false
3914}
3915
Jiyong Parka90ca002019-10-07 15:47:24 +09003916func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003917 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3918}
3919
3920func (c *Module) ApexAvailableFor() []string {
3921 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003922 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003923 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003924 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003925 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003926 }
Yu Liub73c3a62024-12-10 00:58:06 +00003927
3928 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09003929}
3930
Paul Duffin0cb37b92020-03-04 14:52:46 +00003931func (c *Module) EverInstallable() bool {
3932 return c.installer != nil &&
3933 // Check to see whether the module is actually ever installable.
3934 c.installer.everInstallable()
3935}
3936
Ivan Lozanod7586b62021-04-01 09:49:36 -04003937func (c *Module) PreventInstall() bool {
3938 return c.Properties.PreventInstall
3939}
3940
3941func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003942 if c.library != nil {
3943 if i := c.library.installable(); i != nil {
3944 return i
3945 }
3946 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003947 return c.Properties.Installable
3948}
3949
3950func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003951 ret := c.EverInstallable() &&
3952 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003953 proptools.BoolDefault(c.Installable(), true) &&
3954 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003955
3956 // The platform variant doesn't need further condition. Apex variants however might not
3957 // be installable because it will likely to be included in the APEX and won't appear
3958 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003959 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003960 return ret
3961 }
3962
3963 // Special case for modules that are configured to be installed to /data, which includes
3964 // test modules. For these modules, both APEX and non-APEX variants are considered as
3965 // installable. This is because even the APEX variants won't be included in the APEX, but
3966 // will anyway be installed to /data/*.
3967 // See b/146995717
3968 if c.InstallInData() {
3969 return ret
3970 }
3971
3972 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003973}
3974
Logan Chien41eabe62019-04-10 13:33:58 +08003975func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3976 if c.linker != nil {
3977 if library, ok := c.linker.(*libraryDecorator); ok {
3978 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3979 }
3980 }
3981}
3982
Jiyong Park45bf82e2020-12-15 22:29:02 +09003983var _ android.ApexModule = (*Module)(nil)
3984
3985// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003986func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003987 if depTag == StubImplDepTag {
Colin Crossc1b36442021-05-06 13:42:48 -07003988 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003989 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003990 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003991 if depTag == staticVariantTag {
3992 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3993 // actually mean that the static lib (and its dependencies) are copied into the
3994 // APEX.
3995 return false
3996 }
Colin Cross8acea3e2024-12-12 14:53:30 -08003997
3998 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3999 if isLibDepTag && c.static() && libDepTag.shared() {
4000 // shared_lib dependency from a static lib is considered as crossing
4001 // the APEX boundary because the dependency doesn't actually is
4002 // linked; the dependency is used only during the compilation phase.
4003 return false
4004 }
4005
4006 if isLibDepTag && libDepTag.excludeInApex {
4007 return false
4008 }
4009
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004010 return true
4011}
4012
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004013func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004014 if c.HasStubsVariants() {
4015 if IsSharedDepTag(depTag) {
4016 // dynamic dep to a stubs lib crosses APEX boundary
4017 return false
4018 }
4019 if IsRuntimeDepTag(depTag) {
4020 // runtime dep to a stubs lib also crosses APEX boundary
4021 return false
4022 }
4023 if IsHeaderDepTag(depTag) {
4024 return false
4025 }
4026 }
4027 if c.IsLlndk() {
4028 return false
4029 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004030
4031 return true
4032}
4033
Jiyong Park45bf82e2020-12-15 22:29:02 +09004034// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07004035func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
4036 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09004037 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4038 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
4039 return nil
4040 }
Jooyung Han749dc692020-04-15 11:03:39 +09004041 // We don't check for prebuilt modules
4042 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4043 return nil
4044 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004045
Jooyung Han749dc692020-04-15 11:03:39 +09004046 minSdkVersion := c.MinSdkVersion()
4047 if minSdkVersion == "apex_inherit" {
4048 return nil
4049 }
4050 if minSdkVersion == "" {
4051 // JNI libs within APK-in-APEX fall into here
4052 // Those are okay to set sdk_version instead
4053 // We don't have to check if this is a SDK variant because
4054 // non-SDK variant resets sdk_version, which works too.
4055 minSdkVersion = c.SdkVersion()
4056 }
Dan Albertc8060532020-07-22 22:32:17 -07004057 if minSdkVersion == "" {
4058 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4059 }
4060 // Not using nativeApiLevelFromUser because the context here is not
4061 // necessarily a native context.
4062 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004063 if err != nil {
4064 return err
4065 }
Dan Albertc8060532020-07-22 22:32:17 -07004066
Colin Cross8ca61c12022-10-06 21:00:14 -07004067 // A dependency only needs to support a min_sdk_version at least
4068 // as high as the api level that the architecture was introduced in.
4069 // This allows introducing new architectures in the platform that
4070 // need to be included in apexes that normally require an older
4071 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004072 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004073 if sdkVersion.LessThan(minApiForArch) {
4074 sdkVersion = minApiForArch
4075 }
4076
Dan Albertc8060532020-07-22 22:32:17 -07004077 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004078 return fmt.Errorf("newer SDK(%v)", ver)
4079 }
4080 return nil
4081}
4082
Paul Duffinb5769c12021-05-12 16:16:51 +01004083// Implements android.ApexModule
4084func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4085 // stub libraries and native bridge libraries are always available to platform
4086 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4087}
4088
Inseob Kima1888ce2022-10-04 14:42:02 +09004089func (c *Module) overriddenModules() []string {
4090 if o, ok := c.linker.(overridable); ok {
4091 return o.overriddenModules()
4092 }
4093 return nil
4094}
4095
Liz Kammer35ca77e2021-12-22 15:31:40 -05004096type moduleType int
4097
4098const (
4099 unknownType moduleType = iota
4100 binary
4101 object
4102 fullLibrary
4103 staticLibrary
4104 sharedLibrary
4105 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004106 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004107 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004108)
4109
4110func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004111 if c.testBinary() {
4112 // testBinary is also a binary, so this comes before the c.Binary()
4113 // conditional. A testBinary has additional implicit dependencies and
4114 // other test-only semantics.
4115 return testBin
4116 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004117 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004118 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004119 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004120 } else if c.testLibrary() {
4121 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4122 // will let them add implicit compile deps on gtest, for example.
4123 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004124 // For now, treat them as regular libraries.
4125 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004126 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004127 static := false
4128 shared := false
4129 if library, ok := c.linker.(*libraryDecorator); ok {
4130 static = library.MutatedProperties.BuildStatic
4131 shared = library.MutatedProperties.BuildShared
4132 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4133 static = library.MutatedProperties.BuildStatic
4134 shared = library.MutatedProperties.BuildShared
4135 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004136 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004137 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004138 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004139 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004140 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004141 return staticLibrary
4142 }
4143 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004144 } else if c.isNDKStubLibrary() {
4145 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004146 }
4147 return unknownType
4148}
4149
Colin Crosscfad1192015-11-02 16:43:11 -08004150// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004151type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004152 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004153 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004154 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004155}
4156
Patrice Arrudac249c712019-03-19 17:00:29 -07004157// cc_defaults provides a set of properties that can be inherited by other cc
4158// modules. A module can use the properties from a cc_defaults using
4159// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4160// merged (when possible) by prepending the default module's values to the
4161// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004162func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004163 return DefaultsFactory()
4164}
4165
Colin Cross36242852017-06-23 15:06:31 -07004166func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004167 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004168
Colin Cross36242852017-06-23 15:06:31 -07004169 module.AddProperties(props...)
4170 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004171 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004172 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004173 &BaseCompilerProperties{},
4174 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004175 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004176 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004177 &StaticProperties{},
4178 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004179 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004180 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004181 &TestLinkerProperties{},
4182 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004183 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004184 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004185 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004186 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004187 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004188 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004189 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004190 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004191 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004192 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004193 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004194 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004195 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004196 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004197 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4198 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004199 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004200 )
Colin Crosscfad1192015-11-02 16:43:11 -08004201
Jooyung Hancc372c52019-09-25 15:18:44 +09004202 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004203
4204 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004205}
4206
Jiyong Park2286afd2020-06-16 21:58:53 +09004207func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004208 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004209}
4210
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004211func kytheExtractAllFactory() android.Singleton {
4212 return &kytheExtractAllSingleton{}
4213}
4214
4215type kytheExtractAllSingleton struct {
4216}
4217
4218func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4219 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004220 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004221 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004222 if len(files) > 0 {
4223 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004224 }
4225 })
4226 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4227 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004228 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004229 }
4230}
4231
Jihoon Kangf78a8902022-09-01 22:47:07 +00004232func (c *Module) Partition() string {
4233 if p, ok := c.installer.(interface {
4234 getPartition() string
4235 }); ok {
4236 return p.getPartition()
4237 }
4238 return ""
4239}
4240
Spandan Das2b6dfb52024-01-19 00:22:22 +00004241type sourceModuleName interface {
4242 sourceModuleName() string
4243}
4244
4245func (c *Module) BaseModuleName() string {
4246 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4247 // if the prebuilt module sets a source_module_name in Android.bp, use that
4248 return smn.sourceModuleName()
4249 }
4250 return c.ModuleBase.BaseModuleName()
4251}
4252
Spandan Dase20c56c2024-07-23 21:34:24 +00004253func (c *Module) stubsSymbolFilePath() android.Path {
4254 if library, ok := c.linker.(*libraryDecorator); ok {
4255 return library.stubsSymbolFilePath
4256 }
4257 return android.OptionalPath{}.Path()
4258}
4259
Colin Cross06a931b2015-10-28 17:23:31 -07004260var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004261var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004262var BoolPtr = proptools.BoolPtr
4263var String = proptools.String
4264var StringPtr = proptools.StringPtr