blob: 16471c9cc7bdb684ce61170b8ac91f5fd26c8e2c [file] [log] [blame]
Colin Cross5049f022015-03-18 13:28:46 -07001// Copyright 2015 Google Inc. All rights reserved.
Colin Cross3f40fa42015-01-30 17:27:36 -08002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file contains the module types for compiling C/C++ for Android, and converts the properties
18// into the flags and filenames necessary to pass to the compiler. The final creation of the rules
19// is handled in builder.go
20
21import (
Colin Cross516c5452024-10-28 13:45:21 -070022 "errors"
Colin Cross41955e82019-05-29 14:40:35 -070023 "fmt"
Logan Chien41eabe62019-04-10 13:33:58 +080024 "io"
Colin Cross516c5452024-10-28 13:45:21 -070025 "slices"
Dan Albert9e10cd42016-08-03 14:12:14 -070026 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080027 "strings"
28
Colin Cross97ba0732015-03-23 17:50:24 -070029 "github.com/google/blueprint"
Colin Crossa14fb6a2024-10-23 16:57:06 -070030 "github.com/google/blueprint/depset"
Colin Cross06a931b2015-10-28 17:23:31 -070031 "github.com/google/blueprint/proptools"
Colin Cross97ba0732015-03-23 17:50:24 -070032
Vinh Tran367d89d2023-04-28 11:21:25 -040033 "android/soong/aidl_library"
Colin Cross635c3b02016-05-18 15:37:25 -070034 "android/soong/android"
Colin Crossb98c8b02016-07-29 13:44:28 -070035 "android/soong/cc/config"
hamzehc0a671f2021-07-22 12:05:08 -070036 "android/soong/fuzz"
Colin Cross3f40fa42015-01-30 17:27:36 -080037)
38
Yu Liu76d94462024-10-31 23:32:36 +000039type CcMakeVarsInfo struct {
40 WarningsAllowed string
41 UsingWnoError string
42 MissingProfile string
43}
44
45var CcMakeVarsInfoProvider = blueprint.NewProvider[*CcMakeVarsInfo]()
46
Yu Liuec7043d2024-11-05 18:22:20 +000047type CcObjectInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000048 ObjFiles android.Paths
49 TidyFiles android.Paths
50 KytheFiles android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +000051}
52
53var CcObjectInfoProvider = blueprint.NewProvider[CcObjectInfo]()
54
Yu Liu323d77a2024-12-16 23:13:57 +000055type AidlInterfaceInfo struct {
56 // list of aidl_interface sources
57 Sources []string
58 // root directory of AIDL sources
59 AidlRoot string
60 // AIDL backend language (e.g. "cpp", "ndk")
61 Lang string
62 // list of flags passed to AIDL generator
63 Flags []string
64}
65
66type CompilerInfo struct {
67 Srcs android.Paths
68 // list of module-specific flags that will be used for C and C++ compiles.
69 Cflags proptools.Configurable[[]string]
70 AidlInterfaceInfo AidlInterfaceInfo
71 LibraryDecoratorInfo *LibraryDecoratorInfo
72}
73
74type LinkerInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000075 WholeStaticLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000076 // list of modules that should be statically linked into this module.
Yu Liu4f825132024-12-18 00:35:39 +000077 StaticLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000078 // list of modules that should be dynamically linked into this module.
Yu Liu4f825132024-12-18 00:35:39 +000079 SharedLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000080 // list of modules that should only provide headers for this module.
Yu Liu8024b922024-12-20 23:31:32 +000081 HeaderLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000082
83 BinaryDecoratorInfo *BinaryDecoratorInfo
84 LibraryDecoratorInfo *LibraryDecoratorInfo
85 TestBinaryInfo *TestBinaryInfo
86 BenchmarkDecoratorInfo *BenchmarkDecoratorInfo
87 ObjectLinkerInfo *ObjectLinkerInfo
88}
89
90type BinaryDecoratorInfo struct{}
91type LibraryDecoratorInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000092 ExportIncludeDirs proptools.Configurable[[]string]
Yu Liu116610a2025-01-06 21:54:48 +000093 InjectBsslHash bool
Yu Liu323d77a2024-12-16 23:13:57 +000094}
Yu Liuffe86322024-12-18 18:53:12 +000095
Yu Liu8024b922024-12-20 23:31:32 +000096type SnapshotInfo struct {
97 SnapshotAndroidMkSuffix string
Yu Liuffe86322024-12-18 18:53:12 +000098}
99
Yu Liu323d77a2024-12-16 23:13:57 +0000100type TestBinaryInfo struct {
101 Gtest bool
102}
103type BenchmarkDecoratorInfo struct{}
104type ObjectLinkerInfo struct{}
105
Yu Liub1bfa9d2024-12-05 18:57:51 +0000106// Common info about the cc module.
107type CcInfo struct {
Yu Liu323d77a2024-12-16 23:13:57 +0000108 IsPrebuilt bool
109 CmakeSnapshotSupported bool
110 CompilerInfo *CompilerInfo
111 LinkerInfo *LinkerInfo
Yu Liu8024b922024-12-20 23:31:32 +0000112 SnapshotInfo *SnapshotInfo
Yu Liub1bfa9d2024-12-05 18:57:51 +0000113}
114
Yu Liu8024b922024-12-20 23:31:32 +0000115var CcInfoProvider = blueprint.NewProvider[*CcInfo]()
Yu Liub1bfa9d2024-12-05 18:57:51 +0000116
Yu Liu986d98c2024-11-12 00:28:11 +0000117type LinkableInfo struct {
118 // StaticExecutable returns true if this is a binary module with "static_executable: true".
Yu Liu8024b922024-12-20 23:31:32 +0000119 StaticExecutable bool
120 Static bool
121 Shared bool
122 HasStubsVariants bool
123 StubsVersion string
124 IsStubs bool
125 UnstrippedOutputFile android.Path
126 OutputFile android.OptionalPath
127 CoverageFiles android.Paths
128 SAbiDumpFiles android.Paths
129 CcLibraryInterface bool
130 RustLibraryInterface bool
131 // CrateName returns the crateName for a Rust library
132 CrateName string
133 // DepFlags returns a slice of Rustc string flags
134 ExportedCrateLinkDirs []string
135 // This can be different from the one on CommonModuleInfo
136 BaseModuleName string
137 HasNonSystemVariants bool
138 IsLlndk bool
139 InVendorOrProduct bool
140 // SubName returns the modules SubName, used for image and NDK/SDK variations.
141 SubName string
142 InRamdisk bool
143 OnlyInRamdisk bool
144 InVendorRamdisk bool
145 OnlyInVendorRamdisk bool
146 InRecovery bool
147 OnlyInRecovery bool
Yu Liu986d98c2024-11-12 00:28:11 +0000148}
149
Yu Liu8024b922024-12-20 23:31:32 +0000150var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]()
Yu Liu986d98c2024-11-12 00:28:11 +0000151
Colin Cross463a90e2015-06-17 14:20:06 -0700152func init() {
Paul Duffin036e7002019-12-19 19:16:28 +0000153 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -0700154
Inseob Kim3b244062023-07-11 13:31:36 +0900155 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +0000156 pctx.Import("android/soong/cc/config")
157}
158
159func RegisterCCBuildComponents(ctx android.RegistrationContext) {
160 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
161
162 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -0700163 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700164 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -0700165 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -0700166 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700167 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -0700168 })
Colin Cross16b23492016-01-06 14:41:07 -0800169
Paul Duffin036e7002019-12-19 19:16:28 +0000170 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -0400171 for _, san := range Sanitizers {
172 san.registerMutators(ctx)
173 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800174
Colin Cross8a962802024-10-09 15:29:27 -0700175 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
176 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -0800177
Colin Cross597bad62024-10-08 15:10:55 -0700178 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +0000179
Colin Crossf5f4ad32024-01-19 15:41:48 -0800180 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -0700181
Colin Crossd38feb02024-01-23 16:38:06 -0800182 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800183
Colin Cross33e0c812024-01-23 16:36:07 -0800184 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000185
Colin Cross6ac83a82024-01-23 11:23:10 -0800186 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900187
Colin Cross8a962802024-10-09 15:29:27 -0700188 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
189 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700190 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700191
Colin Cross91ae5ec2024-10-01 14:03:40 -0700192 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800193 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700194 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800195 })
196
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000197 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700198}
199
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500200// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
201// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
202// edges to these modules.
203// This object is constructed in DepsMutator, by calling to various module delegates to set
204// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
205// dependencies.
206// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
207// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800208type Deps struct {
209 SharedLibs, LateSharedLibs []string
210 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800211 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800212 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700213
Colin Cross3e5e7782022-06-17 22:17:05 +0000214 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
215 // prevent automatically exporting symbols.
216 UnexportedStaticLibs []string
217
Chris Parsons79d66a52020-06-05 17:26:16 -0400218 // Used for data dependencies adjacent to tests
219 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700220 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400221
Yo Chiang219968c2020-09-22 18:45:04 +0800222 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
223 SystemSharedLibs []string
224
Vinh Tran367d89d2023-04-28 11:21:25 -0400225 // Used by DepMutator to pass aidl_library modules to aidl compiler
226 AidlLibs []string
227
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500228 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800229 StaticUnwinderIfLegacy bool
230
Colin Cross5950f382016-12-13 12:50:57 -0800231 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700232
Colin Cross81413472016-04-11 14:37:39 -0700233 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700234
Cole Faust65cb40a2024-10-21 15:41:42 -0700235 GeneratedSources []string
236 GeneratedHeaders []string
237 DeviceFirstGeneratedHeaders []string
238 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700239
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700240 ReexportGeneratedHeaders []string
241
Colin Crossc465efd2021-06-11 18:00:04 -0700242 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700243
244 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700245 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900246
247 // List of libs that need to be excluded for APEX variant
248 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900249 // List of libs that need to be excluded for non-APEX variant
250 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800251
252 // LLNDK headers for the ABI checker to check LLNDK implementation library.
253 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700254 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800255 // Instead, the LLNDK implementation depends on the LLNDK header libs.
256 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700257}
258
Ivan Lozano0a468a42024-05-13 21:03:34 -0400259// A struct which to collect flags for rlib dependencies
260type RustRlibDep struct {
261 LibPath android.Path // path to the rlib
262 LinkDirs []string // flags required for dependency (e.g. -L flags)
263 CrateName string // crateNames associated with rlibDeps
264}
265
266func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
267 return a.LibPath == b.LibPath
268}
269
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500270// PathDeps is a struct containing file paths to dependencies of a module.
271// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
272// It's used to construct flags for various build statements (such as for compiling and linking).
273// It is then passed to module decorator functions responsible for registering build statements
274// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800275type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700276 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900277 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700278 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900279 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700280 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700281 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400282 // Paths and crateNames for RustStaticLib dependencies
283 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700284
Colin Cross0de8a1e2020-09-18 14:15:30 -0700285 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700286 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700287
Colin Cross26c34ed2016-09-30 17:10:16 -0700288 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100289 Objs Objects
290 // Paths to .o files in dependencies that provide them. Note that these lists
291 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800292 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700293 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700294
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100295 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
296 // the libs from all whole_static_lib dependencies.
297 WholeStaticLibsFromPrebuilts android.Paths
298
Colin Cross26c34ed2016-09-30 17:10:16 -0700299 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700300 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900301 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700302
Inseob Kimd110f872019-12-06 13:15:38 +0900303 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000304 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900305 IncludeDirs android.Paths
306 SystemIncludeDirs android.Paths
307 ReexportedDirs android.Paths
308 ReexportedSystemDirs android.Paths
309 ReexportedFlags []string
310 ReexportedGeneratedHeaders android.Paths
311 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400312 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700313
Colin Cross26c34ed2016-09-30 17:10:16 -0700314 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700315 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700316
Dan Willemsena0790e32018-10-12 00:24:23 -0700317 // Path to the dynamic linker binary
318 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700319
320 // For Darwin builds, the path to the second architecture's output that should
321 // be combined with this architectures's output into a FAT MachO file.
322 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400323
324 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
325 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800326
327 // LLNDK headers for the ABI checker to check LLNDK implementation library.
328 LlndkIncludeDirs android.Paths
329 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700330
331 directImplementationDeps android.Paths
332 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700333}
334
Colin Cross4af21ed2019-11-04 09:37:55 -0800335// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
336// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
337// command line so they can be overridden by the local module flags).
338type LocalOrGlobalFlags struct {
339 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700340 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800341 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700342 CFlags []string // Flags that apply to C and C++ source files
343 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
344 ConlyFlags []string // Flags that apply to C source files
345 CppFlags []string // Flags that apply to C++ source files
346 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700347 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800348}
349
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500350// Flags contains various types of command line flags (and settings) for use in building build
351// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800352type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500353 // Local flags (which individual modules are responsible for). These may override global flags.
354 Local LocalOrGlobalFlags
355 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700356 Global LocalOrGlobalFlags
357 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800358
359 aidlFlags []string // Flags that apply to aidl source files
360 rsFlags []string // Flags that apply to renderscript source files
361 libFlags []string // Flags to add libraries early to the link order
362 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
363 TidyFlags []string // Flags that apply to clang-tidy
364 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700365
Colin Crossc3199482017-03-30 15:03:04 -0700366 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800367 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700368 SystemIncludeFlags []string
369
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800370 Toolchain config.Toolchain
371 Tidy bool // True if ninja .tidy rules should be generated.
372 NeedTidyFiles bool // True if module link should depend on .tidy files
373 GcovCoverage bool // True if coverage files should be generated.
374 SAbiDump bool // True if header abi dumps should be generated.
375 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800376 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800377
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500378 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800379 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500380 // The target-device system path to the dynamic linker.
381 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800382
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700383 CFlagsDeps android.Paths // Files depended on by compiler flags
384 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800385
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500386 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700387 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800388
Colin Cross19878da2019-03-28 14:45:07 -0700389 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700390 protoC bool // Whether to use C instead of C++
391 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700392
393 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200394 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700395}
396
Colin Crossca860ac2016-01-04 14:34:37 -0800397// Properties used to compile all C or C++ modules
398type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700399 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800400 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700401
Yi Kong5786f5c2024-05-28 02:22:34 +0900402 // Aggresively trade performance for smaller binary size.
403 // This should only be used for on-device binaries that are rarely executed and not
404 // performance critical.
405 Optimize_for_size *bool `android:"arch_variant"`
406
Jiyong Parkb35a8192020-08-10 15:59:36 +0900407 // The API level that this module is built against. The APIs of this API level will be
408 // visible at build time, but use of any APIs newer than min_sdk_version will render the
409 // module unloadable on older devices. In the future it will be possible to weakly-link new
410 // APIs, making the behavior match Java: such modules will load on older devices, but
411 // calling new APIs on devices that do not support them will result in a crash.
412 //
413 // This property has the same behavior as sdk_version does for Java modules. For those
414 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
415 // does for Java code.
416 //
417 // In addition, setting this property causes two variants to be built, one for the platform
418 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800419 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700420
Jiyong Parkb35a8192020-08-10 15:59:36 +0900421 // Minimum OS API level supported by this C or C++ module. This property becomes the value
422 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
423 // this property is also used to ensure that the min_sdk_version of the containing module is
424 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
425 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
426 // min_sdk_version of the containing APEX. When the module
427 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900428 Min_sdk_version *string
429
Colin Crossc511bc52020-04-07 16:50:32 +0000430 // If true, always create an sdk variant and don't create a platform variant.
431 Sdk_variant_only *bool
432
Colin Cross4297f402024-11-20 15:20:09 -0800433 AndroidMkSharedLibs []string `blueprint:"mutated"`
434 AndroidMkStaticLibs []string `blueprint:"mutated"`
435 AndroidMkRlibs []string `blueprint:"mutated"`
436 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
437 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
438 AndroidMkHeaderLibs []string `blueprint:"mutated"`
439 HideFromMake bool `blueprint:"mutated"`
440 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700441
Yo Chiang219968c2020-09-22 18:45:04 +0800442 // Set by DepsMutator.
443 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
444
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900445 // The name of the image this module is built for
446 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200447
448 // The VNDK version this module is built against. If empty, the module is not
449 // build against the VNDK.
450 VndkVersion string `blueprint:"mutated"`
451
452 // Suffix for the name of Android.mk entries generated by this module
453 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800454
455 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
456 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900457 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900458
Yifan Hong39143a92020-10-26 12:43:12 -0700459 // Make this module available when building for ramdisk.
460 // On device without a dedicated recovery partition, the module is only
461 // available after switching root into
462 // /first_stage_ramdisk. To expose the module before switching root, install
463 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800464 Ramdisk_available *bool
465
Yifan Hong39143a92020-10-26 12:43:12 -0700466 // Make this module available when building for vendor ramdisk.
467 // On device without a dedicated recovery partition, the module is only
468 // available after switching root into
469 // /first_stage_ramdisk. To expose the module before switching root, install
470 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700471 Vendor_ramdisk_available *bool
472
Jiyong Parkf9332f12018-02-01 00:54:12 +0900473 // Make this module available when building for recovery
474 Recovery_available *bool
475
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200476 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000477 VendorVariantNeeded bool `blueprint:"mutated"`
478 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200479 CoreVariantNeeded bool `blueprint:"mutated"`
480 RamdiskVariantNeeded bool `blueprint:"mutated"`
481 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
482 RecoveryVariantNeeded bool `blueprint:"mutated"`
483
484 // A list of variations for the "image" mutator of the form
485 //<image name> '.' <version char>, for example, 'vendor.S'
486 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900487
488 // Allows this module to use non-APEX version of libraries. Useful
489 // for building binaries that are started before APEXes are activated.
490 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900491
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000492 // Allows this module to be included in CMake release snapshots to be built outside of Android
493 // build system and source tree.
494 Cmake_snapshot_supported *bool
495
Colin Cross1bc94122021-10-28 13:25:54 -0700496 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000497
498 // Set by factories of module types that can only be referenced from variants compiled against
499 // the SDK.
500 AlwaysSdk bool `blueprint:"mutated"`
501
502 // Variant is an SDK variant created by sdkMutator
503 IsSdkVariant bool `blueprint:"mutated"`
504 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
505 // variant to have a ".sdk" suffix.
506 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700507
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800508 Target struct {
509 Platform struct {
510 // List of modules required by the core variant.
511 Required []string `android:"arch_variant"`
512
513 // List of modules not required by the core variant.
514 Exclude_required []string `android:"arch_variant"`
515 } `android:"arch_variant"`
516
517 Recovery struct {
518 // List of modules required by the recovery variant.
519 Required []string `android:"arch_variant"`
520
521 // List of modules not required by the recovery variant.
522 Exclude_required []string `android:"arch_variant"`
523 } `android:"arch_variant"`
524 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700525}
526
527type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900528 // whether this module should be allowed to be directly depended by other
529 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900530 // If set to true, two variants will be built separately, one like
531 // normal, and the other limited to the set of libraries and headers
532 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700533 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900534 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700535 // so it shouldn't have any unversioned runtime dependencies, or
536 // make assumptions about the system that may not be true in the
537 // future.
538 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900539 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900540 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900541 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900542 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900543 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700544 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
545 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900546
Justin Yunebcf0c52021-01-08 18:00:19 +0900547 // This is the same as the "vendor_available" except that the install path
548 // of the vendor variant is /odm or /vendor/odm.
549 // By replacing "vendor_available: true" with "odm_available: true", the
550 // module will install its vendor variant to the /odm partition or /vendor/odm.
551 // As the modules with "odm_available: true" still create the vendor variants,
552 // they can link to the other vendor modules as the vendor_available modules do.
553 // Also, the vendor modules can link to odm_available modules.
554 //
555 // It may not be used for VNDK modules.
556 Odm_available *bool
557
Justin Yun63e9ec72020-10-29 16:49:43 +0900558 // whether this module should be allowed to be directly depended by other
559 // modules with `product_specific: true` or `product_available: true`.
560 // If set to true, an additional product variant will be built separately
561 // that is limited to the set of libraries and headers that are exposed to
562 // /product modules.
563 //
564 // The product variant may be used with a different (newer) /system,
565 // so it shouldn't have any unversioned runtime dependencies, or
566 // make assumptions about the system that may not be true in the
567 // future.
568 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900569 // If set to false, this module becomes inaccessible from /product modules.
570 //
571 // Different from the 'vendor_available' property, the modules with
572 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
573 // library without 'product_available' may not be depended on by any other
574 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900575 //
576 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
577 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
578 Product_available *bool
579
Jiyong Park5fb8c102018-04-09 12:03:06 +0900580 // whether this module is capable of being loaded with other instance
581 // (possibly an older version) of the same module in the same process.
582 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
583 // can be double loaded in a vendor process if the library is also a
584 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
585 // explicitly marked as `double_loadable: true` by the owner, or the dependency
586 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
587 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800588
589 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
590 IsLLNDK bool `blueprint:"mutated"`
591
Colin Cross5271fea2021-04-27 13:06:04 -0700592 // IsVendorPublicLibrary is set for the core and product variants of a library that has
593 // vendor_public_library stubs.
594 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800595}
596
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500597// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
598// to understanding details about the type of the current module.
599// For example, one might call these functions to determine whether the current module is a static
600// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800601type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800602 static() bool
603 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800604 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700605 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800606 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900607 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900608 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900609 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700610 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900611 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700612 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800613 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900614 minSdkVersion() string
615 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700616 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700617 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800618 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800619 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700620 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900621 inProduct() bool
622 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800623 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700624 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900625 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900626 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700627 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700628 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800629 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000630 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800631 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900632 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800633 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800634 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800635 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700636 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700637 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900638 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700639 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800640 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800641 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800642 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800643 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900644 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000645 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800646}
647
648type SharedFlags struct {
649 numSharedFlags int
650 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800651}
652
653type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700654 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800655 ModuleContextIntf
656}
657
658type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700659 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800660 ModuleContextIntf
661}
662
Colin Cross37047f12016-12-13 17:06:13 -0800663type DepsContext interface {
664 android.BottomUpMutatorContext
665 ModuleContextIntf
666}
667
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500668// feature represents additional (optional) steps to building cc-related modules, such as invocation
669// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800670type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800671 flags(ctx ModuleContext, flags Flags) Flags
672 props() []interface{}
673}
674
Joe Onorato37f900c2023-07-18 16:58:16 -0700675// Information returned from Generator about the source code it's generating
676type GeneratedSource struct {
677 IncludeDirs android.Paths
678 Sources android.Paths
679 Headers android.Paths
680 ReexportedDirs android.Paths
681}
682
683// generator allows injection of generated code
684type Generator interface {
685 GeneratorProps() []interface{}
686 GeneratorInit(ctx BaseModuleContext)
687 GeneratorDeps(ctx DepsContext, deps Deps) Deps
688 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
689 GeneratorSources(ctx ModuleContext) GeneratedSource
690 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
691}
692
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500693// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500694// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800695type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700696 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800697 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800698 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700699 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000700 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700701
Colin Cross76fada02016-07-27 10:31:13 -0700702 appendCflags([]string)
703 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700704 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800705}
706
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500707// linker is the interface for a linker decorator object. Individual module types can provide
708// their own implementation for this decorator, and thus specify custom logic regarding build
709// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800710type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700711 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800712 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700713 linkerFlags(ctx ModuleContext, flags Flags) Flags
714 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000715 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800716 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700717
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700718 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700719 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900720 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800721 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700722
723 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900724 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000725
726 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700727 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800728
729 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000730}
731
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500732// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000733type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500734 sharedLibs []string
735 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
736 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700737 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800738}
739
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500740// installer is the interface for an installer helper object. This helper is responsible for
741// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800742type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700743 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700744 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000745 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800746 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700747 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700748 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900749 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000750 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900751 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800752}
753
Inseob Kima1888ce2022-10-04 14:42:02 +0900754type overridable interface {
755 overriddenModules() []string
756}
757
Colin Cross6e511a92020-07-27 21:26:48 -0700758type libraryDependencyKind int
759
760const (
761 headerLibraryDependency = iota
762 sharedLibraryDependency
763 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400764 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700765)
766
767func (k libraryDependencyKind) String() string {
768 switch k {
769 case headerLibraryDependency:
770 return "headerLibraryDependency"
771 case sharedLibraryDependency:
772 return "sharedLibraryDependency"
773 case staticLibraryDependency:
774 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400775 case rlibLibraryDependency:
776 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700777 default:
778 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
779 }
780}
781
782type libraryDependencyOrder int
783
784const (
785 earlyLibraryDependency = -1
786 normalLibraryDependency = 0
787 lateLibraryDependency = 1
788)
789
790func (o libraryDependencyOrder) String() string {
791 switch o {
792 case earlyLibraryDependency:
793 return "earlyLibraryDependency"
794 case normalLibraryDependency:
795 return "normalLibraryDependency"
796 case lateLibraryDependency:
797 return "lateLibraryDependency"
798 default:
799 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
800 }
801}
802
803// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
804// tags that have a set of predefined tag objects that are reused for each dependency, a
805// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
806// That means that comparing a libraryDependencyTag for equality will only be equal if all
807// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
808// then check individual metadata fields instead.
809type libraryDependencyTag struct {
810 blueprint.BaseDependencyTag
811
812 // These are exported so that fmt.Printf("%#v") can call their String methods.
813 Kind libraryDependencyKind
814 Order libraryDependencyOrder
815
816 wholeStatic bool
817
818 reexportFlags bool
819 explicitlyVersioned bool
820 dataLib bool
821 ndk bool
822
823 staticUnwinder bool
824
825 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900826
Cindy Zhou18417cb2020-12-10 07:12:38 -0800827 // Whether or not this dependency should skip the apex dependency check
828 skipApexAllowedDependenciesCheck bool
829
Jiyong Parke3867542020-12-03 17:28:25 +0900830 // Whether or not this dependency has to be followed for the apex variants
831 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900832 // Whether or not this dependency has to be followed for the non-apex variants
833 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000834
835 // If true, don't automatically export symbols from the static library into a shared library.
836 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700837}
838
839// header returns true if the libraryDependencyTag is tagging a header lib dependency.
840func (d libraryDependencyTag) header() bool {
841 return d.Kind == headerLibraryDependency
842}
843
844// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
845func (d libraryDependencyTag) shared() bool {
846 return d.Kind == sharedLibraryDependency
847}
848
849// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
850func (d libraryDependencyTag) static() bool {
851 return d.Kind == staticLibraryDependency
852}
853
Colin Cross65cb3142021-12-10 23:05:02 +0000854func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
855 if d.shared() {
856 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
857 }
858 return nil
859}
860
861var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
862
Colin Crosse9fe2942020-11-10 18:12:15 -0800863// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
864// binaries or other shared libraries are installed as dependencies.
865func (d libraryDependencyTag) InstallDepNeeded() bool {
866 return d.shared()
867}
868
869var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
870
Yu Liu67a28422024-03-05 00:36:31 +0000871func (d libraryDependencyTag) PropagateAconfigValidation() bool {
872 return d.static()
873}
874
875var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
876
Colin Crosse9fe2942020-11-10 18:12:15 -0800877// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700878// libraryDependencyTag. Each tag object is created globally and reused for multiple
879// dependencies (although since the object contains no references, assigning a tag to a
880// variable and modifying it will not modify the original). Users can compare the tag
881// returned by ctx.OtherModuleDependencyTag against the global original
882type dependencyTag struct {
883 blueprint.BaseDependencyTag
884 name string
885}
886
Colin Crosse9fe2942020-11-10 18:12:15 -0800887// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
888// libraryDependencyTag, but where the dependency needs to be installed when the parent is
889// installed.
890type installDependencyTag struct {
891 blueprint.BaseDependencyTag
892 android.InstallAlwaysNeededDependencyTag
893 name string
894}
895
Colin Crossc99deeb2016-04-11 15:06:20 -0700896var (
Colin Cross6e511a92020-07-27 21:26:48 -0700897 genSourceDepTag = dependencyTag{name: "gen source"}
898 genHeaderDepTag = dependencyTag{name: "gen header"}
899 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
900 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900901 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700902 reuseObjTag = dependencyTag{name: "reuse objects"}
903 staticVariantTag = dependencyTag{name: "static variant"}
904 vndkExtDepTag = dependencyTag{name: "vndk extends"}
905 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700906 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800907 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700908 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000909 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500910 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400911 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800912 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700913)
914
Roland Levillainf89cd092019-07-29 16:22:59 +0100915func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700916 ccLibDepTag, ok := depTag.(libraryDependencyTag)
917 return ok && ccLibDepTag.shared()
918}
919
920func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
921 ccLibDepTag, ok := depTag.(libraryDependencyTag)
922 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100923}
924
Zach Johnson3df4e632020-11-06 11:56:27 -0800925func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
926 ccLibDepTag, ok := depTag.(libraryDependencyTag)
927 return ok && ccLibDepTag.header()
928}
929
Roland Levillainf89cd092019-07-29 16:22:59 +0100930func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800931 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100932}
933
Colin Crossca860ac2016-01-04 14:34:37 -0800934// Module contains the properties and members used by all C/C++ module types, and implements
935// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500936// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
937// interface.
938//
939// To define a C/C++ related module, construct a new Module object and point its delegates to
940// type-specific structs. These delegates will be invoked to register module-specific build
941// statements which may be unique to the module type. For example, module.compiler.compile() should
942// be defined so as to register build statements which are responsible for compiling the module.
943//
944// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
945// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
946// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
947// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800948type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700949 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700950
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700951 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700952 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -0700953 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700954
Colin Crossca860ac2016-01-04 14:34:37 -0800955 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +0000956 hod android.HostOrDeviceSupported
957 multilib android.Multilib
958 testModule bool
959 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -0700960
Paul Duffina0843f62019-12-13 19:50:38 +0000961 // Allowable SdkMemberTypes of this module type.
962 sdkMemberTypes []android.SdkMemberType
963
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500964 // decorator delegates, initialize before calling Init
965 // these may contain module-specific implementations, and effectively allow for custom
966 // type-specific logic. These members may reference different objects or the same object.
967 // Functions of these decorators will be invoked to initialize and register type-specific
968 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800969 generators []Generator
970 compiler compiler
971 linker linker
972 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500973
Spandan Dase12d2522023-09-12 21:42:31 +0000974 features []feature
975 stl *stl
976 sanitize *sanitize
977 coverage *coverage
978 fuzzer *fuzzer
979 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +0000980 lto *lto
981 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000982 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800983
Colin Cross31076b32020-10-23 17:22:06 -0700984 library libraryInterface
985
Colin Cross635c3b02016-05-18 15:37:25 -0700986 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800987
Colin Crossb98c8b02016-07-29 13:44:28 -0700988 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700989
Yu Liue70976d2024-10-15 20:45:35 +0000990 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800991
992 // Flags used to compile this module
993 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700994
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800995 // Shared flags among build rules of this module
996 sharedFlags SharedFlags
997
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800998 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700999 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +09001000
1001 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +09001002
1003 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -07001004 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07001005
1006 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -08001007
Inseob Kim37e0bb02024-04-29 15:54:44 +09001008 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001009
1010 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -07001011
1012 hasAidl bool
1013 hasLex bool
1014 hasProto bool
1015 hasRenderscript bool
1016 hasSysprop bool
1017 hasWinMsg bool
1018 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +00001019
1020 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -07001021}
1022
Yu Liu76d94462024-10-31 23:32:36 +00001023func (c *Module) IncrementalSupported() bool {
1024 return c.incremental
1025}
1026
1027var _ blueprint.Incremental = (*Module)(nil)
1028
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001029func (c *Module) AddJSONData(d *map[string]interface{}) {
1030 c.AndroidModuleBase().AddJSONData(d)
1031 (*d)["Cc"] = map[string]interface{}{
1032 "SdkVersion": c.SdkVersion(),
1033 "MinSdkVersion": c.MinSdkVersion(),
1034 "VndkVersion": c.VndkVersion(),
1035 "ProductSpecific": c.ProductSpecific(),
1036 "SocSpecific": c.SocSpecific(),
1037 "DeviceSpecific": c.DeviceSpecific(),
1038 "InProduct": c.InProduct(),
1039 "InVendor": c.InVendor(),
1040 "InRamdisk": c.InRamdisk(),
1041 "InVendorRamdisk": c.InVendorRamdisk(),
1042 "InRecovery": c.InRecovery(),
1043 "VendorAvailable": c.VendorAvailable(),
1044 "ProductAvailable": c.ProductAvailable(),
1045 "RamdiskAvailable": c.RamdiskAvailable(),
1046 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1047 "RecoveryAvailable": c.RecoveryAvailable(),
1048 "OdmAvailable": c.OdmAvailable(),
1049 "InstallInData": c.InstallInData(),
1050 "InstallInRamdisk": c.InstallInRamdisk(),
1051 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1052 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1053 "InstallInRecovery": c.InstallInRecovery(),
1054 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001055 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001056 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1057 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001058 "AidlSrcs": c.hasAidl,
1059 "LexSrcs": c.hasLex,
1060 "ProtoSrcs": c.hasProto,
1061 "RenderscriptSrcs": c.hasRenderscript,
1062 "SyspropSrcs": c.hasSysprop,
1063 "WinMsgSrcs": c.hasWinMsg,
1064 "YaccSrsc": c.hasYacc,
1065 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001066 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001067 }
1068}
1069
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001070func (c *Module) SetPreventInstall() {
1071 c.Properties.PreventInstall = true
1072}
1073
1074func (c *Module) SetHideFromMake() {
1075 c.Properties.HideFromMake = true
1076}
1077
Ivan Lozanod7586b62021-04-01 09:49:36 -04001078func (c *Module) HiddenFromMake() bool {
1079 return c.Properties.HideFromMake
1080}
1081
Cole Fauste8a87832024-09-11 11:35:46 -07001082func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001083 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001084 if c.ImageVariation().Variation == android.CoreVariation {
1085 required = append(required, c.Properties.Target.Platform.Required...)
1086 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1087 } else if c.InRecovery() {
1088 required = append(required, c.Properties.Target.Recovery.Required...)
1089 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1090 }
1091 return android.FirstUniqueStrings(required)
1092}
1093
Ivan Lozano52767be2019-10-18 14:49:46 -07001094func (c *Module) Toc() android.OptionalPath {
1095 if c.linker != nil {
1096 if library, ok := c.linker.(libraryInterface); ok {
1097 return library.toc()
1098 }
1099 }
1100 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1101}
1102
1103func (c *Module) ApiLevel() string {
1104 if c.linker != nil {
1105 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001106 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001107 }
1108 }
1109 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1110}
1111
1112func (c *Module) Static() bool {
1113 if c.linker != nil {
1114 if library, ok := c.linker.(libraryInterface); ok {
1115 return library.static()
1116 }
1117 }
1118 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1119}
1120
1121func (c *Module) Shared() bool {
1122 if c.linker != nil {
1123 if library, ok := c.linker.(libraryInterface); ok {
1124 return library.shared()
1125 }
1126 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001127
Ivan Lozano52767be2019-10-18 14:49:46 -07001128 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1129}
1130
1131func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001132 if c.stl != nil {
1133 return c.stl.Properties.SelectedStl
1134 }
1135 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001136}
1137
Ivan Lozano52767be2019-10-18 14:49:46 -07001138func (c *Module) StubDecorator() bool {
1139 if _, ok := c.linker.(*stubDecorator); ok {
1140 return true
1141 }
1142 return false
1143}
1144
Yi Kong5786f5c2024-05-28 02:22:34 +09001145func (c *Module) OptimizeForSize() bool {
1146 return Bool(c.Properties.Optimize_for_size)
1147}
1148
Ivan Lozano52767be2019-10-18 14:49:46 -07001149func (c *Module) SdkVersion() string {
1150 return String(c.Properties.Sdk_version)
1151}
1152
Artur Satayev480e25b2020-04-27 18:53:18 +01001153func (c *Module) MinSdkVersion() string {
1154 return String(c.Properties.Min_sdk_version)
1155}
1156
Jiyong Park5df7bd32021-08-25 16:18:46 +09001157func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001158 if linker, ok := c.linker.(*objectLinker); ok {
1159 return linker.isCrt()
1160 }
1161 return false
1162}
1163
Jiyong Park5df7bd32021-08-25 16:18:46 +09001164func (c *Module) SplitPerApiLevel() bool {
1165 return c.canUseSdk() && c.isCrt()
1166}
1167
Colin Crossc511bc52020-04-07 16:50:32 +00001168func (c *Module) AlwaysSdk() bool {
1169 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1170}
1171
Ivan Lozano183a3212019-10-18 14:18:45 -07001172func (c *Module) CcLibrary() bool {
1173 if c.linker != nil {
1174 if _, ok := c.linker.(*libraryDecorator); ok {
1175 return true
1176 }
Colin Crossd48fe732020-09-23 20:37:24 -07001177 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1178 return true
1179 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001180 }
1181 return false
1182}
1183
1184func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001185 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001186 return true
1187 }
1188 return false
1189}
1190
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001191func (c *Module) RlibStd() bool {
1192 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1193}
1194
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001195func (c *Module) RustLibraryInterface() bool {
1196 return false
1197}
1198
Ivan Lozano0a468a42024-05-13 21:03:34 -04001199func (c *Module) CrateName() string {
1200 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1201}
1202
1203func (c *Module) ExportedCrateLinkDirs() []string {
1204 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1205}
1206
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001207func (c *Module) IsFuzzModule() bool {
1208 if _, ok := c.compiler.(*fuzzBinary); ok {
1209 return true
1210 }
1211 return false
1212}
1213
1214func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1215 return c.FuzzModule
1216}
1217
1218func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1219 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1220 return fuzzer.fuzzPackagedModule
1221 }
1222 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1223}
1224
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001225func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001226 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1227 return fuzzer.sharedLibraries
1228 }
1229 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1230}
1231
Ivan Lozano2b262972019-11-21 12:30:50 -08001232func (c *Module) NonCcVariants() bool {
1233 return false
1234}
1235
Ivan Lozano183a3212019-10-18 14:18:45 -07001236func (c *Module) SetStatic() {
1237 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001238 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001239 library.setStatic()
1240 return
1241 }
1242 }
1243 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1244}
1245
1246func (c *Module) SetShared() {
1247 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001248 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001249 library.setShared()
1250 return
1251 }
1252 }
1253 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1254}
1255
1256func (c *Module) BuildStaticVariant() bool {
1257 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001258 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001259 return library.buildStatic()
1260 }
1261 }
1262 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1263}
1264
1265func (c *Module) BuildSharedVariant() bool {
1266 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001267 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001268 return library.buildShared()
1269 }
1270 }
1271 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1272}
1273
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001274func (c *Module) BuildRlibVariant() bool {
1275 // cc modules can never build rlib variants
1276 return false
1277}
1278
Ivan Lozano183a3212019-10-18 14:18:45 -07001279func (c *Module) Module() android.Module {
1280 return c
1281}
1282
Jiyong Parkc20eee32018-09-05 22:36:17 +09001283func (c *Module) OutputFile() android.OptionalPath {
1284 return c.outputFile
1285}
1286
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001287func (c *Module) CoverageFiles() android.Paths {
1288 if c.linker != nil {
1289 if library, ok := c.linker.(libraryInterface); ok {
1290 return library.objs().coverageFiles
1291 }
1292 }
1293 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1294}
1295
Ivan Lozano183a3212019-10-18 14:18:45 -07001296var _ LinkableInterface = (*Module)(nil)
1297
Jiyong Park719b4462019-01-13 00:39:51 +09001298func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001299 if c.linker != nil {
1300 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001301 }
1302 return nil
1303}
1304
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001305func (c *Module) CoverageOutputFile() android.OptionalPath {
1306 if c.linker != nil {
1307 return c.linker.coverageOutputFilePath()
1308 }
1309 return android.OptionalPath{}
1310}
1311
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001312func (c *Module) RelativeInstallPath() string {
1313 if c.installer != nil {
1314 return c.installer.relativeInstallPath()
1315 }
1316 return ""
1317}
1318
Jooyung Han344d5432019-08-23 11:17:39 +09001319func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001320 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001321}
1322
Colin Cross36242852017-06-23 15:06:31 -07001323func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001324 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001325 for _, generator := range c.generators {
1326 c.AddProperties(generator.GeneratorProps()...)
1327 }
Colin Crossca860ac2016-01-04 14:34:37 -08001328 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001329 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001330 }
1331 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001332 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001333 }
1334 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001335 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001336 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001337 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001338 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001339 }
Colin Cross16b23492016-01-06 14:41:07 -08001340 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001341 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001342 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001343 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001344 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001345 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001346 if c.fuzzer != nil {
1347 c.AddProperties(c.fuzzer.props()...)
1348 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001349 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001350 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001351 }
Stephen Craneba090d12017-05-09 15:44:35 -07001352 if c.lto != nil {
1353 c.AddProperties(c.lto.props()...)
1354 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001355 if c.afdo != nil {
1356 c.AddProperties(c.afdo.props()...)
1357 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001358 if c.orderfile != nil {
1359 c.AddProperties(c.orderfile.props()...)
1360 }
Colin Crossca860ac2016-01-04 14:34:37 -08001361 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001362 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001363 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001364 // Allow test-only on libraries that are not cc_test_library
1365 if c.library != nil && !c.testLibrary() {
1366 c.AddProperties(&c.sourceProperties)
1367 }
Colin Crossc472d572015-03-17 15:06:21 -07001368
Colin Cross36242852017-06-23 15:06:31 -07001369 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001370 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001371 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001372
Colin Cross36242852017-06-23 15:06:31 -07001373 return c
Colin Crossc472d572015-03-17 15:06:21 -07001374}
1375
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001376// UseVndk() returns true if this module is built against VNDK.
1377// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001378func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001379 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001380}
1381
Colin Crossc511bc52020-04-07 16:50:32 +00001382func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001383 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001384 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001385}
1386
1387func (c *Module) UseSdk() bool {
1388 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001389 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001390 }
1391 return false
1392}
1393
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001394func (c *Module) isCoverageVariant() bool {
1395 return c.coverage.Properties.IsCoverageVariant
1396}
1397
Colin Cross95f1ca02020-10-29 20:47:22 -07001398func (c *Module) IsNdk(config android.Config) bool {
1399 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001400}
1401
Colin Cross127bb8b2020-12-16 16:46:01 -08001402func (c *Module) IsLlndk() bool {
1403 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001404}
1405
Colin Cross1f3f1302021-04-26 18:37:44 -07001406func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001407 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001408 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001409}
1410
Colin Cross5271fea2021-04-27 13:06:04 -07001411func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1412 lib := moduleLibraryInterface(m)
1413 return lib != nil && (lib.hasVendorPublicLibrary())
1414}
1415
1416// IsVendorPublicLibrary returns true for vendor public libraries.
1417func (c *Module) IsVendorPublicLibrary() bool {
1418 return c.VendorProperties.IsVendorPublicLibrary
1419}
1420
Ivan Lozanof1868af2022-04-12 13:08:36 -04001421func (c *Module) IsVndkPrebuiltLibrary() bool {
1422 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1423 return true
1424 }
1425 return false
1426}
1427
1428func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1429 return c.Properties.SdkAndPlatformVariantVisibleToMake
1430}
1431
Ivan Lozanod7586b62021-04-01 09:49:36 -04001432func (c *Module) HasLlndkStubs() bool {
1433 lib := moduleLibraryInterface(c)
1434 return lib != nil && lib.hasLLNDKStubs()
1435}
1436
1437func (c *Module) StubsVersion() string {
1438 if lib, ok := c.linker.(versionedInterface); ok {
1439 return lib.stubsVersion()
1440 }
1441 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1442}
1443
Colin Cross127bb8b2020-12-16 16:46:01 -08001444// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1445// and does not set llndk.vendor_available: false.
1446func (c *Module) isImplementationForLLNDKPublic() bool {
1447 library, _ := c.library.(*libraryDecorator)
1448 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001449 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001450}
1451
Colin Cross3513fb12024-01-24 14:44:47 -08001452func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001453 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001454 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001455 }
1456 return false
1457}
1458
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001459func (c *Module) isOrderfileCompile() bool {
1460 if orderfile := c.orderfile; orderfile != nil {
1461 return orderfile.Properties.OrderfileLoad
1462 }
1463 return false
1464}
1465
Yi Kongc702ebd2022-08-19 16:02:45 +08001466func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001467 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001468}
1469
Yi Konged79fa32023-06-04 17:15:42 +09001470func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001471 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001472}
1473
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001474func (c *Module) isNDKStubLibrary() bool {
1475 if _, ok := c.compiler.(*stubDecorator); ok {
1476 return true
1477 }
1478 return false
1479}
1480
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001481func (c *Module) SubName() string {
1482 return c.Properties.SubName
1483}
1484
Jiyong Park25fc6a92018-11-18 18:02:45 +09001485func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001486 if lib := c.library; lib != nil {
1487 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001488 }
1489 return false
1490}
1491
1492func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001493 if lib := c.library; lib != nil {
1494 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001495 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001496 return false
1497}
1498
Alan Stokes73feba32022-11-14 12:21:24 +00001499func (c *Module) IsStubsImplementationRequired() bool {
1500 if lib := c.library; lib != nil {
1501 return lib.isStubsImplementationRequired()
1502 }
1503 return false
1504}
1505
Colin Cross0477b422020-10-13 18:43:54 -07001506// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1507// the implementation. If it is an implementation library it returns its own name.
1508func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1509 name := ctx.OtherModuleName(c)
1510 if versioned, ok := c.linker.(versionedInterface); ok {
1511 name = versioned.implementationModuleName(name)
1512 }
1513 return name
1514}
1515
Martin Stjernholm2856c662020-12-02 15:03:42 +00001516// Similar to ImplementationModuleName, but uses the Make variant of the module
1517// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1518// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1519// under the premise that the prebuilt module overrides its source counterpart
1520// if it is exposed to Make).
1521func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1522 name := c.BaseModuleName()
1523 if versioned, ok := c.linker.(versionedInterface); ok {
1524 name = versioned.implementationModuleName(name)
1525 }
1526 return name
1527}
1528
Jiyong Park7d55b612021-06-11 17:22:09 +09001529func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001530 return Bool(c.Properties.Bootstrap)
1531}
1532
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001533func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001534 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1535 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1536 return false
1537 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001538 return c.linker != nil && c.linker.nativeCoverage()
1539}
1540
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001541func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001542 if p, ok := c.linker.(SnapshotInterface); ok {
1543 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001544 }
1545 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001546}
1547
Jiyong Parkf1194352019-02-25 11:05:47 +09001548func isBionic(name string) bool {
1549 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001550 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001551 return true
1552 }
1553 return false
1554}
1555
Martin Stjernholm279de572019-09-10 23:18:20 +01001556func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001557 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001558 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001559 }
1560 return isBionic(name)
1561}
1562
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001563func (c *Module) isCfiAssemblySupportEnabled() bool {
1564 return c.sanitize != nil &&
1565 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1566}
1567
Inseob Kim800d1142021-06-14 12:03:51 +09001568func (c *Module) InstallInRoot() bool {
1569 return c.installer != nil && c.installer.installInRoot()
1570}
1571
Colin Crossca860ac2016-01-04 14:34:37 -08001572type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001573 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001574 moduleContextImpl
1575}
1576
Colin Cross37047f12016-12-13 17:06:13 -08001577type depsContext struct {
1578 android.BottomUpMutatorContext
1579 moduleContextImpl
1580}
1581
Colin Crossca860ac2016-01-04 14:34:37 -08001582type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001583 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001584 moduleContextImpl
1585}
1586
1587type moduleContextImpl struct {
1588 mod *Module
1589 ctx BaseModuleContext
1590}
1591
Colin Crossb98c8b02016-07-29 13:44:28 -07001592func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001593 return ctx.mod.toolchain(ctx.ctx)
1594}
1595
1596func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001597 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001598}
1599
1600func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001601 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001602}
1603
Colin Cross6a730042024-12-05 13:53:43 -08001604func (ctx *moduleContextImpl) staticLibrary() bool {
1605 return ctx.mod.staticLibrary()
1606}
1607
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001608func (ctx *moduleContextImpl) testBinary() bool {
1609 return ctx.mod.testBinary()
1610}
1611
Yi Kong56fc1b62022-09-06 16:24:00 +08001612func (ctx *moduleContextImpl) testLibrary() bool {
1613 return ctx.mod.testLibrary()
1614}
1615
Jiyong Park1d1119f2019-07-29 21:27:18 +09001616func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001617 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001618}
1619
Inseob Kim7f283f42020-06-01 21:53:49 +09001620func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001621 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001622}
1623
Inseob Kim1042d292020-06-01 23:23:05 +09001624func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001625 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001626}
1627
Yi Kong5786f5c2024-05-28 02:22:34 +09001628func (ctx *moduleContextImpl) optimizeForSize() bool {
1629 return ctx.mod.OptimizeForSize()
1630}
1631
Jooyung Hanccce2f22020-03-07 03:45:53 +09001632func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001633 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001634}
1635
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001636func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001637 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001638}
1639
1640func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001641 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001642 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001643 }
1644 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001645}
1646
Jiyong Parkb35a8192020-08-10 15:59:36 +09001647func (ctx *moduleContextImpl) minSdkVersion() string {
1648 ver := ctx.mod.MinSdkVersion()
1649 if ver == "apex_inherit" && !ctx.isForPlatform() {
1650 ver = ctx.apexSdkVersion().String()
1651 }
1652 if ver == "apex_inherit" || ver == "" {
1653 ver = ctx.sdkVersion()
1654 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001655
1656 if ctx.ctx.Device() {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001657 // When building for vendor/product, use the latest _stable_ API as "current".
1658 // This is passed to clang/aidl compilers so that compiled/generated code works
1659 // with the system.
1660 if (ctx.inVendor() || ctx.inProduct()) && (ver == "" || ver == "current") {
1661 ver = ctx.ctx.Config().PlatformSdkVersion().String()
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001662 }
1663 }
1664
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001665 // For crt objects, the meaning of min_sdk_version is very different from other types of
1666 // module. For them, min_sdk_version defines the oldest version that the build system will
1667 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1668 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1669 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001670 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1671 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1672 // support such an old version. The version is set to the later version in case when the
1673 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1674 // it's for an APEX.
1675 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1676 if ctx.isForPlatform() {
1677 ver = strconv.Itoa(android.FutureApiLevelInt)
1678 } else { // for apex
1679 ver = ctx.apexSdkVersion().String()
1680 if ver == "" { // in case when min_sdk_version was not set by the APEX
1681 ver = ctx.sdkVersion()
1682 }
1683 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001684 }
1685
Jiyong Parkb35a8192020-08-10 15:59:36 +09001686 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1687 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1688 minSdkVersionInt, err2 := strconv.Atoi(ver)
1689 if err == nil && err2 == nil {
1690 if sdkVersionInt < minSdkVersionInt {
1691 return strconv.Itoa(sdkVersionInt)
1692 }
1693 }
1694 return ver
1695}
1696
1697func (ctx *moduleContextImpl) isSdkVariant() bool {
1698 return ctx.mod.IsSdkVariant()
1699}
1700
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001701func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001702 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001703}
Justin Yun8effde42017-06-23 19:24:43 +09001704
Kiyoung Kimaa394802024-01-08 12:55:45 +09001705func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1706 return ctx.mod.InVendorOrProduct()
1707}
1708
Colin Cross95f1ca02020-10-29 20:47:22 -07001709func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1710 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001711}
1712
Colin Cross127bb8b2020-12-16 16:46:01 -08001713func (ctx *moduleContextImpl) IsLlndk() bool {
1714 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001715}
1716
Colin Cross127bb8b2020-12-16 16:46:01 -08001717func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1718 return ctx.mod.isImplementationForLLNDKPublic()
1719}
1720
Colin Cross3513fb12024-01-24 14:44:47 -08001721func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1722 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001723}
1724
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001725func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1726 return ctx.mod.isOrderfileCompile()
1727}
1728
Yi Kongc702ebd2022-08-19 16:02:45 +08001729func (ctx *moduleContextImpl) isCfi() bool {
1730 return ctx.mod.isCfi()
1731}
1732
Yi Konged79fa32023-06-04 17:15:42 +09001733func (ctx *moduleContextImpl) isFuzzer() bool {
1734 return ctx.mod.isFuzzer()
1735}
1736
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001737func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1738 return ctx.mod.isNDKStubLibrary()
1739}
1740
Colin Cross5271fea2021-04-27 13:06:04 -07001741func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1742 return ctx.mod.IsVendorPublicLibrary()
1743}
1744
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001745func (ctx *moduleContextImpl) selectedStl() string {
1746 if stl := ctx.mod.stl; stl != nil {
1747 return stl.Properties.SelectedStl
1748 }
1749 return ""
1750}
1751
Ivan Lozanobd721262018-11-27 14:33:03 -08001752func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1753 return ctx.mod.linker.useClangLld(actx)
1754}
1755
Colin Crossce75d2c2016-10-06 16:12:58 -07001756func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001757 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001758}
1759
Logan Chiene274fc92019-12-03 11:18:32 -08001760func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Crossff694a82023-12-13 15:54:49 -08001761 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1762 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001763}
1764
Colin Crosse07f2312020-08-13 11:24:56 -07001765func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001766 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1767 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001768}
1769
Dan Albertc8060532020-07-22 22:32:17 -07001770func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001771 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001772}
1773
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001774func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001775 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001776}
1777
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001778func (ctx *moduleContextImpl) nativeCoverage() bool {
1779 return ctx.mod.nativeCoverage()
1780}
1781
Colin Cross95b07f22020-12-16 11:06:50 -08001782func (ctx *moduleContextImpl) isPreventInstall() bool {
1783 return ctx.mod.Properties.PreventInstall
1784}
1785
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001786func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1787 shared := &ctx.mod.sharedFlags
1788 if shared.flagsMap == nil {
1789 shared.numSharedFlags = 0
1790 shared.flagsMap = make(map[string]string)
1791 }
1792 return shared
1793}
1794
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001795func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1796 return ctx.mod.isCfiAssemblySupportEnabled()
1797}
1798
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001799func (ctx *moduleContextImpl) notInPlatform() bool {
1800 return ctx.mod.NotInPlatform()
1801}
1802
Yu Liu76d94462024-10-31 23:32:36 +00001803func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1804 if ctx.mod.makeVarsInfo == nil {
1805 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1806 }
1807 return ctx.mod.makeVarsInfo
1808}
1809
Colin Cross635c3b02016-05-18 15:37:25 -07001810func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001811 return &Module{
1812 hod: hod,
1813 multilib: multilib,
1814 }
1815}
1816
Colin Cross635c3b02016-05-18 15:37:25 -07001817func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001818 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001819 module.features = []feature{
1820 &tidyFeature{},
1821 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001822 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001823 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001824 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001825 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001826 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001827 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001828 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001829 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001830 return module
1831}
1832
Colin Crossce75d2c2016-10-06 16:12:58 -07001833func (c *Module) Prebuilt() *android.Prebuilt {
1834 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1835 return p.prebuilt()
1836 }
1837 return nil
1838}
1839
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001840func (c *Module) IsPrebuilt() bool {
1841 return c.Prebuilt() != nil
1842}
1843
Colin Crossce75d2c2016-10-06 16:12:58 -07001844func (c *Module) Name() string {
1845 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001846 if p, ok := c.linker.(interface {
1847 Name(string) string
1848 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001849 name = p.Name(name)
1850 }
1851 return name
1852}
1853
Alex Light3d673592019-01-18 14:37:31 -08001854func (c *Module) Symlinks() []string {
1855 if p, ok := c.installer.(interface {
1856 symlinkList() []string
1857 }); ok {
1858 return p.symlinkList()
1859 }
1860 return nil
1861}
1862
Chris Parsons216e10a2020-07-09 17:12:52 -04001863func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001864 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001865 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001866 }); ok {
1867 return p.dataPaths()
1868 }
1869 return nil
1870}
1871
Ivan Lozanof1868af2022-04-12 13:08:36 -04001872func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001873 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1874 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001875 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001876 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001877 if c.ProductSpecific() {
1878 // If the module is product specific with 'product_specific: true',
1879 // do not add a name suffix because it is a base module.
1880 return ""
1881 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001882 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001883 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001884 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001885 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001886 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001887 // add version suffix only if the module is using different vndk version than the
1888 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001889 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001890 }
1891 return nameSuffix
1892}
1893
Ivan Lozanof1868af2022-04-12 13:08:36 -04001894func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1895 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001896
1897 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001898 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001899 }
1900
Colin Cross127bb8b2020-12-16 16:46:01 -08001901 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001902 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001903 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1904 // added for product variant only when we have vendor and product variants with core
1905 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001906 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001907 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001908 subName += vendorPublicLibrarySuffix
1909 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001910 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1911 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001912 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001913 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001914 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001915 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001916 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001917 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001918 subName += RecoverySuffix
1919 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1920 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001921 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001922 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001923 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001924 } else if c.IsStubs() && c.IsSdkVariant() {
1925 // Public API surface (NDK)
1926 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1927 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001928 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001929
1930 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001931}
1932
Sam Delmerico75dbca22023-04-20 13:13:25 +00001933func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1934 ctx := &moduleContext{
1935 ModuleContext: actx,
1936 moduleContextImpl: moduleContextImpl{
1937 mod: c,
1938 },
1939 }
1940 ctx.ctx = ctx
1941 return ctx
1942}
1943
Spandan Das20fce2d2023-04-12 17:21:39 +00001944// TODO (b/277651159): Remove this allowlist
1945var (
1946 skipStubLibraryMultipleApexViolation = map[string]bool{
1947 "libclang_rt.asan": true,
1948 "libclang_rt.hwasan": true,
1949 // runtime apex
1950 "libc": true,
1951 "libc_hwasan": true,
1952 "libdl_android": true,
1953 "libm": true,
1954 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00001955 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00001956 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01001957 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00001958 "libandroidio": true,
1959 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01001960 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00001961 "libnativebridge": true,
1962 "libnativehelper": true,
1963 "libnativeloader": true,
1964 "libsigchain": true,
1965 }
1966)
1967
1968// Returns true if a stub library could be installed in multiple apexes
1969func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
1970 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08001971 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00001972 return false
1973 }
1974 // If this is not a stub library, no check necessary
1975 if !c.HasStubsVariants() {
1976 return false
1977 }
1978 // Skip the allowlist
1979 // Use BaseModuleName so that this matches prebuilts.
1980 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
1981 return false
1982 }
1983
Spandan Das20fce2d2023-04-12 17:21:39 +00001984 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08001985 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
1986 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00001987 return true
1988 }
1989 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08001990 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00001991 return true
1992 }
1993 // Default: no violation
1994 return false
1995}
1996
Chris Parsons8d6e4332021-02-22 16:13:50 -05001997func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07001998 ctx := moduleContextFromAndroidModuleContext(actx, c)
1999
Inseob Kim37e0bb02024-04-29 15:54:44 +09002000 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2001 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2002 Logtags: c.logtagsPaths,
2003 })
2004
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002005 // If Test_only is set on a module in bp file, respect the setting, otherwise
2006 // see if is a known test module type.
2007 testOnly := c.testModule || c.testLibrary()
2008 if c.sourceProperties.Test_only != nil {
2009 testOnly = Bool(c.sourceProperties.Test_only)
2010 }
2011 // Keep before any early returns.
2012 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2013 TestOnly: testOnly,
2014 TopLevelTarget: c.testModule,
2015 })
2016
Ivan Lozanof1868af2022-04-12 13:08:36 -04002017 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002018 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002019 if !apexInfo.IsForPlatform() {
2020 c.hideApexVariantFromMake = true
2021 }
2022
Chris Parsonseefc9e62021-04-02 17:36:47 -04002023 c.makeLinkType = GetMakeLinkType(actx, c)
2024
Colin Crossf18e1102017-11-16 14:33:08 -08002025 deps := c.depsToPaths(ctx)
2026 if ctx.Failed() {
2027 return
2028 }
2029
Joe Onorato37f900c2023-07-18 16:58:16 -07002030 for _, generator := range c.generators {
2031 gen := generator.GeneratorSources(ctx)
2032 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2033 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2034 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2035 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2036 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2037 if len(deps.Objs.objFiles) == 0 {
2038 // If we are reusuing object files (which happens when we're a shared library and we're
2039 // reusing our static variant's object files), then skip adding the actual source files,
2040 // because we already have the object for it.
2041 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2042 }
2043 }
2044
2045 if ctx.Failed() {
2046 return
2047 }
2048
Spandan Das20fce2d2023-04-12 17:21:39 +00002049 if c.stubLibraryMultipleApexViolation(actx) {
2050 actx.PropertyErrorf("apex_available",
2051 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2052 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002053 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2054 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002055 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2056 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002057 }
2058
Colin Crossca860ac2016-01-04 14:34:37 -08002059 flags := Flags{
2060 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002061 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002062 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002063 for _, generator := range c.generators {
2064 flags = generator.GeneratorFlags(ctx, flags, deps)
2065 }
Colin Crossca860ac2016-01-04 14:34:37 -08002066 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002067 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002068 }
2069 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002070 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002071 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002072 if c.stl != nil {
2073 flags = c.stl.flags(ctx, flags)
2074 }
Colin Cross16b23492016-01-06 14:41:07 -08002075 if c.sanitize != nil {
2076 flags = c.sanitize.flags(ctx, flags)
2077 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002078 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002079 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002080 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002081 if c.fuzzer != nil {
2082 flags = c.fuzzer.flags(ctx, flags)
2083 }
Stephen Craneba090d12017-05-09 15:44:35 -07002084 if c.lto != nil {
2085 flags = c.lto.flags(ctx, flags)
2086 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002087 if c.afdo != nil {
2088 flags = c.afdo.flags(ctx, flags)
2089 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002090 if c.orderfile != nil {
2091 flags = c.orderfile.flags(ctx, flags)
2092 }
Colin Crossca860ac2016-01-04 14:34:37 -08002093 for _, feature := range c.features {
2094 flags = feature.flags(ctx, flags)
2095 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002096 if ctx.Failed() {
2097 return
2098 }
2099
Colin Cross4af21ed2019-11-04 09:37:55 -08002100 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2101 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2102 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002103
Colin Cross4af21ed2019-11-04 09:37:55 -08002104 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002105
2106 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002107 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002108 }
2109 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002110 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002111 }
2112
Colin Cross3e5e7782022-06-17 22:17:05 +00002113 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2114
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002115 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002116 // We need access to all the flags seen by a source file.
2117 if c.sabi != nil {
2118 flags = c.sabi.flags(ctx, flags)
2119 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002120
Colin Cross4af21ed2019-11-04 09:37:55 -08002121 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002122
Joe Onorato37f900c2023-07-18 16:58:16 -07002123 for _, generator := range c.generators {
2124 generator.GeneratorBuildActions(ctx, flags, deps)
2125 }
2126
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002127 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002128 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002129 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002130 if ctx.Failed() {
2131 return
2132 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002133 }
2134
Colin Crossca860ac2016-01-04 14:34:37 -08002135 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002136 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002137 if ctx.Failed() {
2138 return
2139 }
Colin Cross635c3b02016-05-18 15:37:25 -07002140 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002141
Chris Parsons94a0bba2021-06-04 15:03:47 -04002142 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002143
2144 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2145 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2146 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002147 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002148
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002149 if Bool(c.Properties.Cmake_snapshot_supported) {
2150 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2151 }
2152
Chris Parsons94a0bba2021-06-04 15:03:47 -04002153 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002154
2155 if c.linker != nil {
2156 moduleInfoJSON := ctx.ModuleInfoJSON()
2157 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2158 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2159 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2160 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2161 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2162
2163 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2164 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2165 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2166 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2167
2168 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2169 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2170 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2171 moduleInfoJSON.SubName += ".cfi"
2172 }
2173 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2174 moduleInfoJSON.SubName += ".hwasan"
2175 }
2176 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2177 moduleInfoJSON.SubName += ".scs"
2178 }
2179 }
2180 moduleInfoJSON.SubName += c.Properties.SubName
2181
2182 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2183 moduleInfoJSON.Uninstallable = true
2184 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002185 }
Wei Lia1aa2972024-06-21 13:08:51 -07002186
2187 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002188
Cole Faust96a692b2024-08-08 14:47:51 -07002189 if b, ok := c.compiler.(*baseCompiler); ok {
2190 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2191 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2192 c.hasProto = b.hasSrcExt(ctx, ".proto")
2193 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2194 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2195 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2196 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2197 }
2198
Yu Liuec7043d2024-11-05 18:22:20 +00002199 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002200 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002201 }
2202 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002203 ccObjectInfo.ObjFiles = objs.objFiles
2204 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002205 }
Yu Liu4f825132024-12-18 00:35:39 +00002206 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002207 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2208 }
2209
Yu Liu8024b922024-12-20 23:31:32 +00002210 linkableInfo := CreateCommonLinkableInfo(c)
2211 if lib, ok := c.linker.(versionedInterface); ok {
2212 linkableInfo.StubsVersion = lib.stubsVersion()
2213 }
2214 if c.linker != nil {
2215 if library, ok := c.linker.(libraryInterface); ok {
2216 linkableInfo.Static = library.static()
2217 linkableInfo.CoverageFiles = library.objs().coverageFiles
2218 linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles
2219 }
2220 }
2221 android.SetProvider(ctx, LinkableInfoProvider, linkableInfo)
Yu Liu986d98c2024-11-12 00:28:11 +00002222
Yu Liu323d77a2024-12-16 23:13:57 +00002223 ccInfo := CcInfo{
Yu Liu323d77a2024-12-16 23:13:57 +00002224 IsPrebuilt: c.IsPrebuilt(),
2225 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
2226 }
2227 if c.compiler != nil {
2228 ccInfo.CompilerInfo = &CompilerInfo{
2229 Srcs: c.compiler.(CompiledInterface).Srcs(),
2230 Cflags: c.compiler.baseCompilerProps().Cflags,
2231 AidlInterfaceInfo: AidlInterfaceInfo{
2232 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2233 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2234 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2235 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2236 },
2237 }
2238 switch decorator := c.compiler.(type) {
2239 case *libraryDecorator:
2240 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002241 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs,
Yu Liu323d77a2024-12-16 23:13:57 +00002242 }
2243 }
2244 }
2245 if c.linker != nil {
2246 ccInfo.LinkerInfo = &LinkerInfo{
Yu Liu8024b922024-12-20 23:31:32 +00002247 WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs,
2248 StaticLibs: c.linker.baseLinkerProps().Static_libs,
2249 SharedLibs: c.linker.baseLinkerProps().Shared_libs,
2250 HeaderLibs: c.linker.baseLinkerProps().Header_libs,
Yu Liu323d77a2024-12-16 23:13:57 +00002251 }
2252 switch decorator := c.linker.(type) {
2253 case *binaryDecorator:
2254 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2255 case *libraryDecorator:
Yu Liu116610a2025-01-06 21:54:48 +00002256 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
2257 InjectBsslHash: Bool(c.linker.(*libraryDecorator).Properties.Inject_bssl_hash),
2258 }
Yu Liu323d77a2024-12-16 23:13:57 +00002259 case *testBinary:
2260 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2261 Gtest: decorator.testDecorator.gtest(),
2262 }
2263 case *benchmarkDecorator:
2264 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2265 case *objectLinker:
2266 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{}
2267 }
Yu Liu8024b922024-12-20 23:31:32 +00002268
2269 if s, ok := c.linker.(SnapshotInterface); ok {
2270 ccInfo.SnapshotInfo = &SnapshotInfo{
2271 SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(),
2272 }
Yu Liuffe86322024-12-18 18:53:12 +00002273 }
2274 }
Yu Liu8024b922024-12-20 23:31:32 +00002275 android.SetProvider(ctx, CcInfoProvider, &ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002276
mrziwangabdb2932024-06-18 12:43:41 -07002277 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002278
2279 if c.makeVarsInfo != nil {
2280 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2281 }
mrziwangabdb2932024-06-18 12:43:41 -07002282}
2283
Yu Liu8024b922024-12-20 23:31:32 +00002284func CreateCommonLinkableInfo(mod LinkableInterface) *LinkableInfo {
2285 return &LinkableInfo{
2286 StaticExecutable: mod.StaticExecutable(),
2287 HasStubsVariants: mod.HasStubsVariants(),
2288 OutputFile: mod.OutputFile(),
2289 UnstrippedOutputFile: mod.UnstrippedOutputFile(),
2290 IsStubs: mod.IsStubs(),
2291 CcLibraryInterface: mod.CcLibraryInterface(),
2292 RustLibraryInterface: mod.RustLibraryInterface(),
2293 BaseModuleName: mod.BaseModuleName(),
2294 IsLlndk: mod.IsLlndk(),
2295 HasNonSystemVariants: mod.HasNonSystemVariants(),
2296 SubName: mod.SubName(),
2297 InVendorOrProduct: mod.InVendorOrProduct(),
2298 InRamdisk: mod.InRamdisk(),
2299 OnlyInRamdisk: mod.OnlyInRamdisk(),
2300 InVendorRamdisk: mod.InVendorRamdisk(),
2301 OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(),
2302 InRecovery: mod.InRecovery(),
2303 OnlyInRecovery: mod.OnlyInRecovery(),
2304 }
2305}
2306
Yu Liuec7043d2024-11-05 18:22:20 +00002307func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2308 if len(files) > 0 {
2309 ctx.SetOutputFiles(files, tag)
2310 }
2311}
2312
mrziwangabdb2932024-06-18 12:43:41 -07002313func (c *Module) setOutputFiles(ctx ModuleContext) {
2314 if c.outputFile.Valid() {
2315 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2316 } else {
2317 ctx.SetOutputFiles(android.Paths{}, "")
2318 }
2319 if c.linker != nil {
2320 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2321 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2322 }
Wei Lia1aa2972024-06-21 13:08:51 -07002323}
2324
2325func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2326 // Dump metadata that can not be done in android/compliance-metadata.go
2327 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
2328 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static()))
2329 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2330
2331 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002332 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002333 staticDepNames := make([]string, 0, len(staticDeps))
2334 for _, dep := range staticDeps {
2335 staticDepNames = append(staticDepNames, dep.Name())
2336 }
2337
2338 staticDepPaths := make([]string, 0, len(deps.StaticLibs))
2339 for _, dep := range deps.StaticLibs {
2340 staticDepPaths = append(staticDepPaths, dep.String())
2341 }
2342 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2343 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2344
2345 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002346 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002347 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2348 for _, dep := range wholeStaticDeps {
2349 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2350 }
2351
2352 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2353 for _, dep := range deps.WholeStaticLibs {
2354 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2355 }
2356 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2357 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002358}
2359
2360func (c *Module) maybeUnhideFromMake() {
2361 // If a lib is directly included in any of the APEXes or is not available to the
2362 // platform (which is often the case when the stub is provided as a prebuilt),
2363 // unhide the stubs variant having the latest version gets visible to make. In
2364 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2365 // force anything in the make world to link against the stubs library. (unless it
2366 // is explicitly referenced via .bootstrap suffix or the module is marked with
2367 // 'bootstrap: true').
2368 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002369 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002370 c.IsStubs() && !c.InVendorRamdisk() {
2371 c.Properties.HideFromMake = false // unhide
2372 // Note: this is still non-installable
2373 }
2374}
2375
Colin Cross8ff10582023-12-07 13:10:56 -08002376// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2377// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002378func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002379 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002380 // If the module has been specifically configure to not be installed then
2381 // hide from make as otherwise it will break when running inside make
2382 // as the output path to install will not be specified. Not all uninstallable
2383 // modules can be hidden from make as some are needed for resolving make side
2384 // dependencies.
2385 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002386 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002387 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002388 c.SkipInstall()
2389 }
2390
2391 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2392 // to allow using the outputs in a genrule.
2393 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002394 c.installer.install(ctx, c.outputFile.Path())
2395 if ctx.Failed() {
2396 return
Colin Crossca860ac2016-01-04 14:34:37 -08002397 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002398 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002399}
2400
Colin Cross0ea8ba82019-06-06 14:33:29 -07002401func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002402 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002403 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002404 }
Colin Crossca860ac2016-01-04 14:34:37 -08002405 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002406}
2407
Colin Crossca860ac2016-01-04 14:34:37 -08002408func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002409 for _, generator := range c.generators {
2410 generator.GeneratorInit(ctx)
2411 }
Colin Crossca860ac2016-01-04 14:34:37 -08002412 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002413 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002414 }
Colin Crossca860ac2016-01-04 14:34:37 -08002415 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002416 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002417 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002418 if c.stl != nil {
2419 c.stl.begin(ctx)
2420 }
Colin Cross16b23492016-01-06 14:41:07 -08002421 if c.sanitize != nil {
2422 c.sanitize.begin(ctx)
2423 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002424 if c.coverage != nil {
2425 c.coverage.begin(ctx)
2426 }
Yi Kong9723e332023-12-04 14:52:53 +09002427 if c.afdo != nil {
2428 c.afdo.begin(ctx)
2429 }
Stephen Craneba090d12017-05-09 15:44:35 -07002430 if c.lto != nil {
2431 c.lto.begin(ctx)
2432 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002433 if c.orderfile != nil {
2434 c.orderfile.begin(ctx)
2435 }
Dan Albert92fe7402020-07-15 13:33:30 -07002436 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002437 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002438 if err != nil {
2439 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002440 c.Properties.Sdk_version = nil
2441 } else {
2442 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002443 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002444 }
Colin Crossca860ac2016-01-04 14:34:37 -08002445}
2446
Colin Cross37047f12016-12-13 17:06:13 -08002447func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002448 deps := Deps{}
2449
Joe Onorato37f900c2023-07-18 16:58:16 -07002450 for _, generator := range c.generators {
2451 deps = generator.GeneratorDeps(ctx, deps)
2452 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002453 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002454 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002455 }
2456 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002457 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002458 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002459 if c.stl != nil {
2460 deps = c.stl.deps(ctx, deps)
2461 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002462 if c.coverage != nil {
2463 deps = c.coverage.deps(ctx, deps)
2464 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002465
Colin Crossb6715442017-10-24 11:13:31 -07002466 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2467 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2468 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2469 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2470 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2471 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002472 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002473 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002474
Colin Cross516c5452024-10-28 13:45:21 -07002475 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2476 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2477 }
2478
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002479 for _, lib := range deps.ReexportSharedLibHeaders {
2480 if !inList(lib, deps.SharedLibs) {
2481 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2482 }
2483 }
2484
2485 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002486 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2487 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 -07002488 }
2489 }
2490
Colin Cross5950f382016-12-13 12:50:57 -08002491 for _, lib := range deps.ReexportHeaderLibHeaders {
2492 if !inList(lib, deps.HeaderLibs) {
2493 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2494 }
2495 }
2496
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002497 for _, gen := range deps.ReexportGeneratedHeaders {
2498 if !inList(gen, deps.GeneratedHeaders) {
2499 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2500 }
2501 }
2502
Colin Crossc99deeb2016-04-11 15:06:20 -07002503 return deps
2504}
2505
Colin Cross516c5452024-10-28 13:45:21 -07002506func checkConflictingExplicitVersions(libs []string) error {
2507 withoutVersion := func(s string) string {
2508 name, _ := StubsLibNameAndVersion(s)
2509 return name
2510 }
2511 var errs []error
2512 for i, lib := range libs {
2513 libName := withoutVersion(lib)
2514 libsToCompare := libs[i+1:]
2515 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2516 return withoutVersion(s) == libName
2517 })
2518 if j >= 0 {
2519 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2520 lib, libsToCompare[j]))
2521 }
2522 }
2523 return errors.Join(errs...)
2524}
2525
Dan Albert7e9d2952016-08-04 13:02:36 -07002526func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002527 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002528 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002529 moduleContextImpl: moduleContextImpl{
2530 mod: c,
2531 },
2532 }
2533 ctx.ctx = ctx
2534
Colin Crossca860ac2016-01-04 14:34:37 -08002535 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002536}
2537
Jiyong Park7ed9de32018-10-15 22:25:07 +09002538// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002539func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002540 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2541 version := name[sharp+1:]
2542 libname := name[:sharp]
2543 return libname, version
2544 }
2545 return name, ""
2546}
2547
Dan Albert92fe7402020-07-15 13:33:30 -07002548func GetCrtVariations(ctx android.BottomUpMutatorContext,
2549 m LinkableInterface) []blueprint.Variation {
2550 if ctx.Os() != android.Android {
2551 return nil
2552 }
2553 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002554 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2555 minSdkVersion := m.MinSdkVersion()
2556 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2557 minSdkVersion = m.SdkVersion()
2558 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002559 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2560 if err != nil {
2561 ctx.PropertyErrorf("min_sdk_version", err.Error())
2562 }
Colin Cross363ec762023-01-13 13:45:14 -08002563
2564 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002565 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002566 if apiLevel.LessThan(minApiForArch) {
2567 apiLevel = minApiForArch
2568 }
2569
Dan Albert92fe7402020-07-15 13:33:30 -07002570 return []blueprint.Variation{
2571 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002572 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002573 }
2574 }
2575 return []blueprint.Variation{
2576 {Mutator: "sdk", Variation: ""},
2577 }
2578}
2579
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002580func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2581 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002582
2583 variations = append([]blueprint.Variation(nil), variations...)
2584
Liz Kammer23942242022-04-08 15:41:00 -04002585 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002586 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002587 if version == "impl" {
2588 version = ""
2589 }
Colin Crosse7257d22020-09-24 09:56:18 -07002590 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002591 if tag, ok := depTag.(libraryDependencyTag); ok {
2592 tag.explicitlyVersioned = true
Colin Crossafcdce82024-10-22 13:59:33 -07002593 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2594 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2595 // the modified copy to depTag.
2596 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002597 } else {
2598 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2599 }
Colin Crosse7257d22020-09-24 09:56:18 -07002600 }
Colin Crosse7257d22020-09-24 09:56:18 -07002601
Colin Cross0de8a1e2020-09-18 14:15:30 -07002602 if far {
2603 ctx.AddFarVariationDependencies(variations, depTag, name)
2604 } else {
2605 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002606 }
2607}
2608
Kiyoung Kim487689e2022-07-26 09:48:22 +09002609func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2610 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002611 return snapshot
2612 }
2613
2614 return lib
2615}
2616
Kiyoung Kim37693d02024-04-04 09:56:15 +09002617// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002618// of names:
2619//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002620// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002621//
2622// For each of these, it adds the name of the ndk_library module to the list of
2623// variant libs.
2624//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002625// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002626//
2627// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002628//
2629// The caller can then know to add the variantLibs dependencies differently from the
2630// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002631func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002632 variantLibs = []string{}
2633
2634 nonvariantLibs = []string{}
2635 for _, entry := range list {
2636 // strip #version suffix out
2637 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002638 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002639 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002640 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002641 nonvariantLibs = append(nonvariantLibs, entry)
2642 }
2643 }
2644 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002645
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002646}
2647
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002648func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2649 nonVariantLibs := []string{}
2650 variantLibs := []string{}
2651
2652 for _, lib := range libs {
2653 replaceLibName := GetReplaceModuleName(lib, replaceList)
2654 if replaceLibName == lib {
2655 // Do not handle any libs which are not in API imports
2656 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2657 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2658 variantLibs = append(variantLibs, replaceLibName)
2659 } else {
2660 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2661 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002662 }
2663
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002664 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002665}
2666
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002667func (c *Module) shouldUseApiSurface() bool {
2668 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2669 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2670 // LLNDK Variant
2671 return true
2672 }
2673
2674 if c.Properties.IsSdkVariant {
2675 // NDK Variant
2676 return true
2677 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002678 }
2679
2680 return false
2681}
2682
Colin Cross1e676be2016-10-12 14:38:15 -07002683func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002684 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002685 return
2686 }
2687
Colin Cross37047f12016-12-13 17:06:13 -08002688 ctx := &depsContext{
2689 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002690 moduleContextImpl: moduleContextImpl{
2691 mod: c,
2692 },
2693 }
2694 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002695
Colin Crossc99deeb2016-04-11 15:06:20 -07002696 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002697
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002698 apiNdkLibs := []string{}
2699 apiLateNdkLibs := []string{}
2700
Yo Chiang219968c2020-09-22 18:45:04 +08002701 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2702
Dan Albert914449f2016-06-17 16:45:24 -07002703 variantNdkLibs := []string{}
2704 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002705 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002706 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2707 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2708 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002709 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002710
Colin Cross32ec36c2016-12-15 07:39:51 -08002711 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002712 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002713 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002714 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002715 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002716
Spandan Das73bcafc2022-08-18 23:26:00 +00002717 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002718 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2719 if variationExists {
2720 actx.AddVariationDependencies(nil, depTag, lib)
2721 } else {
2722 // dependencies to ndk_headers fall here as ndk_headers do not have
2723 // any variants.
2724 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2725 }
Spandan Dasff665182024-09-11 18:48:44 +00002726 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002727 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002728 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002729 } else {
2730 actx.AddVariationDependencies(nil, depTag, lib)
2731 }
2732 }
2733
Dan Albertf1d14c72020-07-30 14:32:55 -07002734 if c.isNDKStubLibrary() {
2735 // NDK stubs depend on their implementation because the ABI dumps are
2736 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002737
Spandan Das8b08aea2023-03-14 19:29:34 +00002738 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2739 c.ImageVariation(),
2740 blueprint.Variation{Mutator: "link", Variation: "shared"},
2741 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002742 }
2743
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002744 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2745 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2746 c.Target().NativeBridge == android.NativeBridgeDisabled {
2747 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002748 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002749 llndkHeaderLibTag,
2750 deps.LlndkHeaderLibs...)
2751 }
2752
Jiyong Park5d1598f2019-02-25 22:14:17 +09002753 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002754 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002755
Jiyong Park5d1598f2019-02-25 22:14:17 +09002756 actx.AddVariationDependencies([]blueprint.Variation{
2757 {Mutator: "link", Variation: "static"},
2758 }, depTag, lib)
2759 }
2760
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002761 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002762 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002763 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002764
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002765 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002766 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002767 }
Jiyong Parke3867542020-12-03 17:28:25 +09002768 if inList(lib, deps.ExcludeLibsForApex) {
2769 depTag.excludeInApex = true
2770 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002771 actx.AddVariationDependencies([]blueprint.Variation{
2772 {Mutator: "link", Variation: "static"},
2773 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002774 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002775
Jooyung Han75568392020-03-20 04:29:24 +09002776 // staticUnwinderDep is treated as staticDep for Q apexes
2777 // so that native libraries/binaries are linked with static unwinder
2778 // because Q libc doesn't have unwinder APIs
2779 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002780 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002781 actx.AddVariationDependencies([]blueprint.Variation{
2782 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002783 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002784 }
2785
Jiyong Park7ed9de32018-10-15 22:25:07 +09002786 // shared lib names without the #version suffix
2787 var sharedLibNames []string
2788
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002789 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002790 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002791 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002792 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002793 }
Jiyong Parke3867542020-12-03 17:28:25 +09002794 if inList(lib, deps.ExcludeLibsForApex) {
2795 depTag.excludeInApex = true
2796 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002797 if inList(lib, deps.ExcludeLibsForNonApex) {
2798 depTag.excludeInNonApex = true
2799 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002800
Jiyong Park73c54ee2019-10-22 20:31:18 +09002801 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002802 sharedLibNames = append(sharedLibNames, name)
2803
Colin Crosse7257d22020-09-24 09:56:18 -07002804 variations := []blueprint.Variation{
2805 {Mutator: "link", Variation: "shared"},
2806 }
Spandan Dasff665182024-09-11 18:48:44 +00002807 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002808 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002809
Colin Crossfe9acfe2021-06-14 16:13:03 -07002810 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002811 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002812 actx.AddVariationDependencies([]blueprint.Variation{
2813 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002814 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002815 }
2816
Colin Cross3e5e7782022-06-17 22:17:05 +00002817 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002818 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002819 actx.AddVariationDependencies([]blueprint.Variation{
2820 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002821 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002822 }
2823
Jiyong Park7ed9de32018-10-15 22:25:07 +09002824 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002825 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002826 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2827 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2828 // linking against both the stubs lib and the non-stubs lib at the same time.
2829 continue
2830 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002831 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002832 variations := []blueprint.Variation{
2833 {Mutator: "link", Variation: "shared"},
2834 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002835 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002836 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002837
Dan Willemsen59339a22018-07-22 21:18:45 -07002838 actx.AddVariationDependencies([]blueprint.Variation{
2839 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002840 }, dataLibDepTag, deps.DataLibs...)
2841
Colin Crossc8caa062021-09-24 16:50:14 -07002842 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2843
Chris Parsons79d66a52020-06-05 17:26:16 -04002844 actx.AddVariationDependencies([]blueprint.Variation{
2845 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002846 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002847
Colin Cross68861832016-07-08 10:41:41 -07002848 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002849
2850 for _, gen := range deps.GeneratedHeaders {
2851 depTag := genHeaderDepTag
2852 if inList(gen, deps.ReexportGeneratedHeaders) {
2853 depTag = genHeaderExportDepTag
2854 }
2855 actx.AddDependency(c, depTag, gen)
2856 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002857
Cole Faust65cb40a2024-10-21 15:41:42 -07002858 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2859 depTag := genHeaderDepTag
2860 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2861 }
2862
Dan Albert92fe7402020-07-15 13:33:30 -07002863 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002864 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002865 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002866 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002867 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002868 }
Colin Crossc465efd2021-06-11 18:00:04 -07002869 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002870 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002871 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002872 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002873 if deps.DynamicLinker != "" {
2874 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002875 }
Dan Albert914449f2016-06-17 16:45:24 -07002876
2877 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002878
Colin Cross8acea3e2024-12-12 14:53:30 -08002879 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002880 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002881 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002882 {Mutator: "link", Variation: "shared"},
2883 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002884 actx.AddVariationDependencies([]blueprint.Variation{
2885 {Mutator: "version", Variation: version},
2886 {Mutator: "link", Variation: "shared"},
2887 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002888
Colin Cross8acea3e2024-12-12 14:53:30 -08002889 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002890 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002891 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002892 {Mutator: "link", Variation: "shared"},
2893 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002894 actx.AddVariationDependencies([]blueprint.Variation{
2895 {Mutator: "version", Variation: version},
2896 {Mutator: "link", Variation: "shared"},
2897 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002898
Vinh Tran367d89d2023-04-28 11:21:25 -04002899 if len(deps.AidlLibs) > 0 {
2900 actx.AddDependency(
2901 c,
2902 aidlLibraryTag,
2903 deps.AidlLibs...,
2904 )
2905 }
2906
Colin Cross6362e272015-10-29 15:25:03 -07002907}
Colin Cross21b9a242015-03-24 14:15:58 -07002908
Colin Crosse40b4ea2018-10-02 22:25:58 -07002909func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002910 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002911 c.beginMutator(ctx)
2912 }
2913}
2914
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002915// Whether a module can link to another module, taking into
2916// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002917func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002918 tag blueprint.DependencyTag) {
2919
2920 switch t := tag.(type) {
2921 case dependencyTag:
2922 if t != vndkExtDepTag {
2923 return
2924 }
2925 case libraryDependencyTag:
2926 default:
2927 return
2928 }
2929
Ivan Lozanof9e21722020-12-02 09:00:51 -05002930 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002931 // Host code is not restricted
2932 return
2933 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002934
Ivan Lozano52767be2019-10-18 14:49:46 -07002935 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002936 // Platform code can link to anything
2937 return
2938 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002939 if from.InRamdisk() {
2940 // Ramdisk code is not NDK
2941 return
2942 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002943 if from.InVendorRamdisk() {
2944 // Vendor ramdisk code is not NDK
2945 return
2946 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002947 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002948 // Recovery code is not NDK
2949 return
2950 }
Colin Cross31076b32020-10-23 17:22:06 -07002951 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002952 if c.StubDecorator() {
2953 // These aren't real libraries, but are the stub shared libraries that are included in
2954 // the NDK.
2955 return
2956 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002957 }
Logan Chien834b9a62019-01-14 15:39:03 +08002958
Ivan Lozano52767be2019-10-18 14:49:46 -07002959 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002960 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2961 // to link to libc++ (non-NDK and without sdk_version).
2962 return
2963 }
2964
Ivan Lozano52767be2019-10-18 14:49:46 -07002965 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002966 // NDK code linking to platform code is never okay.
2967 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002968 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002969 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002970 }
2971
2972 // At this point we know we have two NDK libraries, but we need to
2973 // check that we're not linking against anything built against a higher
2974 // API level, as it is only valid to link against older or equivalent
2975 // APIs.
2976
Inseob Kim01a28722018-04-11 09:48:45 +09002977 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002978 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002979 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002980 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002981 // Current can't be linked against by anything else.
2982 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002983 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002984 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002985 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002986 if err != nil {
2987 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002988 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002989 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002990 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002991 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002992 if err != nil {
2993 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002994 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002995 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002996 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002997
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002998 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09002999 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003000 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003001 }
3002 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003003 }
Dan Albert202fe492017-12-15 13:56:59 -08003004
3005 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003006 fromStl := from.SelectedStl()
3007 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003008 if fromStl == "" || toStl == "" {
3009 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003010 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003011 // We can be permissive with the system "STL" since it is only the C++
3012 // ABI layer, but in the future we should make sure that everyone is
3013 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003014 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003015 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003016 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3017 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003018 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003019}
3020
Jooyung Han479ca172020-10-19 18:51:07 +09003021func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3022 if c, ok := ctx.Module().(*Module); ok {
3023 ctx.VisitDirectDeps(func(dep android.Module) {
3024 depTag := ctx.OtherModuleDependencyTag(dep)
3025 ccDep, ok := dep.(LinkableInterface)
3026 if ok {
3027 checkLinkType(ctx, c, ccDep, depTag)
3028 }
3029 })
3030 }
3031}
3032
Jiyong Park5fb8c102018-04-09 12:03:06 +09003033// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003034// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3035// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003036// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003037func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003038 check := func(child, parent android.Module) bool {
3039 to, ok := child.(*Module)
3040 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003041 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003042 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003043
Jooyung Hana70f0672019-01-18 15:20:43 +09003044 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3045 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003046 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003047
Jiyong Park0474e1f2021-01-14 14:26:06 +09003048 // These dependencies are not excercised at runtime. Tracking these will give us
3049 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003050 depTag := ctx.OtherModuleDependencyTag(child)
3051 if IsHeaderDepTag(depTag) {
3052 return false
3053 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003054 if depTag == staticVariantTag {
3055 return false
3056 }
3057 if depTag == stubImplDepTag {
3058 return false
3059 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003060 if depTag == android.RequiredDepTag {
3061 return false
3062 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003063
Justin Yun63e9ec72020-10-29 16:49:43 +09003064 // Even if target lib has no vendor variant, keep checking dependency
3065 // graph in case it depends on vendor_available or product_available
3066 // but not double_loadable transtively.
3067 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003068 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003069 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003070
Jiyong Park0474e1f2021-01-14 14:26:06 +09003071 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3072 // one.
3073 if Bool(to.VendorProperties.Double_loadable) {
3074 return true
3075 }
3076
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003077 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003078 return false
3079 }
3080
Jooyung Hana70f0672019-01-18 15:20:43 +09003081 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3082 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003083 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003084 return false
3085 }
3086 if module, ok := ctx.Module().(*Module); ok {
3087 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003088 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003089 ctx.WalkDeps(check)
3090 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003091 }
3092 }
3093}
3094
Yu Liue4312402023-01-18 09:15:31 -08003095func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3096 // For the dependency from platform to apex, use the latest stubs
3097 apexSdkVersion := android.FutureApiLevel
3098 if !apexInfo.IsForPlatform() {
3099 apexSdkVersion = apexInfo.MinSdkVersion
3100 }
3101
3102 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3103 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3104 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3105 // (b/144430859)
3106 apexSdkVersion = android.FutureApiLevel
3107 }
3108
3109 return apexSdkVersion
3110}
3111
Colin Crossc99deeb2016-04-11 15:06:20 -07003112// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003113func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003114 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003115
Colin Cross0de8a1e2020-09-18 14:15:30 -07003116 var directStaticDeps []StaticLibraryInfo
3117 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003118
Colin Cross0de8a1e2020-09-18 14:15:30 -07003119 reexportExporter := func(exporter FlagExporterInfo) {
3120 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3121 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3122 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3123 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3124 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003125 }
3126
Colin Crossff694a82023-12-13 15:54:49 -08003127 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003128 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003129
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003130 skipModuleList := map[string]bool{}
3131
Yu Liu8024b922024-12-20 23:31:32 +00003132 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003133 depName := ctx.OtherModuleName(dep)
3134 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003135
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003136 if _, ok := skipModuleList[depName]; ok {
3137 // skip this module because original module or API imported module matching with this should be used instead.
3138 return
3139 }
3140
Yu Liu8024b922024-12-20 23:31:32 +00003141 var ccInfo *CcInfo
3142 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3143 if hasCcInfo {
3144 ccInfo = v
3145 }
3146 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003147 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003148 if !hasCcInfo {
3149 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3150 }
3151 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003152 return
3153 }
3154
Vinh Tran367d89d2023-04-28 11:21:25 -04003155 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003156 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003157 depPaths.AidlLibraryInfos = append(
3158 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003159 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003160 )
3161 }
3162 }
3163
Yu Liu8024b922024-12-20 23:31:32 +00003164 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003165 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003166 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003167 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003168 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003169 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003170 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003171 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003172 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003173 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003174 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003175 // Support exported headers from a generated_sources dependency
3176 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003177 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003178 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003179 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003180 genRule.GeneratedDeps...)
3181 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003182 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003183 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003184 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003185 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003186 genRule.GeneratedSourceFiles...)
3187 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003188 // 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 +09003189 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003190 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003191 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003192 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003193 }
Colin Crosscef792e2021-06-11 18:01:26 -07003194 case CrtBeginDepTag:
3195 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3196 case CrtEndDepTag:
3197 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003198 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003199 return
3200 }
3201
Colin Crossfe17f6f2019-03-28 19:30:56 -07003202 if depTag == android.ProtoPluginDepTag {
3203 return
3204 }
3205
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003206 if depTag == android.RequiredDepTag {
3207 return
3208 }
3209
Yu Liu8024b922024-12-20 23:31:32 +00003210 commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey)
3211 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003212 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 -07003213 return
3214 }
Yu Liu8024b922024-12-20 23:31:32 +00003215 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003216 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003217 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003218 return
3219 }
3220
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003221 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003222 // Skip reused objects for stub libraries, they use their own stub object file instead.
3223 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3224 // version mutator, so the stubs variant is created from the shared variant that
3225 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003226 if !c.library.buildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003227 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003228 objs := staticAnalogue.ReuseObjects
3229 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003230 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003231 reexportExporter(depExporterInfo)
3232 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003233 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003234 }
3235
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003236 if depTag == llndkHeaderLibTag {
3237 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3238 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3239 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3240 }
3241
Yu Liu8024b922024-12-20 23:31:32 +00003242 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003243
3244 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3245 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003246 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003247 return
3248 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003249
Jiyong Parke3867542020-12-03 17:28:25 +09003250 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3251 return
3252 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003253 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3254 return
3255 }
Jiyong Parke3867542020-12-03 17:28:25 +09003256
Colin Cross313aa542023-12-13 13:47:44 -08003257 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003258
Colin Cross6e511a92020-07-27 21:26:48 -07003259 var ptr *android.Paths
3260 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003261
Colin Cross6e511a92020-07-27 21:26:48 -07003262 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003263
Colin Cross6e511a92020-07-27 21:26:48 -07003264 switch {
3265 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003266 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003267 if !ctx.Config().AllowMissingDependencies() {
3268 ctx.ModuleErrorf("module %q is not a header library", depName)
3269 } else {
3270 ctx.AddMissingDependencies([]string{depName})
3271 }
3272 return
3273 }
Colin Cross6e511a92020-07-27 21:26:48 -07003274 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003275 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003276 if !ctx.Config().AllowMissingDependencies() {
3277 ctx.ModuleErrorf("module %q is not a shared library", depName)
3278 } else {
3279 ctx.AddMissingDependencies([]string{depName})
3280 }
3281 return
3282 }
Jiyong Parke3867542020-12-03 17:28:25 +09003283
Jiyong Park7d55b612021-06-11 17:22:09 +09003284 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3285 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003286
Jiyong Park1ad8e162020-12-01 23:40:09 +09003287 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3288 // linkFile, depFile, and ptr.
3289 if c.IsStubs() {
3290 break
3291 }
3292
Colin Cross0de8a1e2020-09-18 14:15:30 -07003293 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3294 depFile = sharedLibraryInfo.TableOfContents
3295
Colin Crossb614cd42024-10-11 12:52:21 -07003296 if !sharedLibraryInfo.IsStubs {
3297 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3298 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3299 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3300 }
3301 }
3302
Colin Cross6e511a92020-07-27 21:26:48 -07003303 ptr = &depPaths.SharedLibs
3304 switch libDepTag.Order {
3305 case earlyLibraryDependency:
3306 ptr = &depPaths.EarlySharedLibs
3307 depPtr = &depPaths.EarlySharedLibsDeps
3308 case normalLibraryDependency:
3309 ptr = &depPaths.SharedLibs
3310 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003311 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003312 case lateLibraryDependency:
3313 ptr = &depPaths.LateSharedLibs
3314 depPtr = &depPaths.LateSharedLibsDeps
3315 default:
3316 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003317 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003318
Colin Cross6e511a92020-07-27 21:26:48 -07003319 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003320 if linkableInfo.RustLibraryInterface {
3321 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003322 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3323 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3324 if libDepTag.wholeStatic {
3325 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3326 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003327
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003328 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3329 // exported functions from the rust generated staticlib still exported.
3330 if c.CcLibrary() && c.Shared() {
3331 c.WholeRustStaticlib = true
3332 }
Colin Cross6e511a92020-07-27 21:26:48 -07003333 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003334
Colin Cross6e511a92020-07-27 21:26:48 -07003335 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003336 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3337 if !isStaticLib {
3338 if !ctx.Config().AllowMissingDependencies() {
3339 ctx.ModuleErrorf("module %q is not a static library", depName)
3340 } else {
3341 ctx.AddMissingDependencies([]string{depName})
3342 }
3343 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003344 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003345
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003346 // Stubs lib doesn't link to the static lib dependencies. Don't set
3347 // linkFile, depFile, and ptr.
3348 if c.IsStubs() {
3349 break
3350 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003351
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003352 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3353 if libDepTag.wholeStatic {
3354 ptr = &depPaths.WholeStaticLibs
3355 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3356 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3357 } else {
3358 // This case normally catches prebuilt static
3359 // libraries, but it can also occur when
3360 // AllowMissingDependencies is on and the
3361 // dependencies has no sources of its own
3362 // but has a whole_static_libs dependency
3363 // on a missing library. We want to depend
3364 // on the .a file so that there is something
3365 // in the dependency tree that contains the
3366 // error rule for the missing transitive
3367 // dependency.
3368 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3369 }
3370 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3371 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3372 } else {
3373 switch libDepTag.Order {
3374 case earlyLibraryDependency:
3375 panic(fmt.Errorf("early static libs not supported"))
3376 case normalLibraryDependency:
3377 // static dependencies will be handled separately so they can be ordered
3378 // using transitive dependencies.
3379 ptr = nil
3380 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3381 case lateLibraryDependency:
3382 ptr = &depPaths.LateStaticLibs
3383 default:
3384 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3385 }
3386 }
3387
3388 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3389 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3390
3391 if libDepTag.unexportedSymbols {
3392 depPaths.LdFlags = append(depPaths.LdFlags,
3393 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3394 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003395 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003396 }
3397
Yu Liu8024b922024-12-20 23:31:32 +00003398 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3399 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003400 ctx.ModuleErrorf("module %q not a static library", depName)
3401 return
3402 }
Logan Chien43d34c32017-12-20 01:17:32 +08003403
Colin Cross6e511a92020-07-27 21:26:48 -07003404 // When combining coverage files for shared libraries and executables, coverage files
3405 // in static libraries act as if they were whole static libraries. The same goes for
3406 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003407 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003408 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003409 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003410 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003411 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003412 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003413 // Handle non-CC modules here
3414 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003415 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003416 }
3417 }
3418
Colin Cross6e511a92020-07-27 21:26:48 -07003419 if ptr != nil {
3420 if !linkFile.Valid() {
3421 if !ctx.Config().AllowMissingDependencies() {
3422 ctx.ModuleErrorf("module %q missing output file", depName)
3423 } else {
3424 ctx.AddMissingDependencies([]string{depName})
3425 }
3426 return
3427 }
3428 *ptr = append(*ptr, linkFile.Path())
3429 }
3430
3431 if depPtr != nil {
3432 dep := depFile
3433 if !dep.Valid() {
3434 dep = linkFile
3435 }
3436 *depPtr = append(*depPtr, dep.Path())
3437 }
3438
Colin Cross0de8a1e2020-09-18 14:15:30 -07003439 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3440 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3441 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3442 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003443 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3444
3445 // Only re-export RustRlibDeps for cc static libs
3446 if c.static() {
3447 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3448 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003449
3450 if libDepTag.reexportFlags {
3451 reexportExporter(depExporterInfo)
3452 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3453 // Re-exported shared library headers must be included as well since they can help us with type information
3454 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003455 c.sabi.Properties.ReexportedIncludes = append(
3456 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003457 c.sabi.Properties.ReexportedSystemIncludes = append(
3458 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003459 }
3460
Yu Liu8024b922024-12-20 23:31:32 +00003461 makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003462 switch {
3463 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003464 c.Properties.AndroidMkHeaderLibs = append(
3465 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003466 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003467 // Note: the order of libs in this list is not important because
3468 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003469 c.Properties.AndroidMkSharedLibs = append(
3470 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003471 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003472 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003473 if libDepTag.wholeStatic {
3474 c.Properties.AndroidMkWholeStaticLibs = append(
3475 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3476 } else {
3477 c.Properties.AndroidMkStaticLibs = append(
3478 c.Properties.AndroidMkStaticLibs, makeLibName)
3479 }
Colin Cross6e511a92020-07-27 21:26:48 -07003480 }
3481 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003482 } else if !c.IsStubs() {
3483 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3484
Colin Cross6e511a92020-07-27 21:26:48 -07003485 switch depTag {
3486 case runtimeDepTag:
3487 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liu8024b922024-12-20 23:31:32 +00003488 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003489 case objDepTag:
3490 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3491 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003492 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003493 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003494 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003495 case dynamicLinkerDepTag:
3496 depPaths.DynamicLinker = linkFile
3497 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003498 }
Colin Crossca860ac2016-01-04 14:34:37 -08003499 })
3500
Jeff Gaston294356f2017-09-27 17:05:30 -07003501 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003502 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3503 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3504 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003505
Colin Crossdd84e052017-05-17 13:44:16 -07003506 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003507 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003508 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3509 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003510 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003511 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3512
Jiyong Park74955042019-10-22 20:19:51 +09003513 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3514 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003515 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003516 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003517 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003518 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003519
3520 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003521 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003522 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003523 }
Colin Crossdd84e052017-05-17 13:44:16 -07003524
Colin Crossca860ac2016-01-04 14:34:37 -08003525 return depPaths
3526}
3527
Spandan Das10c41362024-12-03 01:33:09 +00003528func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003529 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003530 bootstrap := false
Spandan Das10c41362024-12-03 01:33:09 +00003531 if linkable, ok := parent.(LinkableInterface); !ok {
3532 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
Jiyong Park7d55b612021-06-11 17:22:09 +09003533 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003534 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003535 bootstrap = linkable.Bootstrap()
3536 }
3537
Spandan Das10c41362024-12-03 01:33:09 +00003538 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003539
3540 useStubs := false
3541
Yu Liu8024b922024-12-20 23:31:32 +00003542 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003543 if !apexInfo.IsForPlatform() {
3544 // For platform libraries, use current version of LLNDK
3545 // If this is for use_vendor apex we will apply the same rules
3546 // of apex sdk enforcement below to choose right version.
3547 useStubs = true
3548 }
3549 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3550 // If not building for APEX or the containing APEX allows the use of
3551 // platform APIs, use stubs only when it is from an APEX (and not from
3552 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3553 // bootstrap modules, always link to non-stub variant
Yu Liu8024b922024-12-20 23:31:32 +00003554 isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003555
Spandan Dasff665182024-09-11 18:48:44 +00003556 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003557 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003558 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3559 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003560 }
3561
3562 return useStubs
3563}
3564
3565// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3566// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3567// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3568// has different level of updatability. For example, if a library foo in an APEX depends on a
3569// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3570// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3571// same APEX as foo, the non-stub variant of bar is used.
3572func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3573 depTag := ctx.OtherModuleDependencyTag(dep)
3574 libDepTag, ok := depTag.(libraryDependencyTag)
3575 if !ok || !libDepTag.shared() {
3576 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3577 }
3578
Colin Cross313aa542023-12-13 13:47:44 -08003579 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3580 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3581 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003582
3583 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003584 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003585 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003586 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3587 toUse := stubs[len(stubs)-1]
3588 sharedLibraryInfo = toUse.SharedLibraryInfo
3589 depExporterInfo = toUse.FlagExporterInfo
3590 }
3591 }
3592 return sharedLibraryInfo, depExporterInfo
3593}
3594
Colin Cross0de8a1e2020-09-18 14:15:30 -07003595// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3596// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003597// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003598// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003599func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3600 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003601 var staticPaths android.Paths
3602 for _, staticDep := range staticDeps {
3603 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3604 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3605 }
3606 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003607 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003608 }
3609 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3610
3611 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3612
3613 // reorder the dependencies based on transitive dependencies
3614 staticPaths = android.FirstUniquePaths(staticPaths)
3615 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3616
3617 if len(orderedStaticPaths) != len(staticPaths) {
3618 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3619 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3620 }
3621
3622 return orderedStaticPaths, transitiveStaticLibs
3623}
3624
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003625// BaseLibName trims known prefixes and suffixes
3626func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003627 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3628 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003629 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003630 return libName
3631}
3632
Yu Liu8024b922024-12-20 23:31:32 +00003633func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003634 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003635 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3636 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003637
Yu Liu8024b922024-12-20 23:31:32 +00003638 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003639 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003640 if ccInfo.SnapshotInfo != nil {
3641 return linkableInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003642 }
3643 }
3644
Yu Liu8024b922024-12-20 23:31:32 +00003645 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003646 // The vendor and product modules in Make will have been renamed to not conflict with the
3647 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003648 return libName + linkableInfo.SubName
3649 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003650 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003651 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003652 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003653 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003654 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003655 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003656 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003657 } else {
3658 return libName
3659 }
3660}
3661
Colin Crossca860ac2016-01-04 14:34:37 -08003662func (c *Module) InstallInData() bool {
3663 if c.installer == nil {
3664 return false
3665 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003666 return c.installer.inData()
3667}
3668
3669func (c *Module) InstallInSanitizerDir() bool {
3670 if c.installer == nil {
3671 return false
3672 }
3673 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003674 return true
3675 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003676 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003677}
3678
Yifan Hong1b3348d2020-01-21 15:53:22 -08003679func (c *Module) InstallInRamdisk() bool {
3680 return c.InRamdisk()
3681}
3682
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003683func (c *Module) InstallInVendorRamdisk() bool {
3684 return c.InVendorRamdisk()
3685}
3686
Jiyong Parkf9332f12018-02-01 00:54:12 +09003687func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003688 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003689}
3690
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003691func (c *Module) MakeUninstallable() {
3692 if c.installer == nil {
3693 c.ModuleBase.MakeUninstallable()
3694 return
3695 }
3696 c.installer.makeUninstallable(c)
3697}
3698
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003699func (c *Module) HostToolPath() android.OptionalPath {
3700 if c.installer == nil {
3701 return android.OptionalPath{}
3702 }
3703 return c.installer.hostToolPath()
3704}
3705
Nan Zhangd4e641b2017-07-12 12:55:28 -07003706func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3707 return c.outputFile
3708}
3709
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003710func (c *Module) static() bool {
3711 if static, ok := c.linker.(interface {
3712 static() bool
3713 }); ok {
3714 return static.static()
3715 }
3716 return false
3717}
3718
Colin Cross6a730042024-12-05 13:53:43 -08003719func (c *Module) staticLibrary() bool {
3720 if static, ok := c.linker.(interface {
3721 staticLibrary() bool
3722 }); ok {
3723 return static.staticLibrary()
3724 }
3725 return false
3726}
3727
Jiyong Park379de2f2018-12-19 02:47:14 +09003728func (c *Module) staticBinary() bool {
3729 if static, ok := c.linker.(interface {
3730 staticBinary() bool
3731 }); ok {
3732 return static.staticBinary()
3733 }
3734 return false
3735}
3736
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003737func (c *Module) testBinary() bool {
3738 if test, ok := c.linker.(interface {
3739 testBinary() bool
3740 }); ok {
3741 return test.testBinary()
3742 }
3743 return false
3744}
3745
Jingwen Chen537242c2022-08-24 11:53:27 +00003746func (c *Module) testLibrary() bool {
3747 if test, ok := c.linker.(interface {
3748 testLibrary() bool
3749 }); ok {
3750 return test.testLibrary()
3751 }
3752 return false
3753}
3754
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003755func (c *Module) benchmarkBinary() bool {
3756 if b, ok := c.linker.(interface {
3757 benchmarkBinary() bool
3758 }); ok {
3759 return b.benchmarkBinary()
3760 }
3761 return false
3762}
3763
3764func (c *Module) fuzzBinary() bool {
3765 if f, ok := c.linker.(interface {
3766 fuzzBinary() bool
3767 }); ok {
3768 return f.fuzzBinary()
3769 }
3770 return false
3771}
3772
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003773// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3774func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003775 if h, ok := c.linker.(interface {
3776 header() bool
3777 }); ok {
3778 return h.header()
3779 }
3780 return false
3781}
3782
Ivan Lozanod7586b62021-04-01 09:49:36 -04003783func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003784 if b, ok := c.linker.(interface {
3785 binary() bool
3786 }); ok {
3787 return b.binary()
3788 }
3789 return false
3790}
3791
Justin Yun5e035862021-06-29 20:50:37 +09003792func (c *Module) StaticExecutable() bool {
3793 if b, ok := c.linker.(*binaryDecorator); ok {
3794 return b.static()
3795 }
3796 return false
3797}
3798
Ivan Lozanod7586b62021-04-01 09:49:36 -04003799func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003800 if o, ok := c.linker.(interface {
3801 object() bool
3802 }); ok {
3803 return o.object()
3804 }
3805 return false
3806}
3807
Kiyoung Kim37693d02024-04-04 09:56:15 +09003808func (m *Module) Dylib() bool {
3809 return false
3810}
3811
3812func (m *Module) Rlib() bool {
3813 return false
3814}
3815
Ivan Lozanof9e21722020-12-02 09:00:51 -05003816func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003817 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003818 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003819 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003820 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003821 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003822 return "native:product"
3823 }
Jooyung Han38002912019-05-16 04:01:54 +09003824 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003825 } else if c.InRamdisk() {
3826 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003827 } else if c.InVendorRamdisk() {
3828 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003829 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003830 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003831 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003832 return "native:ndk:none:none"
3833 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3834 //family, link := getNdkStlFamilyAndLinkType(c)
3835 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3836 } else {
3837 return "native:platform"
3838 }
3839}
3840
Jiyong Park9d452992018-10-03 00:38:19 +09003841// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003842// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003843func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003844 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003845 // Stub libs and prebuilt libs in a versioned SDK are not
3846 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003847 return lib.shared() && !lib.buildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003848 }
3849 return false
3850}
3851
Jiyong Parka90ca002019-10-07 15:47:24 +09003852func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003853 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3854}
3855
3856func (c *Module) ApexAvailableFor() []string {
3857 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003858 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003859 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003860 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003861 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003862 }
Yu Liub73c3a62024-12-10 00:58:06 +00003863
3864 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09003865}
3866
Paul Duffin0cb37b92020-03-04 14:52:46 +00003867func (c *Module) EverInstallable() bool {
3868 return c.installer != nil &&
3869 // Check to see whether the module is actually ever installable.
3870 c.installer.everInstallable()
3871}
3872
Ivan Lozanod7586b62021-04-01 09:49:36 -04003873func (c *Module) PreventInstall() bool {
3874 return c.Properties.PreventInstall
3875}
3876
3877func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003878 if c.library != nil {
3879 if i := c.library.installable(); i != nil {
3880 return i
3881 }
3882 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003883 return c.Properties.Installable
3884}
3885
3886func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003887 ret := c.EverInstallable() &&
3888 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003889 proptools.BoolDefault(c.Installable(), true) &&
3890 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003891
3892 // The platform variant doesn't need further condition. Apex variants however might not
3893 // be installable because it will likely to be included in the APEX and won't appear
3894 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003895 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003896 return ret
3897 }
3898
3899 // Special case for modules that are configured to be installed to /data, which includes
3900 // test modules. For these modules, both APEX and non-APEX variants are considered as
3901 // installable. This is because even the APEX variants won't be included in the APEX, but
3902 // will anyway be installed to /data/*.
3903 // See b/146995717
3904 if c.InstallInData() {
3905 return ret
3906 }
3907
3908 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003909}
3910
Logan Chien41eabe62019-04-10 13:33:58 +08003911func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3912 if c.linker != nil {
3913 if library, ok := c.linker.(*libraryDecorator); ok {
3914 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3915 }
3916 }
3917}
3918
Jiyong Park45bf82e2020-12-15 22:29:02 +09003919var _ android.ApexModule = (*Module)(nil)
3920
3921// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003922func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossc1b36442021-05-06 13:42:48 -07003923 if depTag == stubImplDepTag {
3924 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003925 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003926 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003927 if depTag == staticVariantTag {
3928 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3929 // actually mean that the static lib (and its dependencies) are copied into the
3930 // APEX.
3931 return false
3932 }
Colin Cross8acea3e2024-12-12 14:53:30 -08003933
3934 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3935 if isLibDepTag && c.static() && libDepTag.shared() {
3936 // shared_lib dependency from a static lib is considered as crossing
3937 // the APEX boundary because the dependency doesn't actually is
3938 // linked; the dependency is used only during the compilation phase.
3939 return false
3940 }
3941
3942 if isLibDepTag && libDepTag.excludeInApex {
3943 return false
3944 }
3945
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003946 return true
3947}
3948
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003949func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003950 if c.HasStubsVariants() {
3951 if IsSharedDepTag(depTag) {
3952 // dynamic dep to a stubs lib crosses APEX boundary
3953 return false
3954 }
3955 if IsRuntimeDepTag(depTag) {
3956 // runtime dep to a stubs lib also crosses APEX boundary
3957 return false
3958 }
3959 if IsHeaderDepTag(depTag) {
3960 return false
3961 }
3962 }
3963 if c.IsLlndk() {
3964 return false
3965 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003966
3967 return true
3968}
3969
Jiyong Park45bf82e2020-12-15 22:29:02 +09003970// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003971func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3972 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003973 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3974 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3975 return nil
3976 }
Jooyung Han749dc692020-04-15 11:03:39 +09003977 // We don't check for prebuilt modules
3978 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3979 return nil
3980 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003981
Jooyung Han749dc692020-04-15 11:03:39 +09003982 minSdkVersion := c.MinSdkVersion()
3983 if minSdkVersion == "apex_inherit" {
3984 return nil
3985 }
3986 if minSdkVersion == "" {
3987 // JNI libs within APK-in-APEX fall into here
3988 // Those are okay to set sdk_version instead
3989 // We don't have to check if this is a SDK variant because
3990 // non-SDK variant resets sdk_version, which works too.
3991 minSdkVersion = c.SdkVersion()
3992 }
Dan Albertc8060532020-07-22 22:32:17 -07003993 if minSdkVersion == "" {
3994 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3995 }
3996 // Not using nativeApiLevelFromUser because the context here is not
3997 // necessarily a native context.
3998 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003999 if err != nil {
4000 return err
4001 }
Dan Albertc8060532020-07-22 22:32:17 -07004002
Colin Cross8ca61c12022-10-06 21:00:14 -07004003 // A dependency only needs to support a min_sdk_version at least
4004 // as high as the api level that the architecture was introduced in.
4005 // This allows introducing new architectures in the platform that
4006 // need to be included in apexes that normally require an older
4007 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004008 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004009 if sdkVersion.LessThan(minApiForArch) {
4010 sdkVersion = minApiForArch
4011 }
4012
Dan Albertc8060532020-07-22 22:32:17 -07004013 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004014 return fmt.Errorf("newer SDK(%v)", ver)
4015 }
4016 return nil
4017}
4018
Paul Duffinb5769c12021-05-12 16:16:51 +01004019// Implements android.ApexModule
4020func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4021 // stub libraries and native bridge libraries are always available to platform
4022 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4023}
4024
Inseob Kima1888ce2022-10-04 14:42:02 +09004025func (c *Module) overriddenModules() []string {
4026 if o, ok := c.linker.(overridable); ok {
4027 return o.overriddenModules()
4028 }
4029 return nil
4030}
4031
Liz Kammer35ca77e2021-12-22 15:31:40 -05004032type moduleType int
4033
4034const (
4035 unknownType moduleType = iota
4036 binary
4037 object
4038 fullLibrary
4039 staticLibrary
4040 sharedLibrary
4041 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004042 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004043 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004044)
4045
4046func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004047 if c.testBinary() {
4048 // testBinary is also a binary, so this comes before the c.Binary()
4049 // conditional. A testBinary has additional implicit dependencies and
4050 // other test-only semantics.
4051 return testBin
4052 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004053 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004054 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004055 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004056 } else if c.testLibrary() {
4057 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4058 // will let them add implicit compile deps on gtest, for example.
4059 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004060 // For now, treat them as regular libraries.
4061 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004062 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004063 static := false
4064 shared := false
4065 if library, ok := c.linker.(*libraryDecorator); ok {
4066 static = library.MutatedProperties.BuildStatic
4067 shared = library.MutatedProperties.BuildShared
4068 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4069 static = library.MutatedProperties.BuildStatic
4070 shared = library.MutatedProperties.BuildShared
4071 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004072 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004073 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004074 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004075 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004076 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004077 return staticLibrary
4078 }
4079 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004080 } else if c.isNDKStubLibrary() {
4081 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004082 }
4083 return unknownType
4084}
4085
Colin Crosscfad1192015-11-02 16:43:11 -08004086// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004087type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004088 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004089 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004090 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004091}
4092
Patrice Arrudac249c712019-03-19 17:00:29 -07004093// cc_defaults provides a set of properties that can be inherited by other cc
4094// modules. A module can use the properties from a cc_defaults using
4095// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4096// merged (when possible) by prepending the default module's values to the
4097// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004098func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004099 return DefaultsFactory()
4100}
4101
Colin Cross36242852017-06-23 15:06:31 -07004102func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004103 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004104
Colin Cross36242852017-06-23 15:06:31 -07004105 module.AddProperties(props...)
4106 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004107 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004108 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004109 &BaseCompilerProperties{},
4110 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004111 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004112 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004113 &StaticProperties{},
4114 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004115 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004116 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004117 &TestLinkerProperties{},
4118 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004119 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004120 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004121 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004122 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004123 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004124 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004125 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004126 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004127 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004128 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004129 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004130 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004131 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004132 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004133 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4134 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004135 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004136 )
Colin Crosscfad1192015-11-02 16:43:11 -08004137
Jooyung Hancc372c52019-09-25 15:18:44 +09004138 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004139
4140 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004141}
4142
Jiyong Park2286afd2020-06-16 21:58:53 +09004143func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004144 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004145}
4146
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004147func kytheExtractAllFactory() android.Singleton {
4148 return &kytheExtractAllSingleton{}
4149}
4150
4151type kytheExtractAllSingleton struct {
4152}
4153
4154func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4155 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004156 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004157 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004158 if len(files) > 0 {
4159 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004160 }
4161 })
4162 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4163 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004164 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004165 }
4166}
4167
Jihoon Kangf78a8902022-09-01 22:47:07 +00004168func (c *Module) Partition() string {
4169 if p, ok := c.installer.(interface {
4170 getPartition() string
4171 }); ok {
4172 return p.getPartition()
4173 }
4174 return ""
4175}
4176
Spandan Das2b6dfb52024-01-19 00:22:22 +00004177type sourceModuleName interface {
4178 sourceModuleName() string
4179}
4180
4181func (c *Module) BaseModuleName() string {
4182 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4183 // if the prebuilt module sets a source_module_name in Android.bp, use that
4184 return smn.sourceModuleName()
4185 }
4186 return c.ModuleBase.BaseModuleName()
4187}
4188
Spandan Dase20c56c2024-07-23 21:34:24 +00004189func (c *Module) stubsSymbolFilePath() android.Path {
4190 if library, ok := c.linker.(*libraryDecorator); ok {
4191 return library.stubsSymbolFilePath
4192 }
4193 return android.OptionalPath{}.Path()
4194}
4195
Colin Cross06a931b2015-10-28 17:23:31 -07004196var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004197var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004198var BoolPtr = proptools.BoolPtr
4199var String = proptools.String
4200var StringPtr = proptools.StringPtr