blob: 97d4533103027949fd42134be657a09679cebbd3 [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
Spandan Das20fce2d2023-04-12 17:21:39 +00001958 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08001959 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
1960 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00001961 return true
1962 }
1963 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08001964 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00001965 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
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002123 if Bool(c.Properties.Cmake_snapshot_supported) {
2124 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2125 }
2126
Chris Parsons94a0bba2021-06-04 15:03:47 -04002127 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002128
2129 if c.linker != nil {
2130 moduleInfoJSON := ctx.ModuleInfoJSON()
2131 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2132 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2133 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2134 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2135 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2136
2137 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2138 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2139 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2140 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2141
2142 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2143 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2144 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2145 moduleInfoJSON.SubName += ".cfi"
2146 }
2147 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2148 moduleInfoJSON.SubName += ".hwasan"
2149 }
2150 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2151 moduleInfoJSON.SubName += ".scs"
2152 }
2153 }
2154 moduleInfoJSON.SubName += c.Properties.SubName
2155
2156 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2157 moduleInfoJSON.Uninstallable = true
2158 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002159 }
Wei Lia1aa2972024-06-21 13:08:51 -07002160
2161 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002162
Cole Faust96a692b2024-08-08 14:47:51 -07002163 if b, ok := c.compiler.(*baseCompiler); ok {
2164 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2165 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2166 c.hasProto = b.hasSrcExt(ctx, ".proto")
2167 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2168 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2169 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2170 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2171 }
2172
Yu Liuec7043d2024-11-05 18:22:20 +00002173 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002174 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002175 }
2176 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002177 ccObjectInfo.ObjFiles = objs.objFiles
2178 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002179 }
Yu Liu4f825132024-12-18 00:35:39 +00002180 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002181 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2182 }
2183
Yu Liu986d98c2024-11-12 00:28:11 +00002184 android.SetProvider(ctx, LinkableInfoKey, LinkableInfo{
2185 StaticExecutable: c.StaticExecutable(),
2186 })
2187
Yu Liu323d77a2024-12-16 23:13:57 +00002188 ccInfo := CcInfo{
2189 HasStubsVariants: c.HasStubsVariants(),
2190 IsPrebuilt: c.IsPrebuilt(),
2191 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
2192 }
2193 if c.compiler != nil {
2194 ccInfo.CompilerInfo = &CompilerInfo{
2195 Srcs: c.compiler.(CompiledInterface).Srcs(),
2196 Cflags: c.compiler.baseCompilerProps().Cflags,
2197 AidlInterfaceInfo: AidlInterfaceInfo{
2198 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2199 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2200 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2201 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2202 },
2203 }
2204 switch decorator := c.compiler.(type) {
2205 case *libraryDecorator:
2206 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002207 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs,
Yu Liu323d77a2024-12-16 23:13:57 +00002208 }
2209 }
2210 }
2211 if c.linker != nil {
2212 ccInfo.LinkerInfo = &LinkerInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002213 WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs,
2214 StaticLibs: c.linker.baseLinkerProps().Static_libs,
2215 SharedLibs: c.linker.baseLinkerProps().Shared_libs,
2216 HeaderLibs: c.linker.baseLinkerProps().Header_libs,
2217 UnstrippedOutputFile: c.UnstrippedOutputFile(),
Yu Liu323d77a2024-12-16 23:13:57 +00002218 }
2219 switch decorator := c.linker.(type) {
2220 case *binaryDecorator:
2221 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2222 case *libraryDecorator:
2223 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{}
2224 case *testBinary:
2225 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2226 Gtest: decorator.testDecorator.gtest(),
2227 }
2228 case *benchmarkDecorator:
2229 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2230 case *objectLinker:
2231 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{}
2232 }
2233 }
Yu Liuffe86322024-12-18 18:53:12 +00002234 if c.library != nil {
2235 ccInfo.LibraryInfo = &LibraryInfo{
2236 StubsVersion: c.library.stubsVersion(),
2237 }
2238 }
Yu Liu323d77a2024-12-16 23:13:57 +00002239 android.SetProvider(ctx, CcInfoProvider, ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002240
mrziwangabdb2932024-06-18 12:43:41 -07002241 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002242
2243 if c.makeVarsInfo != nil {
2244 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2245 }
mrziwangabdb2932024-06-18 12:43:41 -07002246}
2247
Yu Liuec7043d2024-11-05 18:22:20 +00002248func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2249 if len(files) > 0 {
2250 ctx.SetOutputFiles(files, tag)
2251 }
2252}
2253
mrziwangabdb2932024-06-18 12:43:41 -07002254func (c *Module) setOutputFiles(ctx ModuleContext) {
2255 if c.outputFile.Valid() {
2256 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2257 } else {
2258 ctx.SetOutputFiles(android.Paths{}, "")
2259 }
2260 if c.linker != nil {
2261 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2262 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2263 }
Wei Lia1aa2972024-06-21 13:08:51 -07002264}
2265
2266func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2267 // Dump metadata that can not be done in android/compliance-metadata.go
2268 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
2269 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static()))
2270 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2271
2272 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002273 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002274 staticDepNames := make([]string, 0, len(staticDeps))
2275 for _, dep := range staticDeps {
2276 staticDepNames = append(staticDepNames, dep.Name())
2277 }
2278
2279 staticDepPaths := make([]string, 0, len(deps.StaticLibs))
2280 for _, dep := range deps.StaticLibs {
2281 staticDepPaths = append(staticDepPaths, dep.String())
2282 }
2283 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2284 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2285
2286 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002287 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002288 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2289 for _, dep := range wholeStaticDeps {
2290 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2291 }
2292
2293 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2294 for _, dep := range deps.WholeStaticLibs {
2295 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2296 }
2297 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2298 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002299}
2300
2301func (c *Module) maybeUnhideFromMake() {
2302 // If a lib is directly included in any of the APEXes or is not available to the
2303 // platform (which is often the case when the stub is provided as a prebuilt),
2304 // unhide the stubs variant having the latest version gets visible to make. In
2305 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2306 // force anything in the make world to link against the stubs library. (unless it
2307 // is explicitly referenced via .bootstrap suffix or the module is marked with
2308 // 'bootstrap: true').
2309 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002310 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002311 c.IsStubs() && !c.InVendorRamdisk() {
2312 c.Properties.HideFromMake = false // unhide
2313 // Note: this is still non-installable
2314 }
2315}
2316
Colin Cross8ff10582023-12-07 13:10:56 -08002317// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2318// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002319func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002320 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002321 // If the module has been specifically configure to not be installed then
2322 // hide from make as otherwise it will break when running inside make
2323 // as the output path to install will not be specified. Not all uninstallable
2324 // modules can be hidden from make as some are needed for resolving make side
2325 // dependencies.
2326 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002327 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002328 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002329 c.SkipInstall()
2330 }
2331
2332 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2333 // to allow using the outputs in a genrule.
2334 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002335 c.installer.install(ctx, c.outputFile.Path())
2336 if ctx.Failed() {
2337 return
Colin Crossca860ac2016-01-04 14:34:37 -08002338 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002339 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002340}
2341
Colin Cross0ea8ba82019-06-06 14:33:29 -07002342func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002343 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002344 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002345 }
Colin Crossca860ac2016-01-04 14:34:37 -08002346 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002347}
2348
Colin Crossca860ac2016-01-04 14:34:37 -08002349func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002350 for _, generator := range c.generators {
2351 generator.GeneratorInit(ctx)
2352 }
Colin Crossca860ac2016-01-04 14:34:37 -08002353 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002354 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002355 }
Colin Crossca860ac2016-01-04 14:34:37 -08002356 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002357 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002358 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002359 if c.stl != nil {
2360 c.stl.begin(ctx)
2361 }
Colin Cross16b23492016-01-06 14:41:07 -08002362 if c.sanitize != nil {
2363 c.sanitize.begin(ctx)
2364 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002365 if c.coverage != nil {
2366 c.coverage.begin(ctx)
2367 }
Yi Kong9723e332023-12-04 14:52:53 +09002368 if c.afdo != nil {
2369 c.afdo.begin(ctx)
2370 }
Stephen Craneba090d12017-05-09 15:44:35 -07002371 if c.lto != nil {
2372 c.lto.begin(ctx)
2373 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002374 if c.orderfile != nil {
2375 c.orderfile.begin(ctx)
2376 }
Dan Albert92fe7402020-07-15 13:33:30 -07002377 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002378 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002379 if err != nil {
2380 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002381 c.Properties.Sdk_version = nil
2382 } else {
2383 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002384 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002385 }
Colin Crossca860ac2016-01-04 14:34:37 -08002386}
2387
Colin Cross37047f12016-12-13 17:06:13 -08002388func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002389 deps := Deps{}
2390
Joe Onorato37f900c2023-07-18 16:58:16 -07002391 for _, generator := range c.generators {
2392 deps = generator.GeneratorDeps(ctx, deps)
2393 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002394 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002395 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002396 }
2397 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002398 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002399 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002400 if c.stl != nil {
2401 deps = c.stl.deps(ctx, deps)
2402 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002403 if c.coverage != nil {
2404 deps = c.coverage.deps(ctx, deps)
2405 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002406
Colin Crossb6715442017-10-24 11:13:31 -07002407 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2408 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2409 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2410 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2411 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2412 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002413 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002414 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002415
Colin Cross516c5452024-10-28 13:45:21 -07002416 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2417 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2418 }
2419
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002420 for _, lib := range deps.ReexportSharedLibHeaders {
2421 if !inList(lib, deps.SharedLibs) {
2422 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2423 }
2424 }
2425
2426 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002427 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2428 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 -07002429 }
2430 }
2431
Colin Cross5950f382016-12-13 12:50:57 -08002432 for _, lib := range deps.ReexportHeaderLibHeaders {
2433 if !inList(lib, deps.HeaderLibs) {
2434 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2435 }
2436 }
2437
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002438 for _, gen := range deps.ReexportGeneratedHeaders {
2439 if !inList(gen, deps.GeneratedHeaders) {
2440 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2441 }
2442 }
2443
Colin Crossc99deeb2016-04-11 15:06:20 -07002444 return deps
2445}
2446
Colin Cross516c5452024-10-28 13:45:21 -07002447func checkConflictingExplicitVersions(libs []string) error {
2448 withoutVersion := func(s string) string {
2449 name, _ := StubsLibNameAndVersion(s)
2450 return name
2451 }
2452 var errs []error
2453 for i, lib := range libs {
2454 libName := withoutVersion(lib)
2455 libsToCompare := libs[i+1:]
2456 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2457 return withoutVersion(s) == libName
2458 })
2459 if j >= 0 {
2460 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2461 lib, libsToCompare[j]))
2462 }
2463 }
2464 return errors.Join(errs...)
2465}
2466
Dan Albert7e9d2952016-08-04 13:02:36 -07002467func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002468 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002469 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002470 moduleContextImpl: moduleContextImpl{
2471 mod: c,
2472 },
2473 }
2474 ctx.ctx = ctx
2475
Colin Crossca860ac2016-01-04 14:34:37 -08002476 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002477}
2478
Jiyong Park7ed9de32018-10-15 22:25:07 +09002479// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002480func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002481 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2482 version := name[sharp+1:]
2483 libname := name[:sharp]
2484 return libname, version
2485 }
2486 return name, ""
2487}
2488
Dan Albert92fe7402020-07-15 13:33:30 -07002489func GetCrtVariations(ctx android.BottomUpMutatorContext,
2490 m LinkableInterface) []blueprint.Variation {
2491 if ctx.Os() != android.Android {
2492 return nil
2493 }
2494 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002495 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2496 minSdkVersion := m.MinSdkVersion()
2497 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2498 minSdkVersion = m.SdkVersion()
2499 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002500 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2501 if err != nil {
2502 ctx.PropertyErrorf("min_sdk_version", err.Error())
2503 }
Colin Cross363ec762023-01-13 13:45:14 -08002504
2505 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002506 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002507 if apiLevel.LessThan(minApiForArch) {
2508 apiLevel = minApiForArch
2509 }
2510
Dan Albert92fe7402020-07-15 13:33:30 -07002511 return []blueprint.Variation{
2512 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002513 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002514 }
2515 }
2516 return []blueprint.Variation{
2517 {Mutator: "sdk", Variation: ""},
2518 }
2519}
2520
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002521func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2522 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002523
2524 variations = append([]blueprint.Variation(nil), variations...)
2525
Liz Kammer23942242022-04-08 15:41:00 -04002526 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002527 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002528 if version == "impl" {
2529 version = ""
2530 }
Colin Crosse7257d22020-09-24 09:56:18 -07002531 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002532 if tag, ok := depTag.(libraryDependencyTag); ok {
2533 tag.explicitlyVersioned = true
Colin Crossafcdce82024-10-22 13:59:33 -07002534 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2535 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2536 // the modified copy to depTag.
2537 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002538 } else {
2539 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2540 }
Colin Crosse7257d22020-09-24 09:56:18 -07002541 }
Colin Crosse7257d22020-09-24 09:56:18 -07002542
Colin Cross0de8a1e2020-09-18 14:15:30 -07002543 if far {
2544 ctx.AddFarVariationDependencies(variations, depTag, name)
2545 } else {
2546 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002547 }
2548}
2549
Kiyoung Kim487689e2022-07-26 09:48:22 +09002550func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2551 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002552 return snapshot
2553 }
2554
2555 return lib
2556}
2557
Kiyoung Kim37693d02024-04-04 09:56:15 +09002558// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002559// of names:
2560//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002561// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002562//
2563// For each of these, it adds the name of the ndk_library module to the list of
2564// variant libs.
2565//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002566// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002567//
2568// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002569//
2570// The caller can then know to add the variantLibs dependencies differently from the
2571// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002572func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002573 variantLibs = []string{}
2574
2575 nonvariantLibs = []string{}
2576 for _, entry := range list {
2577 // strip #version suffix out
2578 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002579 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002580 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002581 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002582 nonvariantLibs = append(nonvariantLibs, entry)
2583 }
2584 }
2585 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002586
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002587}
2588
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002589func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2590 nonVariantLibs := []string{}
2591 variantLibs := []string{}
2592
2593 for _, lib := range libs {
2594 replaceLibName := GetReplaceModuleName(lib, replaceList)
2595 if replaceLibName == lib {
2596 // Do not handle any libs which are not in API imports
2597 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2598 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2599 variantLibs = append(variantLibs, replaceLibName)
2600 } else {
2601 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2602 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002603 }
2604
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002605 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002606}
2607
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002608func (c *Module) shouldUseApiSurface() bool {
2609 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2610 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2611 // LLNDK Variant
2612 return true
2613 }
2614
2615 if c.Properties.IsSdkVariant {
2616 // NDK Variant
2617 return true
2618 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002619 }
2620
2621 return false
2622}
2623
Colin Cross1e676be2016-10-12 14:38:15 -07002624func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002625 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002626 return
2627 }
2628
Colin Cross37047f12016-12-13 17:06:13 -08002629 ctx := &depsContext{
2630 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002631 moduleContextImpl: moduleContextImpl{
2632 mod: c,
2633 },
2634 }
2635 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002636
Colin Crossc99deeb2016-04-11 15:06:20 -07002637 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002638
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002639 apiNdkLibs := []string{}
2640 apiLateNdkLibs := []string{}
2641
Yo Chiang219968c2020-09-22 18:45:04 +08002642 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2643
Dan Albert914449f2016-06-17 16:45:24 -07002644 variantNdkLibs := []string{}
2645 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002646 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002647 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2648 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2649 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002650 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002651
Colin Cross32ec36c2016-12-15 07:39:51 -08002652 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002653 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002654 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002655 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002656 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002657
Spandan Das73bcafc2022-08-18 23:26:00 +00002658 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002659 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2660 if variationExists {
2661 actx.AddVariationDependencies(nil, depTag, lib)
2662 } else {
2663 // dependencies to ndk_headers fall here as ndk_headers do not have
2664 // any variants.
2665 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2666 }
Spandan Dasff665182024-09-11 18:48:44 +00002667 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002668 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002669 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002670 } else {
2671 actx.AddVariationDependencies(nil, depTag, lib)
2672 }
2673 }
2674
Dan Albertf1d14c72020-07-30 14:32:55 -07002675 if c.isNDKStubLibrary() {
2676 // NDK stubs depend on their implementation because the ABI dumps are
2677 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002678
Spandan Das8b08aea2023-03-14 19:29:34 +00002679 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2680 c.ImageVariation(),
2681 blueprint.Variation{Mutator: "link", Variation: "shared"},
2682 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002683 }
2684
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002685 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2686 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2687 c.Target().NativeBridge == android.NativeBridgeDisabled {
2688 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002689 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002690 llndkHeaderLibTag,
2691 deps.LlndkHeaderLibs...)
2692 }
2693
Jiyong Park5d1598f2019-02-25 22:14:17 +09002694 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002695 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002696
Jiyong Park5d1598f2019-02-25 22:14:17 +09002697 actx.AddVariationDependencies([]blueprint.Variation{
2698 {Mutator: "link", Variation: "static"},
2699 }, depTag, lib)
2700 }
2701
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002702 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002703 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002704 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002705
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002706 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002707 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002708 }
Jiyong Parke3867542020-12-03 17:28:25 +09002709 if inList(lib, deps.ExcludeLibsForApex) {
2710 depTag.excludeInApex = true
2711 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002712 actx.AddVariationDependencies([]blueprint.Variation{
2713 {Mutator: "link", Variation: "static"},
2714 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002715 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002716
Jooyung Han75568392020-03-20 04:29:24 +09002717 // staticUnwinderDep is treated as staticDep for Q apexes
2718 // so that native libraries/binaries are linked with static unwinder
2719 // because Q libc doesn't have unwinder APIs
2720 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002721 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002722 actx.AddVariationDependencies([]blueprint.Variation{
2723 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002724 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002725 }
2726
Jiyong Park7ed9de32018-10-15 22:25:07 +09002727 // shared lib names without the #version suffix
2728 var sharedLibNames []string
2729
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002730 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002731 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002732 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002733 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002734 }
Jiyong Parke3867542020-12-03 17:28:25 +09002735 if inList(lib, deps.ExcludeLibsForApex) {
2736 depTag.excludeInApex = true
2737 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002738 if inList(lib, deps.ExcludeLibsForNonApex) {
2739 depTag.excludeInNonApex = true
2740 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002741
Jiyong Park73c54ee2019-10-22 20:31:18 +09002742 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002743 sharedLibNames = append(sharedLibNames, name)
2744
Colin Crosse7257d22020-09-24 09:56:18 -07002745 variations := []blueprint.Variation{
2746 {Mutator: "link", Variation: "shared"},
2747 }
Spandan Dasff665182024-09-11 18:48:44 +00002748 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002749 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002750
Colin Crossfe9acfe2021-06-14 16:13:03 -07002751 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002752 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002753 actx.AddVariationDependencies([]blueprint.Variation{
2754 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002755 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002756 }
2757
Colin Cross3e5e7782022-06-17 22:17:05 +00002758 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002759 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002760 actx.AddVariationDependencies([]blueprint.Variation{
2761 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002762 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002763 }
2764
Jiyong Park7ed9de32018-10-15 22:25:07 +09002765 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002766 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002767 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2768 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2769 // linking against both the stubs lib and the non-stubs lib at the same time.
2770 continue
2771 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002772 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002773 variations := []blueprint.Variation{
2774 {Mutator: "link", Variation: "shared"},
2775 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002776 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002777 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002778
Dan Willemsen59339a22018-07-22 21:18:45 -07002779 actx.AddVariationDependencies([]blueprint.Variation{
2780 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002781 }, dataLibDepTag, deps.DataLibs...)
2782
Colin Crossc8caa062021-09-24 16:50:14 -07002783 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2784
Chris Parsons79d66a52020-06-05 17:26:16 -04002785 actx.AddVariationDependencies([]blueprint.Variation{
2786 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002787 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002788
Colin Cross68861832016-07-08 10:41:41 -07002789 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002790
2791 for _, gen := range deps.GeneratedHeaders {
2792 depTag := genHeaderDepTag
2793 if inList(gen, deps.ReexportGeneratedHeaders) {
2794 depTag = genHeaderExportDepTag
2795 }
2796 actx.AddDependency(c, depTag, gen)
2797 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002798
Cole Faust65cb40a2024-10-21 15:41:42 -07002799 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2800 depTag := genHeaderDepTag
2801 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2802 }
2803
Dan Albert92fe7402020-07-15 13:33:30 -07002804 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002805 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002806 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002807 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002808 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002809 }
Colin Crossc465efd2021-06-11 18:00:04 -07002810 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002811 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002812 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002813 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002814 if deps.DynamicLinker != "" {
2815 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002816 }
Dan Albert914449f2016-06-17 16:45:24 -07002817
2818 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002819
Colin Cross8acea3e2024-12-12 14:53:30 -08002820 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002821 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002822 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002823 {Mutator: "link", Variation: "shared"},
2824 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002825 actx.AddVariationDependencies([]blueprint.Variation{
2826 {Mutator: "version", Variation: version},
2827 {Mutator: "link", Variation: "shared"},
2828 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002829
Colin Cross8acea3e2024-12-12 14:53:30 -08002830 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002831 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002832 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002833 {Mutator: "link", Variation: "shared"},
2834 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002835 actx.AddVariationDependencies([]blueprint.Variation{
2836 {Mutator: "version", Variation: version},
2837 {Mutator: "link", Variation: "shared"},
2838 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002839
Vinh Tran367d89d2023-04-28 11:21:25 -04002840 if len(deps.AidlLibs) > 0 {
2841 actx.AddDependency(
2842 c,
2843 aidlLibraryTag,
2844 deps.AidlLibs...,
2845 )
2846 }
2847
Colin Cross6362e272015-10-29 15:25:03 -07002848}
Colin Cross21b9a242015-03-24 14:15:58 -07002849
Colin Crosse40b4ea2018-10-02 22:25:58 -07002850func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002851 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002852 c.beginMutator(ctx)
2853 }
2854}
2855
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002856// Whether a module can link to another module, taking into
2857// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002858func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002859 tag blueprint.DependencyTag) {
2860
2861 switch t := tag.(type) {
2862 case dependencyTag:
2863 if t != vndkExtDepTag {
2864 return
2865 }
2866 case libraryDependencyTag:
2867 default:
2868 return
2869 }
2870
Ivan Lozanof9e21722020-12-02 09:00:51 -05002871 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002872 // Host code is not restricted
2873 return
2874 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002875
Ivan Lozano52767be2019-10-18 14:49:46 -07002876 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002877 // Platform code can link to anything
2878 return
2879 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002880 if from.InRamdisk() {
2881 // Ramdisk code is not NDK
2882 return
2883 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002884 if from.InVendorRamdisk() {
2885 // Vendor ramdisk code is not NDK
2886 return
2887 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002888 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002889 // Recovery code is not NDK
2890 return
2891 }
Colin Cross31076b32020-10-23 17:22:06 -07002892 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002893 if c.StubDecorator() {
2894 // These aren't real libraries, but are the stub shared libraries that are included in
2895 // the NDK.
2896 return
2897 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002898 }
Logan Chien834b9a62019-01-14 15:39:03 +08002899
Ivan Lozano52767be2019-10-18 14:49:46 -07002900 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002901 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2902 // to link to libc++ (non-NDK and without sdk_version).
2903 return
2904 }
2905
Ivan Lozano52767be2019-10-18 14:49:46 -07002906 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002907 // NDK code linking to platform code is never okay.
2908 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002909 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002910 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002911 }
2912
2913 // At this point we know we have two NDK libraries, but we need to
2914 // check that we're not linking against anything built against a higher
2915 // API level, as it is only valid to link against older or equivalent
2916 // APIs.
2917
Inseob Kim01a28722018-04-11 09:48:45 +09002918 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002919 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002920 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002921 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002922 // Current can't be linked against by anything else.
2923 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002924 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002925 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002926 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002927 if err != nil {
2928 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002929 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002930 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002931 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002932 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002933 if err != nil {
2934 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002935 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002936 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002937 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002938
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002939 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09002940 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002941 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002942 }
2943 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002944 }
Dan Albert202fe492017-12-15 13:56:59 -08002945
2946 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002947 fromStl := from.SelectedStl()
2948 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002949 if fromStl == "" || toStl == "" {
2950 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002951 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002952 // We can be permissive with the system "STL" since it is only the C++
2953 // ABI layer, but in the future we should make sure that everyone is
2954 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002955 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002956 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002957 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2958 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002959 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002960}
2961
Jooyung Han479ca172020-10-19 18:51:07 +09002962func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2963 if c, ok := ctx.Module().(*Module); ok {
2964 ctx.VisitDirectDeps(func(dep android.Module) {
2965 depTag := ctx.OtherModuleDependencyTag(dep)
2966 ccDep, ok := dep.(LinkableInterface)
2967 if ok {
2968 checkLinkType(ctx, c, ccDep, depTag)
2969 }
2970 })
2971 }
2972}
2973
Jiyong Park5fb8c102018-04-09 12:03:06 +09002974// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002975// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2976// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002977// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07002978func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002979 check := func(child, parent android.Module) bool {
2980 to, ok := child.(*Module)
2981 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002982 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002983 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002984
Jooyung Hana70f0672019-01-18 15:20:43 +09002985 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2986 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002987 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002988
Jiyong Park0474e1f2021-01-14 14:26:06 +09002989 // These dependencies are not excercised at runtime. Tracking these will give us
2990 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002991 depTag := ctx.OtherModuleDependencyTag(child)
2992 if IsHeaderDepTag(depTag) {
2993 return false
2994 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002995 if depTag == staticVariantTag {
2996 return false
2997 }
2998 if depTag == stubImplDepTag {
2999 return false
3000 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003001 if depTag == android.RequiredDepTag {
3002 return false
3003 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003004
Justin Yun63e9ec72020-10-29 16:49:43 +09003005 // Even if target lib has no vendor variant, keep checking dependency
3006 // graph in case it depends on vendor_available or product_available
3007 // but not double_loadable transtively.
3008 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003009 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003010 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003011
Jiyong Park0474e1f2021-01-14 14:26:06 +09003012 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3013 // one.
3014 if Bool(to.VendorProperties.Double_loadable) {
3015 return true
3016 }
3017
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003018 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003019 return false
3020 }
3021
Jooyung Hana70f0672019-01-18 15:20:43 +09003022 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3023 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003024 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003025 return false
3026 }
3027 if module, ok := ctx.Module().(*Module); ok {
3028 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003029 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003030 ctx.WalkDeps(check)
3031 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003032 }
3033 }
3034}
3035
Yu Liue4312402023-01-18 09:15:31 -08003036func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3037 // For the dependency from platform to apex, use the latest stubs
3038 apexSdkVersion := android.FutureApiLevel
3039 if !apexInfo.IsForPlatform() {
3040 apexSdkVersion = apexInfo.MinSdkVersion
3041 }
3042
3043 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3044 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3045 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3046 // (b/144430859)
3047 apexSdkVersion = android.FutureApiLevel
3048 }
3049
3050 return apexSdkVersion
3051}
3052
Colin Crossc99deeb2016-04-11 15:06:20 -07003053// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003054func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003055 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003056
Colin Cross0de8a1e2020-09-18 14:15:30 -07003057 var directStaticDeps []StaticLibraryInfo
3058 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003059
Colin Cross0de8a1e2020-09-18 14:15:30 -07003060 reexportExporter := func(exporter FlagExporterInfo) {
3061 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3062 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3063 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3064 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3065 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003066 }
3067
Colin Crossff694a82023-12-13 15:54:49 -08003068 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003069 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003070
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003071 skipModuleList := map[string]bool{}
3072
Colin Crossd11fcda2017-10-23 17:59:01 -07003073 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003074 depName := ctx.OtherModuleName(dep)
3075 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003076
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003077 if _, ok := skipModuleList[depName]; ok {
3078 // skip this module because original module or API imported module matching with this should be used instead.
3079 return
3080 }
3081
Dan Willemsen47450072021-10-19 20:24:49 -07003082 if depTag == android.DarwinUniversalVariantTag {
3083 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3084 return
3085 }
3086
Vinh Tran367d89d2023-04-28 11:21:25 -04003087 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003088 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003089 depPaths.AidlLibraryInfos = append(
3090 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003091 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003092 )
3093 }
3094 }
3095
Ivan Lozano52767be2019-10-18 14:49:46 -07003096 ccDep, ok := dep.(LinkableInterface)
3097 if !ok {
3098
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003099 // handling for a few module types that aren't cc Module but that are also supported
3100 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003101 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003102 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003103 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3104 genRule.GeneratedSourceFiles()...)
3105 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003106 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003107 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003108 // Support exported headers from a generated_sources dependency
3109 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003110 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003111 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003112 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003113 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003114 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003115 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003116 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003117 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003118 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3119 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003120 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003121 // 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 +09003122 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003123
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003124 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003125 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003126 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003127 }
Colin Crosscef792e2021-06-11 18:01:26 -07003128 case CrtBeginDepTag:
3129 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3130 case CrtEndDepTag:
3131 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003132 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003133 return
3134 }
3135
Colin Crossfe17f6f2019-03-28 19:30:56 -07003136 if depTag == android.ProtoPluginDepTag {
3137 return
3138 }
3139
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003140 if depTag == android.RequiredDepTag {
3141 return
3142 }
3143
Colin Crossd11fcda2017-10-23 17:59:01 -07003144 if dep.Target().Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003145 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 -07003146 return
3147 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003148 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003149 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3150 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003151 return
3152 }
3153
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003154 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003155 // Skip reused objects for stub libraries, they use their own stub object file instead.
3156 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3157 // version mutator, so the stubs variant is created from the shared variant that
3158 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003159 if !c.library.buildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003160 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003161 objs := staticAnalogue.ReuseObjects
3162 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003163 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003164 reexportExporter(depExporterInfo)
3165 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003166 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003167 }
3168
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003169 if depTag == llndkHeaderLibTag {
3170 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3171 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3172 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3173 }
3174
Colin Cross6e511a92020-07-27 21:26:48 -07003175 linkFile := ccDep.OutputFile()
3176
3177 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3178 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003179 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003180 return
3181 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003182
Jiyong Parke3867542020-12-03 17:28:25 +09003183 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3184 return
3185 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003186 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3187 return
3188 }
Jiyong Parke3867542020-12-03 17:28:25 +09003189
Colin Cross313aa542023-12-13 13:47:44 -08003190 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003191
Colin Cross6e511a92020-07-27 21:26:48 -07003192 var ptr *android.Paths
3193 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003194
Colin Cross6e511a92020-07-27 21:26:48 -07003195 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003196
Colin Cross6e511a92020-07-27 21:26:48 -07003197 switch {
3198 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003199 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003200 if !ctx.Config().AllowMissingDependencies() {
3201 ctx.ModuleErrorf("module %q is not a header library", depName)
3202 } else {
3203 ctx.AddMissingDependencies([]string{depName})
3204 }
3205 return
3206 }
Colin Cross6e511a92020-07-27 21:26:48 -07003207 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003208 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003209 if !ctx.Config().AllowMissingDependencies() {
3210 ctx.ModuleErrorf("module %q is not a shared library", depName)
3211 } else {
3212 ctx.AddMissingDependencies([]string{depName})
3213 }
3214 return
3215 }
Jiyong Parke3867542020-12-03 17:28:25 +09003216
Jiyong Park7d55b612021-06-11 17:22:09 +09003217 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3218 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003219
Jiyong Park1ad8e162020-12-01 23:40:09 +09003220 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3221 // linkFile, depFile, and ptr.
3222 if c.IsStubs() {
3223 break
3224 }
3225
Colin Cross0de8a1e2020-09-18 14:15:30 -07003226 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3227 depFile = sharedLibraryInfo.TableOfContents
3228
Colin Crossb614cd42024-10-11 12:52:21 -07003229 if !sharedLibraryInfo.IsStubs {
3230 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3231 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3232 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3233 }
3234 }
3235
Colin Cross6e511a92020-07-27 21:26:48 -07003236 ptr = &depPaths.SharedLibs
3237 switch libDepTag.Order {
3238 case earlyLibraryDependency:
3239 ptr = &depPaths.EarlySharedLibs
3240 depPtr = &depPaths.EarlySharedLibsDeps
3241 case normalLibraryDependency:
3242 ptr = &depPaths.SharedLibs
3243 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003244 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003245 case lateLibraryDependency:
3246 ptr = &depPaths.LateSharedLibs
3247 depPtr = &depPaths.LateSharedLibsDeps
3248 default:
3249 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003250 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003251
Colin Cross6e511a92020-07-27 21:26:48 -07003252 case libDepTag.static():
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003253 if ccDep.RustLibraryInterface() {
3254 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: ccDep.CrateName(), LinkDirs: ccDep.ExportedCrateLinkDirs()}
3255 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3256 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3257 if libDepTag.wholeStatic {
3258 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3259 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003260
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003261 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3262 // exported functions from the rust generated staticlib still exported.
3263 if c.CcLibrary() && c.Shared() {
3264 c.WholeRustStaticlib = true
3265 }
Colin Cross6e511a92020-07-27 21:26:48 -07003266 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003267
Colin Cross6e511a92020-07-27 21:26:48 -07003268 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003269 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3270 if !isStaticLib {
3271 if !ctx.Config().AllowMissingDependencies() {
3272 ctx.ModuleErrorf("module %q is not a static library", depName)
3273 } else {
3274 ctx.AddMissingDependencies([]string{depName})
3275 }
3276 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003277 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003278
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003279 // Stubs lib doesn't link to the static lib dependencies. Don't set
3280 // linkFile, depFile, and ptr.
3281 if c.IsStubs() {
3282 break
3283 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003284
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003285 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3286 if libDepTag.wholeStatic {
3287 ptr = &depPaths.WholeStaticLibs
3288 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3289 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3290 } else {
3291 // This case normally catches prebuilt static
3292 // libraries, but it can also occur when
3293 // AllowMissingDependencies is on and the
3294 // dependencies has no sources of its own
3295 // but has a whole_static_libs dependency
3296 // on a missing library. We want to depend
3297 // on the .a file so that there is something
3298 // in the dependency tree that contains the
3299 // error rule for the missing transitive
3300 // dependency.
3301 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3302 }
3303 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3304 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3305 } else {
3306 switch libDepTag.Order {
3307 case earlyLibraryDependency:
3308 panic(fmt.Errorf("early static libs not supported"))
3309 case normalLibraryDependency:
3310 // static dependencies will be handled separately so they can be ordered
3311 // using transitive dependencies.
3312 ptr = nil
3313 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3314 case lateLibraryDependency:
3315 ptr = &depPaths.LateStaticLibs
3316 default:
3317 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3318 }
3319 }
3320
3321 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3322 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3323
3324 if libDepTag.unexportedSymbols {
3325 depPaths.LdFlags = append(depPaths.LdFlags,
3326 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3327 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003328 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003329 }
3330
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003331 if libDepTag.static() && !libDepTag.wholeStatic && !ccDep.RustLibraryInterface() {
Colin Cross6e511a92020-07-27 21:26:48 -07003332 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3333 ctx.ModuleErrorf("module %q not a static library", depName)
3334 return
3335 }
Logan Chien43d34c32017-12-20 01:17:32 +08003336
Colin Cross6e511a92020-07-27 21:26:48 -07003337 // When combining coverage files for shared libraries and executables, coverage files
3338 // in static libraries act as if they were whole static libraries. The same goes for
3339 // source based Abi dump files.
3340 if c, ok := ccDep.(*Module); ok {
3341 staticLib := c.linker.(libraryInterface)
3342 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3343 staticLib.objs().coverageFiles...)
3344 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3345 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003346 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003347 // Handle non-CC modules here
3348 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003349 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003350 }
3351 }
3352
Colin Cross6e511a92020-07-27 21:26:48 -07003353 if ptr != nil {
3354 if !linkFile.Valid() {
3355 if !ctx.Config().AllowMissingDependencies() {
3356 ctx.ModuleErrorf("module %q missing output file", depName)
3357 } else {
3358 ctx.AddMissingDependencies([]string{depName})
3359 }
3360 return
3361 }
3362 *ptr = append(*ptr, linkFile.Path())
3363 }
3364
3365 if depPtr != nil {
3366 dep := depFile
3367 if !dep.Valid() {
3368 dep = linkFile
3369 }
3370 *depPtr = append(*depPtr, dep.Path())
3371 }
3372
Colin Cross0de8a1e2020-09-18 14:15:30 -07003373 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3374 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3375 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3376 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003377 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3378
3379 // Only re-export RustRlibDeps for cc static libs
3380 if c.static() {
3381 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3382 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003383
3384 if libDepTag.reexportFlags {
3385 reexportExporter(depExporterInfo)
3386 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3387 // Re-exported shared library headers must be included as well since they can help us with type information
3388 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003389 c.sabi.Properties.ReexportedIncludes = append(
3390 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003391 c.sabi.Properties.ReexportedSystemIncludes = append(
3392 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003393 }
3394
Spandan Das3faa7922024-02-26 19:42:32 +00003395 makeLibName := MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName()) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003396 switch {
3397 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003398 c.Properties.AndroidMkHeaderLibs = append(
3399 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003400 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003401 // Note: the order of libs in this list is not important because
3402 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003403 c.Properties.AndroidMkSharedLibs = append(
3404 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003405 case libDepTag.static():
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003406 if !ccDep.RustLibraryInterface() {
3407 if libDepTag.wholeStatic {
3408 c.Properties.AndroidMkWholeStaticLibs = append(
3409 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3410 } else {
3411 c.Properties.AndroidMkStaticLibs = append(
3412 c.Properties.AndroidMkStaticLibs, makeLibName)
3413 }
Colin Cross6e511a92020-07-27 21:26:48 -07003414 }
3415 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003416 } else if !c.IsStubs() {
3417 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3418
Colin Cross6e511a92020-07-27 21:26:48 -07003419 switch depTag {
3420 case runtimeDepTag:
3421 c.Properties.AndroidMkRuntimeLibs = append(
Spandan Das3faa7922024-02-26 19:42:32 +00003422 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName())+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003423 case objDepTag:
3424 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3425 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003426 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003427 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003428 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003429 case dynamicLinkerDepTag:
3430 depPaths.DynamicLinker = linkFile
3431 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003432 }
Colin Crossca860ac2016-01-04 14:34:37 -08003433 })
3434
Jeff Gaston294356f2017-09-27 17:05:30 -07003435 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003436 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3437 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3438 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003439
Colin Crossdd84e052017-05-17 13:44:16 -07003440 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003441 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003442 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3443 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003444 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003445 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3446
Jiyong Park74955042019-10-22 20:19:51 +09003447 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3448 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003449 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003450 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003451 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003452 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003453
3454 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003455 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003456 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003457 }
Colin Crossdd84e052017-05-17 13:44:16 -07003458
Colin Crossca860ac2016-01-04 14:34:37 -08003459 return depPaths
3460}
3461
Spandan Das10c41362024-12-03 01:33:09 +00003462func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003463 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003464 bootstrap := false
Spandan Das10c41362024-12-03 01:33:09 +00003465 if linkable, ok := parent.(LinkableInterface); !ok {
3466 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
Jiyong Park7d55b612021-06-11 17:22:09 +09003467 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003468 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003469 bootstrap = linkable.Bootstrap()
3470 }
3471
Spandan Das10c41362024-12-03 01:33:09 +00003472 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003473
3474 useStubs := false
3475
Kiyoung Kimaa394802024-01-08 12:55:45 +09003476 if lib := moduleLibraryInterface(dep); lib.buildStubs() && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003477 if !apexInfo.IsForPlatform() {
3478 // For platform libraries, use current version of LLNDK
3479 // If this is for use_vendor apex we will apply the same rules
3480 // of apex sdk enforcement below to choose right version.
3481 useStubs = true
3482 }
3483 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3484 // If not building for APEX or the containing APEX allows the use of
3485 // platform APIs, use stubs only when it is from an APEX (and not from
3486 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3487 // bootstrap modules, always link to non-stub variant
3488 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3489
Spandan Dasff665182024-09-11 18:48:44 +00003490 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003491 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003492 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3493 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003494 }
3495
3496 return useStubs
3497}
3498
3499// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3500// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3501// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3502// has different level of updatability. For example, if a library foo in an APEX depends on a
3503// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3504// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3505// same APEX as foo, the non-stub variant of bar is used.
3506func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3507 depTag := ctx.OtherModuleDependencyTag(dep)
3508 libDepTag, ok := depTag.(libraryDependencyTag)
3509 if !ok || !libDepTag.shared() {
3510 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3511 }
3512
Colin Cross313aa542023-12-13 13:47:44 -08003513 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3514 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3515 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003516
3517 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003518 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003519 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003520 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3521 toUse := stubs[len(stubs)-1]
3522 sharedLibraryInfo = toUse.SharedLibraryInfo
3523 depExporterInfo = toUse.FlagExporterInfo
3524 }
3525 }
3526 return sharedLibraryInfo, depExporterInfo
3527}
3528
Colin Cross0de8a1e2020-09-18 14:15:30 -07003529// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3530// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003531// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003532// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003533func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3534 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003535 var staticPaths android.Paths
3536 for _, staticDep := range staticDeps {
3537 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3538 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3539 }
3540 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003541 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003542 }
3543 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3544
3545 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3546
3547 // reorder the dependencies based on transitive dependencies
3548 staticPaths = android.FirstUniquePaths(staticPaths)
3549 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3550
3551 if len(orderedStaticPaths) != len(staticPaths) {
3552 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3553 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3554 }
3555
3556 return orderedStaticPaths, transitiveStaticLibs
3557}
3558
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003559// BaseLibName trims known prefixes and suffixes
3560func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003561 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3562 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003563 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003564 return libName
3565}
3566
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003567func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003568 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003569 ccDepModule, _ := ccDep.(*Module)
3570 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003571 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003572
Justin Yuncbca3732021-02-03 19:24:13 +09003573 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003574 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003575 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003576 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003577
Ivan Lozanod1dec542021-05-26 15:33:11 -04003578 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003579 }
3580 }
3581
Kiyoung Kim22152f62024-05-24 10:45:28 +09003582 if ccDep.InVendorOrProduct() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003583 // The vendor and product modules in Make will have been renamed to not conflict with the
3584 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003585 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003586 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003587 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003588 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003589 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003590 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003591 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003592 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003593 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003594 } else {
3595 return libName
3596 }
3597}
3598
Colin Crossca860ac2016-01-04 14:34:37 -08003599func (c *Module) InstallInData() bool {
3600 if c.installer == nil {
3601 return false
3602 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003603 return c.installer.inData()
3604}
3605
3606func (c *Module) InstallInSanitizerDir() bool {
3607 if c.installer == nil {
3608 return false
3609 }
3610 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003611 return true
3612 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003613 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003614}
3615
Yifan Hong1b3348d2020-01-21 15:53:22 -08003616func (c *Module) InstallInRamdisk() bool {
3617 return c.InRamdisk()
3618}
3619
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003620func (c *Module) InstallInVendorRamdisk() bool {
3621 return c.InVendorRamdisk()
3622}
3623
Jiyong Parkf9332f12018-02-01 00:54:12 +09003624func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003625 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003626}
3627
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003628func (c *Module) MakeUninstallable() {
3629 if c.installer == nil {
3630 c.ModuleBase.MakeUninstallable()
3631 return
3632 }
3633 c.installer.makeUninstallable(c)
3634}
3635
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003636func (c *Module) HostToolPath() android.OptionalPath {
3637 if c.installer == nil {
3638 return android.OptionalPath{}
3639 }
3640 return c.installer.hostToolPath()
3641}
3642
Nan Zhangd4e641b2017-07-12 12:55:28 -07003643func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3644 return c.outputFile
3645}
3646
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003647func (c *Module) static() bool {
3648 if static, ok := c.linker.(interface {
3649 static() bool
3650 }); ok {
3651 return static.static()
3652 }
3653 return false
3654}
3655
Colin Cross6a730042024-12-05 13:53:43 -08003656func (c *Module) staticLibrary() bool {
3657 if static, ok := c.linker.(interface {
3658 staticLibrary() bool
3659 }); ok {
3660 return static.staticLibrary()
3661 }
3662 return false
3663}
3664
Jiyong Park379de2f2018-12-19 02:47:14 +09003665func (c *Module) staticBinary() bool {
3666 if static, ok := c.linker.(interface {
3667 staticBinary() bool
3668 }); ok {
3669 return static.staticBinary()
3670 }
3671 return false
3672}
3673
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003674func (c *Module) testBinary() bool {
3675 if test, ok := c.linker.(interface {
3676 testBinary() bool
3677 }); ok {
3678 return test.testBinary()
3679 }
3680 return false
3681}
3682
Jingwen Chen537242c2022-08-24 11:53:27 +00003683func (c *Module) testLibrary() bool {
3684 if test, ok := c.linker.(interface {
3685 testLibrary() bool
3686 }); ok {
3687 return test.testLibrary()
3688 }
3689 return false
3690}
3691
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003692func (c *Module) benchmarkBinary() bool {
3693 if b, ok := c.linker.(interface {
3694 benchmarkBinary() bool
3695 }); ok {
3696 return b.benchmarkBinary()
3697 }
3698 return false
3699}
3700
3701func (c *Module) fuzzBinary() bool {
3702 if f, ok := c.linker.(interface {
3703 fuzzBinary() bool
3704 }); ok {
3705 return f.fuzzBinary()
3706 }
3707 return false
3708}
3709
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003710// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3711func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003712 if h, ok := c.linker.(interface {
3713 header() bool
3714 }); ok {
3715 return h.header()
3716 }
3717 return false
3718}
3719
Ivan Lozanod7586b62021-04-01 09:49:36 -04003720func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003721 if b, ok := c.linker.(interface {
3722 binary() bool
3723 }); ok {
3724 return b.binary()
3725 }
3726 return false
3727}
3728
Justin Yun5e035862021-06-29 20:50:37 +09003729func (c *Module) StaticExecutable() bool {
3730 if b, ok := c.linker.(*binaryDecorator); ok {
3731 return b.static()
3732 }
3733 return false
3734}
3735
Ivan Lozanod7586b62021-04-01 09:49:36 -04003736func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003737 if o, ok := c.linker.(interface {
3738 object() bool
3739 }); ok {
3740 return o.object()
3741 }
3742 return false
3743}
3744
Kiyoung Kim37693d02024-04-04 09:56:15 +09003745func (m *Module) Dylib() bool {
3746 return false
3747}
3748
3749func (m *Module) Rlib() bool {
3750 return false
3751}
3752
Ivan Lozanof9e21722020-12-02 09:00:51 -05003753func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003754 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003755 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003756 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003757 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003758 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003759 return "native:product"
3760 }
Jooyung Han38002912019-05-16 04:01:54 +09003761 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003762 } else if c.InRamdisk() {
3763 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003764 } else if c.InVendorRamdisk() {
3765 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003766 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003767 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003768 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003769 return "native:ndk:none:none"
3770 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3771 //family, link := getNdkStlFamilyAndLinkType(c)
3772 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3773 } else {
3774 return "native:platform"
3775 }
3776}
3777
Jiyong Park9d452992018-10-03 00:38:19 +09003778// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003779// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003780func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003781 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003782 // Stub libs and prebuilt libs in a versioned SDK are not
3783 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003784 return lib.shared() && !lib.buildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003785 }
3786 return false
3787}
3788
Jiyong Parka90ca002019-10-07 15:47:24 +09003789func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003790 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3791}
3792
3793func (c *Module) ApexAvailableFor() []string {
3794 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003795 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003796 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003797 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003798 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003799 }
Yu Liub73c3a62024-12-10 00:58:06 +00003800
3801 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09003802}
3803
Paul Duffin0cb37b92020-03-04 14:52:46 +00003804func (c *Module) EverInstallable() bool {
3805 return c.installer != nil &&
3806 // Check to see whether the module is actually ever installable.
3807 c.installer.everInstallable()
3808}
3809
Ivan Lozanod7586b62021-04-01 09:49:36 -04003810func (c *Module) PreventInstall() bool {
3811 return c.Properties.PreventInstall
3812}
3813
3814func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003815 if c.library != nil {
3816 if i := c.library.installable(); i != nil {
3817 return i
3818 }
3819 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003820 return c.Properties.Installable
3821}
3822
3823func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003824 ret := c.EverInstallable() &&
3825 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003826 proptools.BoolDefault(c.Installable(), true) &&
3827 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003828
3829 // The platform variant doesn't need further condition. Apex variants however might not
3830 // be installable because it will likely to be included in the APEX and won't appear
3831 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003832 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003833 return ret
3834 }
3835
3836 // Special case for modules that are configured to be installed to /data, which includes
3837 // test modules. For these modules, both APEX and non-APEX variants are considered as
3838 // installable. This is because even the APEX variants won't be included in the APEX, but
3839 // will anyway be installed to /data/*.
3840 // See b/146995717
3841 if c.InstallInData() {
3842 return ret
3843 }
3844
3845 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003846}
3847
Logan Chien41eabe62019-04-10 13:33:58 +08003848func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3849 if c.linker != nil {
3850 if library, ok := c.linker.(*libraryDecorator); ok {
3851 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3852 }
3853 }
3854}
3855
Jiyong Park45bf82e2020-12-15 22:29:02 +09003856var _ android.ApexModule = (*Module)(nil)
3857
3858// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003859func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossc1b36442021-05-06 13:42:48 -07003860 if depTag == stubImplDepTag {
3861 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003862 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003863 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003864 if depTag == staticVariantTag {
3865 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3866 // actually mean that the static lib (and its dependencies) are copied into the
3867 // APEX.
3868 return false
3869 }
Colin Cross8acea3e2024-12-12 14:53:30 -08003870
3871 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3872 if isLibDepTag && c.static() && libDepTag.shared() {
3873 // shared_lib dependency from a static lib is considered as crossing
3874 // the APEX boundary because the dependency doesn't actually is
3875 // linked; the dependency is used only during the compilation phase.
3876 return false
3877 }
3878
3879 if isLibDepTag && libDepTag.excludeInApex {
3880 return false
3881 }
3882
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003883 return true
3884}
3885
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003886func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003887 if c.HasStubsVariants() {
3888 if IsSharedDepTag(depTag) {
3889 // dynamic dep to a stubs lib crosses APEX boundary
3890 return false
3891 }
3892 if IsRuntimeDepTag(depTag) {
3893 // runtime dep to a stubs lib also crosses APEX boundary
3894 return false
3895 }
3896 if IsHeaderDepTag(depTag) {
3897 return false
3898 }
3899 }
3900 if c.IsLlndk() {
3901 return false
3902 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003903
3904 return true
3905}
3906
Jiyong Park45bf82e2020-12-15 22:29:02 +09003907// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003908func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3909 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003910 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3911 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3912 return nil
3913 }
Jooyung Han749dc692020-04-15 11:03:39 +09003914 // We don't check for prebuilt modules
3915 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3916 return nil
3917 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003918
Jooyung Han749dc692020-04-15 11:03:39 +09003919 minSdkVersion := c.MinSdkVersion()
3920 if minSdkVersion == "apex_inherit" {
3921 return nil
3922 }
3923 if minSdkVersion == "" {
3924 // JNI libs within APK-in-APEX fall into here
3925 // Those are okay to set sdk_version instead
3926 // We don't have to check if this is a SDK variant because
3927 // non-SDK variant resets sdk_version, which works too.
3928 minSdkVersion = c.SdkVersion()
3929 }
Dan Albertc8060532020-07-22 22:32:17 -07003930 if minSdkVersion == "" {
3931 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3932 }
3933 // Not using nativeApiLevelFromUser because the context here is not
3934 // necessarily a native context.
3935 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003936 if err != nil {
3937 return err
3938 }
Dan Albertc8060532020-07-22 22:32:17 -07003939
Colin Cross8ca61c12022-10-06 21:00:14 -07003940 // A dependency only needs to support a min_sdk_version at least
3941 // as high as the api level that the architecture was introduced in.
3942 // This allows introducing new architectures in the platform that
3943 // need to be included in apexes that normally require an older
3944 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08003945 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07003946 if sdkVersion.LessThan(minApiForArch) {
3947 sdkVersion = minApiForArch
3948 }
3949
Dan Albertc8060532020-07-22 22:32:17 -07003950 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003951 return fmt.Errorf("newer SDK(%v)", ver)
3952 }
3953 return nil
3954}
3955
Paul Duffinb5769c12021-05-12 16:16:51 +01003956// Implements android.ApexModule
3957func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3958 // stub libraries and native bridge libraries are always available to platform
3959 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3960}
3961
Inseob Kima1888ce2022-10-04 14:42:02 +09003962func (c *Module) overriddenModules() []string {
3963 if o, ok := c.linker.(overridable); ok {
3964 return o.overriddenModules()
3965 }
3966 return nil
3967}
3968
Liz Kammer35ca77e2021-12-22 15:31:40 -05003969type moduleType int
3970
3971const (
3972 unknownType moduleType = iota
3973 binary
3974 object
3975 fullLibrary
3976 staticLibrary
3977 sharedLibrary
3978 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00003979 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00003980 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05003981)
3982
3983func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00003984 if c.testBinary() {
3985 // testBinary is also a binary, so this comes before the c.Binary()
3986 // conditional. A testBinary has additional implicit dependencies and
3987 // other test-only semantics.
3988 return testBin
3989 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003990 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003991 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003992 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00003993 } else if c.testLibrary() {
3994 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
3995 // will let them add implicit compile deps on gtest, for example.
3996 //
Liz Kammerefc51d92023-04-21 15:11:25 -04003997 // For now, treat them as regular libraries.
3998 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003999 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004000 static := false
4001 shared := false
4002 if library, ok := c.linker.(*libraryDecorator); ok {
4003 static = library.MutatedProperties.BuildStatic
4004 shared = library.MutatedProperties.BuildShared
4005 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4006 static = library.MutatedProperties.BuildStatic
4007 shared = library.MutatedProperties.BuildShared
4008 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004009 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004010 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004011 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004012 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004013 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004014 return staticLibrary
4015 }
4016 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004017 } else if c.isNDKStubLibrary() {
4018 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004019 }
4020 return unknownType
4021}
4022
Colin Crosscfad1192015-11-02 16:43:11 -08004023// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004024type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004025 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004026 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004027 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004028}
4029
Patrice Arrudac249c712019-03-19 17:00:29 -07004030// cc_defaults provides a set of properties that can be inherited by other cc
4031// modules. A module can use the properties from a cc_defaults using
4032// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4033// merged (when possible) by prepending the default module's values to the
4034// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004035func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004036 return DefaultsFactory()
4037}
4038
Colin Cross36242852017-06-23 15:06:31 -07004039func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004040 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004041
Colin Cross36242852017-06-23 15:06:31 -07004042 module.AddProperties(props...)
4043 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004044 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004045 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004046 &BaseCompilerProperties{},
4047 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004048 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004049 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004050 &StaticProperties{},
4051 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004052 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004053 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004054 &TestLinkerProperties{},
4055 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004056 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004057 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004058 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004059 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004060 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004061 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004062 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004063 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004064 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004065 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004066 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004067 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004068 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004069 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004070 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4071 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004072 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004073 )
Colin Crosscfad1192015-11-02 16:43:11 -08004074
Jooyung Hancc372c52019-09-25 15:18:44 +09004075 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004076
4077 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004078}
4079
Jiyong Park2286afd2020-06-16 21:58:53 +09004080func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004081 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004082}
4083
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004084func kytheExtractAllFactory() android.Singleton {
4085 return &kytheExtractAllSingleton{}
4086}
4087
4088type kytheExtractAllSingleton struct {
4089}
4090
4091func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4092 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004093 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004094 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004095 if len(files) > 0 {
4096 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004097 }
4098 })
4099 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4100 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004101 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004102 }
4103}
4104
Jihoon Kangf78a8902022-09-01 22:47:07 +00004105func (c *Module) Partition() string {
4106 if p, ok := c.installer.(interface {
4107 getPartition() string
4108 }); ok {
4109 return p.getPartition()
4110 }
4111 return ""
4112}
4113
Spandan Das2b6dfb52024-01-19 00:22:22 +00004114type sourceModuleName interface {
4115 sourceModuleName() string
4116}
4117
4118func (c *Module) BaseModuleName() string {
4119 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4120 // if the prebuilt module sets a source_module_name in Android.bp, use that
4121 return smn.sourceModuleName()
4122 }
4123 return c.ModuleBase.BaseModuleName()
4124}
4125
Spandan Dase20c56c2024-07-23 21:34:24 +00004126func (c *Module) stubsSymbolFilePath() android.Path {
4127 if library, ok := c.linker.(*libraryDecorator); ok {
4128 return library.stubsSymbolFilePath
4129 }
4130 return android.OptionalPath{}.Path()
4131}
4132
Colin Cross06a931b2015-10-28 17:23:31 -07004133var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004134var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004135var BoolPtr = proptools.BoolPtr
4136var String = proptools.String
4137var StringPtr = proptools.StringPtr