blob: dff834819d0de4b7cf6cca6a02c1350fe764d080 [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 Cross5049f022015-03-18 13:28:46 -070037 "android/soong/genrule"
Colin Cross3f40fa42015-01-30 17:27:36 -080038)
39
Yu Liu76d94462024-10-31 23:32:36 +000040type CcMakeVarsInfo struct {
41 WarningsAllowed string
42 UsingWnoError string
43 MissingProfile string
44}
45
46var CcMakeVarsInfoProvider = blueprint.NewProvider[*CcMakeVarsInfo]()
47
Yu Liuec7043d2024-11-05 18:22:20 +000048type CcObjectInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000049 ObjFiles android.Paths
50 TidyFiles android.Paths
51 KytheFiles android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +000052}
53
54var CcObjectInfoProvider = blueprint.NewProvider[CcObjectInfo]()
55
Yu Liu323d77a2024-12-16 23:13:57 +000056type AidlInterfaceInfo struct {
57 // list of aidl_interface sources
58 Sources []string
59 // root directory of AIDL sources
60 AidlRoot string
61 // AIDL backend language (e.g. "cpp", "ndk")
62 Lang string
63 // list of flags passed to AIDL generator
64 Flags []string
65}
66
67type CompilerInfo struct {
68 Srcs android.Paths
69 // list of module-specific flags that will be used for C and C++ compiles.
70 Cflags proptools.Configurable[[]string]
71 AidlInterfaceInfo AidlInterfaceInfo
72 LibraryDecoratorInfo *LibraryDecoratorInfo
73}
74
75type LinkerInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000076 WholeStaticLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000077 // list of modules that should be statically linked into this module.
Yu Liu4f825132024-12-18 00:35:39 +000078 StaticLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000079 // list of modules that should be dynamically linked into this module.
Yu Liu4f825132024-12-18 00:35:39 +000080 SharedLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000081 // list of modules that should only provide headers for this module.
Yu Liu4f825132024-12-18 00:35:39 +000082 HeaderLibs proptools.Configurable[[]string]
83 UnstrippedOutputFile android.Path
Yu Liu323d77a2024-12-16 23:13:57 +000084
85 BinaryDecoratorInfo *BinaryDecoratorInfo
86 LibraryDecoratorInfo *LibraryDecoratorInfo
87 TestBinaryInfo *TestBinaryInfo
88 BenchmarkDecoratorInfo *BenchmarkDecoratorInfo
89 ObjectLinkerInfo *ObjectLinkerInfo
90}
91
92type BinaryDecoratorInfo struct{}
93type LibraryDecoratorInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000094 ExportIncludeDirs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000095}
Yu Liuffe86322024-12-18 18:53:12 +000096
97type LibraryInfo struct {
98 StubsVersion string
99}
100
Yu Liu323d77a2024-12-16 23:13:57 +0000101type TestBinaryInfo struct {
102 Gtest bool
103}
104type BenchmarkDecoratorInfo struct{}
105type ObjectLinkerInfo struct{}
106
Yu Liub1bfa9d2024-12-05 18:57:51 +0000107// Common info about the cc module.
108type CcInfo struct {
Yu Liu323d77a2024-12-16 23:13:57 +0000109 HasStubsVariants bool
110 IsPrebuilt bool
111 CmakeSnapshotSupported bool
112 CompilerInfo *CompilerInfo
113 LinkerInfo *LinkerInfo
Yu Liuffe86322024-12-18 18:53:12 +0000114 LibraryInfo *LibraryInfo
Yu Liub1bfa9d2024-12-05 18:57:51 +0000115}
116
117var CcInfoProvider = blueprint.NewProvider[CcInfo]()
118
Yu Liu986d98c2024-11-12 00:28:11 +0000119type LinkableInfo struct {
120 // StaticExecutable returns true if this is a binary module with "static_executable: true".
121 StaticExecutable bool
122}
123
124var LinkableInfoKey = blueprint.NewProvider[LinkableInfo]()
125
Colin Cross463a90e2015-06-17 14:20:06 -0700126func init() {
Paul Duffin036e7002019-12-19 19:16:28 +0000127 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -0700128
Inseob Kim3b244062023-07-11 13:31:36 +0900129 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +0000130 pctx.Import("android/soong/cc/config")
131}
132
133func RegisterCCBuildComponents(ctx android.RegistrationContext) {
134 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
135
136 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -0700137 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700138 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -0700139 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -0700140 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700141 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -0700142 })
Colin Cross16b23492016-01-06 14:41:07 -0800143
Paul Duffin036e7002019-12-19 19:16:28 +0000144 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -0400145 for _, san := range Sanitizers {
146 san.registerMutators(ctx)
147 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800148
Colin Cross8a962802024-10-09 15:29:27 -0700149 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
150 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -0800151
Colin Cross597bad62024-10-08 15:10:55 -0700152 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +0000153
Colin Crossf5f4ad32024-01-19 15:41:48 -0800154 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -0700155
Colin Crossd38feb02024-01-23 16:38:06 -0800156 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800157
Colin Cross33e0c812024-01-23 16:36:07 -0800158 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000159
Colin Cross6ac83a82024-01-23 11:23:10 -0800160 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900161
Colin Cross8a962802024-10-09 15:29:27 -0700162 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
163 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700164 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700165
Colin Cross91ae5ec2024-10-01 14:03:40 -0700166 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800167 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700168 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800169 })
170
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000171 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700172}
173
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500174// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
175// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
176// edges to these modules.
177// This object is constructed in DepsMutator, by calling to various module delegates to set
178// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
179// dependencies.
180// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
181// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800182type Deps struct {
183 SharedLibs, LateSharedLibs []string
184 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800185 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800186 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700187
Colin Cross3e5e7782022-06-17 22:17:05 +0000188 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
189 // prevent automatically exporting symbols.
190 UnexportedStaticLibs []string
191
Chris Parsons79d66a52020-06-05 17:26:16 -0400192 // Used for data dependencies adjacent to tests
193 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700194 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400195
Yo Chiang219968c2020-09-22 18:45:04 +0800196 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
197 SystemSharedLibs []string
198
Vinh Tran367d89d2023-04-28 11:21:25 -0400199 // Used by DepMutator to pass aidl_library modules to aidl compiler
200 AidlLibs []string
201
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500202 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800203 StaticUnwinderIfLegacy bool
204
Colin Cross5950f382016-12-13 12:50:57 -0800205 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700206
Colin Cross81413472016-04-11 14:37:39 -0700207 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700208
Cole Faust65cb40a2024-10-21 15:41:42 -0700209 GeneratedSources []string
210 GeneratedHeaders []string
211 DeviceFirstGeneratedHeaders []string
212 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700213
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700214 ReexportGeneratedHeaders []string
215
Colin Crossc465efd2021-06-11 18:00:04 -0700216 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700217
218 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700219 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900220
221 // List of libs that need to be excluded for APEX variant
222 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900223 // List of libs that need to be excluded for non-APEX variant
224 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800225
226 // LLNDK headers for the ABI checker to check LLNDK implementation library.
227 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700228 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800229 // Instead, the LLNDK implementation depends on the LLNDK header libs.
230 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700231}
232
Ivan Lozano0a468a42024-05-13 21:03:34 -0400233// A struct which to collect flags for rlib dependencies
234type RustRlibDep struct {
235 LibPath android.Path // path to the rlib
236 LinkDirs []string // flags required for dependency (e.g. -L flags)
237 CrateName string // crateNames associated with rlibDeps
238}
239
240func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
241 return a.LibPath == b.LibPath
242}
243
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500244// PathDeps is a struct containing file paths to dependencies of a module.
245// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
246// It's used to construct flags for various build statements (such as for compiling and linking).
247// It is then passed to module decorator functions responsible for registering build statements
248// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800249type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700250 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900251 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700252 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900253 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700254 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700255 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400256 // Paths and crateNames for RustStaticLib dependencies
257 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700258
Colin Cross0de8a1e2020-09-18 14:15:30 -0700259 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700260 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700261
Colin Cross26c34ed2016-09-30 17:10:16 -0700262 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100263 Objs Objects
264 // Paths to .o files in dependencies that provide them. Note that these lists
265 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800266 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700267 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700268
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100269 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
270 // the libs from all whole_static_lib dependencies.
271 WholeStaticLibsFromPrebuilts android.Paths
272
Colin Cross26c34ed2016-09-30 17:10:16 -0700273 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700274 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900275 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700276
Inseob Kimd110f872019-12-06 13:15:38 +0900277 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000278 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900279 IncludeDirs android.Paths
280 SystemIncludeDirs android.Paths
281 ReexportedDirs android.Paths
282 ReexportedSystemDirs android.Paths
283 ReexportedFlags []string
284 ReexportedGeneratedHeaders android.Paths
285 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400286 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700287
Colin Cross26c34ed2016-09-30 17:10:16 -0700288 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700289 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700290
Dan Willemsena0790e32018-10-12 00:24:23 -0700291 // Path to the dynamic linker binary
292 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700293
294 // For Darwin builds, the path to the second architecture's output that should
295 // be combined with this architectures's output into a FAT MachO file.
296 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400297
298 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
299 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800300
301 // LLNDK headers for the ABI checker to check LLNDK implementation library.
302 LlndkIncludeDirs android.Paths
303 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700304
305 directImplementationDeps android.Paths
306 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700307}
308
Colin Cross4af21ed2019-11-04 09:37:55 -0800309// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
310// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
311// command line so they can be overridden by the local module flags).
312type LocalOrGlobalFlags struct {
313 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700314 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800315 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700316 CFlags []string // Flags that apply to C and C++ source files
317 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
318 ConlyFlags []string // Flags that apply to C source files
319 CppFlags []string // Flags that apply to C++ source files
320 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700321 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800322}
323
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500324// Flags contains various types of command line flags (and settings) for use in building build
325// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800326type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500327 // Local flags (which individual modules are responsible for). These may override global flags.
328 Local LocalOrGlobalFlags
329 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700330 Global LocalOrGlobalFlags
331 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800332
333 aidlFlags []string // Flags that apply to aidl source files
334 rsFlags []string // Flags that apply to renderscript source files
335 libFlags []string // Flags to add libraries early to the link order
336 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
337 TidyFlags []string // Flags that apply to clang-tidy
338 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700339
Colin Crossc3199482017-03-30 15:03:04 -0700340 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800341 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700342 SystemIncludeFlags []string
343
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800344 Toolchain config.Toolchain
345 Tidy bool // True if ninja .tidy rules should be generated.
346 NeedTidyFiles bool // True if module link should depend on .tidy files
347 GcovCoverage bool // True if coverage files should be generated.
348 SAbiDump bool // True if header abi dumps should be generated.
349 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800350 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800351
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500352 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800353 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500354 // The target-device system path to the dynamic linker.
355 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800356
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700357 CFlagsDeps android.Paths // Files depended on by compiler flags
358 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800359
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500360 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700361 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800362
Colin Cross19878da2019-03-28 14:45:07 -0700363 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700364 protoC bool // Whether to use C instead of C++
365 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700366
367 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200368 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700369}
370
Colin Crossca860ac2016-01-04 14:34:37 -0800371// Properties used to compile all C or C++ modules
372type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700373 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800374 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700375
Yi Kong5786f5c2024-05-28 02:22:34 +0900376 // Aggresively trade performance for smaller binary size.
377 // This should only be used for on-device binaries that are rarely executed and not
378 // performance critical.
379 Optimize_for_size *bool `android:"arch_variant"`
380
Jiyong Parkb35a8192020-08-10 15:59:36 +0900381 // The API level that this module is built against. The APIs of this API level will be
382 // visible at build time, but use of any APIs newer than min_sdk_version will render the
383 // module unloadable on older devices. In the future it will be possible to weakly-link new
384 // APIs, making the behavior match Java: such modules will load on older devices, but
385 // calling new APIs on devices that do not support them will result in a crash.
386 //
387 // This property has the same behavior as sdk_version does for Java modules. For those
388 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
389 // does for Java code.
390 //
391 // In addition, setting this property causes two variants to be built, one for the platform
392 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800393 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700394
Jiyong Parkb35a8192020-08-10 15:59:36 +0900395 // Minimum OS API level supported by this C or C++ module. This property becomes the value
396 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
397 // this property is also used to ensure that the min_sdk_version of the containing module is
398 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
399 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
400 // min_sdk_version of the containing APEX. When the module
401 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900402 Min_sdk_version *string
403
Colin Crossc511bc52020-04-07 16:50:32 +0000404 // If true, always create an sdk variant and don't create a platform variant.
405 Sdk_variant_only *bool
406
Colin Cross4297f402024-11-20 15:20:09 -0800407 AndroidMkSharedLibs []string `blueprint:"mutated"`
408 AndroidMkStaticLibs []string `blueprint:"mutated"`
409 AndroidMkRlibs []string `blueprint:"mutated"`
410 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
411 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
412 AndroidMkHeaderLibs []string `blueprint:"mutated"`
413 HideFromMake bool `blueprint:"mutated"`
414 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700415
Yo Chiang219968c2020-09-22 18:45:04 +0800416 // Set by DepsMutator.
417 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
418
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900419 // The name of the image this module is built for
420 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200421
422 // The VNDK version this module is built against. If empty, the module is not
423 // build against the VNDK.
424 VndkVersion string `blueprint:"mutated"`
425
426 // Suffix for the name of Android.mk entries generated by this module
427 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800428
429 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
430 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900431 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900432
Yifan Hong39143a92020-10-26 12:43:12 -0700433 // Make this module available when building for ramdisk.
434 // On device without a dedicated recovery partition, the module is only
435 // available after switching root into
436 // /first_stage_ramdisk. To expose the module before switching root, install
437 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800438 Ramdisk_available *bool
439
Yifan Hong39143a92020-10-26 12:43:12 -0700440 // Make this module available when building for vendor ramdisk.
441 // On device without a dedicated recovery partition, the module is only
442 // available after switching root into
443 // /first_stage_ramdisk. To expose the module before switching root, install
444 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700445 Vendor_ramdisk_available *bool
446
Jiyong Parkf9332f12018-02-01 00:54:12 +0900447 // Make this module available when building for recovery
448 Recovery_available *bool
449
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200450 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000451 VendorVariantNeeded bool `blueprint:"mutated"`
452 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200453 CoreVariantNeeded bool `blueprint:"mutated"`
454 RamdiskVariantNeeded bool `blueprint:"mutated"`
455 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
456 RecoveryVariantNeeded bool `blueprint:"mutated"`
457
458 // A list of variations for the "image" mutator of the form
459 //<image name> '.' <version char>, for example, 'vendor.S'
460 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900461
462 // Allows this module to use non-APEX version of libraries. Useful
463 // for building binaries that are started before APEXes are activated.
464 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900465
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000466 // Allows this module to be included in CMake release snapshots to be built outside of Android
467 // build system and source tree.
468 Cmake_snapshot_supported *bool
469
Colin Cross1bc94122021-10-28 13:25:54 -0700470 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000471
472 // Set by factories of module types that can only be referenced from variants compiled against
473 // the SDK.
474 AlwaysSdk bool `blueprint:"mutated"`
475
476 // Variant is an SDK variant created by sdkMutator
477 IsSdkVariant bool `blueprint:"mutated"`
478 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
479 // variant to have a ".sdk" suffix.
480 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700481
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800482 Target struct {
483 Platform struct {
484 // List of modules required by the core variant.
485 Required []string `android:"arch_variant"`
486
487 // List of modules not required by the core variant.
488 Exclude_required []string `android:"arch_variant"`
489 } `android:"arch_variant"`
490
491 Recovery struct {
492 // List of modules required by the recovery variant.
493 Required []string `android:"arch_variant"`
494
495 // List of modules not required by the recovery variant.
496 Exclude_required []string `android:"arch_variant"`
497 } `android:"arch_variant"`
498 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700499}
500
501type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900502 // whether this module should be allowed to be directly depended by other
503 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900504 // If set to true, two variants will be built separately, one like
505 // normal, and the other limited to the set of libraries and headers
506 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700507 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900508 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700509 // so it shouldn't have any unversioned runtime dependencies, or
510 // make assumptions about the system that may not be true in the
511 // future.
512 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900513 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900514 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900515 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900516 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900517 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700518 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
519 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900520
Justin Yunebcf0c52021-01-08 18:00:19 +0900521 // This is the same as the "vendor_available" except that the install path
522 // of the vendor variant is /odm or /vendor/odm.
523 // By replacing "vendor_available: true" with "odm_available: true", the
524 // module will install its vendor variant to the /odm partition or /vendor/odm.
525 // As the modules with "odm_available: true" still create the vendor variants,
526 // they can link to the other vendor modules as the vendor_available modules do.
527 // Also, the vendor modules can link to odm_available modules.
528 //
529 // It may not be used for VNDK modules.
530 Odm_available *bool
531
Justin Yun63e9ec72020-10-29 16:49:43 +0900532 // whether this module should be allowed to be directly depended by other
533 // modules with `product_specific: true` or `product_available: true`.
534 // If set to true, an additional product variant will be built separately
535 // that is limited to the set of libraries and headers that are exposed to
536 // /product modules.
537 //
538 // The product variant may be used with a different (newer) /system,
539 // so it shouldn't have any unversioned runtime dependencies, or
540 // make assumptions about the system that may not be true in the
541 // future.
542 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900543 // If set to false, this module becomes inaccessible from /product modules.
544 //
545 // Different from the 'vendor_available' property, the modules with
546 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
547 // library without 'product_available' may not be depended on by any other
548 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900549 //
550 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
551 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
552 Product_available *bool
553
Jiyong Park5fb8c102018-04-09 12:03:06 +0900554 // whether this module is capable of being loaded with other instance
555 // (possibly an older version) of the same module in the same process.
556 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
557 // can be double loaded in a vendor process if the library is also a
558 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
559 // explicitly marked as `double_loadable: true` by the owner, or the dependency
560 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
561 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800562
563 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
564 IsLLNDK bool `blueprint:"mutated"`
565
Colin Cross5271fea2021-04-27 13:06:04 -0700566 // IsVendorPublicLibrary is set for the core and product variants of a library that has
567 // vendor_public_library stubs.
568 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800569}
570
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500571// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
572// to understanding details about the type of the current module.
573// For example, one might call these functions to determine whether the current module is a static
574// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800575type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800576 static() bool
577 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800578 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700579 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800580 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900581 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900582 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900583 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700584 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900585 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700586 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800587 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900588 minSdkVersion() string
589 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700590 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700591 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800592 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800593 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700594 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900595 inProduct() bool
596 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800597 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700598 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900599 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900600 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700601 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700602 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800603 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000604 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800605 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900606 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800607 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800608 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800609 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700610 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700611 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900612 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700613 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800614 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800615 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800616 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800617 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900618 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000619 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800620}
621
622type SharedFlags struct {
623 numSharedFlags int
624 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800625}
626
627type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700628 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800629 ModuleContextIntf
630}
631
632type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700633 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800634 ModuleContextIntf
635}
636
Colin Cross37047f12016-12-13 17:06:13 -0800637type DepsContext interface {
638 android.BottomUpMutatorContext
639 ModuleContextIntf
640}
641
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500642// feature represents additional (optional) steps to building cc-related modules, such as invocation
643// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800644type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800645 flags(ctx ModuleContext, flags Flags) Flags
646 props() []interface{}
647}
648
Joe Onorato37f900c2023-07-18 16:58:16 -0700649// Information returned from Generator about the source code it's generating
650type GeneratedSource struct {
651 IncludeDirs android.Paths
652 Sources android.Paths
653 Headers android.Paths
654 ReexportedDirs android.Paths
655}
656
657// generator allows injection of generated code
658type Generator interface {
659 GeneratorProps() []interface{}
660 GeneratorInit(ctx BaseModuleContext)
661 GeneratorDeps(ctx DepsContext, deps Deps) Deps
662 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
663 GeneratorSources(ctx ModuleContext) GeneratedSource
664 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
665}
666
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500667// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500668// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800669type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700670 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800671 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800672 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700673 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000674 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700675
Colin Cross76fada02016-07-27 10:31:13 -0700676 appendCflags([]string)
677 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700678 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800679}
680
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500681// linker is the interface for a linker decorator object. Individual module types can provide
682// their own implementation for this decorator, and thus specify custom logic regarding build
683// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800684type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700685 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800686 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700687 linkerFlags(ctx ModuleContext, flags Flags) Flags
688 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000689 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800690 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700691
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700692 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700693 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900694 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800695 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700696
697 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900698 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000699
700 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700701 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800702
703 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000704}
705
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500706// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000707type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500708 sharedLibs []string
709 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
710 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700711 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800712}
713
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500714// installer is the interface for an installer helper object. This helper is responsible for
715// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800716type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700717 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700718 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000719 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800720 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700721 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700722 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900723 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000724 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900725 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800726}
727
Inseob Kima1888ce2022-10-04 14:42:02 +0900728type overridable interface {
729 overriddenModules() []string
730}
731
Colin Cross6e511a92020-07-27 21:26:48 -0700732type libraryDependencyKind int
733
734const (
735 headerLibraryDependency = iota
736 sharedLibraryDependency
737 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400738 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700739)
740
741func (k libraryDependencyKind) String() string {
742 switch k {
743 case headerLibraryDependency:
744 return "headerLibraryDependency"
745 case sharedLibraryDependency:
746 return "sharedLibraryDependency"
747 case staticLibraryDependency:
748 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400749 case rlibLibraryDependency:
750 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700751 default:
752 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
753 }
754}
755
756type libraryDependencyOrder int
757
758const (
759 earlyLibraryDependency = -1
760 normalLibraryDependency = 0
761 lateLibraryDependency = 1
762)
763
764func (o libraryDependencyOrder) String() string {
765 switch o {
766 case earlyLibraryDependency:
767 return "earlyLibraryDependency"
768 case normalLibraryDependency:
769 return "normalLibraryDependency"
770 case lateLibraryDependency:
771 return "lateLibraryDependency"
772 default:
773 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
774 }
775}
776
777// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
778// tags that have a set of predefined tag objects that are reused for each dependency, a
779// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
780// That means that comparing a libraryDependencyTag for equality will only be equal if all
781// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
782// then check individual metadata fields instead.
783type libraryDependencyTag struct {
784 blueprint.BaseDependencyTag
785
786 // These are exported so that fmt.Printf("%#v") can call their String methods.
787 Kind libraryDependencyKind
788 Order libraryDependencyOrder
789
790 wholeStatic bool
791
792 reexportFlags bool
793 explicitlyVersioned bool
794 dataLib bool
795 ndk bool
796
797 staticUnwinder bool
798
799 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900800
Cindy Zhou18417cb2020-12-10 07:12:38 -0800801 // Whether or not this dependency should skip the apex dependency check
802 skipApexAllowedDependenciesCheck bool
803
Jiyong Parke3867542020-12-03 17:28:25 +0900804 // Whether or not this dependency has to be followed for the apex variants
805 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900806 // Whether or not this dependency has to be followed for the non-apex variants
807 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000808
809 // If true, don't automatically export symbols from the static library into a shared library.
810 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700811}
812
813// header returns true if the libraryDependencyTag is tagging a header lib dependency.
814func (d libraryDependencyTag) header() bool {
815 return d.Kind == headerLibraryDependency
816}
817
818// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
819func (d libraryDependencyTag) shared() bool {
820 return d.Kind == sharedLibraryDependency
821}
822
823// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
824func (d libraryDependencyTag) static() bool {
825 return d.Kind == staticLibraryDependency
826}
827
Colin Cross65cb3142021-12-10 23:05:02 +0000828func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
829 if d.shared() {
830 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
831 }
832 return nil
833}
834
835var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
836
Colin Crosse9fe2942020-11-10 18:12:15 -0800837// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
838// binaries or other shared libraries are installed as dependencies.
839func (d libraryDependencyTag) InstallDepNeeded() bool {
840 return d.shared()
841}
842
843var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
844
Yu Liu67a28422024-03-05 00:36:31 +0000845func (d libraryDependencyTag) PropagateAconfigValidation() bool {
846 return d.static()
847}
848
849var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
850
Colin Crosse9fe2942020-11-10 18:12:15 -0800851// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700852// libraryDependencyTag. Each tag object is created globally and reused for multiple
853// dependencies (although since the object contains no references, assigning a tag to a
854// variable and modifying it will not modify the original). Users can compare the tag
855// returned by ctx.OtherModuleDependencyTag against the global original
856type dependencyTag struct {
857 blueprint.BaseDependencyTag
858 name string
859}
860
Colin Crosse9fe2942020-11-10 18:12:15 -0800861// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
862// libraryDependencyTag, but where the dependency needs to be installed when the parent is
863// installed.
864type installDependencyTag struct {
865 blueprint.BaseDependencyTag
866 android.InstallAlwaysNeededDependencyTag
867 name string
868}
869
Colin Crossc99deeb2016-04-11 15:06:20 -0700870var (
Colin Cross6e511a92020-07-27 21:26:48 -0700871 genSourceDepTag = dependencyTag{name: "gen source"}
872 genHeaderDepTag = dependencyTag{name: "gen header"}
873 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
874 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900875 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700876 reuseObjTag = dependencyTag{name: "reuse objects"}
877 staticVariantTag = dependencyTag{name: "static variant"}
878 vndkExtDepTag = dependencyTag{name: "vndk extends"}
879 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700880 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800881 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700882 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000883 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500884 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400885 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800886 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700887)
888
Roland Levillainf89cd092019-07-29 16:22:59 +0100889func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700890 ccLibDepTag, ok := depTag.(libraryDependencyTag)
891 return ok && ccLibDepTag.shared()
892}
893
894func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
895 ccLibDepTag, ok := depTag.(libraryDependencyTag)
896 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100897}
898
Zach Johnson3df4e632020-11-06 11:56:27 -0800899func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
900 ccLibDepTag, ok := depTag.(libraryDependencyTag)
901 return ok && ccLibDepTag.header()
902}
903
Roland Levillainf89cd092019-07-29 16:22:59 +0100904func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800905 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100906}
907
Colin Crossca860ac2016-01-04 14:34:37 -0800908// Module contains the properties and members used by all C/C++ module types, and implements
909// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500910// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
911// interface.
912//
913// To define a C/C++ related module, construct a new Module object and point its delegates to
914// type-specific structs. These delegates will be invoked to register module-specific build
915// statements which may be unique to the module type. For example, module.compiler.compile() should
916// be defined so as to register build statements which are responsible for compiling the module.
917//
918// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
919// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
920// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
921// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800922type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700923 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700924
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700925 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700926 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -0700927 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700928
Colin Crossca860ac2016-01-04 14:34:37 -0800929 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +0000930 hod android.HostOrDeviceSupported
931 multilib android.Multilib
932 testModule bool
933 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -0700934
Paul Duffina0843f62019-12-13 19:50:38 +0000935 // Allowable SdkMemberTypes of this module type.
936 sdkMemberTypes []android.SdkMemberType
937
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500938 // decorator delegates, initialize before calling Init
939 // these may contain module-specific implementations, and effectively allow for custom
940 // type-specific logic. These members may reference different objects or the same object.
941 // Functions of these decorators will be invoked to initialize and register type-specific
942 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800943 generators []Generator
944 compiler compiler
945 linker linker
946 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500947
Spandan Dase12d2522023-09-12 21:42:31 +0000948 features []feature
949 stl *stl
950 sanitize *sanitize
951 coverage *coverage
952 fuzzer *fuzzer
953 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +0000954 lto *lto
955 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000956 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800957
Colin Cross31076b32020-10-23 17:22:06 -0700958 library libraryInterface
959
Colin Cross635c3b02016-05-18 15:37:25 -0700960 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800961
Colin Crossb98c8b02016-07-29 13:44:28 -0700962 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700963
Yu Liue70976d2024-10-15 20:45:35 +0000964 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800965
966 // Flags used to compile this module
967 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700968
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800969 // Shared flags among build rules of this module
970 sharedFlags SharedFlags
971
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800972 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700973 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900974
975 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +0900976
977 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700978 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700979
980 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -0800981
Inseob Kim37e0bb02024-04-29 15:54:44 +0900982 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -0400983
984 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -0700985
986 hasAidl bool
987 hasLex bool
988 hasProto bool
989 hasRenderscript bool
990 hasSysprop bool
991 hasWinMsg bool
992 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +0000993
994 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -0700995}
996
Yu Liu76d94462024-10-31 23:32:36 +0000997func (c *Module) IncrementalSupported() bool {
998 return c.incremental
999}
1000
1001var _ blueprint.Incremental = (*Module)(nil)
1002
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001003func (c *Module) AddJSONData(d *map[string]interface{}) {
1004 c.AndroidModuleBase().AddJSONData(d)
1005 (*d)["Cc"] = map[string]interface{}{
1006 "SdkVersion": c.SdkVersion(),
1007 "MinSdkVersion": c.MinSdkVersion(),
1008 "VndkVersion": c.VndkVersion(),
1009 "ProductSpecific": c.ProductSpecific(),
1010 "SocSpecific": c.SocSpecific(),
1011 "DeviceSpecific": c.DeviceSpecific(),
1012 "InProduct": c.InProduct(),
1013 "InVendor": c.InVendor(),
1014 "InRamdisk": c.InRamdisk(),
1015 "InVendorRamdisk": c.InVendorRamdisk(),
1016 "InRecovery": c.InRecovery(),
1017 "VendorAvailable": c.VendorAvailable(),
1018 "ProductAvailable": c.ProductAvailable(),
1019 "RamdiskAvailable": c.RamdiskAvailable(),
1020 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1021 "RecoveryAvailable": c.RecoveryAvailable(),
1022 "OdmAvailable": c.OdmAvailable(),
1023 "InstallInData": c.InstallInData(),
1024 "InstallInRamdisk": c.InstallInRamdisk(),
1025 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1026 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1027 "InstallInRecovery": c.InstallInRecovery(),
1028 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001029 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001030 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1031 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001032 "AidlSrcs": c.hasAidl,
1033 "LexSrcs": c.hasLex,
1034 "ProtoSrcs": c.hasProto,
1035 "RenderscriptSrcs": c.hasRenderscript,
1036 "SyspropSrcs": c.hasSysprop,
1037 "WinMsgSrcs": c.hasWinMsg,
1038 "YaccSrsc": c.hasYacc,
1039 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001040 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001041 }
1042}
1043
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001044func (c *Module) SetPreventInstall() {
1045 c.Properties.PreventInstall = true
1046}
1047
1048func (c *Module) SetHideFromMake() {
1049 c.Properties.HideFromMake = true
1050}
1051
Ivan Lozanod7586b62021-04-01 09:49:36 -04001052func (c *Module) HiddenFromMake() bool {
1053 return c.Properties.HideFromMake
1054}
1055
Cole Fauste8a87832024-09-11 11:35:46 -07001056func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001057 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001058 if c.ImageVariation().Variation == android.CoreVariation {
1059 required = append(required, c.Properties.Target.Platform.Required...)
1060 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1061 } else if c.InRecovery() {
1062 required = append(required, c.Properties.Target.Recovery.Required...)
1063 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1064 }
1065 return android.FirstUniqueStrings(required)
1066}
1067
Ivan Lozano52767be2019-10-18 14:49:46 -07001068func (c *Module) Toc() android.OptionalPath {
1069 if c.linker != nil {
1070 if library, ok := c.linker.(libraryInterface); ok {
1071 return library.toc()
1072 }
1073 }
1074 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1075}
1076
1077func (c *Module) ApiLevel() string {
1078 if c.linker != nil {
1079 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001080 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001081 }
1082 }
1083 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1084}
1085
1086func (c *Module) Static() bool {
1087 if c.linker != nil {
1088 if library, ok := c.linker.(libraryInterface); ok {
1089 return library.static()
1090 }
1091 }
1092 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1093}
1094
1095func (c *Module) Shared() bool {
1096 if c.linker != nil {
1097 if library, ok := c.linker.(libraryInterface); ok {
1098 return library.shared()
1099 }
1100 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001101
Ivan Lozano52767be2019-10-18 14:49:46 -07001102 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1103}
1104
1105func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001106 if c.stl != nil {
1107 return c.stl.Properties.SelectedStl
1108 }
1109 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001110}
1111
Ivan Lozano52767be2019-10-18 14:49:46 -07001112func (c *Module) StubDecorator() bool {
1113 if _, ok := c.linker.(*stubDecorator); ok {
1114 return true
1115 }
1116 return false
1117}
1118
Yi Kong5786f5c2024-05-28 02:22:34 +09001119func (c *Module) OptimizeForSize() bool {
1120 return Bool(c.Properties.Optimize_for_size)
1121}
1122
Ivan Lozano52767be2019-10-18 14:49:46 -07001123func (c *Module) SdkVersion() string {
1124 return String(c.Properties.Sdk_version)
1125}
1126
Artur Satayev480e25b2020-04-27 18:53:18 +01001127func (c *Module) MinSdkVersion() string {
1128 return String(c.Properties.Min_sdk_version)
1129}
1130
Jiyong Park5df7bd32021-08-25 16:18:46 +09001131func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001132 if linker, ok := c.linker.(*objectLinker); ok {
1133 return linker.isCrt()
1134 }
1135 return false
1136}
1137
Jiyong Park5df7bd32021-08-25 16:18:46 +09001138func (c *Module) SplitPerApiLevel() bool {
1139 return c.canUseSdk() && c.isCrt()
1140}
1141
Colin Crossc511bc52020-04-07 16:50:32 +00001142func (c *Module) AlwaysSdk() bool {
1143 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1144}
1145
Ivan Lozano183a3212019-10-18 14:18:45 -07001146func (c *Module) CcLibrary() bool {
1147 if c.linker != nil {
1148 if _, ok := c.linker.(*libraryDecorator); ok {
1149 return true
1150 }
Colin Crossd48fe732020-09-23 20:37:24 -07001151 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1152 return true
1153 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001154 }
1155 return false
1156}
1157
1158func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001159 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001160 return true
1161 }
1162 return false
1163}
1164
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001165func (c *Module) RlibStd() bool {
1166 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1167}
1168
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001169func (c *Module) RustLibraryInterface() bool {
1170 return false
1171}
1172
Ivan Lozano0a468a42024-05-13 21:03:34 -04001173func (c *Module) CrateName() string {
1174 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1175}
1176
1177func (c *Module) ExportedCrateLinkDirs() []string {
1178 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1179}
1180
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001181func (c *Module) IsFuzzModule() bool {
1182 if _, ok := c.compiler.(*fuzzBinary); ok {
1183 return true
1184 }
1185 return false
1186}
1187
1188func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1189 return c.FuzzModule
1190}
1191
1192func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1193 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1194 return fuzzer.fuzzPackagedModule
1195 }
1196 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1197}
1198
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001199func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001200 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1201 return fuzzer.sharedLibraries
1202 }
1203 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1204}
1205
Ivan Lozano2b262972019-11-21 12:30:50 -08001206func (c *Module) NonCcVariants() bool {
1207 return false
1208}
1209
Ivan Lozano183a3212019-10-18 14:18:45 -07001210func (c *Module) SetStatic() {
1211 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001212 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001213 library.setStatic()
1214 return
1215 }
1216 }
1217 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1218}
1219
1220func (c *Module) SetShared() {
1221 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001222 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001223 library.setShared()
1224 return
1225 }
1226 }
1227 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1228}
1229
1230func (c *Module) BuildStaticVariant() bool {
1231 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001232 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001233 return library.buildStatic()
1234 }
1235 }
1236 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1237}
1238
1239func (c *Module) BuildSharedVariant() bool {
1240 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001241 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001242 return library.buildShared()
1243 }
1244 }
1245 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1246}
1247
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001248func (c *Module) BuildRlibVariant() bool {
1249 // cc modules can never build rlib variants
1250 return false
1251}
1252
Ivan Lozano183a3212019-10-18 14:18:45 -07001253func (c *Module) Module() android.Module {
1254 return c
1255}
1256
Jiyong Parkc20eee32018-09-05 22:36:17 +09001257func (c *Module) OutputFile() android.OptionalPath {
1258 return c.outputFile
1259}
1260
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001261func (c *Module) CoverageFiles() android.Paths {
1262 if c.linker != nil {
1263 if library, ok := c.linker.(libraryInterface); ok {
1264 return library.objs().coverageFiles
1265 }
1266 }
1267 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1268}
1269
Ivan Lozano183a3212019-10-18 14:18:45 -07001270var _ LinkableInterface = (*Module)(nil)
1271
Jiyong Park719b4462019-01-13 00:39:51 +09001272func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001273 if c.linker != nil {
1274 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001275 }
1276 return nil
1277}
1278
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001279func (c *Module) CoverageOutputFile() android.OptionalPath {
1280 if c.linker != nil {
1281 return c.linker.coverageOutputFilePath()
1282 }
1283 return android.OptionalPath{}
1284}
1285
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001286func (c *Module) RelativeInstallPath() string {
1287 if c.installer != nil {
1288 return c.installer.relativeInstallPath()
1289 }
1290 return ""
1291}
1292
Jooyung Han344d5432019-08-23 11:17:39 +09001293func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001294 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001295}
1296
Colin Cross36242852017-06-23 15:06:31 -07001297func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001298 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001299 for _, generator := range c.generators {
1300 c.AddProperties(generator.GeneratorProps()...)
1301 }
Colin Crossca860ac2016-01-04 14:34:37 -08001302 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001303 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001304 }
1305 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001306 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001307 }
1308 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001309 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001310 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001311 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001312 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001313 }
Colin Cross16b23492016-01-06 14:41:07 -08001314 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001315 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001316 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001317 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001318 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001319 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001320 if c.fuzzer != nil {
1321 c.AddProperties(c.fuzzer.props()...)
1322 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001323 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001324 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001325 }
Stephen Craneba090d12017-05-09 15:44:35 -07001326 if c.lto != nil {
1327 c.AddProperties(c.lto.props()...)
1328 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001329 if c.afdo != nil {
1330 c.AddProperties(c.afdo.props()...)
1331 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001332 if c.orderfile != nil {
1333 c.AddProperties(c.orderfile.props()...)
1334 }
Colin Crossca860ac2016-01-04 14:34:37 -08001335 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001336 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001337 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001338 // Allow test-only on libraries that are not cc_test_library
1339 if c.library != nil && !c.testLibrary() {
1340 c.AddProperties(&c.sourceProperties)
1341 }
Colin Crossc472d572015-03-17 15:06:21 -07001342
Colin Cross36242852017-06-23 15:06:31 -07001343 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001344 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001345 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001346
Colin Cross36242852017-06-23 15:06:31 -07001347 return c
Colin Crossc472d572015-03-17 15:06:21 -07001348}
1349
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001350// UseVndk() returns true if this module is built against VNDK.
1351// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001352func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001353 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001354}
1355
Colin Crossc511bc52020-04-07 16:50:32 +00001356func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001357 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001358 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001359}
1360
1361func (c *Module) UseSdk() bool {
1362 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001363 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001364 }
1365 return false
1366}
1367
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001368func (c *Module) isCoverageVariant() bool {
1369 return c.coverage.Properties.IsCoverageVariant
1370}
1371
Colin Cross95f1ca02020-10-29 20:47:22 -07001372func (c *Module) IsNdk(config android.Config) bool {
1373 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001374}
1375
Colin Cross127bb8b2020-12-16 16:46:01 -08001376func (c *Module) IsLlndk() bool {
1377 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001378}
1379
Colin Cross1f3f1302021-04-26 18:37:44 -07001380func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001381 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001382 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001383}
1384
Colin Cross5271fea2021-04-27 13:06:04 -07001385func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1386 lib := moduleLibraryInterface(m)
1387 return lib != nil && (lib.hasVendorPublicLibrary())
1388}
1389
1390// IsVendorPublicLibrary returns true for vendor public libraries.
1391func (c *Module) IsVendorPublicLibrary() bool {
1392 return c.VendorProperties.IsVendorPublicLibrary
1393}
1394
Ivan Lozanof1868af2022-04-12 13:08:36 -04001395func (c *Module) IsVndkPrebuiltLibrary() bool {
1396 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1397 return true
1398 }
1399 return false
1400}
1401
1402func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1403 return c.Properties.SdkAndPlatformVariantVisibleToMake
1404}
1405
Ivan Lozanod7586b62021-04-01 09:49:36 -04001406func (c *Module) HasLlndkStubs() bool {
1407 lib := moduleLibraryInterface(c)
1408 return lib != nil && lib.hasLLNDKStubs()
1409}
1410
1411func (c *Module) StubsVersion() string {
1412 if lib, ok := c.linker.(versionedInterface); ok {
1413 return lib.stubsVersion()
1414 }
1415 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1416}
1417
Colin Cross127bb8b2020-12-16 16:46:01 -08001418// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1419// and does not set llndk.vendor_available: false.
1420func (c *Module) isImplementationForLLNDKPublic() bool {
1421 library, _ := c.library.(*libraryDecorator)
1422 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001423 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001424}
1425
Colin Cross3513fb12024-01-24 14:44:47 -08001426func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001427 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001428 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001429 }
1430 return false
1431}
1432
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001433func (c *Module) isOrderfileCompile() bool {
1434 if orderfile := c.orderfile; orderfile != nil {
1435 return orderfile.Properties.OrderfileLoad
1436 }
1437 return false
1438}
1439
Yi Kongc702ebd2022-08-19 16:02:45 +08001440func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001441 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001442}
1443
Yi Konged79fa32023-06-04 17:15:42 +09001444func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001445 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001446}
1447
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001448func (c *Module) isNDKStubLibrary() bool {
1449 if _, ok := c.compiler.(*stubDecorator); ok {
1450 return true
1451 }
1452 return false
1453}
1454
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001455func (c *Module) SubName() string {
1456 return c.Properties.SubName
1457}
1458
Jiyong Park25fc6a92018-11-18 18:02:45 +09001459func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001460 if lib := c.library; lib != nil {
1461 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001462 }
1463 return false
1464}
1465
1466func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001467 if lib := c.library; lib != nil {
1468 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001469 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001470 return false
1471}
1472
Alan Stokes73feba32022-11-14 12:21:24 +00001473func (c *Module) IsStubsImplementationRequired() bool {
1474 if lib := c.library; lib != nil {
1475 return lib.isStubsImplementationRequired()
1476 }
1477 return false
1478}
1479
Colin Cross0477b422020-10-13 18:43:54 -07001480// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1481// the implementation. If it is an implementation library it returns its own name.
1482func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1483 name := ctx.OtherModuleName(c)
1484 if versioned, ok := c.linker.(versionedInterface); ok {
1485 name = versioned.implementationModuleName(name)
1486 }
1487 return name
1488}
1489
Martin Stjernholm2856c662020-12-02 15:03:42 +00001490// Similar to ImplementationModuleName, but uses the Make variant of the module
1491// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1492// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1493// under the premise that the prebuilt module overrides its source counterpart
1494// if it is exposed to Make).
1495func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1496 name := c.BaseModuleName()
1497 if versioned, ok := c.linker.(versionedInterface); ok {
1498 name = versioned.implementationModuleName(name)
1499 }
1500 return name
1501}
1502
Jiyong Park7d55b612021-06-11 17:22:09 +09001503func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001504 return Bool(c.Properties.Bootstrap)
1505}
1506
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001507func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001508 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1509 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1510 return false
1511 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001512 return c.linker != nil && c.linker.nativeCoverage()
1513}
1514
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001515func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001516 if p, ok := c.linker.(SnapshotInterface); ok {
1517 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001518 }
1519 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001520}
1521
Jiyong Parkf1194352019-02-25 11:05:47 +09001522func isBionic(name string) bool {
1523 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001524 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001525 return true
1526 }
1527 return false
1528}
1529
Martin Stjernholm279de572019-09-10 23:18:20 +01001530func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001531 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001532 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001533 }
1534 return isBionic(name)
1535}
1536
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001537func (c *Module) isCfiAssemblySupportEnabled() bool {
1538 return c.sanitize != nil &&
1539 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1540}
1541
Inseob Kim800d1142021-06-14 12:03:51 +09001542func (c *Module) InstallInRoot() bool {
1543 return c.installer != nil && c.installer.installInRoot()
1544}
1545
Colin Crossca860ac2016-01-04 14:34:37 -08001546type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001547 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001548 moduleContextImpl
1549}
1550
Colin Cross37047f12016-12-13 17:06:13 -08001551type depsContext struct {
1552 android.BottomUpMutatorContext
1553 moduleContextImpl
1554}
1555
Colin Crossca860ac2016-01-04 14:34:37 -08001556type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001557 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001558 moduleContextImpl
1559}
1560
1561type moduleContextImpl struct {
1562 mod *Module
1563 ctx BaseModuleContext
1564}
1565
Colin Crossb98c8b02016-07-29 13:44:28 -07001566func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001567 return ctx.mod.toolchain(ctx.ctx)
1568}
1569
1570func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001571 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001572}
1573
1574func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001575 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001576}
1577
Colin Cross6a730042024-12-05 13:53:43 -08001578func (ctx *moduleContextImpl) staticLibrary() bool {
1579 return ctx.mod.staticLibrary()
1580}
1581
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001582func (ctx *moduleContextImpl) testBinary() bool {
1583 return ctx.mod.testBinary()
1584}
1585
Yi Kong56fc1b62022-09-06 16:24:00 +08001586func (ctx *moduleContextImpl) testLibrary() bool {
1587 return ctx.mod.testLibrary()
1588}
1589
Jiyong Park1d1119f2019-07-29 21:27:18 +09001590func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001591 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001592}
1593
Inseob Kim7f283f42020-06-01 21:53:49 +09001594func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001595 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001596}
1597
Inseob Kim1042d292020-06-01 23:23:05 +09001598func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001599 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001600}
1601
Yi Kong5786f5c2024-05-28 02:22:34 +09001602func (ctx *moduleContextImpl) optimizeForSize() bool {
1603 return ctx.mod.OptimizeForSize()
1604}
1605
Jooyung Hanccce2f22020-03-07 03:45:53 +09001606func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001607 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001608}
1609
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001610func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001611 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001612}
1613
1614func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001615 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001616 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001617 }
1618 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001619}
1620
Jiyong Parkb35a8192020-08-10 15:59:36 +09001621func (ctx *moduleContextImpl) minSdkVersion() string {
1622 ver := ctx.mod.MinSdkVersion()
1623 if ver == "apex_inherit" && !ctx.isForPlatform() {
1624 ver = ctx.apexSdkVersion().String()
1625 }
1626 if ver == "apex_inherit" || ver == "" {
1627 ver = ctx.sdkVersion()
1628 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001629
1630 if ctx.ctx.Device() {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001631 // When building for vendor/product, use the latest _stable_ API as "current".
1632 // This is passed to clang/aidl compilers so that compiled/generated code works
1633 // with the system.
1634 if (ctx.inVendor() || ctx.inProduct()) && (ver == "" || ver == "current") {
1635 ver = ctx.ctx.Config().PlatformSdkVersion().String()
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001636 }
1637 }
1638
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001639 // For crt objects, the meaning of min_sdk_version is very different from other types of
1640 // module. For them, min_sdk_version defines the oldest version that the build system will
1641 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1642 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1643 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001644 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1645 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1646 // support such an old version. The version is set to the later version in case when the
1647 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1648 // it's for an APEX.
1649 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1650 if ctx.isForPlatform() {
1651 ver = strconv.Itoa(android.FutureApiLevelInt)
1652 } else { // for apex
1653 ver = ctx.apexSdkVersion().String()
1654 if ver == "" { // in case when min_sdk_version was not set by the APEX
1655 ver = ctx.sdkVersion()
1656 }
1657 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001658 }
1659
Jiyong Parkb35a8192020-08-10 15:59:36 +09001660 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1661 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1662 minSdkVersionInt, err2 := strconv.Atoi(ver)
1663 if err == nil && err2 == nil {
1664 if sdkVersionInt < minSdkVersionInt {
1665 return strconv.Itoa(sdkVersionInt)
1666 }
1667 }
1668 return ver
1669}
1670
1671func (ctx *moduleContextImpl) isSdkVariant() bool {
1672 return ctx.mod.IsSdkVariant()
1673}
1674
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001675func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001676 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001677}
Justin Yun8effde42017-06-23 19:24:43 +09001678
Kiyoung Kimaa394802024-01-08 12:55:45 +09001679func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1680 return ctx.mod.InVendorOrProduct()
1681}
1682
Colin Cross95f1ca02020-10-29 20:47:22 -07001683func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1684 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001685}
1686
Colin Cross127bb8b2020-12-16 16:46:01 -08001687func (ctx *moduleContextImpl) IsLlndk() bool {
1688 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001689}
1690
Colin Cross127bb8b2020-12-16 16:46:01 -08001691func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1692 return ctx.mod.isImplementationForLLNDKPublic()
1693}
1694
Colin Cross3513fb12024-01-24 14:44:47 -08001695func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1696 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001697}
1698
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001699func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1700 return ctx.mod.isOrderfileCompile()
1701}
1702
Yi Kongc702ebd2022-08-19 16:02:45 +08001703func (ctx *moduleContextImpl) isCfi() bool {
1704 return ctx.mod.isCfi()
1705}
1706
Yi Konged79fa32023-06-04 17:15:42 +09001707func (ctx *moduleContextImpl) isFuzzer() bool {
1708 return ctx.mod.isFuzzer()
1709}
1710
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001711func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1712 return ctx.mod.isNDKStubLibrary()
1713}
1714
Colin Cross5271fea2021-04-27 13:06:04 -07001715func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1716 return ctx.mod.IsVendorPublicLibrary()
1717}
1718
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001719func (ctx *moduleContextImpl) selectedStl() string {
1720 if stl := ctx.mod.stl; stl != nil {
1721 return stl.Properties.SelectedStl
1722 }
1723 return ""
1724}
1725
Ivan Lozanobd721262018-11-27 14:33:03 -08001726func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1727 return ctx.mod.linker.useClangLld(actx)
1728}
1729
Colin Crossce75d2c2016-10-06 16:12:58 -07001730func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001731 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001732}
1733
Logan Chiene274fc92019-12-03 11:18:32 -08001734func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Crossff694a82023-12-13 15:54:49 -08001735 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1736 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001737}
1738
Colin Crosse07f2312020-08-13 11:24:56 -07001739func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001740 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1741 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001742}
1743
Dan Albertc8060532020-07-22 22:32:17 -07001744func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001745 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001746}
1747
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001748func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001749 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001750}
1751
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001752func (ctx *moduleContextImpl) nativeCoverage() bool {
1753 return ctx.mod.nativeCoverage()
1754}
1755
Colin Cross95b07f22020-12-16 11:06:50 -08001756func (ctx *moduleContextImpl) isPreventInstall() bool {
1757 return ctx.mod.Properties.PreventInstall
1758}
1759
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001760func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1761 shared := &ctx.mod.sharedFlags
1762 if shared.flagsMap == nil {
1763 shared.numSharedFlags = 0
1764 shared.flagsMap = make(map[string]string)
1765 }
1766 return shared
1767}
1768
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001769func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1770 return ctx.mod.isCfiAssemblySupportEnabled()
1771}
1772
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001773func (ctx *moduleContextImpl) notInPlatform() bool {
1774 return ctx.mod.NotInPlatform()
1775}
1776
Yu Liu76d94462024-10-31 23:32:36 +00001777func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1778 if ctx.mod.makeVarsInfo == nil {
1779 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1780 }
1781 return ctx.mod.makeVarsInfo
1782}
1783
Colin Cross635c3b02016-05-18 15:37:25 -07001784func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001785 return &Module{
1786 hod: hod,
1787 multilib: multilib,
1788 }
1789}
1790
Colin Cross635c3b02016-05-18 15:37:25 -07001791func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001792 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001793 module.features = []feature{
1794 &tidyFeature{},
1795 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001796 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001797 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001798 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001799 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001800 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001801 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001802 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001803 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001804 return module
1805}
1806
Colin Crossce75d2c2016-10-06 16:12:58 -07001807func (c *Module) Prebuilt() *android.Prebuilt {
1808 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1809 return p.prebuilt()
1810 }
1811 return nil
1812}
1813
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001814func (c *Module) IsPrebuilt() bool {
1815 return c.Prebuilt() != nil
1816}
1817
Colin Crossce75d2c2016-10-06 16:12:58 -07001818func (c *Module) Name() string {
1819 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001820 if p, ok := c.linker.(interface {
1821 Name(string) string
1822 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001823 name = p.Name(name)
1824 }
1825 return name
1826}
1827
Alex Light3d673592019-01-18 14:37:31 -08001828func (c *Module) Symlinks() []string {
1829 if p, ok := c.installer.(interface {
1830 symlinkList() []string
1831 }); ok {
1832 return p.symlinkList()
1833 }
1834 return nil
1835}
1836
Chris Parsons216e10a2020-07-09 17:12:52 -04001837func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001838 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001839 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001840 }); ok {
1841 return p.dataPaths()
1842 }
1843 return nil
1844}
1845
Ivan Lozanof1868af2022-04-12 13:08:36 -04001846func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001847 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1848 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001849 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001850 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001851 if c.ProductSpecific() {
1852 // If the module is product specific with 'product_specific: true',
1853 // do not add a name suffix because it is a base module.
1854 return ""
1855 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001856 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001857 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001858 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001859 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001860 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001861 // add version suffix only if the module is using different vndk version than the
1862 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001863 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001864 }
1865 return nameSuffix
1866}
1867
Ivan Lozanof1868af2022-04-12 13:08:36 -04001868func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1869 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001870
1871 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001872 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001873 }
1874
Colin Cross127bb8b2020-12-16 16:46:01 -08001875 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001876 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001877 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1878 // added for product variant only when we have vendor and product variants with core
1879 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001880 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001881 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001882 subName += vendorPublicLibrarySuffix
1883 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001884 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1885 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001886 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001887 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001888 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001889 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001890 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001891 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001892 subName += RecoverySuffix
1893 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1894 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001895 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001896 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001897 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001898 } else if c.IsStubs() && c.IsSdkVariant() {
1899 // Public API surface (NDK)
1900 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1901 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001902 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001903
1904 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001905}
1906
Sam Delmerico75dbca22023-04-20 13:13:25 +00001907func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1908 ctx := &moduleContext{
1909 ModuleContext: actx,
1910 moduleContextImpl: moduleContextImpl{
1911 mod: c,
1912 },
1913 }
1914 ctx.ctx = ctx
1915 return ctx
1916}
1917
Spandan Das20fce2d2023-04-12 17:21:39 +00001918// TODO (b/277651159): Remove this allowlist
1919var (
1920 skipStubLibraryMultipleApexViolation = map[string]bool{
1921 "libclang_rt.asan": true,
1922 "libclang_rt.hwasan": true,
1923 // runtime apex
1924 "libc": true,
1925 "libc_hwasan": true,
1926 "libdl_android": true,
1927 "libm": true,
1928 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00001929 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00001930 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01001931 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00001932 "libandroidio": true,
1933 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01001934 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00001935 "libnativebridge": true,
1936 "libnativehelper": true,
1937 "libnativeloader": true,
1938 "libsigchain": true,
1939 }
1940)
1941
1942// Returns true if a stub library could be installed in multiple apexes
1943func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
1944 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08001945 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00001946 return false
1947 }
1948 // If this is not a stub library, no check necessary
1949 if !c.HasStubsVariants() {
1950 return false
1951 }
1952 // Skip the allowlist
1953 // Use BaseModuleName so that this matches prebuilts.
1954 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
1955 return false
1956 }
1957
1958 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
1959 // Stub libraries should not have more than one apex_available
1960 if len(aaWithoutTestApexes) > 1 {
1961 return true
1962 }
1963 // Stub libraries should not use the wildcard
1964 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
1965 return true
1966 }
1967 // Default: no violation
1968 return false
1969}
1970
Chris Parsons8d6e4332021-02-22 16:13:50 -05001971func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07001972 ctx := moduleContextFromAndroidModuleContext(actx, c)
1973
Inseob Kim37e0bb02024-04-29 15:54:44 +09001974 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
1975 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
1976 Logtags: c.logtagsPaths,
1977 })
1978
Ronald Braunstein6a08d492024-04-15 12:55:30 -07001979 // If Test_only is set on a module in bp file, respect the setting, otherwise
1980 // see if is a known test module type.
1981 testOnly := c.testModule || c.testLibrary()
1982 if c.sourceProperties.Test_only != nil {
1983 testOnly = Bool(c.sourceProperties.Test_only)
1984 }
1985 // Keep before any early returns.
1986 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
1987 TestOnly: testOnly,
1988 TopLevelTarget: c.testModule,
1989 })
1990
Ivan Lozanof1868af2022-04-12 13:08:36 -04001991 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08001992 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001993 if !apexInfo.IsForPlatform() {
1994 c.hideApexVariantFromMake = true
1995 }
1996
Chris Parsonseefc9e62021-04-02 17:36:47 -04001997 c.makeLinkType = GetMakeLinkType(actx, c)
1998
Colin Crossf18e1102017-11-16 14:33:08 -08001999 deps := c.depsToPaths(ctx)
2000 if ctx.Failed() {
2001 return
2002 }
2003
Joe Onorato37f900c2023-07-18 16:58:16 -07002004 for _, generator := range c.generators {
2005 gen := generator.GeneratorSources(ctx)
2006 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2007 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2008 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2009 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2010 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2011 if len(deps.Objs.objFiles) == 0 {
2012 // If we are reusuing object files (which happens when we're a shared library and we're
2013 // reusing our static variant's object files), then skip adding the actual source files,
2014 // because we already have the object for it.
2015 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2016 }
2017 }
2018
2019 if ctx.Failed() {
2020 return
2021 }
2022
Spandan Das20fce2d2023-04-12 17:21:39 +00002023 if c.stubLibraryMultipleApexViolation(actx) {
2024 actx.PropertyErrorf("apex_available",
2025 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2026 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002027 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2028 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002029 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2030 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002031 }
2032
Colin Crossca860ac2016-01-04 14:34:37 -08002033 flags := Flags{
2034 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002035 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002036 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002037 for _, generator := range c.generators {
2038 flags = generator.GeneratorFlags(ctx, flags, deps)
2039 }
Colin Crossca860ac2016-01-04 14:34:37 -08002040 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002041 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002042 }
2043 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002044 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002045 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002046 if c.stl != nil {
2047 flags = c.stl.flags(ctx, flags)
2048 }
Colin Cross16b23492016-01-06 14:41:07 -08002049 if c.sanitize != nil {
2050 flags = c.sanitize.flags(ctx, flags)
2051 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002052 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002053 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002054 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002055 if c.fuzzer != nil {
2056 flags = c.fuzzer.flags(ctx, flags)
2057 }
Stephen Craneba090d12017-05-09 15:44:35 -07002058 if c.lto != nil {
2059 flags = c.lto.flags(ctx, flags)
2060 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002061 if c.afdo != nil {
2062 flags = c.afdo.flags(ctx, flags)
2063 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002064 if c.orderfile != nil {
2065 flags = c.orderfile.flags(ctx, flags)
2066 }
Colin Crossca860ac2016-01-04 14:34:37 -08002067 for _, feature := range c.features {
2068 flags = feature.flags(ctx, flags)
2069 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002070 if ctx.Failed() {
2071 return
2072 }
2073
Colin Cross4af21ed2019-11-04 09:37:55 -08002074 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2075 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2076 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002077
Colin Cross4af21ed2019-11-04 09:37:55 -08002078 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002079
2080 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002081 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002082 }
2083 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002084 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002085 }
2086
Colin Cross3e5e7782022-06-17 22:17:05 +00002087 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2088
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002089 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002090 // We need access to all the flags seen by a source file.
2091 if c.sabi != nil {
2092 flags = c.sabi.flags(ctx, flags)
2093 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002094
Colin Cross4af21ed2019-11-04 09:37:55 -08002095 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002096
Joe Onorato37f900c2023-07-18 16:58:16 -07002097 for _, generator := range c.generators {
2098 generator.GeneratorBuildActions(ctx, flags, deps)
2099 }
2100
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002101 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002102 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002103 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002104 if ctx.Failed() {
2105 return
2106 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002107 }
2108
Colin Crossca860ac2016-01-04 14:34:37 -08002109 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002110 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002111 if ctx.Failed() {
2112 return
2113 }
Colin Cross635c3b02016-05-18 15:37:25 -07002114 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002115
Chris Parsons94a0bba2021-06-04 15:03:47 -04002116 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002117
2118 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2119 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2120 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002121 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002122
Colin Cross40213022023-12-13 15:19:49 -08002123 android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()})
Colin Cross5049f022015-03-18 13:28:46 -07002124
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002125 if Bool(c.Properties.Cmake_snapshot_supported) {
2126 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2127 }
2128
Chris Parsons94a0bba2021-06-04 15:03:47 -04002129 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002130
2131 if c.linker != nil {
2132 moduleInfoJSON := ctx.ModuleInfoJSON()
2133 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2134 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2135 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2136 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2137 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2138
2139 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2140 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2141 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2142 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2143
2144 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2145 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2146 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2147 moduleInfoJSON.SubName += ".cfi"
2148 }
2149 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2150 moduleInfoJSON.SubName += ".hwasan"
2151 }
2152 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2153 moduleInfoJSON.SubName += ".scs"
2154 }
2155 }
2156 moduleInfoJSON.SubName += c.Properties.SubName
2157
2158 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2159 moduleInfoJSON.Uninstallable = true
2160 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002161 }
Wei Lia1aa2972024-06-21 13:08:51 -07002162
2163 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002164
Cole Faust96a692b2024-08-08 14:47:51 -07002165 if b, ok := c.compiler.(*baseCompiler); ok {
2166 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2167 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2168 c.hasProto = b.hasSrcExt(ctx, ".proto")
2169 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2170 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2171 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2172 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2173 }
2174
Yu Liuec7043d2024-11-05 18:22:20 +00002175 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002176 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002177 }
2178 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002179 ccObjectInfo.ObjFiles = objs.objFiles
2180 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002181 }
Yu Liu4f825132024-12-18 00:35:39 +00002182 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002183 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2184 }
2185
Yu Liu986d98c2024-11-12 00:28:11 +00002186 android.SetProvider(ctx, LinkableInfoKey, LinkableInfo{
2187 StaticExecutable: c.StaticExecutable(),
2188 })
2189
Yu Liu323d77a2024-12-16 23:13:57 +00002190 ccInfo := CcInfo{
2191 HasStubsVariants: c.HasStubsVariants(),
2192 IsPrebuilt: c.IsPrebuilt(),
2193 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
2194 }
2195 if c.compiler != nil {
2196 ccInfo.CompilerInfo = &CompilerInfo{
2197 Srcs: c.compiler.(CompiledInterface).Srcs(),
2198 Cflags: c.compiler.baseCompilerProps().Cflags,
2199 AidlInterfaceInfo: AidlInterfaceInfo{
2200 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2201 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2202 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2203 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2204 },
2205 }
2206 switch decorator := c.compiler.(type) {
2207 case *libraryDecorator:
2208 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002209 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs,
Yu Liu323d77a2024-12-16 23:13:57 +00002210 }
2211 }
2212 }
2213 if c.linker != nil {
2214 ccInfo.LinkerInfo = &LinkerInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002215 WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs,
2216 StaticLibs: c.linker.baseLinkerProps().Static_libs,
2217 SharedLibs: c.linker.baseLinkerProps().Shared_libs,
2218 HeaderLibs: c.linker.baseLinkerProps().Header_libs,
2219 UnstrippedOutputFile: c.UnstrippedOutputFile(),
Yu Liu323d77a2024-12-16 23:13:57 +00002220 }
2221 switch decorator := c.linker.(type) {
2222 case *binaryDecorator:
2223 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2224 case *libraryDecorator:
2225 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{}
2226 case *testBinary:
2227 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2228 Gtest: decorator.testDecorator.gtest(),
2229 }
2230 case *benchmarkDecorator:
2231 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2232 case *objectLinker:
2233 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{}
2234 }
2235 }
Yu Liuffe86322024-12-18 18:53:12 +00002236 if c.library != nil {
2237 ccInfo.LibraryInfo = &LibraryInfo{
2238 StubsVersion: c.library.stubsVersion(),
2239 }
2240 }
Yu Liu323d77a2024-12-16 23:13:57 +00002241 android.SetProvider(ctx, CcInfoProvider, ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002242
mrziwangabdb2932024-06-18 12:43:41 -07002243 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002244
2245 if c.makeVarsInfo != nil {
2246 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2247 }
mrziwangabdb2932024-06-18 12:43:41 -07002248}
2249
Yu Liuec7043d2024-11-05 18:22:20 +00002250func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2251 if len(files) > 0 {
2252 ctx.SetOutputFiles(files, tag)
2253 }
2254}
2255
mrziwangabdb2932024-06-18 12:43:41 -07002256func (c *Module) setOutputFiles(ctx ModuleContext) {
2257 if c.outputFile.Valid() {
2258 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2259 } else {
2260 ctx.SetOutputFiles(android.Paths{}, "")
2261 }
2262 if c.linker != nil {
2263 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2264 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2265 }
Wei Lia1aa2972024-06-21 13:08:51 -07002266}
2267
2268func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2269 // Dump metadata that can not be done in android/compliance-metadata.go
2270 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
2271 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static()))
2272 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2273
2274 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002275 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002276 staticDepNames := make([]string, 0, len(staticDeps))
2277 for _, dep := range staticDeps {
2278 staticDepNames = append(staticDepNames, dep.Name())
2279 }
2280
2281 staticDepPaths := make([]string, 0, len(deps.StaticLibs))
2282 for _, dep := range deps.StaticLibs {
2283 staticDepPaths = append(staticDepPaths, dep.String())
2284 }
2285 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2286 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2287
2288 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002289 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002290 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2291 for _, dep := range wholeStaticDeps {
2292 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2293 }
2294
2295 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2296 for _, dep := range deps.WholeStaticLibs {
2297 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2298 }
2299 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2300 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002301}
2302
2303func (c *Module) maybeUnhideFromMake() {
2304 // If a lib is directly included in any of the APEXes or is not available to the
2305 // platform (which is often the case when the stub is provided as a prebuilt),
2306 // unhide the stubs variant having the latest version gets visible to make. In
2307 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2308 // force anything in the make world to link against the stubs library. (unless it
2309 // is explicitly referenced via .bootstrap suffix or the module is marked with
2310 // 'bootstrap: true').
2311 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002312 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002313 c.IsStubs() && !c.InVendorRamdisk() {
2314 c.Properties.HideFromMake = false // unhide
2315 // Note: this is still non-installable
2316 }
2317}
2318
Colin Cross8ff10582023-12-07 13:10:56 -08002319// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2320// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002321func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002322 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002323 // If the module has been specifically configure to not be installed then
2324 // hide from make as otherwise it will break when running inside make
2325 // as the output path to install will not be specified. Not all uninstallable
2326 // modules can be hidden from make as some are needed for resolving make side
2327 // dependencies.
2328 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002329 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002330 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002331 c.SkipInstall()
2332 }
2333
2334 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2335 // to allow using the outputs in a genrule.
2336 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002337 c.installer.install(ctx, c.outputFile.Path())
2338 if ctx.Failed() {
2339 return
Colin Crossca860ac2016-01-04 14:34:37 -08002340 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002341 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002342}
2343
Colin Cross0ea8ba82019-06-06 14:33:29 -07002344func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002345 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002346 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002347 }
Colin Crossca860ac2016-01-04 14:34:37 -08002348 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002349}
2350
Colin Crossca860ac2016-01-04 14:34:37 -08002351func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002352 for _, generator := range c.generators {
2353 generator.GeneratorInit(ctx)
2354 }
Colin Crossca860ac2016-01-04 14:34:37 -08002355 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002356 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002357 }
Colin Crossca860ac2016-01-04 14:34:37 -08002358 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002359 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002360 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002361 if c.stl != nil {
2362 c.stl.begin(ctx)
2363 }
Colin Cross16b23492016-01-06 14:41:07 -08002364 if c.sanitize != nil {
2365 c.sanitize.begin(ctx)
2366 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002367 if c.coverage != nil {
2368 c.coverage.begin(ctx)
2369 }
Yi Kong9723e332023-12-04 14:52:53 +09002370 if c.afdo != nil {
2371 c.afdo.begin(ctx)
2372 }
Stephen Craneba090d12017-05-09 15:44:35 -07002373 if c.lto != nil {
2374 c.lto.begin(ctx)
2375 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002376 if c.orderfile != nil {
2377 c.orderfile.begin(ctx)
2378 }
Dan Albert92fe7402020-07-15 13:33:30 -07002379 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002380 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002381 if err != nil {
2382 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002383 c.Properties.Sdk_version = nil
2384 } else {
2385 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002386 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002387 }
Colin Crossca860ac2016-01-04 14:34:37 -08002388}
2389
Colin Cross37047f12016-12-13 17:06:13 -08002390func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002391 deps := Deps{}
2392
Joe Onorato37f900c2023-07-18 16:58:16 -07002393 for _, generator := range c.generators {
2394 deps = generator.GeneratorDeps(ctx, deps)
2395 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002396 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002397 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002398 }
2399 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002400 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002401 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002402 if c.stl != nil {
2403 deps = c.stl.deps(ctx, deps)
2404 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002405 if c.coverage != nil {
2406 deps = c.coverage.deps(ctx, deps)
2407 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002408
Colin Crossb6715442017-10-24 11:13:31 -07002409 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2410 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2411 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2412 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2413 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2414 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002415 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002416 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002417
Colin Cross516c5452024-10-28 13:45:21 -07002418 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2419 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2420 }
2421
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002422 for _, lib := range deps.ReexportSharedLibHeaders {
2423 if !inList(lib, deps.SharedLibs) {
2424 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2425 }
2426 }
2427
2428 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002429 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2430 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 -07002431 }
2432 }
2433
Colin Cross5950f382016-12-13 12:50:57 -08002434 for _, lib := range deps.ReexportHeaderLibHeaders {
2435 if !inList(lib, deps.HeaderLibs) {
2436 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2437 }
2438 }
2439
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002440 for _, gen := range deps.ReexportGeneratedHeaders {
2441 if !inList(gen, deps.GeneratedHeaders) {
2442 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2443 }
2444 }
2445
Colin Crossc99deeb2016-04-11 15:06:20 -07002446 return deps
2447}
2448
Colin Cross516c5452024-10-28 13:45:21 -07002449func checkConflictingExplicitVersions(libs []string) error {
2450 withoutVersion := func(s string) string {
2451 name, _ := StubsLibNameAndVersion(s)
2452 return name
2453 }
2454 var errs []error
2455 for i, lib := range libs {
2456 libName := withoutVersion(lib)
2457 libsToCompare := libs[i+1:]
2458 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2459 return withoutVersion(s) == libName
2460 })
2461 if j >= 0 {
2462 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2463 lib, libsToCompare[j]))
2464 }
2465 }
2466 return errors.Join(errs...)
2467}
2468
Dan Albert7e9d2952016-08-04 13:02:36 -07002469func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002470 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002471 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002472 moduleContextImpl: moduleContextImpl{
2473 mod: c,
2474 },
2475 }
2476 ctx.ctx = ctx
2477
Colin Crossca860ac2016-01-04 14:34:37 -08002478 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002479}
2480
Jiyong Park7ed9de32018-10-15 22:25:07 +09002481// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002482func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002483 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2484 version := name[sharp+1:]
2485 libname := name[:sharp]
2486 return libname, version
2487 }
2488 return name, ""
2489}
2490
Dan Albert92fe7402020-07-15 13:33:30 -07002491func GetCrtVariations(ctx android.BottomUpMutatorContext,
2492 m LinkableInterface) []blueprint.Variation {
2493 if ctx.Os() != android.Android {
2494 return nil
2495 }
2496 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002497 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2498 minSdkVersion := m.MinSdkVersion()
2499 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2500 minSdkVersion = m.SdkVersion()
2501 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002502 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2503 if err != nil {
2504 ctx.PropertyErrorf("min_sdk_version", err.Error())
2505 }
Colin Cross363ec762023-01-13 13:45:14 -08002506
2507 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002508 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002509 if apiLevel.LessThan(minApiForArch) {
2510 apiLevel = minApiForArch
2511 }
2512
Dan Albert92fe7402020-07-15 13:33:30 -07002513 return []blueprint.Variation{
2514 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002515 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002516 }
2517 }
2518 return []blueprint.Variation{
2519 {Mutator: "sdk", Variation: ""},
2520 }
2521}
2522
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002523func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2524 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002525
2526 variations = append([]blueprint.Variation(nil), variations...)
2527
Liz Kammer23942242022-04-08 15:41:00 -04002528 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002529 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002530 if version == "impl" {
2531 version = ""
2532 }
Colin Crosse7257d22020-09-24 09:56:18 -07002533 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002534 if tag, ok := depTag.(libraryDependencyTag); ok {
2535 tag.explicitlyVersioned = true
Colin Crossafcdce82024-10-22 13:59:33 -07002536 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2537 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2538 // the modified copy to depTag.
2539 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002540 } else {
2541 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2542 }
Colin Crosse7257d22020-09-24 09:56:18 -07002543 }
Colin Crosse7257d22020-09-24 09:56:18 -07002544
Colin Cross0de8a1e2020-09-18 14:15:30 -07002545 if far {
2546 ctx.AddFarVariationDependencies(variations, depTag, name)
2547 } else {
2548 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002549 }
2550}
2551
Kiyoung Kim487689e2022-07-26 09:48:22 +09002552func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2553 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002554 return snapshot
2555 }
2556
2557 return lib
2558}
2559
Kiyoung Kim37693d02024-04-04 09:56:15 +09002560// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002561// of names:
2562//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002563// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002564//
2565// For each of these, it adds the name of the ndk_library module to the list of
2566// variant libs.
2567//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002568// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002569//
2570// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002571//
2572// The caller can then know to add the variantLibs dependencies differently from the
2573// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002574func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002575 variantLibs = []string{}
2576
2577 nonvariantLibs = []string{}
2578 for _, entry := range list {
2579 // strip #version suffix out
2580 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002581 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002582 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002583 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002584 nonvariantLibs = append(nonvariantLibs, entry)
2585 }
2586 }
2587 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002588
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002589}
2590
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002591func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2592 nonVariantLibs := []string{}
2593 variantLibs := []string{}
2594
2595 for _, lib := range libs {
2596 replaceLibName := GetReplaceModuleName(lib, replaceList)
2597 if replaceLibName == lib {
2598 // Do not handle any libs which are not in API imports
2599 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2600 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2601 variantLibs = append(variantLibs, replaceLibName)
2602 } else {
2603 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2604 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002605 }
2606
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002607 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002608}
2609
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002610func (c *Module) shouldUseApiSurface() bool {
2611 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2612 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2613 // LLNDK Variant
2614 return true
2615 }
2616
2617 if c.Properties.IsSdkVariant {
2618 // NDK Variant
2619 return true
2620 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002621 }
2622
2623 return false
2624}
2625
Colin Cross1e676be2016-10-12 14:38:15 -07002626func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002627 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002628 return
2629 }
2630
Colin Cross37047f12016-12-13 17:06:13 -08002631 ctx := &depsContext{
2632 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002633 moduleContextImpl: moduleContextImpl{
2634 mod: c,
2635 },
2636 }
2637 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002638
Colin Crossc99deeb2016-04-11 15:06:20 -07002639 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002640
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002641 apiNdkLibs := []string{}
2642 apiLateNdkLibs := []string{}
2643
Yo Chiang219968c2020-09-22 18:45:04 +08002644 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2645
Dan Albert914449f2016-06-17 16:45:24 -07002646 variantNdkLibs := []string{}
2647 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002648 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002649 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2650 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2651 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002652 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002653
Colin Cross32ec36c2016-12-15 07:39:51 -08002654 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002655 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002656 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002657 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002658 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002659
Spandan Das73bcafc2022-08-18 23:26:00 +00002660 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002661 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2662 if variationExists {
2663 actx.AddVariationDependencies(nil, depTag, lib)
2664 } else {
2665 // dependencies to ndk_headers fall here as ndk_headers do not have
2666 // any variants.
2667 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2668 }
Spandan Dasff665182024-09-11 18:48:44 +00002669 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002670 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002671 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002672 } else {
2673 actx.AddVariationDependencies(nil, depTag, lib)
2674 }
2675 }
2676
Dan Albertf1d14c72020-07-30 14:32:55 -07002677 if c.isNDKStubLibrary() {
2678 // NDK stubs depend on their implementation because the ABI dumps are
2679 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002680
Spandan Das8b08aea2023-03-14 19:29:34 +00002681 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2682 c.ImageVariation(),
2683 blueprint.Variation{Mutator: "link", Variation: "shared"},
2684 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002685 }
2686
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002687 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2688 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2689 c.Target().NativeBridge == android.NativeBridgeDisabled {
2690 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002691 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002692 llndkHeaderLibTag,
2693 deps.LlndkHeaderLibs...)
2694 }
2695
Jiyong Park5d1598f2019-02-25 22:14:17 +09002696 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002697 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002698
Jiyong Park5d1598f2019-02-25 22:14:17 +09002699 actx.AddVariationDependencies([]blueprint.Variation{
2700 {Mutator: "link", Variation: "static"},
2701 }, depTag, lib)
2702 }
2703
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002704 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002705 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002706 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002707
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002708 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002709 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002710 }
Jiyong Parke3867542020-12-03 17:28:25 +09002711 if inList(lib, deps.ExcludeLibsForApex) {
2712 depTag.excludeInApex = true
2713 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002714 actx.AddVariationDependencies([]blueprint.Variation{
2715 {Mutator: "link", Variation: "static"},
2716 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002717 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002718
Jooyung Han75568392020-03-20 04:29:24 +09002719 // staticUnwinderDep is treated as staticDep for Q apexes
2720 // so that native libraries/binaries are linked with static unwinder
2721 // because Q libc doesn't have unwinder APIs
2722 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002723 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002724 actx.AddVariationDependencies([]blueprint.Variation{
2725 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002726 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002727 }
2728
Jiyong Park7ed9de32018-10-15 22:25:07 +09002729 // shared lib names without the #version suffix
2730 var sharedLibNames []string
2731
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002732 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002733 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002734 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002735 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002736 }
Jiyong Parke3867542020-12-03 17:28:25 +09002737 if inList(lib, deps.ExcludeLibsForApex) {
2738 depTag.excludeInApex = true
2739 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002740 if inList(lib, deps.ExcludeLibsForNonApex) {
2741 depTag.excludeInNonApex = true
2742 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002743
Jiyong Park73c54ee2019-10-22 20:31:18 +09002744 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002745 sharedLibNames = append(sharedLibNames, name)
2746
Colin Crosse7257d22020-09-24 09:56:18 -07002747 variations := []blueprint.Variation{
2748 {Mutator: "link", Variation: "shared"},
2749 }
Spandan Dasff665182024-09-11 18:48:44 +00002750 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002751 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002752
Colin Crossfe9acfe2021-06-14 16:13:03 -07002753 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002754 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002755 actx.AddVariationDependencies([]blueprint.Variation{
2756 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002757 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002758 }
2759
Colin Cross3e5e7782022-06-17 22:17:05 +00002760 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002761 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002762 actx.AddVariationDependencies([]blueprint.Variation{
2763 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002764 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002765 }
2766
Jiyong Park7ed9de32018-10-15 22:25:07 +09002767 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002768 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002769 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2770 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2771 // linking against both the stubs lib and the non-stubs lib at the same time.
2772 continue
2773 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002774 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002775 variations := []blueprint.Variation{
2776 {Mutator: "link", Variation: "shared"},
2777 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002778 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002779 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002780
Dan Willemsen59339a22018-07-22 21:18:45 -07002781 actx.AddVariationDependencies([]blueprint.Variation{
2782 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002783 }, dataLibDepTag, deps.DataLibs...)
2784
Colin Crossc8caa062021-09-24 16:50:14 -07002785 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2786
Chris Parsons79d66a52020-06-05 17:26:16 -04002787 actx.AddVariationDependencies([]blueprint.Variation{
2788 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002789 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002790
Colin Cross68861832016-07-08 10:41:41 -07002791 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002792
2793 for _, gen := range deps.GeneratedHeaders {
2794 depTag := genHeaderDepTag
2795 if inList(gen, deps.ReexportGeneratedHeaders) {
2796 depTag = genHeaderExportDepTag
2797 }
2798 actx.AddDependency(c, depTag, gen)
2799 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002800
Cole Faust65cb40a2024-10-21 15:41:42 -07002801 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2802 depTag := genHeaderDepTag
2803 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2804 }
2805
Dan Albert92fe7402020-07-15 13:33:30 -07002806 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002807 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002808 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002809 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002810 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002811 }
Colin Crossc465efd2021-06-11 18:00:04 -07002812 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002813 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002814 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002815 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002816 if deps.DynamicLinker != "" {
2817 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002818 }
Dan Albert914449f2016-06-17 16:45:24 -07002819
2820 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002821
Colin Cross8acea3e2024-12-12 14:53:30 -08002822 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002823 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002824 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002825 {Mutator: "link", Variation: "shared"},
2826 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002827 actx.AddVariationDependencies([]blueprint.Variation{
2828 {Mutator: "version", Variation: version},
2829 {Mutator: "link", Variation: "shared"},
2830 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002831
Colin Cross8acea3e2024-12-12 14:53:30 -08002832 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002833 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002834 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002835 {Mutator: "link", Variation: "shared"},
2836 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002837 actx.AddVariationDependencies([]blueprint.Variation{
2838 {Mutator: "version", Variation: version},
2839 {Mutator: "link", Variation: "shared"},
2840 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002841
Vinh Tran367d89d2023-04-28 11:21:25 -04002842 if len(deps.AidlLibs) > 0 {
2843 actx.AddDependency(
2844 c,
2845 aidlLibraryTag,
2846 deps.AidlLibs...,
2847 )
2848 }
2849
Colin Cross6362e272015-10-29 15:25:03 -07002850}
Colin Cross21b9a242015-03-24 14:15:58 -07002851
Colin Crosse40b4ea2018-10-02 22:25:58 -07002852func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002853 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002854 c.beginMutator(ctx)
2855 }
2856}
2857
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002858// Whether a module can link to another module, taking into
2859// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002860func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002861 tag blueprint.DependencyTag) {
2862
2863 switch t := tag.(type) {
2864 case dependencyTag:
2865 if t != vndkExtDepTag {
2866 return
2867 }
2868 case libraryDependencyTag:
2869 default:
2870 return
2871 }
2872
Ivan Lozanof9e21722020-12-02 09:00:51 -05002873 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002874 // Host code is not restricted
2875 return
2876 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002877
Ivan Lozano52767be2019-10-18 14:49:46 -07002878 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002879 // Platform code can link to anything
2880 return
2881 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002882 if from.InRamdisk() {
2883 // Ramdisk code is not NDK
2884 return
2885 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002886 if from.InVendorRamdisk() {
2887 // Vendor ramdisk code is not NDK
2888 return
2889 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002890 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002891 // Recovery code is not NDK
2892 return
2893 }
Colin Cross31076b32020-10-23 17:22:06 -07002894 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002895 if c.StubDecorator() {
2896 // These aren't real libraries, but are the stub shared libraries that are included in
2897 // the NDK.
2898 return
2899 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002900 }
Logan Chien834b9a62019-01-14 15:39:03 +08002901
Ivan Lozano52767be2019-10-18 14:49:46 -07002902 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002903 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2904 // to link to libc++ (non-NDK and without sdk_version).
2905 return
2906 }
2907
Ivan Lozano52767be2019-10-18 14:49:46 -07002908 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002909 // NDK code linking to platform code is never okay.
2910 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002911 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002912 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002913 }
2914
2915 // At this point we know we have two NDK libraries, but we need to
2916 // check that we're not linking against anything built against a higher
2917 // API level, as it is only valid to link against older or equivalent
2918 // APIs.
2919
Inseob Kim01a28722018-04-11 09:48:45 +09002920 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002921 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002922 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002923 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002924 // Current can't be linked against by anything else.
2925 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002926 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002927 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002928 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002929 if err != nil {
2930 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002931 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002932 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002933 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002934 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002935 if err != nil {
2936 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002937 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002938 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002939 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002940
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002941 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09002942 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002943 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002944 }
2945 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002946 }
Dan Albert202fe492017-12-15 13:56:59 -08002947
2948 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002949 fromStl := from.SelectedStl()
2950 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002951 if fromStl == "" || toStl == "" {
2952 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002953 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002954 // We can be permissive with the system "STL" since it is only the C++
2955 // ABI layer, but in the future we should make sure that everyone is
2956 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002957 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002958 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002959 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2960 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002961 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002962}
2963
Jooyung Han479ca172020-10-19 18:51:07 +09002964func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2965 if c, ok := ctx.Module().(*Module); ok {
2966 ctx.VisitDirectDeps(func(dep android.Module) {
2967 depTag := ctx.OtherModuleDependencyTag(dep)
2968 ccDep, ok := dep.(LinkableInterface)
2969 if ok {
2970 checkLinkType(ctx, c, ccDep, depTag)
2971 }
2972 })
2973 }
2974}
2975
Jiyong Park5fb8c102018-04-09 12:03:06 +09002976// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002977// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2978// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002979// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07002980func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002981 check := func(child, parent android.Module) bool {
2982 to, ok := child.(*Module)
2983 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002984 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002985 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002986
Jooyung Hana70f0672019-01-18 15:20:43 +09002987 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2988 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002989 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002990
Jiyong Park0474e1f2021-01-14 14:26:06 +09002991 // These dependencies are not excercised at runtime. Tracking these will give us
2992 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002993 depTag := ctx.OtherModuleDependencyTag(child)
2994 if IsHeaderDepTag(depTag) {
2995 return false
2996 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002997 if depTag == staticVariantTag {
2998 return false
2999 }
3000 if depTag == stubImplDepTag {
3001 return false
3002 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003003 if depTag == android.RequiredDepTag {
3004 return false
3005 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003006
Justin Yun63e9ec72020-10-29 16:49:43 +09003007 // Even if target lib has no vendor variant, keep checking dependency
3008 // graph in case it depends on vendor_available or product_available
3009 // but not double_loadable transtively.
3010 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003011 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003012 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003013
Jiyong Park0474e1f2021-01-14 14:26:06 +09003014 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3015 // one.
3016 if Bool(to.VendorProperties.Double_loadable) {
3017 return true
3018 }
3019
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003020 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003021 return false
3022 }
3023
Jooyung Hana70f0672019-01-18 15:20:43 +09003024 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3025 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003026 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003027 return false
3028 }
3029 if module, ok := ctx.Module().(*Module); ok {
3030 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003031 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003032 ctx.WalkDeps(check)
3033 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003034 }
3035 }
3036}
3037
Yu Liue4312402023-01-18 09:15:31 -08003038func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3039 // For the dependency from platform to apex, use the latest stubs
3040 apexSdkVersion := android.FutureApiLevel
3041 if !apexInfo.IsForPlatform() {
3042 apexSdkVersion = apexInfo.MinSdkVersion
3043 }
3044
3045 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3046 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3047 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3048 // (b/144430859)
3049 apexSdkVersion = android.FutureApiLevel
3050 }
3051
3052 return apexSdkVersion
3053}
3054
Colin Crossc99deeb2016-04-11 15:06:20 -07003055// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003056func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003057 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003058
Colin Cross0de8a1e2020-09-18 14:15:30 -07003059 var directStaticDeps []StaticLibraryInfo
3060 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003061
Colin Cross0de8a1e2020-09-18 14:15:30 -07003062 reexportExporter := func(exporter FlagExporterInfo) {
3063 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3064 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3065 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3066 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3067 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003068 }
3069
Colin Crossff694a82023-12-13 15:54:49 -08003070 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003071 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003072
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003073 skipModuleList := map[string]bool{}
3074
Colin Crossd11fcda2017-10-23 17:59:01 -07003075 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003076 depName := ctx.OtherModuleName(dep)
3077 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003078
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003079 if _, ok := skipModuleList[depName]; ok {
3080 // skip this module because original module or API imported module matching with this should be used instead.
3081 return
3082 }
3083
Dan Willemsen47450072021-10-19 20:24:49 -07003084 if depTag == android.DarwinUniversalVariantTag {
3085 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3086 return
3087 }
3088
Vinh Tran367d89d2023-04-28 11:21:25 -04003089 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003090 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003091 depPaths.AidlLibraryInfos = append(
3092 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003093 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003094 )
3095 }
3096 }
3097
Ivan Lozano52767be2019-10-18 14:49:46 -07003098 ccDep, ok := dep.(LinkableInterface)
3099 if !ok {
3100
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003101 // handling for a few module types that aren't cc Module but that are also supported
3102 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003103 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003104 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003105 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3106 genRule.GeneratedSourceFiles()...)
3107 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003108 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003109 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003110 // Support exported headers from a generated_sources dependency
3111 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003112 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003113 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003114 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003115 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003116 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003117 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003118 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003119 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003120 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3121 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003122 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003123 // 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 +09003124 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003125
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003126 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003127 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003128 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003129 }
Colin Crosscef792e2021-06-11 18:01:26 -07003130 case CrtBeginDepTag:
3131 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3132 case CrtEndDepTag:
3133 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003134 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003135 return
3136 }
3137
Colin Crossfe17f6f2019-03-28 19:30:56 -07003138 if depTag == android.ProtoPluginDepTag {
3139 return
3140 }
3141
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003142 if depTag == android.RequiredDepTag {
3143 return
3144 }
3145
Colin Crossd11fcda2017-10-23 17:59:01 -07003146 if dep.Target().Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003147 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 -07003148 return
3149 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003150 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003151 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3152 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003153 return
3154 }
3155
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003156 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003157 // Skip reused objects for stub libraries, they use their own stub object file instead.
3158 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3159 // version mutator, so the stubs variant is created from the shared variant that
3160 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003161 if !c.library.buildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003162 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003163 objs := staticAnalogue.ReuseObjects
3164 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003165 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003166 reexportExporter(depExporterInfo)
3167 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003168 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003169 }
3170
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003171 if depTag == llndkHeaderLibTag {
3172 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3173 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3174 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3175 }
3176
Colin Cross6e511a92020-07-27 21:26:48 -07003177 linkFile := ccDep.OutputFile()
3178
3179 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3180 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003181 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003182 return
3183 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003184
Jiyong Parke3867542020-12-03 17:28:25 +09003185 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3186 return
3187 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003188 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3189 return
3190 }
Jiyong Parke3867542020-12-03 17:28:25 +09003191
Colin Cross313aa542023-12-13 13:47:44 -08003192 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003193
Colin Cross6e511a92020-07-27 21:26:48 -07003194 var ptr *android.Paths
3195 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003196
Colin Cross6e511a92020-07-27 21:26:48 -07003197 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003198
Colin Cross6e511a92020-07-27 21:26:48 -07003199 switch {
3200 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003201 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003202 if !ctx.Config().AllowMissingDependencies() {
3203 ctx.ModuleErrorf("module %q is not a header library", depName)
3204 } else {
3205 ctx.AddMissingDependencies([]string{depName})
3206 }
3207 return
3208 }
Colin Cross6e511a92020-07-27 21:26:48 -07003209 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003210 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003211 if !ctx.Config().AllowMissingDependencies() {
3212 ctx.ModuleErrorf("module %q is not a shared library", depName)
3213 } else {
3214 ctx.AddMissingDependencies([]string{depName})
3215 }
3216 return
3217 }
Jiyong Parke3867542020-12-03 17:28:25 +09003218
Jiyong Park7d55b612021-06-11 17:22:09 +09003219 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3220 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003221
Jiyong Park1ad8e162020-12-01 23:40:09 +09003222 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3223 // linkFile, depFile, and ptr.
3224 if c.IsStubs() {
3225 break
3226 }
3227
Colin Cross0de8a1e2020-09-18 14:15:30 -07003228 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3229 depFile = sharedLibraryInfo.TableOfContents
3230
Colin Crossb614cd42024-10-11 12:52:21 -07003231 if !sharedLibraryInfo.IsStubs {
3232 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3233 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3234 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3235 }
3236 }
3237
Colin Cross6e511a92020-07-27 21:26:48 -07003238 ptr = &depPaths.SharedLibs
3239 switch libDepTag.Order {
3240 case earlyLibraryDependency:
3241 ptr = &depPaths.EarlySharedLibs
3242 depPtr = &depPaths.EarlySharedLibsDeps
3243 case normalLibraryDependency:
3244 ptr = &depPaths.SharedLibs
3245 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003246 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003247 case lateLibraryDependency:
3248 ptr = &depPaths.LateSharedLibs
3249 depPtr = &depPaths.LateSharedLibsDeps
3250 default:
3251 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003252 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003253
Colin Cross6e511a92020-07-27 21:26:48 -07003254 case libDepTag.static():
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003255 if ccDep.RustLibraryInterface() {
3256 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: ccDep.CrateName(), LinkDirs: ccDep.ExportedCrateLinkDirs()}
3257 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3258 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3259 if libDepTag.wholeStatic {
3260 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3261 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003262
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003263 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3264 // exported functions from the rust generated staticlib still exported.
3265 if c.CcLibrary() && c.Shared() {
3266 c.WholeRustStaticlib = true
3267 }
Colin Cross6e511a92020-07-27 21:26:48 -07003268 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003269
Colin Cross6e511a92020-07-27 21:26:48 -07003270 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003271 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3272 if !isStaticLib {
3273 if !ctx.Config().AllowMissingDependencies() {
3274 ctx.ModuleErrorf("module %q is not a static library", depName)
3275 } else {
3276 ctx.AddMissingDependencies([]string{depName})
3277 }
3278 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003279 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003280
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003281 // Stubs lib doesn't link to the static lib dependencies. Don't set
3282 // linkFile, depFile, and ptr.
3283 if c.IsStubs() {
3284 break
3285 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003286
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003287 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3288 if libDepTag.wholeStatic {
3289 ptr = &depPaths.WholeStaticLibs
3290 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3291 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3292 } else {
3293 // This case normally catches prebuilt static
3294 // libraries, but it can also occur when
3295 // AllowMissingDependencies is on and the
3296 // dependencies has no sources of its own
3297 // but has a whole_static_libs dependency
3298 // on a missing library. We want to depend
3299 // on the .a file so that there is something
3300 // in the dependency tree that contains the
3301 // error rule for the missing transitive
3302 // dependency.
3303 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3304 }
3305 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3306 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3307 } else {
3308 switch libDepTag.Order {
3309 case earlyLibraryDependency:
3310 panic(fmt.Errorf("early static libs not supported"))
3311 case normalLibraryDependency:
3312 // static dependencies will be handled separately so they can be ordered
3313 // using transitive dependencies.
3314 ptr = nil
3315 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3316 case lateLibraryDependency:
3317 ptr = &depPaths.LateStaticLibs
3318 default:
3319 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3320 }
3321 }
3322
3323 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3324 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3325
3326 if libDepTag.unexportedSymbols {
3327 depPaths.LdFlags = append(depPaths.LdFlags,
3328 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3329 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003330 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003331 }
3332
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003333 if libDepTag.static() && !libDepTag.wholeStatic && !ccDep.RustLibraryInterface() {
Colin Cross6e511a92020-07-27 21:26:48 -07003334 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3335 ctx.ModuleErrorf("module %q not a static library", depName)
3336 return
3337 }
Logan Chien43d34c32017-12-20 01:17:32 +08003338
Colin Cross6e511a92020-07-27 21:26:48 -07003339 // When combining coverage files for shared libraries and executables, coverage files
3340 // in static libraries act as if they were whole static libraries. The same goes for
3341 // source based Abi dump files.
3342 if c, ok := ccDep.(*Module); ok {
3343 staticLib := c.linker.(libraryInterface)
3344 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3345 staticLib.objs().coverageFiles...)
3346 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3347 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003348 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003349 // Handle non-CC modules here
3350 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003351 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003352 }
3353 }
3354
Colin Cross6e511a92020-07-27 21:26:48 -07003355 if ptr != nil {
3356 if !linkFile.Valid() {
3357 if !ctx.Config().AllowMissingDependencies() {
3358 ctx.ModuleErrorf("module %q missing output file", depName)
3359 } else {
3360 ctx.AddMissingDependencies([]string{depName})
3361 }
3362 return
3363 }
3364 *ptr = append(*ptr, linkFile.Path())
3365 }
3366
3367 if depPtr != nil {
3368 dep := depFile
3369 if !dep.Valid() {
3370 dep = linkFile
3371 }
3372 *depPtr = append(*depPtr, dep.Path())
3373 }
3374
Colin Cross0de8a1e2020-09-18 14:15:30 -07003375 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3376 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3377 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3378 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003379 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3380
3381 // Only re-export RustRlibDeps for cc static libs
3382 if c.static() {
3383 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3384 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003385
3386 if libDepTag.reexportFlags {
3387 reexportExporter(depExporterInfo)
3388 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3389 // Re-exported shared library headers must be included as well since they can help us with type information
3390 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003391 c.sabi.Properties.ReexportedIncludes = append(
3392 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003393 c.sabi.Properties.ReexportedSystemIncludes = append(
3394 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003395 }
3396
Spandan Das3faa7922024-02-26 19:42:32 +00003397 makeLibName := MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName()) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003398 switch {
3399 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003400 c.Properties.AndroidMkHeaderLibs = append(
3401 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003402 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003403 // Note: the order of libs in this list is not important because
3404 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003405 c.Properties.AndroidMkSharedLibs = append(
3406 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003407 case libDepTag.static():
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003408 if !ccDep.RustLibraryInterface() {
3409 if libDepTag.wholeStatic {
3410 c.Properties.AndroidMkWholeStaticLibs = append(
3411 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3412 } else {
3413 c.Properties.AndroidMkStaticLibs = append(
3414 c.Properties.AndroidMkStaticLibs, makeLibName)
3415 }
Colin Cross6e511a92020-07-27 21:26:48 -07003416 }
3417 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003418 } else if !c.IsStubs() {
3419 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3420
Colin Cross6e511a92020-07-27 21:26:48 -07003421 switch depTag {
3422 case runtimeDepTag:
3423 c.Properties.AndroidMkRuntimeLibs = append(
Spandan Das3faa7922024-02-26 19:42:32 +00003424 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName())+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003425 case objDepTag:
3426 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3427 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003428 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003429 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003430 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003431 case dynamicLinkerDepTag:
3432 depPaths.DynamicLinker = linkFile
3433 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003434 }
Colin Crossca860ac2016-01-04 14:34:37 -08003435 })
3436
Jeff Gaston294356f2017-09-27 17:05:30 -07003437 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003438 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3439 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3440 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003441
Colin Crossdd84e052017-05-17 13:44:16 -07003442 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003443 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003444 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3445 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003446 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003447 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3448
Jiyong Park74955042019-10-22 20:19:51 +09003449 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3450 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003451 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003452 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003453 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003454 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003455
3456 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003457 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003458 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003459 }
Colin Crossdd84e052017-05-17 13:44:16 -07003460
Colin Crossca860ac2016-01-04 14:34:37 -08003461 return depPaths
3462}
3463
Spandan Das10c41362024-12-03 01:33:09 +00003464func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003465 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003466 bootstrap := false
Spandan Das10c41362024-12-03 01:33:09 +00003467 if linkable, ok := parent.(LinkableInterface); !ok {
3468 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
Jiyong Park7d55b612021-06-11 17:22:09 +09003469 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003470 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003471 bootstrap = linkable.Bootstrap()
3472 }
3473
Spandan Das10c41362024-12-03 01:33:09 +00003474 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003475
3476 useStubs := false
3477
Kiyoung Kimaa394802024-01-08 12:55:45 +09003478 if lib := moduleLibraryInterface(dep); lib.buildStubs() && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003479 if !apexInfo.IsForPlatform() {
3480 // For platform libraries, use current version of LLNDK
3481 // If this is for use_vendor apex we will apply the same rules
3482 // of apex sdk enforcement below to choose right version.
3483 useStubs = true
3484 }
3485 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3486 // If not building for APEX or the containing APEX allows the use of
3487 // platform APIs, use stubs only when it is from an APEX (and not from
3488 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3489 // bootstrap modules, always link to non-stub variant
3490 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3491
Spandan Dasff665182024-09-11 18:48:44 +00003492 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003493 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003494 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3495 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003496 }
3497
3498 return useStubs
3499}
3500
3501// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3502// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3503// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3504// has different level of updatability. For example, if a library foo in an APEX depends on a
3505// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3506// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3507// same APEX as foo, the non-stub variant of bar is used.
3508func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3509 depTag := ctx.OtherModuleDependencyTag(dep)
3510 libDepTag, ok := depTag.(libraryDependencyTag)
3511 if !ok || !libDepTag.shared() {
3512 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3513 }
3514
Colin Cross313aa542023-12-13 13:47:44 -08003515 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3516 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3517 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003518
3519 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003520 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003521 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003522 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3523 toUse := stubs[len(stubs)-1]
3524 sharedLibraryInfo = toUse.SharedLibraryInfo
3525 depExporterInfo = toUse.FlagExporterInfo
3526 }
3527 }
3528 return sharedLibraryInfo, depExporterInfo
3529}
3530
Colin Cross0de8a1e2020-09-18 14:15:30 -07003531// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3532// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003533// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003534// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003535func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3536 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003537 var staticPaths android.Paths
3538 for _, staticDep := range staticDeps {
3539 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3540 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3541 }
3542 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003543 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003544 }
3545 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3546
3547 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3548
3549 // reorder the dependencies based on transitive dependencies
3550 staticPaths = android.FirstUniquePaths(staticPaths)
3551 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3552
3553 if len(orderedStaticPaths) != len(staticPaths) {
3554 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3555 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3556 }
3557
3558 return orderedStaticPaths, transitiveStaticLibs
3559}
3560
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003561// BaseLibName trims known prefixes and suffixes
3562func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003563 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3564 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003565 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003566 return libName
3567}
3568
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003569func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003570 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003571 ccDepModule, _ := ccDep.(*Module)
3572 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003573 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003574
Justin Yuncbca3732021-02-03 19:24:13 +09003575 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003576 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003577 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003578 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003579
Ivan Lozanod1dec542021-05-26 15:33:11 -04003580 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003581 }
3582 }
3583
Kiyoung Kim22152f62024-05-24 10:45:28 +09003584 if ccDep.InVendorOrProduct() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003585 // The vendor and product modules in Make will have been renamed to not conflict with the
3586 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003587 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003588 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003589 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003590 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003591 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003592 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003593 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003594 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003595 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003596 } else {
3597 return libName
3598 }
3599}
3600
Colin Crossca860ac2016-01-04 14:34:37 -08003601func (c *Module) InstallInData() bool {
3602 if c.installer == nil {
3603 return false
3604 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003605 return c.installer.inData()
3606}
3607
3608func (c *Module) InstallInSanitizerDir() bool {
3609 if c.installer == nil {
3610 return false
3611 }
3612 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003613 return true
3614 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003615 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003616}
3617
Yifan Hong1b3348d2020-01-21 15:53:22 -08003618func (c *Module) InstallInRamdisk() bool {
3619 return c.InRamdisk()
3620}
3621
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003622func (c *Module) InstallInVendorRamdisk() bool {
3623 return c.InVendorRamdisk()
3624}
3625
Jiyong Parkf9332f12018-02-01 00:54:12 +09003626func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003627 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003628}
3629
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003630func (c *Module) MakeUninstallable() {
3631 if c.installer == nil {
3632 c.ModuleBase.MakeUninstallable()
3633 return
3634 }
3635 c.installer.makeUninstallable(c)
3636}
3637
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003638func (c *Module) HostToolPath() android.OptionalPath {
3639 if c.installer == nil {
3640 return android.OptionalPath{}
3641 }
3642 return c.installer.hostToolPath()
3643}
3644
Nan Zhangd4e641b2017-07-12 12:55:28 -07003645func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3646 return c.outputFile
3647}
3648
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003649func (c *Module) static() bool {
3650 if static, ok := c.linker.(interface {
3651 static() bool
3652 }); ok {
3653 return static.static()
3654 }
3655 return false
3656}
3657
Colin Cross6a730042024-12-05 13:53:43 -08003658func (c *Module) staticLibrary() bool {
3659 if static, ok := c.linker.(interface {
3660 staticLibrary() bool
3661 }); ok {
3662 return static.staticLibrary()
3663 }
3664 return false
3665}
3666
Jiyong Park379de2f2018-12-19 02:47:14 +09003667func (c *Module) staticBinary() bool {
3668 if static, ok := c.linker.(interface {
3669 staticBinary() bool
3670 }); ok {
3671 return static.staticBinary()
3672 }
3673 return false
3674}
3675
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003676func (c *Module) testBinary() bool {
3677 if test, ok := c.linker.(interface {
3678 testBinary() bool
3679 }); ok {
3680 return test.testBinary()
3681 }
3682 return false
3683}
3684
Jingwen Chen537242c2022-08-24 11:53:27 +00003685func (c *Module) testLibrary() bool {
3686 if test, ok := c.linker.(interface {
3687 testLibrary() bool
3688 }); ok {
3689 return test.testLibrary()
3690 }
3691 return false
3692}
3693
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003694func (c *Module) benchmarkBinary() bool {
3695 if b, ok := c.linker.(interface {
3696 benchmarkBinary() bool
3697 }); ok {
3698 return b.benchmarkBinary()
3699 }
3700 return false
3701}
3702
3703func (c *Module) fuzzBinary() bool {
3704 if f, ok := c.linker.(interface {
3705 fuzzBinary() bool
3706 }); ok {
3707 return f.fuzzBinary()
3708 }
3709 return false
3710}
3711
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003712// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3713func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003714 if h, ok := c.linker.(interface {
3715 header() bool
3716 }); ok {
3717 return h.header()
3718 }
3719 return false
3720}
3721
Ivan Lozanod7586b62021-04-01 09:49:36 -04003722func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003723 if b, ok := c.linker.(interface {
3724 binary() bool
3725 }); ok {
3726 return b.binary()
3727 }
3728 return false
3729}
3730
Justin Yun5e035862021-06-29 20:50:37 +09003731func (c *Module) StaticExecutable() bool {
3732 if b, ok := c.linker.(*binaryDecorator); ok {
3733 return b.static()
3734 }
3735 return false
3736}
3737
Ivan Lozanod7586b62021-04-01 09:49:36 -04003738func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003739 if o, ok := c.linker.(interface {
3740 object() bool
3741 }); ok {
3742 return o.object()
3743 }
3744 return false
3745}
3746
Kiyoung Kim37693d02024-04-04 09:56:15 +09003747func (m *Module) Dylib() bool {
3748 return false
3749}
3750
3751func (m *Module) Rlib() bool {
3752 return false
3753}
3754
Ivan Lozanof9e21722020-12-02 09:00:51 -05003755func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003756 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003757 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003758 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003759 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003760 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003761 return "native:product"
3762 }
Jooyung Han38002912019-05-16 04:01:54 +09003763 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003764 } else if c.InRamdisk() {
3765 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003766 } else if c.InVendorRamdisk() {
3767 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003768 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003769 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003770 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003771 return "native:ndk:none:none"
3772 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3773 //family, link := getNdkStlFamilyAndLinkType(c)
3774 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3775 } else {
3776 return "native:platform"
3777 }
3778}
3779
Jiyong Park9d452992018-10-03 00:38:19 +09003780// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003781// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003782func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003783 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003784 // Stub libs and prebuilt libs in a versioned SDK are not
3785 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003786 return lib.shared() && !lib.buildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003787 }
3788 return false
3789}
3790
Jiyong Parka90ca002019-10-07 15:47:24 +09003791func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003792 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3793}
3794
3795func (c *Module) ApexAvailableFor() []string {
3796 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003797 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003798 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003799 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003800 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003801 }
Yu Liub73c3a62024-12-10 00:58:06 +00003802
3803 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09003804}
3805
Paul Duffin0cb37b92020-03-04 14:52:46 +00003806func (c *Module) EverInstallable() bool {
3807 return c.installer != nil &&
3808 // Check to see whether the module is actually ever installable.
3809 c.installer.everInstallable()
3810}
3811
Ivan Lozanod7586b62021-04-01 09:49:36 -04003812func (c *Module) PreventInstall() bool {
3813 return c.Properties.PreventInstall
3814}
3815
3816func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003817 if c.library != nil {
3818 if i := c.library.installable(); i != nil {
3819 return i
3820 }
3821 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003822 return c.Properties.Installable
3823}
3824
3825func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003826 ret := c.EverInstallable() &&
3827 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003828 proptools.BoolDefault(c.Installable(), true) &&
3829 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003830
3831 // The platform variant doesn't need further condition. Apex variants however might not
3832 // be installable because it will likely to be included in the APEX and won't appear
3833 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003834 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003835 return ret
3836 }
3837
3838 // Special case for modules that are configured to be installed to /data, which includes
3839 // test modules. For these modules, both APEX and non-APEX variants are considered as
3840 // installable. This is because even the APEX variants won't be included in the APEX, but
3841 // will anyway be installed to /data/*.
3842 // See b/146995717
3843 if c.InstallInData() {
3844 return ret
3845 }
3846
3847 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003848}
3849
Logan Chien41eabe62019-04-10 13:33:58 +08003850func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3851 if c.linker != nil {
3852 if library, ok := c.linker.(*libraryDecorator); ok {
3853 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3854 }
3855 }
3856}
3857
Jiyong Park45bf82e2020-12-15 22:29:02 +09003858var _ android.ApexModule = (*Module)(nil)
3859
3860// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003861func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossc1b36442021-05-06 13:42:48 -07003862 if depTag == stubImplDepTag {
3863 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003864 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003865 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003866 if depTag == staticVariantTag {
3867 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3868 // actually mean that the static lib (and its dependencies) are copied into the
3869 // APEX.
3870 return false
3871 }
Colin Cross8acea3e2024-12-12 14:53:30 -08003872
3873 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3874 if isLibDepTag && c.static() && libDepTag.shared() {
3875 // shared_lib dependency from a static lib is considered as crossing
3876 // the APEX boundary because the dependency doesn't actually is
3877 // linked; the dependency is used only during the compilation phase.
3878 return false
3879 }
3880
3881 if isLibDepTag && libDepTag.excludeInApex {
3882 return false
3883 }
3884
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003885 return true
3886}
3887
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003888func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003889 if c.HasStubsVariants() {
3890 if IsSharedDepTag(depTag) {
3891 // dynamic dep to a stubs lib crosses APEX boundary
3892 return false
3893 }
3894 if IsRuntimeDepTag(depTag) {
3895 // runtime dep to a stubs lib also crosses APEX boundary
3896 return false
3897 }
3898 if IsHeaderDepTag(depTag) {
3899 return false
3900 }
3901 }
3902 if c.IsLlndk() {
3903 return false
3904 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003905
3906 return true
3907}
3908
Jiyong Park45bf82e2020-12-15 22:29:02 +09003909// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003910func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3911 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003912 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3913 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3914 return nil
3915 }
Jooyung Han749dc692020-04-15 11:03:39 +09003916 // We don't check for prebuilt modules
3917 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3918 return nil
3919 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003920
Jooyung Han749dc692020-04-15 11:03:39 +09003921 minSdkVersion := c.MinSdkVersion()
3922 if minSdkVersion == "apex_inherit" {
3923 return nil
3924 }
3925 if minSdkVersion == "" {
3926 // JNI libs within APK-in-APEX fall into here
3927 // Those are okay to set sdk_version instead
3928 // We don't have to check if this is a SDK variant because
3929 // non-SDK variant resets sdk_version, which works too.
3930 minSdkVersion = c.SdkVersion()
3931 }
Dan Albertc8060532020-07-22 22:32:17 -07003932 if minSdkVersion == "" {
3933 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3934 }
3935 // Not using nativeApiLevelFromUser because the context here is not
3936 // necessarily a native context.
3937 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003938 if err != nil {
3939 return err
3940 }
Dan Albertc8060532020-07-22 22:32:17 -07003941
Colin Cross8ca61c12022-10-06 21:00:14 -07003942 // A dependency only needs to support a min_sdk_version at least
3943 // as high as the api level that the architecture was introduced in.
3944 // This allows introducing new architectures in the platform that
3945 // need to be included in apexes that normally require an older
3946 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08003947 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07003948 if sdkVersion.LessThan(minApiForArch) {
3949 sdkVersion = minApiForArch
3950 }
3951
Dan Albertc8060532020-07-22 22:32:17 -07003952 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003953 return fmt.Errorf("newer SDK(%v)", ver)
3954 }
3955 return nil
3956}
3957
Paul Duffinb5769c12021-05-12 16:16:51 +01003958// Implements android.ApexModule
3959func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3960 // stub libraries and native bridge libraries are always available to platform
3961 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3962}
3963
Inseob Kima1888ce2022-10-04 14:42:02 +09003964func (c *Module) overriddenModules() []string {
3965 if o, ok := c.linker.(overridable); ok {
3966 return o.overriddenModules()
3967 }
3968 return nil
3969}
3970
Liz Kammer35ca77e2021-12-22 15:31:40 -05003971type moduleType int
3972
3973const (
3974 unknownType moduleType = iota
3975 binary
3976 object
3977 fullLibrary
3978 staticLibrary
3979 sharedLibrary
3980 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00003981 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00003982 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05003983)
3984
3985func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00003986 if c.testBinary() {
3987 // testBinary is also a binary, so this comes before the c.Binary()
3988 // conditional. A testBinary has additional implicit dependencies and
3989 // other test-only semantics.
3990 return testBin
3991 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003992 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003993 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003994 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00003995 } else if c.testLibrary() {
3996 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
3997 // will let them add implicit compile deps on gtest, for example.
3998 //
Liz Kammerefc51d92023-04-21 15:11:25 -04003999 // For now, treat them as regular libraries.
4000 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004001 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004002 static := false
4003 shared := false
4004 if library, ok := c.linker.(*libraryDecorator); ok {
4005 static = library.MutatedProperties.BuildStatic
4006 shared = library.MutatedProperties.BuildShared
4007 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4008 static = library.MutatedProperties.BuildStatic
4009 shared = library.MutatedProperties.BuildShared
4010 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004011 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004012 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004013 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004014 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004015 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004016 return staticLibrary
4017 }
4018 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004019 } else if c.isNDKStubLibrary() {
4020 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004021 }
4022 return unknownType
4023}
4024
Colin Crosscfad1192015-11-02 16:43:11 -08004025// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004026type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004027 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004028 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004029 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004030}
4031
Patrice Arrudac249c712019-03-19 17:00:29 -07004032// cc_defaults provides a set of properties that can be inherited by other cc
4033// modules. A module can use the properties from a cc_defaults using
4034// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4035// merged (when possible) by prepending the default module's values to the
4036// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004037func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004038 return DefaultsFactory()
4039}
4040
Colin Cross36242852017-06-23 15:06:31 -07004041func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004042 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004043
Colin Cross36242852017-06-23 15:06:31 -07004044 module.AddProperties(props...)
4045 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004046 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004047 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004048 &BaseCompilerProperties{},
4049 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004050 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004051 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004052 &StaticProperties{},
4053 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004054 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004055 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004056 &TestLinkerProperties{},
4057 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004058 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004059 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004060 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004061 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004062 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004063 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004064 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004065 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004066 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004067 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004068 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004069 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004070 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004071 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004072 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4073 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004074 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004075 )
Colin Crosscfad1192015-11-02 16:43:11 -08004076
Jooyung Hancc372c52019-09-25 15:18:44 +09004077 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004078
4079 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004080}
4081
Jiyong Park2286afd2020-06-16 21:58:53 +09004082func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004083 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004084}
4085
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004086func kytheExtractAllFactory() android.Singleton {
4087 return &kytheExtractAllSingleton{}
4088}
4089
4090type kytheExtractAllSingleton struct {
4091}
4092
4093func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4094 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004095 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004096 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004097 if len(files) > 0 {
4098 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004099 }
4100 })
4101 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4102 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004103 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004104 }
4105}
4106
Jihoon Kangf78a8902022-09-01 22:47:07 +00004107func (c *Module) Partition() string {
4108 if p, ok := c.installer.(interface {
4109 getPartition() string
4110 }); ok {
4111 return p.getPartition()
4112 }
4113 return ""
4114}
4115
Spandan Das2b6dfb52024-01-19 00:22:22 +00004116type sourceModuleName interface {
4117 sourceModuleName() string
4118}
4119
4120func (c *Module) BaseModuleName() string {
4121 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4122 // if the prebuilt module sets a source_module_name in Android.bp, use that
4123 return smn.sourceModuleName()
4124 }
4125 return c.ModuleBase.BaseModuleName()
4126}
4127
Spandan Dase20c56c2024-07-23 21:34:24 +00004128func (c *Module) stubsSymbolFilePath() android.Path {
4129 if library, ok := c.linker.(*libraryDecorator); ok {
4130 return library.stubsSymbolFilePath
4131 }
4132 return android.OptionalPath{}.Path()
4133}
4134
Colin Cross06a931b2015-10-28 17:23:31 -07004135var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004136var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004137var BoolPtr = proptools.BoolPtr
4138var String = proptools.String
4139var StringPtr = proptools.StringPtr