xref: /aosp_15_r20/build/soong/cc/cc.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage cc
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Worker// This file contains the module types for compiling C/C++ for Android, and converts the properties
18*333d2b36SAndroid Build Coastguard Worker// into the flags and filenames necessary to pass to the compiler.  The final creation of the rules
19*333d2b36SAndroid Build Coastguard Worker// is handled in builder.go
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Workerimport (
22*333d2b36SAndroid Build Coastguard Worker	"errors"
23*333d2b36SAndroid Build Coastguard Worker	"fmt"
24*333d2b36SAndroid Build Coastguard Worker	"io"
25*333d2b36SAndroid Build Coastguard Worker	"slices"
26*333d2b36SAndroid Build Coastguard Worker	"strconv"
27*333d2b36SAndroid Build Coastguard Worker	"strings"
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
30*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/depset"
31*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Worker	"android/soong/aidl_library"
34*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
35*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc/config"
36*333d2b36SAndroid Build Coastguard Worker	"android/soong/fuzz"
37*333d2b36SAndroid Build Coastguard Worker	"android/soong/genrule"
38*333d2b36SAndroid Build Coastguard Worker)
39*333d2b36SAndroid Build Coastguard Worker
40*333d2b36SAndroid Build Coastguard Workertype CcMakeVarsInfo struct {
41*333d2b36SAndroid Build Coastguard Worker	WarningsAllowed string
42*333d2b36SAndroid Build Coastguard Worker	UsingWnoError   string
43*333d2b36SAndroid Build Coastguard Worker	MissingProfile  string
44*333d2b36SAndroid Build Coastguard Worker}
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Workervar CcMakeVarsInfoProvider = blueprint.NewProvider[*CcMakeVarsInfo]()
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Workertype CcObjectInfo struct {
49*333d2b36SAndroid Build Coastguard Worker	objFiles   android.Paths
50*333d2b36SAndroid Build Coastguard Worker	tidyFiles  android.Paths
51*333d2b36SAndroid Build Coastguard Worker	kytheFiles android.Paths
52*333d2b36SAndroid Build Coastguard Worker}
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Workervar CcObjectInfoProvider = blueprint.NewProvider[CcObjectInfo]()
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Worker// Common info about the cc module.
57*333d2b36SAndroid Build Coastguard Workertype CcInfo struct {
58*333d2b36SAndroid Build Coastguard Worker	HasStubsVariants bool
59*333d2b36SAndroid Build Coastguard Worker}
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Workervar CcInfoProvider = blueprint.NewProvider[CcInfo]()
62*333d2b36SAndroid Build Coastguard Worker
63*333d2b36SAndroid Build Coastguard Workertype LinkableInfo struct {
64*333d2b36SAndroid Build Coastguard Worker	// StaticExecutable returns true if this is a binary module with "static_executable: true".
65*333d2b36SAndroid Build Coastguard Worker	StaticExecutable bool
66*333d2b36SAndroid Build Coastguard Worker}
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Workervar LinkableInfoKey = blueprint.NewProvider[LinkableInfo]()
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Workerfunc init() {
71*333d2b36SAndroid Build Coastguard Worker	RegisterCCBuildComponents(android.InitRegistrationContext)
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker	pctx.Import("android/soong/android")
74*333d2b36SAndroid Build Coastguard Worker	pctx.Import("android/soong/cc/config")
75*333d2b36SAndroid Build Coastguard Worker}
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Workerfunc RegisterCCBuildComponents(ctx android.RegistrationContext) {
78*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("cc_defaults", defaultsFactory)
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker	ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
81*333d2b36SAndroid Build Coastguard Worker		ctx.Transition("sdk", &sdkTransitionMutator{})
82*333d2b36SAndroid Build Coastguard Worker		ctx.BottomUp("llndk", llndkMutator)
83*333d2b36SAndroid Build Coastguard Worker		ctx.Transition("link", &linkageTransitionMutator{})
84*333d2b36SAndroid Build Coastguard Worker		ctx.Transition("version", &versionTransitionMutator{})
85*333d2b36SAndroid Build Coastguard Worker		ctx.BottomUp("begin", BeginMutator)
86*333d2b36SAndroid Build Coastguard Worker	})
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Worker	ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
89*333d2b36SAndroid Build Coastguard Worker		for _, san := range Sanitizers {
90*333d2b36SAndroid Build Coastguard Worker			san.registerMutators(ctx)
91*333d2b36SAndroid Build Coastguard Worker		}
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Worker		ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
94*333d2b36SAndroid Build Coastguard Worker		ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker		ctx.Transition("fuzz", &fuzzTransitionMutator{})
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Worker		ctx.Transition("coverage", &coverageTransitionMutator{})
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker		ctx.Transition("afdo", &afdoTransitionMutator{})
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker		ctx.Transition("orderfile", &orderfileTransitionMutator{})
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Worker		ctx.Transition("lto", &ltoTransitionMutator{})
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker		ctx.BottomUp("check_linktype", checkLinkTypeMutator)
107*333d2b36SAndroid Build Coastguard Worker		ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
108*333d2b36SAndroid Build Coastguard Worker	})
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Worker	ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
111*333d2b36SAndroid Build Coastguard Worker		// sabi mutator needs to be run after apex mutator finishes.
112*333d2b36SAndroid Build Coastguard Worker		ctx.Transition("sabi", &sabiTransitionMutator{})
113*333d2b36SAndroid Build Coastguard Worker	})
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
116*333d2b36SAndroid Build Coastguard Worker}
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Worker// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
119*333d2b36SAndroid Build Coastguard Worker// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
120*333d2b36SAndroid Build Coastguard Worker// edges to these modules.
121*333d2b36SAndroid Build Coastguard Worker// This object is constructed in DepsMutator, by calling to various module delegates to set
122*333d2b36SAndroid Build Coastguard Worker// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
123*333d2b36SAndroid Build Coastguard Worker// dependencies.
124*333d2b36SAndroid Build Coastguard Worker// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
125*333d2b36SAndroid Build Coastguard Worker// (or its sibling methods) to set real dependencies on the given modules.
126*333d2b36SAndroid Build Coastguard Workertype Deps struct {
127*333d2b36SAndroid Build Coastguard Worker	SharedLibs, LateSharedLibs                  []string
128*333d2b36SAndroid Build Coastguard Worker	StaticLibs, LateStaticLibs, WholeStaticLibs []string
129*333d2b36SAndroid Build Coastguard Worker	HeaderLibs                                  []string
130*333d2b36SAndroid Build Coastguard Worker	RuntimeLibs                                 []string
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Worker	// UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
133*333d2b36SAndroid Build Coastguard Worker	// prevent automatically exporting symbols.
134*333d2b36SAndroid Build Coastguard Worker	UnexportedStaticLibs []string
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker	// Used for data dependencies adjacent to tests
137*333d2b36SAndroid Build Coastguard Worker	DataLibs []string
138*333d2b36SAndroid Build Coastguard Worker	DataBins []string
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Worker	// Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
141*333d2b36SAndroid Build Coastguard Worker	SystemSharedLibs []string
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker	// Used by DepMutator to pass aidl_library modules to aidl compiler
144*333d2b36SAndroid Build Coastguard Worker	AidlLibs []string
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Worker	// If true, statically link the unwinder into native libraries/binaries.
147*333d2b36SAndroid Build Coastguard Worker	StaticUnwinderIfLegacy bool
148*333d2b36SAndroid Build Coastguard Worker
149*333d2b36SAndroid Build Coastguard Worker	ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Worker	ObjFiles []string
152*333d2b36SAndroid Build Coastguard Worker
153*333d2b36SAndroid Build Coastguard Worker	GeneratedSources            []string
154*333d2b36SAndroid Build Coastguard Worker	GeneratedHeaders            []string
155*333d2b36SAndroid Build Coastguard Worker	DeviceFirstGeneratedHeaders []string
156*333d2b36SAndroid Build Coastguard Worker	GeneratedDeps               []string
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker	ReexportGeneratedHeaders []string
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Worker	CrtBegin, CrtEnd []string
161*333d2b36SAndroid Build Coastguard Worker
162*333d2b36SAndroid Build Coastguard Worker	// Used for host bionic
163*333d2b36SAndroid Build Coastguard Worker	DynamicLinker string
164*333d2b36SAndroid Build Coastguard Worker
165*333d2b36SAndroid Build Coastguard Worker	// List of libs that need to be excluded for APEX variant
166*333d2b36SAndroid Build Coastguard Worker	ExcludeLibsForApex []string
167*333d2b36SAndroid Build Coastguard Worker	// List of libs that need to be excluded for non-APEX variant
168*333d2b36SAndroid Build Coastguard Worker	ExcludeLibsForNonApex []string
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker	// LLNDK headers for the ABI checker to check LLNDK implementation library.
171*333d2b36SAndroid Build Coastguard Worker	// An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
172*333d2b36SAndroid Build Coastguard Worker	// The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
173*333d2b36SAndroid Build Coastguard Worker	// Instead, the LLNDK implementation depends on the LLNDK header libs.
174*333d2b36SAndroid Build Coastguard Worker	LlndkHeaderLibs []string
175*333d2b36SAndroid Build Coastguard Worker}
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker// A struct which to collect flags for rlib dependencies
178*333d2b36SAndroid Build Coastguard Workertype RustRlibDep struct {
179*333d2b36SAndroid Build Coastguard Worker	LibPath   android.Path // path to the rlib
180*333d2b36SAndroid Build Coastguard Worker	LinkDirs  []string     // flags required for dependency (e.g. -L flags)
181*333d2b36SAndroid Build Coastguard Worker	CrateName string       // crateNames associated with rlibDeps
182*333d2b36SAndroid Build Coastguard Worker}
183*333d2b36SAndroid Build Coastguard Worker
184*333d2b36SAndroid Build Coastguard Workerfunc EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
185*333d2b36SAndroid Build Coastguard Worker	return a.LibPath == b.LibPath
186*333d2b36SAndroid Build Coastguard Worker}
187*333d2b36SAndroid Build Coastguard Worker
188*333d2b36SAndroid Build Coastguard Worker// PathDeps is a struct containing file paths to dependencies of a module.
189*333d2b36SAndroid Build Coastguard Worker// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
190*333d2b36SAndroid Build Coastguard Worker// It's used to construct flags for various build statements (such as for compiling and linking).
191*333d2b36SAndroid Build Coastguard Worker// It is then passed to module decorator functions responsible for registering build statements
192*333d2b36SAndroid Build Coastguard Worker// (such as `module.compiler.compile()`).`
193*333d2b36SAndroid Build Coastguard Workertype PathDeps struct {
194*333d2b36SAndroid Build Coastguard Worker	// Paths to .so files
195*333d2b36SAndroid Build Coastguard Worker	SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
196*333d2b36SAndroid Build Coastguard Worker	// Paths to the dependencies to use for .so files (.so.toc files)
197*333d2b36SAndroid Build Coastguard Worker	SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
198*333d2b36SAndroid Build Coastguard Worker	// Paths to .a files
199*333d2b36SAndroid Build Coastguard Worker	StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
200*333d2b36SAndroid Build Coastguard Worker	// Paths and crateNames for RustStaticLib dependencies
201*333d2b36SAndroid Build Coastguard Worker	RustRlibDeps []RustRlibDep
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Worker	// Transitive static library dependencies of static libraries for use in ordering.
204*333d2b36SAndroid Build Coastguard Worker	TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
205*333d2b36SAndroid Build Coastguard Worker
206*333d2b36SAndroid Build Coastguard Worker	// Paths to .o files
207*333d2b36SAndroid Build Coastguard Worker	Objs Objects
208*333d2b36SAndroid Build Coastguard Worker	// Paths to .o files in dependencies that provide them. Note that these lists
209*333d2b36SAndroid Build Coastguard Worker	// aren't complete since prebuilt modules don't provide the .o files.
210*333d2b36SAndroid Build Coastguard Worker	StaticLibObjs      Objects
211*333d2b36SAndroid Build Coastguard Worker	WholeStaticLibObjs Objects
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Worker	// Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
214*333d2b36SAndroid Build Coastguard Worker	// the libs from all whole_static_lib dependencies.
215*333d2b36SAndroid Build Coastguard Worker	WholeStaticLibsFromPrebuilts android.Paths
216*333d2b36SAndroid Build Coastguard Worker
217*333d2b36SAndroid Build Coastguard Worker	// Paths to generated source files
218*333d2b36SAndroid Build Coastguard Worker	GeneratedSources android.Paths
219*333d2b36SAndroid Build Coastguard Worker	GeneratedDeps    android.Paths
220*333d2b36SAndroid Build Coastguard Worker
221*333d2b36SAndroid Build Coastguard Worker	Flags                      []string
222*333d2b36SAndroid Build Coastguard Worker	LdFlags                    []string
223*333d2b36SAndroid Build Coastguard Worker	IncludeDirs                android.Paths
224*333d2b36SAndroid Build Coastguard Worker	SystemIncludeDirs          android.Paths
225*333d2b36SAndroid Build Coastguard Worker	ReexportedDirs             android.Paths
226*333d2b36SAndroid Build Coastguard Worker	ReexportedSystemDirs       android.Paths
227*333d2b36SAndroid Build Coastguard Worker	ReexportedFlags            []string
228*333d2b36SAndroid Build Coastguard Worker	ReexportedGeneratedHeaders android.Paths
229*333d2b36SAndroid Build Coastguard Worker	ReexportedDeps             android.Paths
230*333d2b36SAndroid Build Coastguard Worker	ReexportedRustRlibDeps     []RustRlibDep
231*333d2b36SAndroid Build Coastguard Worker
232*333d2b36SAndroid Build Coastguard Worker	// Paths to crt*.o files
233*333d2b36SAndroid Build Coastguard Worker	CrtBegin, CrtEnd android.Paths
234*333d2b36SAndroid Build Coastguard Worker
235*333d2b36SAndroid Build Coastguard Worker	// Path to the dynamic linker binary
236*333d2b36SAndroid Build Coastguard Worker	DynamicLinker android.OptionalPath
237*333d2b36SAndroid Build Coastguard Worker
238*333d2b36SAndroid Build Coastguard Worker	// For Darwin builds, the path to the second architecture's output that should
239*333d2b36SAndroid Build Coastguard Worker	// be combined with this architectures's output into a FAT MachO file.
240*333d2b36SAndroid Build Coastguard Worker	DarwinSecondArchOutput android.OptionalPath
241*333d2b36SAndroid Build Coastguard Worker
242*333d2b36SAndroid Build Coastguard Worker	// Paths to direct srcs and transitive include dirs from direct aidl_library deps
243*333d2b36SAndroid Build Coastguard Worker	AidlLibraryInfos []aidl_library.AidlLibraryInfo
244*333d2b36SAndroid Build Coastguard Worker
245*333d2b36SAndroid Build Coastguard Worker	// LLNDK headers for the ABI checker to check LLNDK implementation library.
246*333d2b36SAndroid Build Coastguard Worker	LlndkIncludeDirs       android.Paths
247*333d2b36SAndroid Build Coastguard Worker	LlndkSystemIncludeDirs android.Paths
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Worker	directImplementationDeps     android.Paths
250*333d2b36SAndroid Build Coastguard Worker	transitiveImplementationDeps []depset.DepSet[android.Path]
251*333d2b36SAndroid Build Coastguard Worker}
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Worker// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
254*333d2b36SAndroid Build Coastguard Worker// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
255*333d2b36SAndroid Build Coastguard Worker// command line so they can be overridden by the local module flags).
256*333d2b36SAndroid Build Coastguard Workertype LocalOrGlobalFlags struct {
257*333d2b36SAndroid Build Coastguard Worker	CommonFlags     []string // Flags that apply to C, C++, and assembly source files
258*333d2b36SAndroid Build Coastguard Worker	AsFlags         []string // Flags that apply to assembly source files
259*333d2b36SAndroid Build Coastguard Worker	YasmFlags       []string // Flags that apply to yasm assembly source files
260*333d2b36SAndroid Build Coastguard Worker	CFlags          []string // Flags that apply to C and C++ source files
261*333d2b36SAndroid Build Coastguard Worker	ToolingCFlags   []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
262*333d2b36SAndroid Build Coastguard Worker	ConlyFlags      []string // Flags that apply to C source files
263*333d2b36SAndroid Build Coastguard Worker	CppFlags        []string // Flags that apply to C++ source files
264*333d2b36SAndroid Build Coastguard Worker	ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
265*333d2b36SAndroid Build Coastguard Worker	LdFlags         []string // Flags that apply to linker command lines
266*333d2b36SAndroid Build Coastguard Worker}
267*333d2b36SAndroid Build Coastguard Worker
268*333d2b36SAndroid Build Coastguard Worker// Flags contains various types of command line flags (and settings) for use in building build
269*333d2b36SAndroid Build Coastguard Worker// statements related to C++.
270*333d2b36SAndroid Build Coastguard Workertype Flags struct {
271*333d2b36SAndroid Build Coastguard Worker	// Local flags (which individual modules are responsible for). These may override global flags.
272*333d2b36SAndroid Build Coastguard Worker	Local LocalOrGlobalFlags
273*333d2b36SAndroid Build Coastguard Worker	// Global flags (which build system or toolchain is responsible for).
274*333d2b36SAndroid Build Coastguard Worker	Global          LocalOrGlobalFlags
275*333d2b36SAndroid Build Coastguard Worker	NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
276*333d2b36SAndroid Build Coastguard Worker
277*333d2b36SAndroid Build Coastguard Worker	aidlFlags     []string // Flags that apply to aidl source files
278*333d2b36SAndroid Build Coastguard Worker	rsFlags       []string // Flags that apply to renderscript source files
279*333d2b36SAndroid Build Coastguard Worker	libFlags      []string // Flags to add libraries early to the link order
280*333d2b36SAndroid Build Coastguard Worker	extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
281*333d2b36SAndroid Build Coastguard Worker	TidyFlags     []string // Flags that apply to clang-tidy
282*333d2b36SAndroid Build Coastguard Worker	SAbiFlags     []string // Flags that apply to header-abi-dumper
283*333d2b36SAndroid Build Coastguard Worker
284*333d2b36SAndroid Build Coastguard Worker	// Global include flags that apply to C, C++, and assembly source files
285*333d2b36SAndroid Build Coastguard Worker	// These must be after any module include flags, which will be in CommonFlags.
286*333d2b36SAndroid Build Coastguard Worker	SystemIncludeFlags []string
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Worker	Toolchain     config.Toolchain
289*333d2b36SAndroid Build Coastguard Worker	Tidy          bool // True if ninja .tidy rules should be generated.
290*333d2b36SAndroid Build Coastguard Worker	NeedTidyFiles bool // True if module link should depend on .tidy files
291*333d2b36SAndroid Build Coastguard Worker	GcovCoverage  bool // True if coverage files should be generated.
292*333d2b36SAndroid Build Coastguard Worker	SAbiDump      bool // True if header abi dumps should be generated.
293*333d2b36SAndroid Build Coastguard Worker	EmitXrefs     bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
294*333d2b36SAndroid Build Coastguard Worker	ClangVerify   bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
295*333d2b36SAndroid Build Coastguard Worker
296*333d2b36SAndroid Build Coastguard Worker	// The instruction set required for clang ("arm" or "thumb").
297*333d2b36SAndroid Build Coastguard Worker	RequiredInstructionSet string
298*333d2b36SAndroid Build Coastguard Worker	// The target-device system path to the dynamic linker.
299*333d2b36SAndroid Build Coastguard Worker	DynamicLinker string
300*333d2b36SAndroid Build Coastguard Worker
301*333d2b36SAndroid Build Coastguard Worker	CFlagsDeps  android.Paths // Files depended on by compiler flags
302*333d2b36SAndroid Build Coastguard Worker	LdFlagsDeps android.Paths // Files depended on by linker flags
303*333d2b36SAndroid Build Coastguard Worker
304*333d2b36SAndroid Build Coastguard Worker	// True if .s files should be processed with the c preprocessor.
305*333d2b36SAndroid Build Coastguard Worker	AssemblerWithCpp bool
306*333d2b36SAndroid Build Coastguard Worker
307*333d2b36SAndroid Build Coastguard Worker	proto            android.ProtoFlags
308*333d2b36SAndroid Build Coastguard Worker	protoC           bool // Whether to use C instead of C++
309*333d2b36SAndroid Build Coastguard Worker	protoOptionsFile bool // Whether to look for a .options file next to the .proto
310*333d2b36SAndroid Build Coastguard Worker
311*333d2b36SAndroid Build Coastguard Worker	Yacc *YaccProperties
312*333d2b36SAndroid Build Coastguard Worker	Lex  *LexProperties
313*333d2b36SAndroid Build Coastguard Worker}
314*333d2b36SAndroid Build Coastguard Worker
315*333d2b36SAndroid Build Coastguard Worker// Properties used to compile all C or C++ modules
316*333d2b36SAndroid Build Coastguard Workertype BaseProperties struct {
317*333d2b36SAndroid Build Coastguard Worker	// Deprecated. true is the default, false is invalid.
318*333d2b36SAndroid Build Coastguard Worker	Clang *bool `android:"arch_variant"`
319*333d2b36SAndroid Build Coastguard Worker
320*333d2b36SAndroid Build Coastguard Worker	// Aggresively trade performance for smaller binary size.
321*333d2b36SAndroid Build Coastguard Worker	// This should only be used for on-device binaries that are rarely executed and not
322*333d2b36SAndroid Build Coastguard Worker	// performance critical.
323*333d2b36SAndroid Build Coastguard Worker	Optimize_for_size *bool `android:"arch_variant"`
324*333d2b36SAndroid Build Coastguard Worker
325*333d2b36SAndroid Build Coastguard Worker	// The API level that this module is built against. The APIs of this API level will be
326*333d2b36SAndroid Build Coastguard Worker	// visible at build time, but use of any APIs newer than min_sdk_version will render the
327*333d2b36SAndroid Build Coastguard Worker	// module unloadable on older devices.  In the future it will be possible to weakly-link new
328*333d2b36SAndroid Build Coastguard Worker	// APIs, making the behavior match Java: such modules will load on older devices, but
329*333d2b36SAndroid Build Coastguard Worker	// calling new APIs on devices that do not support them will result in a crash.
330*333d2b36SAndroid Build Coastguard Worker	//
331*333d2b36SAndroid Build Coastguard Worker	// This property has the same behavior as sdk_version does for Java modules. For those
332*333d2b36SAndroid Build Coastguard Worker	// familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
333*333d2b36SAndroid Build Coastguard Worker	// does for Java code.
334*333d2b36SAndroid Build Coastguard Worker	//
335*333d2b36SAndroid Build Coastguard Worker	// In addition, setting this property causes two variants to be built, one for the platform
336*333d2b36SAndroid Build Coastguard Worker	// and one for apps.
337*333d2b36SAndroid Build Coastguard Worker	Sdk_version *string
338*333d2b36SAndroid Build Coastguard Worker
339*333d2b36SAndroid Build Coastguard Worker	// Minimum OS API level supported by this C or C++ module. This property becomes the value
340*333d2b36SAndroid Build Coastguard Worker	// of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
341*333d2b36SAndroid Build Coastguard Worker	// this property is also used to ensure that the min_sdk_version of the containing module is
342*333d2b36SAndroid Build Coastguard Worker	// not older (i.e. less) than this module's min_sdk_version. When not set, this property
343*333d2b36SAndroid Build Coastguard Worker	// defaults to the value of sdk_version.  When this is set to "apex_inherit", this tracks
344*333d2b36SAndroid Build Coastguard Worker	// min_sdk_version of the containing APEX. When the module
345*333d2b36SAndroid Build Coastguard Worker	// is not built for an APEX, "apex_inherit" defaults to sdk_version.
346*333d2b36SAndroid Build Coastguard Worker	Min_sdk_version *string
347*333d2b36SAndroid Build Coastguard Worker
348*333d2b36SAndroid Build Coastguard Worker	// If true, always create an sdk variant and don't create a platform variant.
349*333d2b36SAndroid Build Coastguard Worker	Sdk_variant_only *bool
350*333d2b36SAndroid Build Coastguard Worker
351*333d2b36SAndroid Build Coastguard Worker	AndroidMkSharedLibs      []string `blueprint:"mutated"`
352*333d2b36SAndroid Build Coastguard Worker	AndroidMkStaticLibs      []string `blueprint:"mutated"`
353*333d2b36SAndroid Build Coastguard Worker	AndroidMkRlibs           []string `blueprint:"mutated"`
354*333d2b36SAndroid Build Coastguard Worker	AndroidMkRuntimeLibs     []string `blueprint:"mutated"`
355*333d2b36SAndroid Build Coastguard Worker	AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
356*333d2b36SAndroid Build Coastguard Worker	AndroidMkHeaderLibs      []string `blueprint:"mutated"`
357*333d2b36SAndroid Build Coastguard Worker	HideFromMake             bool     `blueprint:"mutated"`
358*333d2b36SAndroid Build Coastguard Worker	PreventInstall           bool     `blueprint:"mutated"`
359*333d2b36SAndroid Build Coastguard Worker
360*333d2b36SAndroid Build Coastguard Worker	// Set by DepsMutator.
361*333d2b36SAndroid Build Coastguard Worker	AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
362*333d2b36SAndroid Build Coastguard Worker
363*333d2b36SAndroid Build Coastguard Worker	// The name of the image this module is built for
364*333d2b36SAndroid Build Coastguard Worker	ImageVariation string `blueprint:"mutated"`
365*333d2b36SAndroid Build Coastguard Worker
366*333d2b36SAndroid Build Coastguard Worker	// The VNDK version this module is built against. If empty, the module is not
367*333d2b36SAndroid Build Coastguard Worker	// build against the VNDK.
368*333d2b36SAndroid Build Coastguard Worker	VndkVersion string `blueprint:"mutated"`
369*333d2b36SAndroid Build Coastguard Worker
370*333d2b36SAndroid Build Coastguard Worker	// Suffix for the name of Android.mk entries generated by this module
371*333d2b36SAndroid Build Coastguard Worker	SubName string `blueprint:"mutated"`
372*333d2b36SAndroid Build Coastguard Worker
373*333d2b36SAndroid Build Coastguard Worker	// *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
374*333d2b36SAndroid Build Coastguard Worker	// file
375*333d2b36SAndroid Build Coastguard Worker	Logtags []string `android:"path"`
376*333d2b36SAndroid Build Coastguard Worker
377*333d2b36SAndroid Build Coastguard Worker	// Make this module available when building for ramdisk.
378*333d2b36SAndroid Build Coastguard Worker	// On device without a dedicated recovery partition, the module is only
379*333d2b36SAndroid Build Coastguard Worker	// available after switching root into
380*333d2b36SAndroid Build Coastguard Worker	// /first_stage_ramdisk. To expose the module before switching root, install
381*333d2b36SAndroid Build Coastguard Worker	// the recovery variant instead.
382*333d2b36SAndroid Build Coastguard Worker	Ramdisk_available *bool
383*333d2b36SAndroid Build Coastguard Worker
384*333d2b36SAndroid Build Coastguard Worker	// Make this module available when building for vendor ramdisk.
385*333d2b36SAndroid Build Coastguard Worker	// On device without a dedicated recovery partition, the module is only
386*333d2b36SAndroid Build Coastguard Worker	// available after switching root into
387*333d2b36SAndroid Build Coastguard Worker	// /first_stage_ramdisk. To expose the module before switching root, install
388*333d2b36SAndroid Build Coastguard Worker	// the recovery variant instead.
389*333d2b36SAndroid Build Coastguard Worker	Vendor_ramdisk_available *bool
390*333d2b36SAndroid Build Coastguard Worker
391*333d2b36SAndroid Build Coastguard Worker	// Make this module available when building for recovery
392*333d2b36SAndroid Build Coastguard Worker	Recovery_available *bool
393*333d2b36SAndroid Build Coastguard Worker
394*333d2b36SAndroid Build Coastguard Worker	// Used by imageMutator, set by ImageMutatorBegin()
395*333d2b36SAndroid Build Coastguard Worker	VendorVariantNeeded        bool `blueprint:"mutated"`
396*333d2b36SAndroid Build Coastguard Worker	ProductVariantNeeded       bool `blueprint:"mutated"`
397*333d2b36SAndroid Build Coastguard Worker	CoreVariantNeeded          bool `blueprint:"mutated"`
398*333d2b36SAndroid Build Coastguard Worker	RamdiskVariantNeeded       bool `blueprint:"mutated"`
399*333d2b36SAndroid Build Coastguard Worker	VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
400*333d2b36SAndroid Build Coastguard Worker	RecoveryVariantNeeded      bool `blueprint:"mutated"`
401*333d2b36SAndroid Build Coastguard Worker
402*333d2b36SAndroid Build Coastguard Worker	// A list of variations for the "image" mutator of the form
403*333d2b36SAndroid Build Coastguard Worker	//<image name> '.' <version char>, for example, 'vendor.S'
404*333d2b36SAndroid Build Coastguard Worker	ExtraVersionedImageVariations []string `blueprint:"mutated"`
405*333d2b36SAndroid Build Coastguard Worker
406*333d2b36SAndroid Build Coastguard Worker	// Allows this module to use non-APEX version of libraries. Useful
407*333d2b36SAndroid Build Coastguard Worker	// for building binaries that are started before APEXes are activated.
408*333d2b36SAndroid Build Coastguard Worker	Bootstrap *bool
409*333d2b36SAndroid Build Coastguard Worker
410*333d2b36SAndroid Build Coastguard Worker	// Allows this module to be included in CMake release snapshots to be built outside of Android
411*333d2b36SAndroid Build Coastguard Worker	// build system and source tree.
412*333d2b36SAndroid Build Coastguard Worker	Cmake_snapshot_supported *bool
413*333d2b36SAndroid Build Coastguard Worker
414*333d2b36SAndroid Build Coastguard Worker	Installable *bool `android:"arch_variant"`
415*333d2b36SAndroid Build Coastguard Worker
416*333d2b36SAndroid Build Coastguard Worker	// Set by factories of module types that can only be referenced from variants compiled against
417*333d2b36SAndroid Build Coastguard Worker	// the SDK.
418*333d2b36SAndroid Build Coastguard Worker	AlwaysSdk bool `blueprint:"mutated"`
419*333d2b36SAndroid Build Coastguard Worker
420*333d2b36SAndroid Build Coastguard Worker	// Variant is an SDK variant created by sdkMutator
421*333d2b36SAndroid Build Coastguard Worker	IsSdkVariant bool `blueprint:"mutated"`
422*333d2b36SAndroid Build Coastguard Worker	// Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
423*333d2b36SAndroid Build Coastguard Worker	// variant to have a ".sdk" suffix.
424*333d2b36SAndroid Build Coastguard Worker	SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
425*333d2b36SAndroid Build Coastguard Worker
426*333d2b36SAndroid Build Coastguard Worker	Target struct {
427*333d2b36SAndroid Build Coastguard Worker		Platform struct {
428*333d2b36SAndroid Build Coastguard Worker			// List of modules required by the core variant.
429*333d2b36SAndroid Build Coastguard Worker			Required []string `android:"arch_variant"`
430*333d2b36SAndroid Build Coastguard Worker
431*333d2b36SAndroid Build Coastguard Worker			// List of modules not required by the core variant.
432*333d2b36SAndroid Build Coastguard Worker			Exclude_required []string `android:"arch_variant"`
433*333d2b36SAndroid Build Coastguard Worker		} `android:"arch_variant"`
434*333d2b36SAndroid Build Coastguard Worker
435*333d2b36SAndroid Build Coastguard Worker		Recovery struct {
436*333d2b36SAndroid Build Coastguard Worker			// List of modules required by the recovery variant.
437*333d2b36SAndroid Build Coastguard Worker			Required []string `android:"arch_variant"`
438*333d2b36SAndroid Build Coastguard Worker
439*333d2b36SAndroid Build Coastguard Worker			// List of modules not required by the recovery variant.
440*333d2b36SAndroid Build Coastguard Worker			Exclude_required []string `android:"arch_variant"`
441*333d2b36SAndroid Build Coastguard Worker		} `android:"arch_variant"`
442*333d2b36SAndroid Build Coastguard Worker	} `android:"arch_variant"`
443*333d2b36SAndroid Build Coastguard Worker}
444*333d2b36SAndroid Build Coastguard Worker
445*333d2b36SAndroid Build Coastguard Workertype VendorProperties struct {
446*333d2b36SAndroid Build Coastguard Worker	// whether this module should be allowed to be directly depended by other
447*333d2b36SAndroid Build Coastguard Worker	// modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
448*333d2b36SAndroid Build Coastguard Worker	// If set to true, two variants will be built separately, one like
449*333d2b36SAndroid Build Coastguard Worker	// normal, and the other limited to the set of libraries and headers
450*333d2b36SAndroid Build Coastguard Worker	// that are exposed to /vendor modules.
451*333d2b36SAndroid Build Coastguard Worker	//
452*333d2b36SAndroid Build Coastguard Worker	// The vendor variant may be used with a different (newer) /system,
453*333d2b36SAndroid Build Coastguard Worker	// so it shouldn't have any unversioned runtime dependencies, or
454*333d2b36SAndroid Build Coastguard Worker	// make assumptions about the system that may not be true in the
455*333d2b36SAndroid Build Coastguard Worker	// future.
456*333d2b36SAndroid Build Coastguard Worker	//
457*333d2b36SAndroid Build Coastguard Worker	// If set to false, this module becomes inaccessible from /vendor modules.
458*333d2b36SAndroid Build Coastguard Worker	//
459*333d2b36SAndroid Build Coastguard Worker	// The modules with vndk: {enabled: true} must define 'vendor_available'
460*333d2b36SAndroid Build Coastguard Worker	// to 'true'.
461*333d2b36SAndroid Build Coastguard Worker	//
462*333d2b36SAndroid Build Coastguard Worker	// Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
463*333d2b36SAndroid Build Coastguard Worker	Vendor_available *bool
464*333d2b36SAndroid Build Coastguard Worker
465*333d2b36SAndroid Build Coastguard Worker	// This is the same as the "vendor_available" except that the install path
466*333d2b36SAndroid Build Coastguard Worker	// of the vendor variant is /odm or /vendor/odm.
467*333d2b36SAndroid Build Coastguard Worker	// By replacing "vendor_available: true" with "odm_available: true", the
468*333d2b36SAndroid Build Coastguard Worker	// module will install its vendor variant to the /odm partition or /vendor/odm.
469*333d2b36SAndroid Build Coastguard Worker	// As the modules with "odm_available: true" still create the vendor variants,
470*333d2b36SAndroid Build Coastguard Worker	// they can link to the other vendor modules as the vendor_available modules do.
471*333d2b36SAndroid Build Coastguard Worker	// Also, the vendor modules can link to odm_available modules.
472*333d2b36SAndroid Build Coastguard Worker	//
473*333d2b36SAndroid Build Coastguard Worker	// It may not be used for VNDK modules.
474*333d2b36SAndroid Build Coastguard Worker	Odm_available *bool
475*333d2b36SAndroid Build Coastguard Worker
476*333d2b36SAndroid Build Coastguard Worker	// whether this module should be allowed to be directly depended by other
477*333d2b36SAndroid Build Coastguard Worker	// modules with `product_specific: true` or `product_available: true`.
478*333d2b36SAndroid Build Coastguard Worker	// If set to true, an additional product variant will be built separately
479*333d2b36SAndroid Build Coastguard Worker	// that is limited to the set of libraries and headers that are exposed to
480*333d2b36SAndroid Build Coastguard Worker	// /product modules.
481*333d2b36SAndroid Build Coastguard Worker	//
482*333d2b36SAndroid Build Coastguard Worker	// The product variant may be used with a different (newer) /system,
483*333d2b36SAndroid Build Coastguard Worker	// so it shouldn't have any unversioned runtime dependencies, or
484*333d2b36SAndroid Build Coastguard Worker	// make assumptions about the system that may not be true in the
485*333d2b36SAndroid Build Coastguard Worker	// future.
486*333d2b36SAndroid Build Coastguard Worker	//
487*333d2b36SAndroid Build Coastguard Worker	// If set to false, this module becomes inaccessible from /product modules.
488*333d2b36SAndroid Build Coastguard Worker	//
489*333d2b36SAndroid Build Coastguard Worker	// Different from the 'vendor_available' property, the modules with
490*333d2b36SAndroid Build Coastguard Worker	// vndk: {enabled: true} don't have to define 'product_available'. The VNDK
491*333d2b36SAndroid Build Coastguard Worker	// library without 'product_available' may not be depended on by any other
492*333d2b36SAndroid Build Coastguard Worker	// modules that has product variants including the product available VNDKs.
493*333d2b36SAndroid Build Coastguard Worker	//
494*333d2b36SAndroid Build Coastguard Worker	// Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
495*333d2b36SAndroid Build Coastguard Worker	// and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
496*333d2b36SAndroid Build Coastguard Worker	Product_available *bool
497*333d2b36SAndroid Build Coastguard Worker
498*333d2b36SAndroid Build Coastguard Worker	// whether this module is capable of being loaded with other instance
499*333d2b36SAndroid Build Coastguard Worker	// (possibly an older version) of the same module in the same process.
500*333d2b36SAndroid Build Coastguard Worker	// Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
501*333d2b36SAndroid Build Coastguard Worker	// can be double loaded in a vendor process if the library is also a
502*333d2b36SAndroid Build Coastguard Worker	// (direct and indirect) dependency of an LLNDK library. Such libraries must be
503*333d2b36SAndroid Build Coastguard Worker	// explicitly marked as `double_loadable: true` by the owner, or the dependency
504*333d2b36SAndroid Build Coastguard Worker	// from the LLNDK lib should be cut if the lib is not designed to be double loaded.
505*333d2b36SAndroid Build Coastguard Worker	Double_loadable *bool
506*333d2b36SAndroid Build Coastguard Worker
507*333d2b36SAndroid Build Coastguard Worker	// IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
508*333d2b36SAndroid Build Coastguard Worker	IsLLNDK bool `blueprint:"mutated"`
509*333d2b36SAndroid Build Coastguard Worker
510*333d2b36SAndroid Build Coastguard Worker	// IsVendorPublicLibrary is set for the core and product variants of a library that has
511*333d2b36SAndroid Build Coastguard Worker	// vendor_public_library stubs.
512*333d2b36SAndroid Build Coastguard Worker	IsVendorPublicLibrary bool `blueprint:"mutated"`
513*333d2b36SAndroid Build Coastguard Worker}
514*333d2b36SAndroid Build Coastguard Worker
515*333d2b36SAndroid Build Coastguard Worker// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
516*333d2b36SAndroid Build Coastguard Worker// to understanding  details about the type of the current module.
517*333d2b36SAndroid Build Coastguard Worker// For example, one might call these functions to determine whether the current module is a static
518*333d2b36SAndroid Build Coastguard Worker// library and/or is installed in vendor directories.
519*333d2b36SAndroid Build Coastguard Workertype ModuleContextIntf interface {
520*333d2b36SAndroid Build Coastguard Worker	static() bool
521*333d2b36SAndroid Build Coastguard Worker	staticBinary() bool
522*333d2b36SAndroid Build Coastguard Worker	testBinary() bool
523*333d2b36SAndroid Build Coastguard Worker	testLibrary() bool
524*333d2b36SAndroid Build Coastguard Worker	header() bool
525*333d2b36SAndroid Build Coastguard Worker	binary() bool
526*333d2b36SAndroid Build Coastguard Worker	object() bool
527*333d2b36SAndroid Build Coastguard Worker	toolchain() config.Toolchain
528*333d2b36SAndroid Build Coastguard Worker	canUseSdk() bool
529*333d2b36SAndroid Build Coastguard Worker	useSdk() bool
530*333d2b36SAndroid Build Coastguard Worker	sdkVersion() string
531*333d2b36SAndroid Build Coastguard Worker	minSdkVersion() string
532*333d2b36SAndroid Build Coastguard Worker	isSdkVariant() bool
533*333d2b36SAndroid Build Coastguard Worker	useVndk() bool
534*333d2b36SAndroid Build Coastguard Worker	isNdk(config android.Config) bool
535*333d2b36SAndroid Build Coastguard Worker	IsLlndk() bool
536*333d2b36SAndroid Build Coastguard Worker	isImplementationForLLNDKPublic() bool
537*333d2b36SAndroid Build Coastguard Worker	IsVendorPublicLibrary() bool
538*333d2b36SAndroid Build Coastguard Worker	inProduct() bool
539*333d2b36SAndroid Build Coastguard Worker	inVendor() bool
540*333d2b36SAndroid Build Coastguard Worker	inRamdisk() bool
541*333d2b36SAndroid Build Coastguard Worker	inVendorRamdisk() bool
542*333d2b36SAndroid Build Coastguard Worker	inRecovery() bool
543*333d2b36SAndroid Build Coastguard Worker	InVendorOrProduct() bool
544*333d2b36SAndroid Build Coastguard Worker	selectedStl() string
545*333d2b36SAndroid Build Coastguard Worker	baseModuleName() string
546*333d2b36SAndroid Build Coastguard Worker	isAfdoCompile(ctx ModuleContext) bool
547*333d2b36SAndroid Build Coastguard Worker	isOrderfileCompile() bool
548*333d2b36SAndroid Build Coastguard Worker	isCfi() bool
549*333d2b36SAndroid Build Coastguard Worker	isFuzzer() bool
550*333d2b36SAndroid Build Coastguard Worker	isNDKStubLibrary() bool
551*333d2b36SAndroid Build Coastguard Worker	useClangLld(actx ModuleContext) bool
552*333d2b36SAndroid Build Coastguard Worker	isForPlatform() bool
553*333d2b36SAndroid Build Coastguard Worker	apexVariationName() string
554*333d2b36SAndroid Build Coastguard Worker	apexSdkVersion() android.ApiLevel
555*333d2b36SAndroid Build Coastguard Worker	bootstrap() bool
556*333d2b36SAndroid Build Coastguard Worker	nativeCoverage() bool
557*333d2b36SAndroid Build Coastguard Worker	isPreventInstall() bool
558*333d2b36SAndroid Build Coastguard Worker	isCfiAssemblySupportEnabled() bool
559*333d2b36SAndroid Build Coastguard Worker	getSharedFlags() *SharedFlags
560*333d2b36SAndroid Build Coastguard Worker	notInPlatform() bool
561*333d2b36SAndroid Build Coastguard Worker	optimizeForSize() bool
562*333d2b36SAndroid Build Coastguard Worker	getOrCreateMakeVarsInfo() *CcMakeVarsInfo
563*333d2b36SAndroid Build Coastguard Worker}
564*333d2b36SAndroid Build Coastguard Worker
565*333d2b36SAndroid Build Coastguard Workertype SharedFlags struct {
566*333d2b36SAndroid Build Coastguard Worker	numSharedFlags int
567*333d2b36SAndroid Build Coastguard Worker	flagsMap       map[string]string
568*333d2b36SAndroid Build Coastguard Worker}
569*333d2b36SAndroid Build Coastguard Worker
570*333d2b36SAndroid Build Coastguard Workertype ModuleContext interface {
571*333d2b36SAndroid Build Coastguard Worker	android.ModuleContext
572*333d2b36SAndroid Build Coastguard Worker	ModuleContextIntf
573*333d2b36SAndroid Build Coastguard Worker}
574*333d2b36SAndroid Build Coastguard Worker
575*333d2b36SAndroid Build Coastguard Workertype BaseModuleContext interface {
576*333d2b36SAndroid Build Coastguard Worker	android.BaseModuleContext
577*333d2b36SAndroid Build Coastguard Worker	ModuleContextIntf
578*333d2b36SAndroid Build Coastguard Worker}
579*333d2b36SAndroid Build Coastguard Worker
580*333d2b36SAndroid Build Coastguard Workertype DepsContext interface {
581*333d2b36SAndroid Build Coastguard Worker	android.BottomUpMutatorContext
582*333d2b36SAndroid Build Coastguard Worker	ModuleContextIntf
583*333d2b36SAndroid Build Coastguard Worker}
584*333d2b36SAndroid Build Coastguard Worker
585*333d2b36SAndroid Build Coastguard Worker// feature represents additional (optional) steps to building cc-related modules, such as invocation
586*333d2b36SAndroid Build Coastguard Worker// of clang-tidy.
587*333d2b36SAndroid Build Coastguard Workertype feature interface {
588*333d2b36SAndroid Build Coastguard Worker	flags(ctx ModuleContext, flags Flags) Flags
589*333d2b36SAndroid Build Coastguard Worker	props() []interface{}
590*333d2b36SAndroid Build Coastguard Worker}
591*333d2b36SAndroid Build Coastguard Worker
592*333d2b36SAndroid Build Coastguard Worker// Information returned from Generator about the source code it's generating
593*333d2b36SAndroid Build Coastguard Workertype GeneratedSource struct {
594*333d2b36SAndroid Build Coastguard Worker	IncludeDirs    android.Paths
595*333d2b36SAndroid Build Coastguard Worker	Sources        android.Paths
596*333d2b36SAndroid Build Coastguard Worker	Headers        android.Paths
597*333d2b36SAndroid Build Coastguard Worker	ReexportedDirs android.Paths
598*333d2b36SAndroid Build Coastguard Worker}
599*333d2b36SAndroid Build Coastguard Worker
600*333d2b36SAndroid Build Coastguard Worker// generator allows injection of generated code
601*333d2b36SAndroid Build Coastguard Workertype Generator interface {
602*333d2b36SAndroid Build Coastguard Worker	GeneratorProps() []interface{}
603*333d2b36SAndroid Build Coastguard Worker	GeneratorInit(ctx BaseModuleContext)
604*333d2b36SAndroid Build Coastguard Worker	GeneratorDeps(ctx DepsContext, deps Deps) Deps
605*333d2b36SAndroid Build Coastguard Worker	GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
606*333d2b36SAndroid Build Coastguard Worker	GeneratorSources(ctx ModuleContext) GeneratedSource
607*333d2b36SAndroid Build Coastguard Worker	GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
608*333d2b36SAndroid Build Coastguard Worker}
609*333d2b36SAndroid Build Coastguard Worker
610*333d2b36SAndroid Build Coastguard Worker// compiler is the interface for a compiler helper object. Different module decorators may implement
611*333d2b36SAndroid Build Coastguard Worker// this helper differently.
612*333d2b36SAndroid Build Coastguard Workertype compiler interface {
613*333d2b36SAndroid Build Coastguard Worker	compilerInit(ctx BaseModuleContext)
614*333d2b36SAndroid Build Coastguard Worker	compilerDeps(ctx DepsContext, deps Deps) Deps
615*333d2b36SAndroid Build Coastguard Worker	compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
616*333d2b36SAndroid Build Coastguard Worker	compilerProps() []interface{}
617*333d2b36SAndroid Build Coastguard Worker	baseCompilerProps() BaseCompilerProperties
618*333d2b36SAndroid Build Coastguard Worker
619*333d2b36SAndroid Build Coastguard Worker	appendCflags([]string)
620*333d2b36SAndroid Build Coastguard Worker	appendAsflags([]string)
621*333d2b36SAndroid Build Coastguard Worker	compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
622*333d2b36SAndroid Build Coastguard Worker}
623*333d2b36SAndroid Build Coastguard Worker
624*333d2b36SAndroid Build Coastguard Worker// linker is the interface for a linker decorator object. Individual module types can provide
625*333d2b36SAndroid Build Coastguard Worker// their own implementation for this decorator, and thus specify custom logic regarding build
626*333d2b36SAndroid Build Coastguard Worker// statements pertaining to linking.
627*333d2b36SAndroid Build Coastguard Workertype linker interface {
628*333d2b36SAndroid Build Coastguard Worker	linkerInit(ctx BaseModuleContext)
629*333d2b36SAndroid Build Coastguard Worker	linkerDeps(ctx DepsContext, deps Deps) Deps
630*333d2b36SAndroid Build Coastguard Worker	linkerFlags(ctx ModuleContext, flags Flags) Flags
631*333d2b36SAndroid Build Coastguard Worker	linkerProps() []interface{}
632*333d2b36SAndroid Build Coastguard Worker	baseLinkerProps() BaseLinkerProperties
633*333d2b36SAndroid Build Coastguard Worker	useClangLld(actx ModuleContext) bool
634*333d2b36SAndroid Build Coastguard Worker
635*333d2b36SAndroid Build Coastguard Worker	link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
636*333d2b36SAndroid Build Coastguard Worker	appendLdflags([]string)
637*333d2b36SAndroid Build Coastguard Worker	unstrippedOutputFilePath() android.Path
638*333d2b36SAndroid Build Coastguard Worker	strippedAllOutputFilePath() android.Path
639*333d2b36SAndroid Build Coastguard Worker
640*333d2b36SAndroid Build Coastguard Worker	nativeCoverage() bool
641*333d2b36SAndroid Build Coastguard Worker	coverageOutputFilePath() android.OptionalPath
642*333d2b36SAndroid Build Coastguard Worker
643*333d2b36SAndroid Build Coastguard Worker	// Get the deps that have been explicitly specified in the properties.
644*333d2b36SAndroid Build Coastguard Worker	linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
645*333d2b36SAndroid Build Coastguard Worker
646*333d2b36SAndroid Build Coastguard Worker	moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
647*333d2b36SAndroid Build Coastguard Worker}
648*333d2b36SAndroid Build Coastguard Worker
649*333d2b36SAndroid Build Coastguard Worker// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
650*333d2b36SAndroid Build Coastguard Workertype specifiedDeps struct {
651*333d2b36SAndroid Build Coastguard Worker	sharedLibs []string
652*333d2b36SAndroid Build Coastguard Worker	// Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
653*333d2b36SAndroid Build Coastguard Worker	// libc, libm, etc.)
654*333d2b36SAndroid Build Coastguard Worker	systemSharedLibs []string
655*333d2b36SAndroid Build Coastguard Worker}
656*333d2b36SAndroid Build Coastguard Worker
657*333d2b36SAndroid Build Coastguard Worker// installer is the interface for an installer helper object. This helper is responsible for
658*333d2b36SAndroid Build Coastguard Worker// copying build outputs to the appropriate locations so that they may be installed on device.
659*333d2b36SAndroid Build Coastguard Workertype installer interface {
660*333d2b36SAndroid Build Coastguard Worker	installerProps() []interface{}
661*333d2b36SAndroid Build Coastguard Worker	install(ctx ModuleContext, path android.Path)
662*333d2b36SAndroid Build Coastguard Worker	everInstallable() bool
663*333d2b36SAndroid Build Coastguard Worker	inData() bool
664*333d2b36SAndroid Build Coastguard Worker	inSanitizerDir() bool
665*333d2b36SAndroid Build Coastguard Worker	hostToolPath() android.OptionalPath
666*333d2b36SAndroid Build Coastguard Worker	relativeInstallPath() string
667*333d2b36SAndroid Build Coastguard Worker	makeUninstallable(mod *Module)
668*333d2b36SAndroid Build Coastguard Worker	installInRoot() bool
669*333d2b36SAndroid Build Coastguard Worker}
670*333d2b36SAndroid Build Coastguard Worker
671*333d2b36SAndroid Build Coastguard Workertype overridable interface {
672*333d2b36SAndroid Build Coastguard Worker	overriddenModules() []string
673*333d2b36SAndroid Build Coastguard Worker}
674*333d2b36SAndroid Build Coastguard Worker
675*333d2b36SAndroid Build Coastguard Workertype libraryDependencyKind int
676*333d2b36SAndroid Build Coastguard Worker
677*333d2b36SAndroid Build Coastguard Workerconst (
678*333d2b36SAndroid Build Coastguard Worker	headerLibraryDependency = iota
679*333d2b36SAndroid Build Coastguard Worker	sharedLibraryDependency
680*333d2b36SAndroid Build Coastguard Worker	staticLibraryDependency
681*333d2b36SAndroid Build Coastguard Worker	rlibLibraryDependency
682*333d2b36SAndroid Build Coastguard Worker)
683*333d2b36SAndroid Build Coastguard Worker
684*333d2b36SAndroid Build Coastguard Workerfunc (k libraryDependencyKind) String() string {
685*333d2b36SAndroid Build Coastguard Worker	switch k {
686*333d2b36SAndroid Build Coastguard Worker	case headerLibraryDependency:
687*333d2b36SAndroid Build Coastguard Worker		return "headerLibraryDependency"
688*333d2b36SAndroid Build Coastguard Worker	case sharedLibraryDependency:
689*333d2b36SAndroid Build Coastguard Worker		return "sharedLibraryDependency"
690*333d2b36SAndroid Build Coastguard Worker	case staticLibraryDependency:
691*333d2b36SAndroid Build Coastguard Worker		return "staticLibraryDependency"
692*333d2b36SAndroid Build Coastguard Worker	case rlibLibraryDependency:
693*333d2b36SAndroid Build Coastguard Worker		return "rlibLibraryDependency"
694*333d2b36SAndroid Build Coastguard Worker	default:
695*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
696*333d2b36SAndroid Build Coastguard Worker	}
697*333d2b36SAndroid Build Coastguard Worker}
698*333d2b36SAndroid Build Coastguard Worker
699*333d2b36SAndroid Build Coastguard Workertype libraryDependencyOrder int
700*333d2b36SAndroid Build Coastguard Worker
701*333d2b36SAndroid Build Coastguard Workerconst (
702*333d2b36SAndroid Build Coastguard Worker	earlyLibraryDependency  = -1
703*333d2b36SAndroid Build Coastguard Worker	normalLibraryDependency = 0
704*333d2b36SAndroid Build Coastguard Worker	lateLibraryDependency   = 1
705*333d2b36SAndroid Build Coastguard Worker)
706*333d2b36SAndroid Build Coastguard Worker
707*333d2b36SAndroid Build Coastguard Workerfunc (o libraryDependencyOrder) String() string {
708*333d2b36SAndroid Build Coastguard Worker	switch o {
709*333d2b36SAndroid Build Coastguard Worker	case earlyLibraryDependency:
710*333d2b36SAndroid Build Coastguard Worker		return "earlyLibraryDependency"
711*333d2b36SAndroid Build Coastguard Worker	case normalLibraryDependency:
712*333d2b36SAndroid Build Coastguard Worker		return "normalLibraryDependency"
713*333d2b36SAndroid Build Coastguard Worker	case lateLibraryDependency:
714*333d2b36SAndroid Build Coastguard Worker		return "lateLibraryDependency"
715*333d2b36SAndroid Build Coastguard Worker	default:
716*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
717*333d2b36SAndroid Build Coastguard Worker	}
718*333d2b36SAndroid Build Coastguard Worker}
719*333d2b36SAndroid Build Coastguard Worker
720*333d2b36SAndroid Build Coastguard Worker// libraryDependencyTag is used to tag dependencies on libraries.  Unlike many dependency
721*333d2b36SAndroid Build Coastguard Worker// tags that have a set of predefined tag objects that are reused for each dependency, a
722*333d2b36SAndroid Build Coastguard Worker// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
723*333d2b36SAndroid Build Coastguard Worker// That means that comparing a libraryDependencyTag for equality will only be equal if all
724*333d2b36SAndroid Build Coastguard Worker// of the metadata is equal.  Most usages will want to type assert to libraryDependencyTag and
725*333d2b36SAndroid Build Coastguard Worker// then check individual metadata fields instead.
726*333d2b36SAndroid Build Coastguard Workertype libraryDependencyTag struct {
727*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
728*333d2b36SAndroid Build Coastguard Worker
729*333d2b36SAndroid Build Coastguard Worker	// These are exported so that fmt.Printf("%#v") can call their String methods.
730*333d2b36SAndroid Build Coastguard Worker	Kind  libraryDependencyKind
731*333d2b36SAndroid Build Coastguard Worker	Order libraryDependencyOrder
732*333d2b36SAndroid Build Coastguard Worker
733*333d2b36SAndroid Build Coastguard Worker	wholeStatic bool
734*333d2b36SAndroid Build Coastguard Worker
735*333d2b36SAndroid Build Coastguard Worker	reexportFlags       bool
736*333d2b36SAndroid Build Coastguard Worker	explicitlyVersioned bool
737*333d2b36SAndroid Build Coastguard Worker	dataLib             bool
738*333d2b36SAndroid Build Coastguard Worker	ndk                 bool
739*333d2b36SAndroid Build Coastguard Worker
740*333d2b36SAndroid Build Coastguard Worker	staticUnwinder bool
741*333d2b36SAndroid Build Coastguard Worker
742*333d2b36SAndroid Build Coastguard Worker	makeSuffix string
743*333d2b36SAndroid Build Coastguard Worker
744*333d2b36SAndroid Build Coastguard Worker	// Whether or not this dependency should skip the apex dependency check
745*333d2b36SAndroid Build Coastguard Worker	skipApexAllowedDependenciesCheck bool
746*333d2b36SAndroid Build Coastguard Worker
747*333d2b36SAndroid Build Coastguard Worker	// Whether or not this dependency has to be followed for the apex variants
748*333d2b36SAndroid Build Coastguard Worker	excludeInApex bool
749*333d2b36SAndroid Build Coastguard Worker	// Whether or not this dependency has to be followed for the non-apex variants
750*333d2b36SAndroid Build Coastguard Worker	excludeInNonApex bool
751*333d2b36SAndroid Build Coastguard Worker
752*333d2b36SAndroid Build Coastguard Worker	// If true, don't automatically export symbols from the static library into a shared library.
753*333d2b36SAndroid Build Coastguard Worker	unexportedSymbols bool
754*333d2b36SAndroid Build Coastguard Worker}
755*333d2b36SAndroid Build Coastguard Worker
756*333d2b36SAndroid Build Coastguard Worker// header returns true if the libraryDependencyTag is tagging a header lib dependency.
757*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) header() bool {
758*333d2b36SAndroid Build Coastguard Worker	return d.Kind == headerLibraryDependency
759*333d2b36SAndroid Build Coastguard Worker}
760*333d2b36SAndroid Build Coastguard Worker
761*333d2b36SAndroid Build Coastguard Worker// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
762*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) shared() bool {
763*333d2b36SAndroid Build Coastguard Worker	return d.Kind == sharedLibraryDependency
764*333d2b36SAndroid Build Coastguard Worker}
765*333d2b36SAndroid Build Coastguard Worker
766*333d2b36SAndroid Build Coastguard Worker// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
767*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) static() bool {
768*333d2b36SAndroid Build Coastguard Worker	return d.Kind == staticLibraryDependency
769*333d2b36SAndroid Build Coastguard Worker}
770*333d2b36SAndroid Build Coastguard Worker
771*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
772*333d2b36SAndroid Build Coastguard Worker	if d.shared() {
773*333d2b36SAndroid Build Coastguard Worker		return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
774*333d2b36SAndroid Build Coastguard Worker	}
775*333d2b36SAndroid Build Coastguard Worker	return nil
776*333d2b36SAndroid Build Coastguard Worker}
777*333d2b36SAndroid Build Coastguard Worker
778*333d2b36SAndroid Build Coastguard Workervar _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
779*333d2b36SAndroid Build Coastguard Worker
780*333d2b36SAndroid Build Coastguard Worker// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
781*333d2b36SAndroid Build Coastguard Worker// binaries or other shared libraries are installed as dependencies.
782*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) InstallDepNeeded() bool {
783*333d2b36SAndroid Build Coastguard Worker	return d.shared()
784*333d2b36SAndroid Build Coastguard Worker}
785*333d2b36SAndroid Build Coastguard Worker
786*333d2b36SAndroid Build Coastguard Workervar _ android.InstallNeededDependencyTag = libraryDependencyTag{}
787*333d2b36SAndroid Build Coastguard Worker
788*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) PropagateAconfigValidation() bool {
789*333d2b36SAndroid Build Coastguard Worker	return d.static()
790*333d2b36SAndroid Build Coastguard Worker}
791*333d2b36SAndroid Build Coastguard Worker
792*333d2b36SAndroid Build Coastguard Workervar _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
793*333d2b36SAndroid Build Coastguard Worker
794*333d2b36SAndroid Build Coastguard Worker// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
795*333d2b36SAndroid Build Coastguard Worker// libraryDependencyTag.  Each tag object is created globally and reused for multiple
796*333d2b36SAndroid Build Coastguard Worker// dependencies (although since the object contains no references, assigning a tag to a
797*333d2b36SAndroid Build Coastguard Worker// variable and modifying it will not modify the original).  Users can compare the tag
798*333d2b36SAndroid Build Coastguard Worker// returned by ctx.OtherModuleDependencyTag against the global original
799*333d2b36SAndroid Build Coastguard Workertype dependencyTag struct {
800*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
801*333d2b36SAndroid Build Coastguard Worker	name string
802*333d2b36SAndroid Build Coastguard Worker}
803*333d2b36SAndroid Build Coastguard Worker
804*333d2b36SAndroid Build Coastguard Worker// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
805*333d2b36SAndroid Build Coastguard Worker// libraryDependencyTag, but where the dependency needs to be installed when the parent is
806*333d2b36SAndroid Build Coastguard Worker// installed.
807*333d2b36SAndroid Build Coastguard Workertype installDependencyTag struct {
808*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
809*333d2b36SAndroid Build Coastguard Worker	android.InstallAlwaysNeededDependencyTag
810*333d2b36SAndroid Build Coastguard Worker	name string
811*333d2b36SAndroid Build Coastguard Worker}
812*333d2b36SAndroid Build Coastguard Worker
813*333d2b36SAndroid Build Coastguard Workervar (
814*333d2b36SAndroid Build Coastguard Worker	genSourceDepTag       = dependencyTag{name: "gen source"}
815*333d2b36SAndroid Build Coastguard Worker	genHeaderDepTag       = dependencyTag{name: "gen header"}
816*333d2b36SAndroid Build Coastguard Worker	genHeaderExportDepTag = dependencyTag{name: "gen header export"}
817*333d2b36SAndroid Build Coastguard Worker	objDepTag             = dependencyTag{name: "obj"}
818*333d2b36SAndroid Build Coastguard Worker	dynamicLinkerDepTag   = installDependencyTag{name: "dynamic linker"}
819*333d2b36SAndroid Build Coastguard Worker	reuseObjTag           = dependencyTag{name: "reuse objects"}
820*333d2b36SAndroid Build Coastguard Worker	staticVariantTag      = dependencyTag{name: "static variant"}
821*333d2b36SAndroid Build Coastguard Worker	vndkExtDepTag         = dependencyTag{name: "vndk extends"}
822*333d2b36SAndroid Build Coastguard Worker	dataLibDepTag         = dependencyTag{name: "data lib"}
823*333d2b36SAndroid Build Coastguard Worker	dataBinDepTag         = dependencyTag{name: "data bin"}
824*333d2b36SAndroid Build Coastguard Worker	runtimeDepTag         = installDependencyTag{name: "runtime lib"}
825*333d2b36SAndroid Build Coastguard Worker	stubImplDepTag        = dependencyTag{name: "stub_impl"}
826*333d2b36SAndroid Build Coastguard Worker	JniFuzzLibTag         = dependencyTag{name: "jni_fuzz_lib_tag"}
827*333d2b36SAndroid Build Coastguard Worker	FdoProfileTag         = dependencyTag{name: "fdo_profile"}
828*333d2b36SAndroid Build Coastguard Worker	aidlLibraryTag        = dependencyTag{name: "aidl_library"}
829*333d2b36SAndroid Build Coastguard Worker	llndkHeaderLibTag     = dependencyTag{name: "llndk_header_lib"}
830*333d2b36SAndroid Build Coastguard Worker)
831*333d2b36SAndroid Build Coastguard Worker
832*333d2b36SAndroid Build Coastguard Workerfunc IsSharedDepTag(depTag blueprint.DependencyTag) bool {
833*333d2b36SAndroid Build Coastguard Worker	ccLibDepTag, ok := depTag.(libraryDependencyTag)
834*333d2b36SAndroid Build Coastguard Worker	return ok && ccLibDepTag.shared()
835*333d2b36SAndroid Build Coastguard Worker}
836*333d2b36SAndroid Build Coastguard Worker
837*333d2b36SAndroid Build Coastguard Workerfunc IsStaticDepTag(depTag blueprint.DependencyTag) bool {
838*333d2b36SAndroid Build Coastguard Worker	ccLibDepTag, ok := depTag.(libraryDependencyTag)
839*333d2b36SAndroid Build Coastguard Worker	return ok && ccLibDepTag.static()
840*333d2b36SAndroid Build Coastguard Worker}
841*333d2b36SAndroid Build Coastguard Worker
842*333d2b36SAndroid Build Coastguard Workerfunc IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
843*333d2b36SAndroid Build Coastguard Worker	ccLibDepTag, ok := depTag.(libraryDependencyTag)
844*333d2b36SAndroid Build Coastguard Worker	return ok && ccLibDepTag.header()
845*333d2b36SAndroid Build Coastguard Worker}
846*333d2b36SAndroid Build Coastguard Worker
847*333d2b36SAndroid Build Coastguard Workerfunc IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
848*333d2b36SAndroid Build Coastguard Worker	return depTag == runtimeDepTag
849*333d2b36SAndroid Build Coastguard Worker}
850*333d2b36SAndroid Build Coastguard Worker
851*333d2b36SAndroid Build Coastguard Worker// Module contains the properties and members used by all C/C++ module types, and implements
852*333d2b36SAndroid Build Coastguard Worker// the blueprint.Module interface.  It delegates to compiler, linker, and installer interfaces
853*333d2b36SAndroid Build Coastguard Worker// to construct the output file.  Behavior can be customized with a Customizer, or "decorator",
854*333d2b36SAndroid Build Coastguard Worker// interface.
855*333d2b36SAndroid Build Coastguard Worker//
856*333d2b36SAndroid Build Coastguard Worker// To define a C/C++ related module, construct a new Module object and point its delegates to
857*333d2b36SAndroid Build Coastguard Worker// type-specific structs. These delegates will be invoked to register module-specific build
858*333d2b36SAndroid Build Coastguard Worker// statements which may be unique to the module type. For example, module.compiler.compile() should
859*333d2b36SAndroid Build Coastguard Worker// be defined so as to register build statements which are responsible for compiling the module.
860*333d2b36SAndroid Build Coastguard Worker//
861*333d2b36SAndroid Build Coastguard Worker// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
862*333d2b36SAndroid Build Coastguard Worker// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
863*333d2b36SAndroid Build Coastguard Worker// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
864*333d2b36SAndroid Build Coastguard Worker// installer logic.
865*333d2b36SAndroid Build Coastguard Workertype Module struct {
866*333d2b36SAndroid Build Coastguard Worker	fuzz.FuzzModule
867*333d2b36SAndroid Build Coastguard Worker
868*333d2b36SAndroid Build Coastguard Worker	VendorProperties VendorProperties
869*333d2b36SAndroid Build Coastguard Worker	Properties       BaseProperties
870*333d2b36SAndroid Build Coastguard Worker	sourceProperties android.SourceProperties
871*333d2b36SAndroid Build Coastguard Worker
872*333d2b36SAndroid Build Coastguard Worker	// initialize before calling Init
873*333d2b36SAndroid Build Coastguard Worker	hod         android.HostOrDeviceSupported
874*333d2b36SAndroid Build Coastguard Worker	multilib    android.Multilib
875*333d2b36SAndroid Build Coastguard Worker	testModule  bool
876*333d2b36SAndroid Build Coastguard Worker	incremental bool
877*333d2b36SAndroid Build Coastguard Worker
878*333d2b36SAndroid Build Coastguard Worker	// Allowable SdkMemberTypes of this module type.
879*333d2b36SAndroid Build Coastguard Worker	sdkMemberTypes []android.SdkMemberType
880*333d2b36SAndroid Build Coastguard Worker
881*333d2b36SAndroid Build Coastguard Worker	// decorator delegates, initialize before calling Init
882*333d2b36SAndroid Build Coastguard Worker	// these may contain module-specific implementations, and effectively allow for custom
883*333d2b36SAndroid Build Coastguard Worker	// type-specific logic. These members may reference different objects or the same object.
884*333d2b36SAndroid Build Coastguard Worker	// Functions of these decorators will be invoked to initialize and register type-specific
885*333d2b36SAndroid Build Coastguard Worker	// build statements.
886*333d2b36SAndroid Build Coastguard Worker	generators []Generator
887*333d2b36SAndroid Build Coastguard Worker	compiler   compiler
888*333d2b36SAndroid Build Coastguard Worker	linker     linker
889*333d2b36SAndroid Build Coastguard Worker	installer  installer
890*333d2b36SAndroid Build Coastguard Worker
891*333d2b36SAndroid Build Coastguard Worker	features  []feature
892*333d2b36SAndroid Build Coastguard Worker	stl       *stl
893*333d2b36SAndroid Build Coastguard Worker	sanitize  *sanitize
894*333d2b36SAndroid Build Coastguard Worker	coverage  *coverage
895*333d2b36SAndroid Build Coastguard Worker	fuzzer    *fuzzer
896*333d2b36SAndroid Build Coastguard Worker	sabi      *sabi
897*333d2b36SAndroid Build Coastguard Worker	lto       *lto
898*333d2b36SAndroid Build Coastguard Worker	afdo      *afdo
899*333d2b36SAndroid Build Coastguard Worker	orderfile *orderfile
900*333d2b36SAndroid Build Coastguard Worker
901*333d2b36SAndroid Build Coastguard Worker	library libraryInterface
902*333d2b36SAndroid Build Coastguard Worker
903*333d2b36SAndroid Build Coastguard Worker	outputFile android.OptionalPath
904*333d2b36SAndroid Build Coastguard Worker
905*333d2b36SAndroid Build Coastguard Worker	cachedToolchain config.Toolchain
906*333d2b36SAndroid Build Coastguard Worker
907*333d2b36SAndroid Build Coastguard Worker	subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
908*333d2b36SAndroid Build Coastguard Worker
909*333d2b36SAndroid Build Coastguard Worker	// Flags used to compile this module
910*333d2b36SAndroid Build Coastguard Worker	flags Flags
911*333d2b36SAndroid Build Coastguard Worker
912*333d2b36SAndroid Build Coastguard Worker	// Shared flags among build rules of this module
913*333d2b36SAndroid Build Coastguard Worker	sharedFlags SharedFlags
914*333d2b36SAndroid Build Coastguard Worker
915*333d2b36SAndroid Build Coastguard Worker	// only non-nil when this is a shared library that reuses the objects of a static library
916*333d2b36SAndroid Build Coastguard Worker	staticAnalogue *StaticLibraryInfo
917*333d2b36SAndroid Build Coastguard Worker
918*333d2b36SAndroid Build Coastguard Worker	makeLinkType string
919*333d2b36SAndroid Build Coastguard Worker
920*333d2b36SAndroid Build Coastguard Worker	// For apex variants, this is set as apex.min_sdk_version
921*333d2b36SAndroid Build Coastguard Worker	apexSdkVersion android.ApiLevel
922*333d2b36SAndroid Build Coastguard Worker
923*333d2b36SAndroid Build Coastguard Worker	hideApexVariantFromMake bool
924*333d2b36SAndroid Build Coastguard Worker
925*333d2b36SAndroid Build Coastguard Worker	logtagsPaths android.Paths
926*333d2b36SAndroid Build Coastguard Worker
927*333d2b36SAndroid Build Coastguard Worker	WholeRustStaticlib bool
928*333d2b36SAndroid Build Coastguard Worker
929*333d2b36SAndroid Build Coastguard Worker	hasAidl         bool
930*333d2b36SAndroid Build Coastguard Worker	hasLex          bool
931*333d2b36SAndroid Build Coastguard Worker	hasProto        bool
932*333d2b36SAndroid Build Coastguard Worker	hasRenderscript bool
933*333d2b36SAndroid Build Coastguard Worker	hasSysprop      bool
934*333d2b36SAndroid Build Coastguard Worker	hasWinMsg       bool
935*333d2b36SAndroid Build Coastguard Worker	hasYacc         bool
936*333d2b36SAndroid Build Coastguard Worker
937*333d2b36SAndroid Build Coastguard Worker	makeVarsInfo *CcMakeVarsInfo
938*333d2b36SAndroid Build Coastguard Worker}
939*333d2b36SAndroid Build Coastguard Worker
940*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IncrementalSupported() bool {
941*333d2b36SAndroid Build Coastguard Worker	return c.incremental
942*333d2b36SAndroid Build Coastguard Worker}
943*333d2b36SAndroid Build Coastguard Worker
944*333d2b36SAndroid Build Coastguard Workervar _ blueprint.Incremental = (*Module)(nil)
945*333d2b36SAndroid Build Coastguard Worker
946*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) AddJSONData(d *map[string]interface{}) {
947*333d2b36SAndroid Build Coastguard Worker	c.AndroidModuleBase().AddJSONData(d)
948*333d2b36SAndroid Build Coastguard Worker	(*d)["Cc"] = map[string]interface{}{
949*333d2b36SAndroid Build Coastguard Worker		"SdkVersion":             c.SdkVersion(),
950*333d2b36SAndroid Build Coastguard Worker		"MinSdkVersion":          c.MinSdkVersion(),
951*333d2b36SAndroid Build Coastguard Worker		"VndkVersion":            c.VndkVersion(),
952*333d2b36SAndroid Build Coastguard Worker		"ProductSpecific":        c.ProductSpecific(),
953*333d2b36SAndroid Build Coastguard Worker		"SocSpecific":            c.SocSpecific(),
954*333d2b36SAndroid Build Coastguard Worker		"DeviceSpecific":         c.DeviceSpecific(),
955*333d2b36SAndroid Build Coastguard Worker		"InProduct":              c.InProduct(),
956*333d2b36SAndroid Build Coastguard Worker		"InVendor":               c.InVendor(),
957*333d2b36SAndroid Build Coastguard Worker		"InRamdisk":              c.InRamdisk(),
958*333d2b36SAndroid Build Coastguard Worker		"InVendorRamdisk":        c.InVendorRamdisk(),
959*333d2b36SAndroid Build Coastguard Worker		"InRecovery":             c.InRecovery(),
960*333d2b36SAndroid Build Coastguard Worker		"VendorAvailable":        c.VendorAvailable(),
961*333d2b36SAndroid Build Coastguard Worker		"ProductAvailable":       c.ProductAvailable(),
962*333d2b36SAndroid Build Coastguard Worker		"RamdiskAvailable":       c.RamdiskAvailable(),
963*333d2b36SAndroid Build Coastguard Worker		"VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
964*333d2b36SAndroid Build Coastguard Worker		"RecoveryAvailable":      c.RecoveryAvailable(),
965*333d2b36SAndroid Build Coastguard Worker		"OdmAvailable":           c.OdmAvailable(),
966*333d2b36SAndroid Build Coastguard Worker		"InstallInData":          c.InstallInData(),
967*333d2b36SAndroid Build Coastguard Worker		"InstallInRamdisk":       c.InstallInRamdisk(),
968*333d2b36SAndroid Build Coastguard Worker		"InstallInSanitizerDir":  c.InstallInSanitizerDir(),
969*333d2b36SAndroid Build Coastguard Worker		"InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
970*333d2b36SAndroid Build Coastguard Worker		"InstallInRecovery":      c.InstallInRecovery(),
971*333d2b36SAndroid Build Coastguard Worker		"InstallInRoot":          c.InstallInRoot(),
972*333d2b36SAndroid Build Coastguard Worker		"IsLlndk":                c.IsLlndk(),
973*333d2b36SAndroid Build Coastguard Worker		"IsVendorPublicLibrary":  c.IsVendorPublicLibrary(),
974*333d2b36SAndroid Build Coastguard Worker		"ApexSdkVersion":         c.apexSdkVersion,
975*333d2b36SAndroid Build Coastguard Worker		"AidlSrcs":               c.hasAidl,
976*333d2b36SAndroid Build Coastguard Worker		"LexSrcs":                c.hasLex,
977*333d2b36SAndroid Build Coastguard Worker		"ProtoSrcs":              c.hasProto,
978*333d2b36SAndroid Build Coastguard Worker		"RenderscriptSrcs":       c.hasRenderscript,
979*333d2b36SAndroid Build Coastguard Worker		"SyspropSrcs":            c.hasSysprop,
980*333d2b36SAndroid Build Coastguard Worker		"WinMsgSrcs":             c.hasWinMsg,
981*333d2b36SAndroid Build Coastguard Worker		"YaccSrsc":               c.hasYacc,
982*333d2b36SAndroid Build Coastguard Worker		"OnlyCSrcs":              !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
983*333d2b36SAndroid Build Coastguard Worker		"OptimizeForSize":        c.OptimizeForSize(),
984*333d2b36SAndroid Build Coastguard Worker	}
985*333d2b36SAndroid Build Coastguard Worker}
986*333d2b36SAndroid Build Coastguard Worker
987*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SetPreventInstall() {
988*333d2b36SAndroid Build Coastguard Worker	c.Properties.PreventInstall = true
989*333d2b36SAndroid Build Coastguard Worker}
990*333d2b36SAndroid Build Coastguard Worker
991*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SetHideFromMake() {
992*333d2b36SAndroid Build Coastguard Worker	c.Properties.HideFromMake = true
993*333d2b36SAndroid Build Coastguard Worker}
994*333d2b36SAndroid Build Coastguard Worker
995*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HiddenFromMake() bool {
996*333d2b36SAndroid Build Coastguard Worker	return c.Properties.HideFromMake
997*333d2b36SAndroid Build Coastguard Worker}
998*333d2b36SAndroid Build Coastguard Worker
999*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
1000*333d2b36SAndroid Build Coastguard Worker	required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
1001*333d2b36SAndroid Build Coastguard Worker	if c.ImageVariation().Variation == android.CoreVariation {
1002*333d2b36SAndroid Build Coastguard Worker		required = append(required, c.Properties.Target.Platform.Required...)
1003*333d2b36SAndroid Build Coastguard Worker		required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1004*333d2b36SAndroid Build Coastguard Worker	} else if c.InRecovery() {
1005*333d2b36SAndroid Build Coastguard Worker		required = append(required, c.Properties.Target.Recovery.Required...)
1006*333d2b36SAndroid Build Coastguard Worker		required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1007*333d2b36SAndroid Build Coastguard Worker	}
1008*333d2b36SAndroid Build Coastguard Worker	return android.FirstUniqueStrings(required)
1009*333d2b36SAndroid Build Coastguard Worker}
1010*333d2b36SAndroid Build Coastguard Worker
1011*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Toc() android.OptionalPath {
1012*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1013*333d2b36SAndroid Build Coastguard Worker		if library, ok := c.linker.(libraryInterface); ok {
1014*333d2b36SAndroid Build Coastguard Worker			return library.toc()
1015*333d2b36SAndroid Build Coastguard Worker		}
1016*333d2b36SAndroid Build Coastguard Worker	}
1017*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1018*333d2b36SAndroid Build Coastguard Worker}
1019*333d2b36SAndroid Build Coastguard Worker
1020*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ApiLevel() string {
1021*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1022*333d2b36SAndroid Build Coastguard Worker		if stub, ok := c.linker.(*stubDecorator); ok {
1023*333d2b36SAndroid Build Coastguard Worker			return stub.apiLevel.String()
1024*333d2b36SAndroid Build Coastguard Worker		}
1025*333d2b36SAndroid Build Coastguard Worker	}
1026*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1027*333d2b36SAndroid Build Coastguard Worker}
1028*333d2b36SAndroid Build Coastguard Worker
1029*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Static() bool {
1030*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1031*333d2b36SAndroid Build Coastguard Worker		if library, ok := c.linker.(libraryInterface); ok {
1032*333d2b36SAndroid Build Coastguard Worker			return library.static()
1033*333d2b36SAndroid Build Coastguard Worker		}
1034*333d2b36SAndroid Build Coastguard Worker	}
1035*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1036*333d2b36SAndroid Build Coastguard Worker}
1037*333d2b36SAndroid Build Coastguard Worker
1038*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Shared() bool {
1039*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1040*333d2b36SAndroid Build Coastguard Worker		if library, ok := c.linker.(libraryInterface); ok {
1041*333d2b36SAndroid Build Coastguard Worker			return library.shared()
1042*333d2b36SAndroid Build Coastguard Worker		}
1043*333d2b36SAndroid Build Coastguard Worker	}
1044*333d2b36SAndroid Build Coastguard Worker
1045*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1046*333d2b36SAndroid Build Coastguard Worker}
1047*333d2b36SAndroid Build Coastguard Worker
1048*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SelectedStl() string {
1049*333d2b36SAndroid Build Coastguard Worker	if c.stl != nil {
1050*333d2b36SAndroid Build Coastguard Worker		return c.stl.Properties.SelectedStl
1051*333d2b36SAndroid Build Coastguard Worker	}
1052*333d2b36SAndroid Build Coastguard Worker	return ""
1053*333d2b36SAndroid Build Coastguard Worker}
1054*333d2b36SAndroid Build Coastguard Worker
1055*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) StubDecorator() bool {
1056*333d2b36SAndroid Build Coastguard Worker	if _, ok := c.linker.(*stubDecorator); ok {
1057*333d2b36SAndroid Build Coastguard Worker		return true
1058*333d2b36SAndroid Build Coastguard Worker	}
1059*333d2b36SAndroid Build Coastguard Worker	return false
1060*333d2b36SAndroid Build Coastguard Worker}
1061*333d2b36SAndroid Build Coastguard Worker
1062*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) OptimizeForSize() bool {
1063*333d2b36SAndroid Build Coastguard Worker	return Bool(c.Properties.Optimize_for_size)
1064*333d2b36SAndroid Build Coastguard Worker}
1065*333d2b36SAndroid Build Coastguard Worker
1066*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SdkVersion() string {
1067*333d2b36SAndroid Build Coastguard Worker	return String(c.Properties.Sdk_version)
1068*333d2b36SAndroid Build Coastguard Worker}
1069*333d2b36SAndroid Build Coastguard Worker
1070*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) MinSdkVersion() string {
1071*333d2b36SAndroid Build Coastguard Worker	return String(c.Properties.Min_sdk_version)
1072*333d2b36SAndroid Build Coastguard Worker}
1073*333d2b36SAndroid Build Coastguard Worker
1074*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isCrt() bool {
1075*333d2b36SAndroid Build Coastguard Worker	if linker, ok := c.linker.(*objectLinker); ok {
1076*333d2b36SAndroid Build Coastguard Worker		return linker.isCrt()
1077*333d2b36SAndroid Build Coastguard Worker	}
1078*333d2b36SAndroid Build Coastguard Worker	return false
1079*333d2b36SAndroid Build Coastguard Worker}
1080*333d2b36SAndroid Build Coastguard Worker
1081*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SplitPerApiLevel() bool {
1082*333d2b36SAndroid Build Coastguard Worker	return c.canUseSdk() && c.isCrt()
1083*333d2b36SAndroid Build Coastguard Worker}
1084*333d2b36SAndroid Build Coastguard Worker
1085*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) AlwaysSdk() bool {
1086*333d2b36SAndroid Build Coastguard Worker	return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1087*333d2b36SAndroid Build Coastguard Worker}
1088*333d2b36SAndroid Build Coastguard Worker
1089*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CcLibrary() bool {
1090*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1091*333d2b36SAndroid Build Coastguard Worker		if _, ok := c.linker.(*libraryDecorator); ok {
1092*333d2b36SAndroid Build Coastguard Worker			return true
1093*333d2b36SAndroid Build Coastguard Worker		}
1094*333d2b36SAndroid Build Coastguard Worker		if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1095*333d2b36SAndroid Build Coastguard Worker			return true
1096*333d2b36SAndroid Build Coastguard Worker		}
1097*333d2b36SAndroid Build Coastguard Worker	}
1098*333d2b36SAndroid Build Coastguard Worker	return false
1099*333d2b36SAndroid Build Coastguard Worker}
1100*333d2b36SAndroid Build Coastguard Worker
1101*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CcLibraryInterface() bool {
1102*333d2b36SAndroid Build Coastguard Worker	if _, ok := c.linker.(libraryInterface); ok {
1103*333d2b36SAndroid Build Coastguard Worker		return true
1104*333d2b36SAndroid Build Coastguard Worker	}
1105*333d2b36SAndroid Build Coastguard Worker	return false
1106*333d2b36SAndroid Build Coastguard Worker}
1107*333d2b36SAndroid Build Coastguard Worker
1108*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RlibStd() bool {
1109*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1110*333d2b36SAndroid Build Coastguard Worker}
1111*333d2b36SAndroid Build Coastguard Worker
1112*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RustLibraryInterface() bool {
1113*333d2b36SAndroid Build Coastguard Worker	return false
1114*333d2b36SAndroid Build Coastguard Worker}
1115*333d2b36SAndroid Build Coastguard Worker
1116*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CrateName() string {
1117*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1118*333d2b36SAndroid Build Coastguard Worker}
1119*333d2b36SAndroid Build Coastguard Worker
1120*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ExportedCrateLinkDirs() []string {
1121*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1122*333d2b36SAndroid Build Coastguard Worker}
1123*333d2b36SAndroid Build Coastguard Worker
1124*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsFuzzModule() bool {
1125*333d2b36SAndroid Build Coastguard Worker	if _, ok := c.compiler.(*fuzzBinary); ok {
1126*333d2b36SAndroid Build Coastguard Worker		return true
1127*333d2b36SAndroid Build Coastguard Worker	}
1128*333d2b36SAndroid Build Coastguard Worker	return false
1129*333d2b36SAndroid Build Coastguard Worker}
1130*333d2b36SAndroid Build Coastguard Worker
1131*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1132*333d2b36SAndroid Build Coastguard Worker	return c.FuzzModule
1133*333d2b36SAndroid Build Coastguard Worker}
1134*333d2b36SAndroid Build Coastguard Worker
1135*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1136*333d2b36SAndroid Build Coastguard Worker	if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1137*333d2b36SAndroid Build Coastguard Worker		return fuzzer.fuzzPackagedModule
1138*333d2b36SAndroid Build Coastguard Worker	}
1139*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1140*333d2b36SAndroid Build Coastguard Worker}
1141*333d2b36SAndroid Build Coastguard Worker
1142*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
1143*333d2b36SAndroid Build Coastguard Worker	if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1144*333d2b36SAndroid Build Coastguard Worker		return fuzzer.sharedLibraries
1145*333d2b36SAndroid Build Coastguard Worker	}
1146*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1147*333d2b36SAndroid Build Coastguard Worker}
1148*333d2b36SAndroid Build Coastguard Worker
1149*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) NonCcVariants() bool {
1150*333d2b36SAndroid Build Coastguard Worker	return false
1151*333d2b36SAndroid Build Coastguard Worker}
1152*333d2b36SAndroid Build Coastguard Worker
1153*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SetStatic() {
1154*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1155*333d2b36SAndroid Build Coastguard Worker		if library, ok := c.linker.(libraryInterface); ok {
1156*333d2b36SAndroid Build Coastguard Worker			library.setStatic()
1157*333d2b36SAndroid Build Coastguard Worker			return
1158*333d2b36SAndroid Build Coastguard Worker		}
1159*333d2b36SAndroid Build Coastguard Worker	}
1160*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1161*333d2b36SAndroid Build Coastguard Worker}
1162*333d2b36SAndroid Build Coastguard Worker
1163*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SetShared() {
1164*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1165*333d2b36SAndroid Build Coastguard Worker		if library, ok := c.linker.(libraryInterface); ok {
1166*333d2b36SAndroid Build Coastguard Worker			library.setShared()
1167*333d2b36SAndroid Build Coastguard Worker			return
1168*333d2b36SAndroid Build Coastguard Worker		}
1169*333d2b36SAndroid Build Coastguard Worker	}
1170*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1171*333d2b36SAndroid Build Coastguard Worker}
1172*333d2b36SAndroid Build Coastguard Worker
1173*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) BuildStaticVariant() bool {
1174*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1175*333d2b36SAndroid Build Coastguard Worker		if library, ok := c.linker.(libraryInterface); ok {
1176*333d2b36SAndroid Build Coastguard Worker			return library.buildStatic()
1177*333d2b36SAndroid Build Coastguard Worker		}
1178*333d2b36SAndroid Build Coastguard Worker	}
1179*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1180*333d2b36SAndroid Build Coastguard Worker}
1181*333d2b36SAndroid Build Coastguard Worker
1182*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) BuildSharedVariant() bool {
1183*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1184*333d2b36SAndroid Build Coastguard Worker		if library, ok := c.linker.(libraryInterface); ok {
1185*333d2b36SAndroid Build Coastguard Worker			return library.buildShared()
1186*333d2b36SAndroid Build Coastguard Worker		}
1187*333d2b36SAndroid Build Coastguard Worker	}
1188*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1189*333d2b36SAndroid Build Coastguard Worker}
1190*333d2b36SAndroid Build Coastguard Worker
1191*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) BuildRlibVariant() bool {
1192*333d2b36SAndroid Build Coastguard Worker	// cc modules can never build rlib variants
1193*333d2b36SAndroid Build Coastguard Worker	return false
1194*333d2b36SAndroid Build Coastguard Worker}
1195*333d2b36SAndroid Build Coastguard Worker
1196*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsRustFFI() bool {
1197*333d2b36SAndroid Build Coastguard Worker	// cc modules are not Rust modules
1198*333d2b36SAndroid Build Coastguard Worker	return false
1199*333d2b36SAndroid Build Coastguard Worker}
1200*333d2b36SAndroid Build Coastguard Worker
1201*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Module() android.Module {
1202*333d2b36SAndroid Build Coastguard Worker	return c
1203*333d2b36SAndroid Build Coastguard Worker}
1204*333d2b36SAndroid Build Coastguard Worker
1205*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) OutputFile() android.OptionalPath {
1206*333d2b36SAndroid Build Coastguard Worker	return c.outputFile
1207*333d2b36SAndroid Build Coastguard Worker}
1208*333d2b36SAndroid Build Coastguard Worker
1209*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CoverageFiles() android.Paths {
1210*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1211*333d2b36SAndroid Build Coastguard Worker		if library, ok := c.linker.(libraryInterface); ok {
1212*333d2b36SAndroid Build Coastguard Worker			return library.objs().coverageFiles
1213*333d2b36SAndroid Build Coastguard Worker		}
1214*333d2b36SAndroid Build Coastguard Worker	}
1215*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1216*333d2b36SAndroid Build Coastguard Worker}
1217*333d2b36SAndroid Build Coastguard Worker
1218*333d2b36SAndroid Build Coastguard Workervar _ LinkableInterface = (*Module)(nil)
1219*333d2b36SAndroid Build Coastguard Worker
1220*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) UnstrippedOutputFile() android.Path {
1221*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1222*333d2b36SAndroid Build Coastguard Worker		return c.linker.unstrippedOutputFilePath()
1223*333d2b36SAndroid Build Coastguard Worker	}
1224*333d2b36SAndroid Build Coastguard Worker	return nil
1225*333d2b36SAndroid Build Coastguard Worker}
1226*333d2b36SAndroid Build Coastguard Worker
1227*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CoverageOutputFile() android.OptionalPath {
1228*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1229*333d2b36SAndroid Build Coastguard Worker		return c.linker.coverageOutputFilePath()
1230*333d2b36SAndroid Build Coastguard Worker	}
1231*333d2b36SAndroid Build Coastguard Worker	return android.OptionalPath{}
1232*333d2b36SAndroid Build Coastguard Worker}
1233*333d2b36SAndroid Build Coastguard Worker
1234*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RelativeInstallPath() string {
1235*333d2b36SAndroid Build Coastguard Worker	if c.installer != nil {
1236*333d2b36SAndroid Build Coastguard Worker		return c.installer.relativeInstallPath()
1237*333d2b36SAndroid Build Coastguard Worker	}
1238*333d2b36SAndroid Build Coastguard Worker	return ""
1239*333d2b36SAndroid Build Coastguard Worker}
1240*333d2b36SAndroid Build Coastguard Worker
1241*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) VndkVersion() string {
1242*333d2b36SAndroid Build Coastguard Worker	return c.Properties.VndkVersion
1243*333d2b36SAndroid Build Coastguard Worker}
1244*333d2b36SAndroid Build Coastguard Worker
1245*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Init() android.Module {
1246*333d2b36SAndroid Build Coastguard Worker	c.AddProperties(&c.Properties, &c.VendorProperties)
1247*333d2b36SAndroid Build Coastguard Worker	for _, generator := range c.generators {
1248*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(generator.GeneratorProps()...)
1249*333d2b36SAndroid Build Coastguard Worker	}
1250*333d2b36SAndroid Build Coastguard Worker	if c.compiler != nil {
1251*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.compiler.compilerProps()...)
1252*333d2b36SAndroid Build Coastguard Worker	}
1253*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1254*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.linker.linkerProps()...)
1255*333d2b36SAndroid Build Coastguard Worker	}
1256*333d2b36SAndroid Build Coastguard Worker	if c.installer != nil {
1257*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.installer.installerProps()...)
1258*333d2b36SAndroid Build Coastguard Worker	}
1259*333d2b36SAndroid Build Coastguard Worker	if c.stl != nil {
1260*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.stl.props()...)
1261*333d2b36SAndroid Build Coastguard Worker	}
1262*333d2b36SAndroid Build Coastguard Worker	if c.sanitize != nil {
1263*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.sanitize.props()...)
1264*333d2b36SAndroid Build Coastguard Worker	}
1265*333d2b36SAndroid Build Coastguard Worker	if c.coverage != nil {
1266*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.coverage.props()...)
1267*333d2b36SAndroid Build Coastguard Worker	}
1268*333d2b36SAndroid Build Coastguard Worker	if c.fuzzer != nil {
1269*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.fuzzer.props()...)
1270*333d2b36SAndroid Build Coastguard Worker	}
1271*333d2b36SAndroid Build Coastguard Worker	if c.sabi != nil {
1272*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.sabi.props()...)
1273*333d2b36SAndroid Build Coastguard Worker	}
1274*333d2b36SAndroid Build Coastguard Worker	if c.lto != nil {
1275*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.lto.props()...)
1276*333d2b36SAndroid Build Coastguard Worker	}
1277*333d2b36SAndroid Build Coastguard Worker	if c.afdo != nil {
1278*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.afdo.props()...)
1279*333d2b36SAndroid Build Coastguard Worker	}
1280*333d2b36SAndroid Build Coastguard Worker	if c.orderfile != nil {
1281*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(c.orderfile.props()...)
1282*333d2b36SAndroid Build Coastguard Worker	}
1283*333d2b36SAndroid Build Coastguard Worker	for _, feature := range c.features {
1284*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(feature.props()...)
1285*333d2b36SAndroid Build Coastguard Worker	}
1286*333d2b36SAndroid Build Coastguard Worker	// Allow test-only on libraries that are not cc_test_library
1287*333d2b36SAndroid Build Coastguard Worker	if c.library != nil && !c.testLibrary() {
1288*333d2b36SAndroid Build Coastguard Worker		c.AddProperties(&c.sourceProperties)
1289*333d2b36SAndroid Build Coastguard Worker	}
1290*333d2b36SAndroid Build Coastguard Worker
1291*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(c, c.hod, c.multilib)
1292*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(c)
1293*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultableModule(c)
1294*333d2b36SAndroid Build Coastguard Worker
1295*333d2b36SAndroid Build Coastguard Worker	return c
1296*333d2b36SAndroid Build Coastguard Worker}
1297*333d2b36SAndroid Build Coastguard Worker
1298*333d2b36SAndroid Build Coastguard Worker// UseVndk() returns true if this module is built against VNDK.
1299*333d2b36SAndroid Build Coastguard Worker// This means the vendor and product variants of a module.
1300*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) UseVndk() bool {
1301*333d2b36SAndroid Build Coastguard Worker	return c.Properties.VndkVersion != ""
1302*333d2b36SAndroid Build Coastguard Worker}
1303*333d2b36SAndroid Build Coastguard Worker
1304*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) canUseSdk() bool {
1305*333d2b36SAndroid Build Coastguard Worker	return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1306*333d2b36SAndroid Build Coastguard Worker		!c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
1307*333d2b36SAndroid Build Coastguard Worker}
1308*333d2b36SAndroid Build Coastguard Worker
1309*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) UseSdk() bool {
1310*333d2b36SAndroid Build Coastguard Worker	if c.canUseSdk() {
1311*333d2b36SAndroid Build Coastguard Worker		return String(c.Properties.Sdk_version) != ""
1312*333d2b36SAndroid Build Coastguard Worker	}
1313*333d2b36SAndroid Build Coastguard Worker	return false
1314*333d2b36SAndroid Build Coastguard Worker}
1315*333d2b36SAndroid Build Coastguard Worker
1316*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isCoverageVariant() bool {
1317*333d2b36SAndroid Build Coastguard Worker	return c.coverage.Properties.IsCoverageVariant
1318*333d2b36SAndroid Build Coastguard Worker}
1319*333d2b36SAndroid Build Coastguard Worker
1320*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsNdk(config android.Config) bool {
1321*333d2b36SAndroid Build Coastguard Worker	return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
1322*333d2b36SAndroid Build Coastguard Worker}
1323*333d2b36SAndroid Build Coastguard Worker
1324*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsLlndk() bool {
1325*333d2b36SAndroid Build Coastguard Worker	return c.VendorProperties.IsLLNDK
1326*333d2b36SAndroid Build Coastguard Worker}
1327*333d2b36SAndroid Build Coastguard Worker
1328*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) NeedsLlndkVariants() bool {
1329*333d2b36SAndroid Build Coastguard Worker	lib := moduleLibraryInterface(m)
1330*333d2b36SAndroid Build Coastguard Worker	return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
1331*333d2b36SAndroid Build Coastguard Worker}
1332*333d2b36SAndroid Build Coastguard Worker
1333*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) NeedsVendorPublicLibraryVariants() bool {
1334*333d2b36SAndroid Build Coastguard Worker	lib := moduleLibraryInterface(m)
1335*333d2b36SAndroid Build Coastguard Worker	return lib != nil && (lib.hasVendorPublicLibrary())
1336*333d2b36SAndroid Build Coastguard Worker}
1337*333d2b36SAndroid Build Coastguard Worker
1338*333d2b36SAndroid Build Coastguard Worker// IsVendorPublicLibrary returns true for vendor public libraries.
1339*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsVendorPublicLibrary() bool {
1340*333d2b36SAndroid Build Coastguard Worker	return c.VendorProperties.IsVendorPublicLibrary
1341*333d2b36SAndroid Build Coastguard Worker}
1342*333d2b36SAndroid Build Coastguard Worker
1343*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsVndkPrebuiltLibrary() bool {
1344*333d2b36SAndroid Build Coastguard Worker	if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1345*333d2b36SAndroid Build Coastguard Worker		return true
1346*333d2b36SAndroid Build Coastguard Worker	}
1347*333d2b36SAndroid Build Coastguard Worker	return false
1348*333d2b36SAndroid Build Coastguard Worker}
1349*333d2b36SAndroid Build Coastguard Worker
1350*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1351*333d2b36SAndroid Build Coastguard Worker	return c.Properties.SdkAndPlatformVariantVisibleToMake
1352*333d2b36SAndroid Build Coastguard Worker}
1353*333d2b36SAndroid Build Coastguard Worker
1354*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HasLlndkStubs() bool {
1355*333d2b36SAndroid Build Coastguard Worker	lib := moduleLibraryInterface(c)
1356*333d2b36SAndroid Build Coastguard Worker	return lib != nil && lib.hasLLNDKStubs()
1357*333d2b36SAndroid Build Coastguard Worker}
1358*333d2b36SAndroid Build Coastguard Worker
1359*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) StubsVersion() string {
1360*333d2b36SAndroid Build Coastguard Worker	if lib, ok := c.linker.(versionedInterface); ok {
1361*333d2b36SAndroid Build Coastguard Worker		return lib.stubsVersion()
1362*333d2b36SAndroid Build Coastguard Worker	}
1363*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1364*333d2b36SAndroid Build Coastguard Worker}
1365*333d2b36SAndroid Build Coastguard Worker
1366*333d2b36SAndroid Build Coastguard Worker// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1367*333d2b36SAndroid Build Coastguard Worker// and does not set llndk.vendor_available: false.
1368*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isImplementationForLLNDKPublic() bool {
1369*333d2b36SAndroid Build Coastguard Worker	library, _ := c.library.(*libraryDecorator)
1370*333d2b36SAndroid Build Coastguard Worker	return library != nil && library.hasLLNDKStubs() &&
1371*333d2b36SAndroid Build Coastguard Worker		!Bool(library.Properties.Llndk.Private)
1372*333d2b36SAndroid Build Coastguard Worker}
1373*333d2b36SAndroid Build Coastguard Worker
1374*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isAfdoCompile(ctx ModuleContext) bool {
1375*333d2b36SAndroid Build Coastguard Worker	if afdo := c.afdo; afdo != nil {
1376*333d2b36SAndroid Build Coastguard Worker		return afdo.isAfdoCompile(ctx)
1377*333d2b36SAndroid Build Coastguard Worker	}
1378*333d2b36SAndroid Build Coastguard Worker	return false
1379*333d2b36SAndroid Build Coastguard Worker}
1380*333d2b36SAndroid Build Coastguard Worker
1381*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isOrderfileCompile() bool {
1382*333d2b36SAndroid Build Coastguard Worker	if orderfile := c.orderfile; orderfile != nil {
1383*333d2b36SAndroid Build Coastguard Worker		return orderfile.Properties.OrderfileLoad
1384*333d2b36SAndroid Build Coastguard Worker	}
1385*333d2b36SAndroid Build Coastguard Worker	return false
1386*333d2b36SAndroid Build Coastguard Worker}
1387*333d2b36SAndroid Build Coastguard Worker
1388*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isCfi() bool {
1389*333d2b36SAndroid Build Coastguard Worker	return c.sanitize.isSanitizerEnabled(cfi)
1390*333d2b36SAndroid Build Coastguard Worker}
1391*333d2b36SAndroid Build Coastguard Worker
1392*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isFuzzer() bool {
1393*333d2b36SAndroid Build Coastguard Worker	return c.sanitize.isSanitizerEnabled(Fuzzer)
1394*333d2b36SAndroid Build Coastguard Worker}
1395*333d2b36SAndroid Build Coastguard Worker
1396*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isNDKStubLibrary() bool {
1397*333d2b36SAndroid Build Coastguard Worker	if _, ok := c.compiler.(*stubDecorator); ok {
1398*333d2b36SAndroid Build Coastguard Worker		return true
1399*333d2b36SAndroid Build Coastguard Worker	}
1400*333d2b36SAndroid Build Coastguard Worker	return false
1401*333d2b36SAndroid Build Coastguard Worker}
1402*333d2b36SAndroid Build Coastguard Worker
1403*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SubName() string {
1404*333d2b36SAndroid Build Coastguard Worker	return c.Properties.SubName
1405*333d2b36SAndroid Build Coastguard Worker}
1406*333d2b36SAndroid Build Coastguard Worker
1407*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsStubs() bool {
1408*333d2b36SAndroid Build Coastguard Worker	if lib := c.library; lib != nil {
1409*333d2b36SAndroid Build Coastguard Worker		return lib.buildStubs()
1410*333d2b36SAndroid Build Coastguard Worker	}
1411*333d2b36SAndroid Build Coastguard Worker	return false
1412*333d2b36SAndroid Build Coastguard Worker}
1413*333d2b36SAndroid Build Coastguard Worker
1414*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HasStubsVariants() bool {
1415*333d2b36SAndroid Build Coastguard Worker	if lib := c.library; lib != nil {
1416*333d2b36SAndroid Build Coastguard Worker		return lib.hasStubsVariants()
1417*333d2b36SAndroid Build Coastguard Worker	}
1418*333d2b36SAndroid Build Coastguard Worker	return false
1419*333d2b36SAndroid Build Coastguard Worker}
1420*333d2b36SAndroid Build Coastguard Worker
1421*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsStubsImplementationRequired() bool {
1422*333d2b36SAndroid Build Coastguard Worker	if lib := c.library; lib != nil {
1423*333d2b36SAndroid Build Coastguard Worker		return lib.isStubsImplementationRequired()
1424*333d2b36SAndroid Build Coastguard Worker	}
1425*333d2b36SAndroid Build Coastguard Worker	return false
1426*333d2b36SAndroid Build Coastguard Worker}
1427*333d2b36SAndroid Build Coastguard Worker
1428*333d2b36SAndroid Build Coastguard Worker// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1429*333d2b36SAndroid Build Coastguard Worker// the implementation.  If it is an implementation library it returns its own name.
1430*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1431*333d2b36SAndroid Build Coastguard Worker	name := ctx.OtherModuleName(c)
1432*333d2b36SAndroid Build Coastguard Worker	if versioned, ok := c.linker.(versionedInterface); ok {
1433*333d2b36SAndroid Build Coastguard Worker		name = versioned.implementationModuleName(name)
1434*333d2b36SAndroid Build Coastguard Worker	}
1435*333d2b36SAndroid Build Coastguard Worker	return name
1436*333d2b36SAndroid Build Coastguard Worker}
1437*333d2b36SAndroid Build Coastguard Worker
1438*333d2b36SAndroid Build Coastguard Worker// Similar to ImplementationModuleName, but uses the Make variant of the module
1439*333d2b36SAndroid Build Coastguard Worker// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1440*333d2b36SAndroid Build Coastguard Worker// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1441*333d2b36SAndroid Build Coastguard Worker// under the premise that the prebuilt module overrides its source counterpart
1442*333d2b36SAndroid Build Coastguard Worker// if it is exposed to Make).
1443*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1444*333d2b36SAndroid Build Coastguard Worker	name := c.BaseModuleName()
1445*333d2b36SAndroid Build Coastguard Worker	if versioned, ok := c.linker.(versionedInterface); ok {
1446*333d2b36SAndroid Build Coastguard Worker		name = versioned.implementationModuleName(name)
1447*333d2b36SAndroid Build Coastguard Worker	}
1448*333d2b36SAndroid Build Coastguard Worker	return name
1449*333d2b36SAndroid Build Coastguard Worker}
1450*333d2b36SAndroid Build Coastguard Worker
1451*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Bootstrap() bool {
1452*333d2b36SAndroid Build Coastguard Worker	return Bool(c.Properties.Bootstrap)
1453*333d2b36SAndroid Build Coastguard Worker}
1454*333d2b36SAndroid Build Coastguard Worker
1455*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) nativeCoverage() bool {
1456*333d2b36SAndroid Build Coastguard Worker	// Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1457*333d2b36SAndroid Build Coastguard Worker	if c.Target().NativeBridge == android.NativeBridgeEnabled {
1458*333d2b36SAndroid Build Coastguard Worker		return false
1459*333d2b36SAndroid Build Coastguard Worker	}
1460*333d2b36SAndroid Build Coastguard Worker	return c.linker != nil && c.linker.nativeCoverage()
1461*333d2b36SAndroid Build Coastguard Worker}
1462*333d2b36SAndroid Build Coastguard Worker
1463*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsSnapshotPrebuilt() bool {
1464*333d2b36SAndroid Build Coastguard Worker	if p, ok := c.linker.(SnapshotInterface); ok {
1465*333d2b36SAndroid Build Coastguard Worker		return p.IsSnapshotPrebuilt()
1466*333d2b36SAndroid Build Coastguard Worker	}
1467*333d2b36SAndroid Build Coastguard Worker	return false
1468*333d2b36SAndroid Build Coastguard Worker}
1469*333d2b36SAndroid Build Coastguard Worker
1470*333d2b36SAndroid Build Coastguard Workerfunc isBionic(name string) bool {
1471*333d2b36SAndroid Build Coastguard Worker	switch name {
1472*333d2b36SAndroid Build Coastguard Worker	case "libc", "libm", "libdl", "libdl_android", "linker":
1473*333d2b36SAndroid Build Coastguard Worker		return true
1474*333d2b36SAndroid Build Coastguard Worker	}
1475*333d2b36SAndroid Build Coastguard Worker	return false
1476*333d2b36SAndroid Build Coastguard Worker}
1477*333d2b36SAndroid Build Coastguard Worker
1478*333d2b36SAndroid Build Coastguard Workerfunc InstallToBootstrap(name string, config android.Config) bool {
1479*333d2b36SAndroid Build Coastguard Worker	if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
1480*333d2b36SAndroid Build Coastguard Worker		return true
1481*333d2b36SAndroid Build Coastguard Worker	}
1482*333d2b36SAndroid Build Coastguard Worker	return isBionic(name)
1483*333d2b36SAndroid Build Coastguard Worker}
1484*333d2b36SAndroid Build Coastguard Worker
1485*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isCfiAssemblySupportEnabled() bool {
1486*333d2b36SAndroid Build Coastguard Worker	return c.sanitize != nil &&
1487*333d2b36SAndroid Build Coastguard Worker		Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1488*333d2b36SAndroid Build Coastguard Worker}
1489*333d2b36SAndroid Build Coastguard Worker
1490*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInRoot() bool {
1491*333d2b36SAndroid Build Coastguard Worker	return c.installer != nil && c.installer.installInRoot()
1492*333d2b36SAndroid Build Coastguard Worker}
1493*333d2b36SAndroid Build Coastguard Worker
1494*333d2b36SAndroid Build Coastguard Workertype baseModuleContext struct {
1495*333d2b36SAndroid Build Coastguard Worker	android.BaseModuleContext
1496*333d2b36SAndroid Build Coastguard Worker	moduleContextImpl
1497*333d2b36SAndroid Build Coastguard Worker}
1498*333d2b36SAndroid Build Coastguard Worker
1499*333d2b36SAndroid Build Coastguard Workertype depsContext struct {
1500*333d2b36SAndroid Build Coastguard Worker	android.BottomUpMutatorContext
1501*333d2b36SAndroid Build Coastguard Worker	moduleContextImpl
1502*333d2b36SAndroid Build Coastguard Worker}
1503*333d2b36SAndroid Build Coastguard Worker
1504*333d2b36SAndroid Build Coastguard Workertype moduleContext struct {
1505*333d2b36SAndroid Build Coastguard Worker	android.ModuleContext
1506*333d2b36SAndroid Build Coastguard Worker	moduleContextImpl
1507*333d2b36SAndroid Build Coastguard Worker}
1508*333d2b36SAndroid Build Coastguard Worker
1509*333d2b36SAndroid Build Coastguard Workertype moduleContextImpl struct {
1510*333d2b36SAndroid Build Coastguard Worker	mod *Module
1511*333d2b36SAndroid Build Coastguard Worker	ctx BaseModuleContext
1512*333d2b36SAndroid Build Coastguard Worker}
1513*333d2b36SAndroid Build Coastguard Worker
1514*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) toolchain() config.Toolchain {
1515*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.toolchain(ctx.ctx)
1516*333d2b36SAndroid Build Coastguard Worker}
1517*333d2b36SAndroid Build Coastguard Worker
1518*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) static() bool {
1519*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.static()
1520*333d2b36SAndroid Build Coastguard Worker}
1521*333d2b36SAndroid Build Coastguard Worker
1522*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) staticBinary() bool {
1523*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.staticBinary()
1524*333d2b36SAndroid Build Coastguard Worker}
1525*333d2b36SAndroid Build Coastguard Worker
1526*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) testBinary() bool {
1527*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.testBinary()
1528*333d2b36SAndroid Build Coastguard Worker}
1529*333d2b36SAndroid Build Coastguard Worker
1530*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) testLibrary() bool {
1531*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.testLibrary()
1532*333d2b36SAndroid Build Coastguard Worker}
1533*333d2b36SAndroid Build Coastguard Worker
1534*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) header() bool {
1535*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.Header()
1536*333d2b36SAndroid Build Coastguard Worker}
1537*333d2b36SAndroid Build Coastguard Worker
1538*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) binary() bool {
1539*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.Binary()
1540*333d2b36SAndroid Build Coastguard Worker}
1541*333d2b36SAndroid Build Coastguard Worker
1542*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) object() bool {
1543*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.Object()
1544*333d2b36SAndroid Build Coastguard Worker}
1545*333d2b36SAndroid Build Coastguard Worker
1546*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) optimizeForSize() bool {
1547*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.OptimizeForSize()
1548*333d2b36SAndroid Build Coastguard Worker}
1549*333d2b36SAndroid Build Coastguard Worker
1550*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) canUseSdk() bool {
1551*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.canUseSdk()
1552*333d2b36SAndroid Build Coastguard Worker}
1553*333d2b36SAndroid Build Coastguard Worker
1554*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) useSdk() bool {
1555*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.UseSdk()
1556*333d2b36SAndroid Build Coastguard Worker}
1557*333d2b36SAndroid Build Coastguard Worker
1558*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) sdkVersion() string {
1559*333d2b36SAndroid Build Coastguard Worker	if ctx.ctx.Device() {
1560*333d2b36SAndroid Build Coastguard Worker		return String(ctx.mod.Properties.Sdk_version)
1561*333d2b36SAndroid Build Coastguard Worker	}
1562*333d2b36SAndroid Build Coastguard Worker	return ""
1563*333d2b36SAndroid Build Coastguard Worker}
1564*333d2b36SAndroid Build Coastguard Worker
1565*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) minSdkVersion() string {
1566*333d2b36SAndroid Build Coastguard Worker	ver := ctx.mod.MinSdkVersion()
1567*333d2b36SAndroid Build Coastguard Worker	if ver == "apex_inherit" && !ctx.isForPlatform() {
1568*333d2b36SAndroid Build Coastguard Worker		ver = ctx.apexSdkVersion().String()
1569*333d2b36SAndroid Build Coastguard Worker	}
1570*333d2b36SAndroid Build Coastguard Worker	if ver == "apex_inherit" || ver == "" {
1571*333d2b36SAndroid Build Coastguard Worker		ver = ctx.sdkVersion()
1572*333d2b36SAndroid Build Coastguard Worker	}
1573*333d2b36SAndroid Build Coastguard Worker
1574*333d2b36SAndroid Build Coastguard Worker	if ctx.ctx.Device() {
1575*333d2b36SAndroid Build Coastguard Worker		// When building for vendor/product, use the latest _stable_ API as "current".
1576*333d2b36SAndroid Build Coastguard Worker		// This is passed to clang/aidl compilers so that compiled/generated code works
1577*333d2b36SAndroid Build Coastguard Worker		// with the system.
1578*333d2b36SAndroid Build Coastguard Worker		if (ctx.inVendor() || ctx.inProduct()) && (ver == "" || ver == "current") {
1579*333d2b36SAndroid Build Coastguard Worker			ver = ctx.ctx.Config().PlatformSdkVersion().String()
1580*333d2b36SAndroid Build Coastguard Worker		}
1581*333d2b36SAndroid Build Coastguard Worker	}
1582*333d2b36SAndroid Build Coastguard Worker
1583*333d2b36SAndroid Build Coastguard Worker	// For crt objects, the meaning of min_sdk_version is very different from other types of
1584*333d2b36SAndroid Build Coastguard Worker	// module. For them, min_sdk_version defines the oldest version that the build system will
1585*333d2b36SAndroid Build Coastguard Worker	// create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1586*333d2b36SAndroid Build Coastguard Worker	// the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1587*333d2b36SAndroid Build Coastguard Worker	// and min_sdk_version properties of the variants are set to the corresponding version
1588*333d2b36SAndroid Build Coastguard Worker	// numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1589*333d2b36SAndroid Build Coastguard Worker	// untouched.  min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1590*333d2b36SAndroid Build Coastguard Worker	// support such an old version. The version is set to the later version in case when the
1591*333d2b36SAndroid Build Coastguard Worker	// non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1592*333d2b36SAndroid Build Coastguard Worker	// it's for an APEX.
1593*333d2b36SAndroid Build Coastguard Worker	if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1594*333d2b36SAndroid Build Coastguard Worker		if ctx.isForPlatform() {
1595*333d2b36SAndroid Build Coastguard Worker			ver = strconv.Itoa(android.FutureApiLevelInt)
1596*333d2b36SAndroid Build Coastguard Worker		} else { // for apex
1597*333d2b36SAndroid Build Coastguard Worker			ver = ctx.apexSdkVersion().String()
1598*333d2b36SAndroid Build Coastguard Worker			if ver == "" { // in case when min_sdk_version was not set by the APEX
1599*333d2b36SAndroid Build Coastguard Worker				ver = ctx.sdkVersion()
1600*333d2b36SAndroid Build Coastguard Worker			}
1601*333d2b36SAndroid Build Coastguard Worker		}
1602*333d2b36SAndroid Build Coastguard Worker	}
1603*333d2b36SAndroid Build Coastguard Worker
1604*333d2b36SAndroid Build Coastguard Worker	// Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1605*333d2b36SAndroid Build Coastguard Worker	sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1606*333d2b36SAndroid Build Coastguard Worker	minSdkVersionInt, err2 := strconv.Atoi(ver)
1607*333d2b36SAndroid Build Coastguard Worker	if err == nil && err2 == nil {
1608*333d2b36SAndroid Build Coastguard Worker		if sdkVersionInt < minSdkVersionInt {
1609*333d2b36SAndroid Build Coastguard Worker			return strconv.Itoa(sdkVersionInt)
1610*333d2b36SAndroid Build Coastguard Worker		}
1611*333d2b36SAndroid Build Coastguard Worker	}
1612*333d2b36SAndroid Build Coastguard Worker	return ver
1613*333d2b36SAndroid Build Coastguard Worker}
1614*333d2b36SAndroid Build Coastguard Worker
1615*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isSdkVariant() bool {
1616*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.IsSdkVariant()
1617*333d2b36SAndroid Build Coastguard Worker}
1618*333d2b36SAndroid Build Coastguard Worker
1619*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) useVndk() bool {
1620*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.UseVndk()
1621*333d2b36SAndroid Build Coastguard Worker}
1622*333d2b36SAndroid Build Coastguard Worker
1623*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) InVendorOrProduct() bool {
1624*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.InVendorOrProduct()
1625*333d2b36SAndroid Build Coastguard Worker}
1626*333d2b36SAndroid Build Coastguard Worker
1627*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1628*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.IsNdk(config)
1629*333d2b36SAndroid Build Coastguard Worker}
1630*333d2b36SAndroid Build Coastguard Worker
1631*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) IsLlndk() bool {
1632*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.IsLlndk()
1633*333d2b36SAndroid Build Coastguard Worker}
1634*333d2b36SAndroid Build Coastguard Worker
1635*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1636*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.isImplementationForLLNDKPublic()
1637*333d2b36SAndroid Build Coastguard Worker}
1638*333d2b36SAndroid Build Coastguard Worker
1639*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1640*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.isAfdoCompile(mctx)
1641*333d2b36SAndroid Build Coastguard Worker}
1642*333d2b36SAndroid Build Coastguard Worker
1643*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isOrderfileCompile() bool {
1644*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.isOrderfileCompile()
1645*333d2b36SAndroid Build Coastguard Worker}
1646*333d2b36SAndroid Build Coastguard Worker
1647*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isCfi() bool {
1648*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.isCfi()
1649*333d2b36SAndroid Build Coastguard Worker}
1650*333d2b36SAndroid Build Coastguard Worker
1651*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isFuzzer() bool {
1652*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.isFuzzer()
1653*333d2b36SAndroid Build Coastguard Worker}
1654*333d2b36SAndroid Build Coastguard Worker
1655*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1656*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.isNDKStubLibrary()
1657*333d2b36SAndroid Build Coastguard Worker}
1658*333d2b36SAndroid Build Coastguard Worker
1659*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1660*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.IsVendorPublicLibrary()
1661*333d2b36SAndroid Build Coastguard Worker}
1662*333d2b36SAndroid Build Coastguard Worker
1663*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) selectedStl() string {
1664*333d2b36SAndroid Build Coastguard Worker	if stl := ctx.mod.stl; stl != nil {
1665*333d2b36SAndroid Build Coastguard Worker		return stl.Properties.SelectedStl
1666*333d2b36SAndroid Build Coastguard Worker	}
1667*333d2b36SAndroid Build Coastguard Worker	return ""
1668*333d2b36SAndroid Build Coastguard Worker}
1669*333d2b36SAndroid Build Coastguard Worker
1670*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1671*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.linker.useClangLld(actx)
1672*333d2b36SAndroid Build Coastguard Worker}
1673*333d2b36SAndroid Build Coastguard Worker
1674*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) baseModuleName() string {
1675*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.BaseModuleName()
1676*333d2b36SAndroid Build Coastguard Worker}
1677*333d2b36SAndroid Build Coastguard Worker
1678*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isForPlatform() bool {
1679*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1680*333d2b36SAndroid Build Coastguard Worker	return apexInfo.IsForPlatform()
1681*333d2b36SAndroid Build Coastguard Worker}
1682*333d2b36SAndroid Build Coastguard Worker
1683*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) apexVariationName() string {
1684*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1685*333d2b36SAndroid Build Coastguard Worker	return apexInfo.ApexVariationName
1686*333d2b36SAndroid Build Coastguard Worker}
1687*333d2b36SAndroid Build Coastguard Worker
1688*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
1689*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.apexSdkVersion
1690*333d2b36SAndroid Build Coastguard Worker}
1691*333d2b36SAndroid Build Coastguard Worker
1692*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) bootstrap() bool {
1693*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.Bootstrap()
1694*333d2b36SAndroid Build Coastguard Worker}
1695*333d2b36SAndroid Build Coastguard Worker
1696*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) nativeCoverage() bool {
1697*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.nativeCoverage()
1698*333d2b36SAndroid Build Coastguard Worker}
1699*333d2b36SAndroid Build Coastguard Worker
1700*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isPreventInstall() bool {
1701*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.Properties.PreventInstall
1702*333d2b36SAndroid Build Coastguard Worker}
1703*333d2b36SAndroid Build Coastguard Worker
1704*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1705*333d2b36SAndroid Build Coastguard Worker	shared := &ctx.mod.sharedFlags
1706*333d2b36SAndroid Build Coastguard Worker	if shared.flagsMap == nil {
1707*333d2b36SAndroid Build Coastguard Worker		shared.numSharedFlags = 0
1708*333d2b36SAndroid Build Coastguard Worker		shared.flagsMap = make(map[string]string)
1709*333d2b36SAndroid Build Coastguard Worker	}
1710*333d2b36SAndroid Build Coastguard Worker	return shared
1711*333d2b36SAndroid Build Coastguard Worker}
1712*333d2b36SAndroid Build Coastguard Worker
1713*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1714*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.isCfiAssemblySupportEnabled()
1715*333d2b36SAndroid Build Coastguard Worker}
1716*333d2b36SAndroid Build Coastguard Worker
1717*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) notInPlatform() bool {
1718*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.NotInPlatform()
1719*333d2b36SAndroid Build Coastguard Worker}
1720*333d2b36SAndroid Build Coastguard Worker
1721*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1722*333d2b36SAndroid Build Coastguard Worker	if ctx.mod.makeVarsInfo == nil {
1723*333d2b36SAndroid Build Coastguard Worker		ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1724*333d2b36SAndroid Build Coastguard Worker	}
1725*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.makeVarsInfo
1726*333d2b36SAndroid Build Coastguard Worker}
1727*333d2b36SAndroid Build Coastguard Worker
1728*333d2b36SAndroid Build Coastguard Workerfunc newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
1729*333d2b36SAndroid Build Coastguard Worker	return &Module{
1730*333d2b36SAndroid Build Coastguard Worker		hod:      hod,
1731*333d2b36SAndroid Build Coastguard Worker		multilib: multilib,
1732*333d2b36SAndroid Build Coastguard Worker	}
1733*333d2b36SAndroid Build Coastguard Worker}
1734*333d2b36SAndroid Build Coastguard Worker
1735*333d2b36SAndroid Build Coastguard Workerfunc newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
1736*333d2b36SAndroid Build Coastguard Worker	module := newBaseModule(hod, multilib)
1737*333d2b36SAndroid Build Coastguard Worker	module.features = []feature{
1738*333d2b36SAndroid Build Coastguard Worker		&tidyFeature{},
1739*333d2b36SAndroid Build Coastguard Worker	}
1740*333d2b36SAndroid Build Coastguard Worker	module.stl = &stl{}
1741*333d2b36SAndroid Build Coastguard Worker	module.sanitize = &sanitize{}
1742*333d2b36SAndroid Build Coastguard Worker	module.coverage = &coverage{}
1743*333d2b36SAndroid Build Coastguard Worker	module.fuzzer = &fuzzer{}
1744*333d2b36SAndroid Build Coastguard Worker	module.sabi = &sabi{}
1745*333d2b36SAndroid Build Coastguard Worker	module.lto = &lto{}
1746*333d2b36SAndroid Build Coastguard Worker	module.afdo = &afdo{}
1747*333d2b36SAndroid Build Coastguard Worker	module.orderfile = &orderfile{}
1748*333d2b36SAndroid Build Coastguard Worker	return module
1749*333d2b36SAndroid Build Coastguard Worker}
1750*333d2b36SAndroid Build Coastguard Worker
1751*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Prebuilt() *android.Prebuilt {
1752*333d2b36SAndroid Build Coastguard Worker	if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1753*333d2b36SAndroid Build Coastguard Worker		return p.prebuilt()
1754*333d2b36SAndroid Build Coastguard Worker	}
1755*333d2b36SAndroid Build Coastguard Worker	return nil
1756*333d2b36SAndroid Build Coastguard Worker}
1757*333d2b36SAndroid Build Coastguard Worker
1758*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsPrebuilt() bool {
1759*333d2b36SAndroid Build Coastguard Worker	return c.Prebuilt() != nil
1760*333d2b36SAndroid Build Coastguard Worker}
1761*333d2b36SAndroid Build Coastguard Worker
1762*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Name() string {
1763*333d2b36SAndroid Build Coastguard Worker	name := c.ModuleBase.Name()
1764*333d2b36SAndroid Build Coastguard Worker	if p, ok := c.linker.(interface {
1765*333d2b36SAndroid Build Coastguard Worker		Name(string) string
1766*333d2b36SAndroid Build Coastguard Worker	}); ok {
1767*333d2b36SAndroid Build Coastguard Worker		name = p.Name(name)
1768*333d2b36SAndroid Build Coastguard Worker	}
1769*333d2b36SAndroid Build Coastguard Worker	return name
1770*333d2b36SAndroid Build Coastguard Worker}
1771*333d2b36SAndroid Build Coastguard Worker
1772*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Symlinks() []string {
1773*333d2b36SAndroid Build Coastguard Worker	if p, ok := c.installer.(interface {
1774*333d2b36SAndroid Build Coastguard Worker		symlinkList() []string
1775*333d2b36SAndroid Build Coastguard Worker	}); ok {
1776*333d2b36SAndroid Build Coastguard Worker		return p.symlinkList()
1777*333d2b36SAndroid Build Coastguard Worker	}
1778*333d2b36SAndroid Build Coastguard Worker	return nil
1779*333d2b36SAndroid Build Coastguard Worker}
1780*333d2b36SAndroid Build Coastguard Worker
1781*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) DataPaths() []android.DataPath {
1782*333d2b36SAndroid Build Coastguard Worker	if p, ok := c.installer.(interface {
1783*333d2b36SAndroid Build Coastguard Worker		dataPaths() []android.DataPath
1784*333d2b36SAndroid Build Coastguard Worker	}); ok {
1785*333d2b36SAndroid Build Coastguard Worker		return p.dataPaths()
1786*333d2b36SAndroid Build Coastguard Worker	}
1787*333d2b36SAndroid Build Coastguard Worker	return nil
1788*333d2b36SAndroid Build Coastguard Worker}
1789*333d2b36SAndroid Build Coastguard Worker
1790*333d2b36SAndroid Build Coastguard Workerfunc getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
1791*333d2b36SAndroid Build Coastguard Worker	// Returns the name suffix for product and vendor variants. If the VNDK version is not
1792*333d2b36SAndroid Build Coastguard Worker	// "current", it will append the VNDK version to the name suffix.
1793*333d2b36SAndroid Build Coastguard Worker	var nameSuffix string
1794*333d2b36SAndroid Build Coastguard Worker	if c.InProduct() {
1795*333d2b36SAndroid Build Coastguard Worker		if c.ProductSpecific() {
1796*333d2b36SAndroid Build Coastguard Worker			// If the module is product specific with 'product_specific: true',
1797*333d2b36SAndroid Build Coastguard Worker			// do not add a name suffix because it is a base module.
1798*333d2b36SAndroid Build Coastguard Worker			return ""
1799*333d2b36SAndroid Build Coastguard Worker		}
1800*333d2b36SAndroid Build Coastguard Worker		return ProductSuffix
1801*333d2b36SAndroid Build Coastguard Worker	} else {
1802*333d2b36SAndroid Build Coastguard Worker		nameSuffix = VendorSuffix
1803*333d2b36SAndroid Build Coastguard Worker	}
1804*333d2b36SAndroid Build Coastguard Worker	if c.VndkVersion() != "" {
1805*333d2b36SAndroid Build Coastguard Worker		// add version suffix only if the module is using different vndk version than the
1806*333d2b36SAndroid Build Coastguard Worker		// version in product or vendor partition.
1807*333d2b36SAndroid Build Coastguard Worker		nameSuffix += "." + c.VndkVersion()
1808*333d2b36SAndroid Build Coastguard Worker	}
1809*333d2b36SAndroid Build Coastguard Worker	return nameSuffix
1810*333d2b36SAndroid Build Coastguard Worker}
1811*333d2b36SAndroid Build Coastguard Worker
1812*333d2b36SAndroid Build Coastguard Workerfunc GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1813*333d2b36SAndroid Build Coastguard Worker	var subName = ""
1814*333d2b36SAndroid Build Coastguard Worker
1815*333d2b36SAndroid Build Coastguard Worker	if c.Target().NativeBridge == android.NativeBridgeEnabled {
1816*333d2b36SAndroid Build Coastguard Worker		subName += NativeBridgeSuffix
1817*333d2b36SAndroid Build Coastguard Worker	}
1818*333d2b36SAndroid Build Coastguard Worker
1819*333d2b36SAndroid Build Coastguard Worker	llndk := c.IsLlndk()
1820*333d2b36SAndroid Build Coastguard Worker	if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
1821*333d2b36SAndroid Build Coastguard Worker		// .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1822*333d2b36SAndroid Build Coastguard Worker		// added for product variant only when we have vendor and product variants with core
1823*333d2b36SAndroid Build Coastguard Worker		// variant. The suffix is not added for vendor-only or product-only module.
1824*333d2b36SAndroid Build Coastguard Worker		subName += getNameSuffixWithVndkVersion(actx, c)
1825*333d2b36SAndroid Build Coastguard Worker	} else if c.IsVendorPublicLibrary() {
1826*333d2b36SAndroid Build Coastguard Worker		subName += vendorPublicLibrarySuffix
1827*333d2b36SAndroid Build Coastguard Worker	} else if c.IsVndkPrebuiltLibrary() {
1828*333d2b36SAndroid Build Coastguard Worker		// .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1829*333d2b36SAndroid Build Coastguard Worker		// such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
1830*333d2b36SAndroid Build Coastguard Worker		subName += VendorSuffix
1831*333d2b36SAndroid Build Coastguard Worker	} else if c.InRamdisk() && !c.OnlyInRamdisk() {
1832*333d2b36SAndroid Build Coastguard Worker		subName += RamdiskSuffix
1833*333d2b36SAndroid Build Coastguard Worker	} else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
1834*333d2b36SAndroid Build Coastguard Worker		subName += VendorRamdiskSuffix
1835*333d2b36SAndroid Build Coastguard Worker	} else if c.InRecovery() && !c.OnlyInRecovery() {
1836*333d2b36SAndroid Build Coastguard Worker		subName += RecoverySuffix
1837*333d2b36SAndroid Build Coastguard Worker	} else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1838*333d2b36SAndroid Build Coastguard Worker		subName += sdkSuffix
1839*333d2b36SAndroid Build Coastguard Worker		if c.SplitPerApiLevel() {
1840*333d2b36SAndroid Build Coastguard Worker			subName += "." + c.SdkVersion()
1841*333d2b36SAndroid Build Coastguard Worker		}
1842*333d2b36SAndroid Build Coastguard Worker	} else if c.IsStubs() && c.IsSdkVariant() {
1843*333d2b36SAndroid Build Coastguard Worker		// Public API surface (NDK)
1844*333d2b36SAndroid Build Coastguard Worker		// Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1845*333d2b36SAndroid Build Coastguard Worker		subName = sdkSuffix
1846*333d2b36SAndroid Build Coastguard Worker	}
1847*333d2b36SAndroid Build Coastguard Worker
1848*333d2b36SAndroid Build Coastguard Worker	return subName
1849*333d2b36SAndroid Build Coastguard Worker}
1850*333d2b36SAndroid Build Coastguard Worker
1851*333d2b36SAndroid Build Coastguard Workerfunc moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1852*333d2b36SAndroid Build Coastguard Worker	ctx := &moduleContext{
1853*333d2b36SAndroid Build Coastguard Worker		ModuleContext: actx,
1854*333d2b36SAndroid Build Coastguard Worker		moduleContextImpl: moduleContextImpl{
1855*333d2b36SAndroid Build Coastguard Worker			mod: c,
1856*333d2b36SAndroid Build Coastguard Worker		},
1857*333d2b36SAndroid Build Coastguard Worker	}
1858*333d2b36SAndroid Build Coastguard Worker	ctx.ctx = ctx
1859*333d2b36SAndroid Build Coastguard Worker	return ctx
1860*333d2b36SAndroid Build Coastguard Worker}
1861*333d2b36SAndroid Build Coastguard Worker
1862*333d2b36SAndroid Build Coastguard Worker// TODO (b/277651159): Remove this allowlist
1863*333d2b36SAndroid Build Coastguard Workervar (
1864*333d2b36SAndroid Build Coastguard Worker	skipStubLibraryMultipleApexViolation = map[string]bool{
1865*333d2b36SAndroid Build Coastguard Worker		"libclang_rt.asan":   true,
1866*333d2b36SAndroid Build Coastguard Worker		"libclang_rt.hwasan": true,
1867*333d2b36SAndroid Build Coastguard Worker		// runtime apex
1868*333d2b36SAndroid Build Coastguard Worker		"libc":          true,
1869*333d2b36SAndroid Build Coastguard Worker		"libc_hwasan":   true,
1870*333d2b36SAndroid Build Coastguard Worker		"libdl_android": true,
1871*333d2b36SAndroid Build Coastguard Worker		"libm":          true,
1872*333d2b36SAndroid Build Coastguard Worker		"libdl":         true,
1873*333d2b36SAndroid Build Coastguard Worker		"libz":          true,
1874*333d2b36SAndroid Build Coastguard Worker		// art apex
1875*333d2b36SAndroid Build Coastguard Worker		// TODO(b/234351700): Remove this when com.android.art.debug is gone.
1876*333d2b36SAndroid Build Coastguard Worker		"libandroidio":    true,
1877*333d2b36SAndroid Build Coastguard Worker		"libdexfile":      true,
1878*333d2b36SAndroid Build Coastguard Worker		"libdexfiled":     true, // com.android.art.debug only
1879*333d2b36SAndroid Build Coastguard Worker		"libnativebridge": true,
1880*333d2b36SAndroid Build Coastguard Worker		"libnativehelper": true,
1881*333d2b36SAndroid Build Coastguard Worker		"libnativeloader": true,
1882*333d2b36SAndroid Build Coastguard Worker		"libsigchain":     true,
1883*333d2b36SAndroid Build Coastguard Worker	}
1884*333d2b36SAndroid Build Coastguard Worker)
1885*333d2b36SAndroid Build Coastguard Worker
1886*333d2b36SAndroid Build Coastguard Worker// Returns true if a stub library could be installed in multiple apexes
1887*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
1888*333d2b36SAndroid Build Coastguard Worker	// If this is not an apex variant, no check necessary
1889*333d2b36SAndroid Build Coastguard Worker	if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
1890*333d2b36SAndroid Build Coastguard Worker		return false
1891*333d2b36SAndroid Build Coastguard Worker	}
1892*333d2b36SAndroid Build Coastguard Worker	// If this is not a stub library, no check necessary
1893*333d2b36SAndroid Build Coastguard Worker	if !c.HasStubsVariants() {
1894*333d2b36SAndroid Build Coastguard Worker		return false
1895*333d2b36SAndroid Build Coastguard Worker	}
1896*333d2b36SAndroid Build Coastguard Worker	// Skip the allowlist
1897*333d2b36SAndroid Build Coastguard Worker	// Use BaseModuleName so that this matches prebuilts.
1898*333d2b36SAndroid Build Coastguard Worker	if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
1899*333d2b36SAndroid Build Coastguard Worker		return false
1900*333d2b36SAndroid Build Coastguard Worker	}
1901*333d2b36SAndroid Build Coastguard Worker
1902*333d2b36SAndroid Build Coastguard Worker	_, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
1903*333d2b36SAndroid Build Coastguard Worker	// Stub libraries should not have more than one apex_available
1904*333d2b36SAndroid Build Coastguard Worker	if len(aaWithoutTestApexes) > 1 {
1905*333d2b36SAndroid Build Coastguard Worker		return true
1906*333d2b36SAndroid Build Coastguard Worker	}
1907*333d2b36SAndroid Build Coastguard Worker	// Stub libraries should not use the wildcard
1908*333d2b36SAndroid Build Coastguard Worker	if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
1909*333d2b36SAndroid Build Coastguard Worker		return true
1910*333d2b36SAndroid Build Coastguard Worker	}
1911*333d2b36SAndroid Build Coastguard Worker	// Default: no violation
1912*333d2b36SAndroid Build Coastguard Worker	return false
1913*333d2b36SAndroid Build Coastguard Worker}
1914*333d2b36SAndroid Build Coastguard Worker
1915*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
1916*333d2b36SAndroid Build Coastguard Worker	ctx := moduleContextFromAndroidModuleContext(actx, c)
1917*333d2b36SAndroid Build Coastguard Worker
1918*333d2b36SAndroid Build Coastguard Worker	c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
1919*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
1920*333d2b36SAndroid Build Coastguard Worker		Logtags: c.logtagsPaths,
1921*333d2b36SAndroid Build Coastguard Worker	})
1922*333d2b36SAndroid Build Coastguard Worker
1923*333d2b36SAndroid Build Coastguard Worker	// If Test_only is set on a module in bp file, respect the setting, otherwise
1924*333d2b36SAndroid Build Coastguard Worker	// see if is a known test module type.
1925*333d2b36SAndroid Build Coastguard Worker	testOnly := c.testModule || c.testLibrary()
1926*333d2b36SAndroid Build Coastguard Worker	if c.sourceProperties.Test_only != nil {
1927*333d2b36SAndroid Build Coastguard Worker		testOnly = Bool(c.sourceProperties.Test_only)
1928*333d2b36SAndroid Build Coastguard Worker	}
1929*333d2b36SAndroid Build Coastguard Worker	// Keep before any early returns.
1930*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
1931*333d2b36SAndroid Build Coastguard Worker		TestOnly:       testOnly,
1932*333d2b36SAndroid Build Coastguard Worker		TopLevelTarget: c.testModule,
1933*333d2b36SAndroid Build Coastguard Worker	})
1934*333d2b36SAndroid Build Coastguard Worker
1935*333d2b36SAndroid Build Coastguard Worker	c.Properties.SubName = GetSubnameProperty(actx, c)
1936*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
1937*333d2b36SAndroid Build Coastguard Worker	if !apexInfo.IsForPlatform() {
1938*333d2b36SAndroid Build Coastguard Worker		c.hideApexVariantFromMake = true
1939*333d2b36SAndroid Build Coastguard Worker	}
1940*333d2b36SAndroid Build Coastguard Worker
1941*333d2b36SAndroid Build Coastguard Worker	c.makeLinkType = GetMakeLinkType(actx, c)
1942*333d2b36SAndroid Build Coastguard Worker
1943*333d2b36SAndroid Build Coastguard Worker	deps := c.depsToPaths(ctx)
1944*333d2b36SAndroid Build Coastguard Worker	if ctx.Failed() {
1945*333d2b36SAndroid Build Coastguard Worker		return
1946*333d2b36SAndroid Build Coastguard Worker	}
1947*333d2b36SAndroid Build Coastguard Worker
1948*333d2b36SAndroid Build Coastguard Worker	for _, generator := range c.generators {
1949*333d2b36SAndroid Build Coastguard Worker		gen := generator.GeneratorSources(ctx)
1950*333d2b36SAndroid Build Coastguard Worker		deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
1951*333d2b36SAndroid Build Coastguard Worker		deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
1952*333d2b36SAndroid Build Coastguard Worker		deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
1953*333d2b36SAndroid Build Coastguard Worker		deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
1954*333d2b36SAndroid Build Coastguard Worker		deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
1955*333d2b36SAndroid Build Coastguard Worker		if len(deps.Objs.objFiles) == 0 {
1956*333d2b36SAndroid Build Coastguard Worker			// If we are reusuing object files (which happens when we're a shared library and we're
1957*333d2b36SAndroid Build Coastguard Worker			// reusing our static variant's object files), then skip adding the actual source files,
1958*333d2b36SAndroid Build Coastguard Worker			// because we already have the object for it.
1959*333d2b36SAndroid Build Coastguard Worker			deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
1960*333d2b36SAndroid Build Coastguard Worker		}
1961*333d2b36SAndroid Build Coastguard Worker	}
1962*333d2b36SAndroid Build Coastguard Worker
1963*333d2b36SAndroid Build Coastguard Worker	if ctx.Failed() {
1964*333d2b36SAndroid Build Coastguard Worker		return
1965*333d2b36SAndroid Build Coastguard Worker	}
1966*333d2b36SAndroid Build Coastguard Worker
1967*333d2b36SAndroid Build Coastguard Worker	if c.stubLibraryMultipleApexViolation(actx) {
1968*333d2b36SAndroid Build Coastguard Worker		actx.PropertyErrorf("apex_available",
1969*333d2b36SAndroid Build Coastguard Worker			"Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
1970*333d2b36SAndroid Build Coastguard Worker	}
1971*333d2b36SAndroid Build Coastguard Worker	if c.Properties.Clang != nil && *c.Properties.Clang == false {
1972*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1973*333d2b36SAndroid Build Coastguard Worker	} else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
1974*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
1975*333d2b36SAndroid Build Coastguard Worker	}
1976*333d2b36SAndroid Build Coastguard Worker
1977*333d2b36SAndroid Build Coastguard Worker	flags := Flags{
1978*333d2b36SAndroid Build Coastguard Worker		Toolchain: c.toolchain(ctx),
1979*333d2b36SAndroid Build Coastguard Worker		EmitXrefs: ctx.Config().EmitXrefRules(),
1980*333d2b36SAndroid Build Coastguard Worker	}
1981*333d2b36SAndroid Build Coastguard Worker	for _, generator := range c.generators {
1982*333d2b36SAndroid Build Coastguard Worker		flags = generator.GeneratorFlags(ctx, flags, deps)
1983*333d2b36SAndroid Build Coastguard Worker	}
1984*333d2b36SAndroid Build Coastguard Worker	if c.compiler != nil {
1985*333d2b36SAndroid Build Coastguard Worker		flags = c.compiler.compilerFlags(ctx, flags, deps)
1986*333d2b36SAndroid Build Coastguard Worker	}
1987*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
1988*333d2b36SAndroid Build Coastguard Worker		flags = c.linker.linkerFlags(ctx, flags)
1989*333d2b36SAndroid Build Coastguard Worker	}
1990*333d2b36SAndroid Build Coastguard Worker	if c.stl != nil {
1991*333d2b36SAndroid Build Coastguard Worker		flags = c.stl.flags(ctx, flags)
1992*333d2b36SAndroid Build Coastguard Worker	}
1993*333d2b36SAndroid Build Coastguard Worker	if c.sanitize != nil {
1994*333d2b36SAndroid Build Coastguard Worker		flags = c.sanitize.flags(ctx, flags)
1995*333d2b36SAndroid Build Coastguard Worker	}
1996*333d2b36SAndroid Build Coastguard Worker	if c.coverage != nil {
1997*333d2b36SAndroid Build Coastguard Worker		flags, deps = c.coverage.flags(ctx, flags, deps)
1998*333d2b36SAndroid Build Coastguard Worker	}
1999*333d2b36SAndroid Build Coastguard Worker	if c.fuzzer != nil {
2000*333d2b36SAndroid Build Coastguard Worker		flags = c.fuzzer.flags(ctx, flags)
2001*333d2b36SAndroid Build Coastguard Worker	}
2002*333d2b36SAndroid Build Coastguard Worker	if c.lto != nil {
2003*333d2b36SAndroid Build Coastguard Worker		flags = c.lto.flags(ctx, flags)
2004*333d2b36SAndroid Build Coastguard Worker	}
2005*333d2b36SAndroid Build Coastguard Worker	if c.afdo != nil {
2006*333d2b36SAndroid Build Coastguard Worker		flags = c.afdo.flags(ctx, flags)
2007*333d2b36SAndroid Build Coastguard Worker	}
2008*333d2b36SAndroid Build Coastguard Worker	if c.orderfile != nil {
2009*333d2b36SAndroid Build Coastguard Worker		flags = c.orderfile.flags(ctx, flags)
2010*333d2b36SAndroid Build Coastguard Worker	}
2011*333d2b36SAndroid Build Coastguard Worker	for _, feature := range c.features {
2012*333d2b36SAndroid Build Coastguard Worker		flags = feature.flags(ctx, flags)
2013*333d2b36SAndroid Build Coastguard Worker	}
2014*333d2b36SAndroid Build Coastguard Worker	if ctx.Failed() {
2015*333d2b36SAndroid Build Coastguard Worker		return
2016*333d2b36SAndroid Build Coastguard Worker	}
2017*333d2b36SAndroid Build Coastguard Worker
2018*333d2b36SAndroid Build Coastguard Worker	flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2019*333d2b36SAndroid Build Coastguard Worker	flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2020*333d2b36SAndroid Build Coastguard Worker	flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
2021*333d2b36SAndroid Build Coastguard Worker
2022*333d2b36SAndroid Build Coastguard Worker	flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
2023*333d2b36SAndroid Build Coastguard Worker
2024*333d2b36SAndroid Build Coastguard Worker	for _, dir := range deps.IncludeDirs {
2025*333d2b36SAndroid Build Coastguard Worker		flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
2026*333d2b36SAndroid Build Coastguard Worker	}
2027*333d2b36SAndroid Build Coastguard Worker	for _, dir := range deps.SystemIncludeDirs {
2028*333d2b36SAndroid Build Coastguard Worker		flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
2029*333d2b36SAndroid Build Coastguard Worker	}
2030*333d2b36SAndroid Build Coastguard Worker
2031*333d2b36SAndroid Build Coastguard Worker	flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2032*333d2b36SAndroid Build Coastguard Worker
2033*333d2b36SAndroid Build Coastguard Worker	c.flags = flags
2034*333d2b36SAndroid Build Coastguard Worker	// We need access to all the flags seen by a source file.
2035*333d2b36SAndroid Build Coastguard Worker	if c.sabi != nil {
2036*333d2b36SAndroid Build Coastguard Worker		flags = c.sabi.flags(ctx, flags)
2037*333d2b36SAndroid Build Coastguard Worker	}
2038*333d2b36SAndroid Build Coastguard Worker
2039*333d2b36SAndroid Build Coastguard Worker	flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
2040*333d2b36SAndroid Build Coastguard Worker
2041*333d2b36SAndroid Build Coastguard Worker	for _, generator := range c.generators {
2042*333d2b36SAndroid Build Coastguard Worker		generator.GeneratorBuildActions(ctx, flags, deps)
2043*333d2b36SAndroid Build Coastguard Worker	}
2044*333d2b36SAndroid Build Coastguard Worker
2045*333d2b36SAndroid Build Coastguard Worker	var objs Objects
2046*333d2b36SAndroid Build Coastguard Worker	if c.compiler != nil {
2047*333d2b36SAndroid Build Coastguard Worker		objs = c.compiler.compile(ctx, flags, deps)
2048*333d2b36SAndroid Build Coastguard Worker		if ctx.Failed() {
2049*333d2b36SAndroid Build Coastguard Worker			return
2050*333d2b36SAndroid Build Coastguard Worker		}
2051*333d2b36SAndroid Build Coastguard Worker	}
2052*333d2b36SAndroid Build Coastguard Worker
2053*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
2054*333d2b36SAndroid Build Coastguard Worker		outputFile := c.linker.link(ctx, flags, deps, objs)
2055*333d2b36SAndroid Build Coastguard Worker		if ctx.Failed() {
2056*333d2b36SAndroid Build Coastguard Worker			return
2057*333d2b36SAndroid Build Coastguard Worker		}
2058*333d2b36SAndroid Build Coastguard Worker		c.outputFile = android.OptionalPathForPath(outputFile)
2059*333d2b36SAndroid Build Coastguard Worker
2060*333d2b36SAndroid Build Coastguard Worker		c.maybeUnhideFromMake()
2061*333d2b36SAndroid Build Coastguard Worker
2062*333d2b36SAndroid Build Coastguard Worker		android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2063*333d2b36SAndroid Build Coastguard Worker			ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2064*333d2b36SAndroid Build Coastguard Worker		})
2065*333d2b36SAndroid Build Coastguard Worker	}
2066*333d2b36SAndroid Build Coastguard Worker
2067*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()})
2068*333d2b36SAndroid Build Coastguard Worker
2069*333d2b36SAndroid Build Coastguard Worker	if Bool(c.Properties.Cmake_snapshot_supported) {
2070*333d2b36SAndroid Build Coastguard Worker		android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2071*333d2b36SAndroid Build Coastguard Worker	}
2072*333d2b36SAndroid Build Coastguard Worker
2073*333d2b36SAndroid Build Coastguard Worker	c.maybeInstall(ctx, apexInfo)
2074*333d2b36SAndroid Build Coastguard Worker
2075*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
2076*333d2b36SAndroid Build Coastguard Worker		moduleInfoJSON := ctx.ModuleInfoJSON()
2077*333d2b36SAndroid Build Coastguard Worker		c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2078*333d2b36SAndroid Build Coastguard Worker		moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2079*333d2b36SAndroid Build Coastguard Worker		moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2080*333d2b36SAndroid Build Coastguard Worker		moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2081*333d2b36SAndroid Build Coastguard Worker		moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2082*333d2b36SAndroid Build Coastguard Worker
2083*333d2b36SAndroid Build Coastguard Worker		moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2084*333d2b36SAndroid Build Coastguard Worker		moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2085*333d2b36SAndroid Build Coastguard Worker		moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2086*333d2b36SAndroid Build Coastguard Worker		moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2087*333d2b36SAndroid Build Coastguard Worker
2088*333d2b36SAndroid Build Coastguard Worker		if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2089*333d2b36SAndroid Build Coastguard Worker			(moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2090*333d2b36SAndroid Build Coastguard Worker			if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2091*333d2b36SAndroid Build Coastguard Worker				moduleInfoJSON.SubName += ".cfi"
2092*333d2b36SAndroid Build Coastguard Worker			}
2093*333d2b36SAndroid Build Coastguard Worker			if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2094*333d2b36SAndroid Build Coastguard Worker				moduleInfoJSON.SubName += ".hwasan"
2095*333d2b36SAndroid Build Coastguard Worker			}
2096*333d2b36SAndroid Build Coastguard Worker			if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2097*333d2b36SAndroid Build Coastguard Worker				moduleInfoJSON.SubName += ".scs"
2098*333d2b36SAndroid Build Coastguard Worker			}
2099*333d2b36SAndroid Build Coastguard Worker		}
2100*333d2b36SAndroid Build Coastguard Worker		moduleInfoJSON.SubName += c.Properties.SubName
2101*333d2b36SAndroid Build Coastguard Worker
2102*333d2b36SAndroid Build Coastguard Worker		if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2103*333d2b36SAndroid Build Coastguard Worker			moduleInfoJSON.Uninstallable = true
2104*333d2b36SAndroid Build Coastguard Worker		}
2105*333d2b36SAndroid Build Coastguard Worker	}
2106*333d2b36SAndroid Build Coastguard Worker
2107*333d2b36SAndroid Build Coastguard Worker	buildComplianceMetadataInfo(ctx, c, deps)
2108*333d2b36SAndroid Build Coastguard Worker
2109*333d2b36SAndroid Build Coastguard Worker	if b, ok := c.compiler.(*baseCompiler); ok {
2110*333d2b36SAndroid Build Coastguard Worker		c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2111*333d2b36SAndroid Build Coastguard Worker		c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2112*333d2b36SAndroid Build Coastguard Worker		c.hasProto = b.hasSrcExt(ctx, ".proto")
2113*333d2b36SAndroid Build Coastguard Worker		c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2114*333d2b36SAndroid Build Coastguard Worker		c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2115*333d2b36SAndroid Build Coastguard Worker		c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2116*333d2b36SAndroid Build Coastguard Worker		c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2117*333d2b36SAndroid Build Coastguard Worker	}
2118*333d2b36SAndroid Build Coastguard Worker
2119*333d2b36SAndroid Build Coastguard Worker	ccObjectInfo := CcObjectInfo{
2120*333d2b36SAndroid Build Coastguard Worker		kytheFiles: objs.kytheFiles,
2121*333d2b36SAndroid Build Coastguard Worker	}
2122*333d2b36SAndroid Build Coastguard Worker	if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
2123*333d2b36SAndroid Build Coastguard Worker		ccObjectInfo.objFiles = objs.objFiles
2124*333d2b36SAndroid Build Coastguard Worker		ccObjectInfo.tidyFiles = objs.tidyFiles
2125*333d2b36SAndroid Build Coastguard Worker	}
2126*333d2b36SAndroid Build Coastguard Worker	if len(ccObjectInfo.kytheFiles)+len(ccObjectInfo.objFiles)+len(ccObjectInfo.tidyFiles) > 0 {
2127*333d2b36SAndroid Build Coastguard Worker		android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2128*333d2b36SAndroid Build Coastguard Worker	}
2129*333d2b36SAndroid Build Coastguard Worker
2130*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, LinkableInfoKey, LinkableInfo{
2131*333d2b36SAndroid Build Coastguard Worker		StaticExecutable: c.StaticExecutable(),
2132*333d2b36SAndroid Build Coastguard Worker	})
2133*333d2b36SAndroid Build Coastguard Worker
2134*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, CcInfoProvider, CcInfo{
2135*333d2b36SAndroid Build Coastguard Worker		HasStubsVariants: c.HasStubsVariants(),
2136*333d2b36SAndroid Build Coastguard Worker	})
2137*333d2b36SAndroid Build Coastguard Worker
2138*333d2b36SAndroid Build Coastguard Worker	c.setOutputFiles(ctx)
2139*333d2b36SAndroid Build Coastguard Worker
2140*333d2b36SAndroid Build Coastguard Worker	if c.makeVarsInfo != nil {
2141*333d2b36SAndroid Build Coastguard Worker		android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2142*333d2b36SAndroid Build Coastguard Worker	}
2143*333d2b36SAndroid Build Coastguard Worker}
2144*333d2b36SAndroid Build Coastguard Worker
2145*333d2b36SAndroid Build Coastguard Workerfunc setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2146*333d2b36SAndroid Build Coastguard Worker	if len(files) > 0 {
2147*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(files, tag)
2148*333d2b36SAndroid Build Coastguard Worker	}
2149*333d2b36SAndroid Build Coastguard Worker}
2150*333d2b36SAndroid Build Coastguard Worker
2151*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) setOutputFiles(ctx ModuleContext) {
2152*333d2b36SAndroid Build Coastguard Worker	if c.outputFile.Valid() {
2153*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2154*333d2b36SAndroid Build Coastguard Worker	} else {
2155*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(android.Paths{}, "")
2156*333d2b36SAndroid Build Coastguard Worker	}
2157*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
2158*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2159*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2160*333d2b36SAndroid Build Coastguard Worker	}
2161*333d2b36SAndroid Build Coastguard Worker}
2162*333d2b36SAndroid Build Coastguard Worker
2163*333d2b36SAndroid Build Coastguard Workerfunc buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2164*333d2b36SAndroid Build Coastguard Worker	// Dump metadata that can not be done in android/compliance-metadata.go
2165*333d2b36SAndroid Build Coastguard Worker	complianceMetadataInfo := ctx.ComplianceMetadataInfo()
2166*333d2b36SAndroid Build Coastguard Worker	complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static()))
2167*333d2b36SAndroid Build Coastguard Worker	complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2168*333d2b36SAndroid Build Coastguard Worker
2169*333d2b36SAndroid Build Coastguard Worker	// Static deps
2170*333d2b36SAndroid Build Coastguard Worker	staticDeps := ctx.GetDirectDepsWithTag(StaticDepTag(false))
2171*333d2b36SAndroid Build Coastguard Worker	staticDepNames := make([]string, 0, len(staticDeps))
2172*333d2b36SAndroid Build Coastguard Worker	for _, dep := range staticDeps {
2173*333d2b36SAndroid Build Coastguard Worker		staticDepNames = append(staticDepNames, dep.Name())
2174*333d2b36SAndroid Build Coastguard Worker	}
2175*333d2b36SAndroid Build Coastguard Worker
2176*333d2b36SAndroid Build Coastguard Worker	staticDepPaths := make([]string, 0, len(deps.StaticLibs))
2177*333d2b36SAndroid Build Coastguard Worker	for _, dep := range deps.StaticLibs {
2178*333d2b36SAndroid Build Coastguard Worker		staticDepPaths = append(staticDepPaths, dep.String())
2179*333d2b36SAndroid Build Coastguard Worker	}
2180*333d2b36SAndroid Build Coastguard Worker	complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2181*333d2b36SAndroid Build Coastguard Worker	complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2182*333d2b36SAndroid Build Coastguard Worker
2183*333d2b36SAndroid Build Coastguard Worker	// Whole static deps
2184*333d2b36SAndroid Build Coastguard Worker	wholeStaticDeps := ctx.GetDirectDepsWithTag(StaticDepTag(true))
2185*333d2b36SAndroid Build Coastguard Worker	wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2186*333d2b36SAndroid Build Coastguard Worker	for _, dep := range wholeStaticDeps {
2187*333d2b36SAndroid Build Coastguard Worker		wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2188*333d2b36SAndroid Build Coastguard Worker	}
2189*333d2b36SAndroid Build Coastguard Worker
2190*333d2b36SAndroid Build Coastguard Worker	wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2191*333d2b36SAndroid Build Coastguard Worker	for _, dep := range deps.WholeStaticLibs {
2192*333d2b36SAndroid Build Coastguard Worker		wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2193*333d2b36SAndroid Build Coastguard Worker	}
2194*333d2b36SAndroid Build Coastguard Worker	complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2195*333d2b36SAndroid Build Coastguard Worker	complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
2196*333d2b36SAndroid Build Coastguard Worker}
2197*333d2b36SAndroid Build Coastguard Worker
2198*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) maybeUnhideFromMake() {
2199*333d2b36SAndroid Build Coastguard Worker	// If a lib is directly included in any of the APEXes or is not available to the
2200*333d2b36SAndroid Build Coastguard Worker	// platform (which is often the case when the stub is provided as a prebuilt),
2201*333d2b36SAndroid Build Coastguard Worker	// unhide the stubs variant having the latest version gets visible to make. In
2202*333d2b36SAndroid Build Coastguard Worker	// addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2203*333d2b36SAndroid Build Coastguard Worker	// force anything in the make world to link against the stubs library.  (unless it
2204*333d2b36SAndroid Build Coastguard Worker	// is explicitly referenced via .bootstrap suffix or the module is marked with
2205*333d2b36SAndroid Build Coastguard Worker	// 'bootstrap: true').
2206*333d2b36SAndroid Build Coastguard Worker	if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
2207*333d2b36SAndroid Build Coastguard Worker		!c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
2208*333d2b36SAndroid Build Coastguard Worker		c.IsStubs() && !c.InVendorRamdisk() {
2209*333d2b36SAndroid Build Coastguard Worker		c.Properties.HideFromMake = false // unhide
2210*333d2b36SAndroid Build Coastguard Worker		// Note: this is still non-installable
2211*333d2b36SAndroid Build Coastguard Worker	}
2212*333d2b36SAndroid Build Coastguard Worker}
2213*333d2b36SAndroid Build Coastguard Worker
2214*333d2b36SAndroid Build Coastguard Worker// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2215*333d2b36SAndroid Build Coastguard Worker// install hooks for installable modules, like binaries and tests.
2216*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
2217*333d2b36SAndroid Build Coastguard Worker	if !proptools.BoolDefault(c.Installable(), true) {
2218*333d2b36SAndroid Build Coastguard Worker		// If the module has been specifically configure to not be installed then
2219*333d2b36SAndroid Build Coastguard Worker		// hide from make as otherwise it will break when running inside make
2220*333d2b36SAndroid Build Coastguard Worker		// as the output path to install will not be specified. Not all uninstallable
2221*333d2b36SAndroid Build Coastguard Worker		// modules can be hidden from make as some are needed for resolving make side
2222*333d2b36SAndroid Build Coastguard Worker		// dependencies.
2223*333d2b36SAndroid Build Coastguard Worker		c.HideFromMake()
2224*333d2b36SAndroid Build Coastguard Worker		c.SkipInstall()
2225*333d2b36SAndroid Build Coastguard Worker	} else if !installable(c, apexInfo) {
2226*333d2b36SAndroid Build Coastguard Worker		c.SkipInstall()
2227*333d2b36SAndroid Build Coastguard Worker	}
2228*333d2b36SAndroid Build Coastguard Worker
2229*333d2b36SAndroid Build Coastguard Worker	// Still call c.installer.install though, the installs will be stored as PackageSpecs
2230*333d2b36SAndroid Build Coastguard Worker	// to allow using the outputs in a genrule.
2231*333d2b36SAndroid Build Coastguard Worker	if c.installer != nil && c.outputFile.Valid() {
2232*333d2b36SAndroid Build Coastguard Worker		c.installer.install(ctx, c.outputFile.Path())
2233*333d2b36SAndroid Build Coastguard Worker		if ctx.Failed() {
2234*333d2b36SAndroid Build Coastguard Worker			return
2235*333d2b36SAndroid Build Coastguard Worker		}
2236*333d2b36SAndroid Build Coastguard Worker	}
2237*333d2b36SAndroid Build Coastguard Worker}
2238*333d2b36SAndroid Build Coastguard Worker
2239*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
2240*333d2b36SAndroid Build Coastguard Worker	if c.cachedToolchain == nil {
2241*333d2b36SAndroid Build Coastguard Worker		c.cachedToolchain = config.FindToolchainWithContext(ctx)
2242*333d2b36SAndroid Build Coastguard Worker	}
2243*333d2b36SAndroid Build Coastguard Worker	return c.cachedToolchain
2244*333d2b36SAndroid Build Coastguard Worker}
2245*333d2b36SAndroid Build Coastguard Worker
2246*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) begin(ctx BaseModuleContext) {
2247*333d2b36SAndroid Build Coastguard Worker	for _, generator := range c.generators {
2248*333d2b36SAndroid Build Coastguard Worker		generator.GeneratorInit(ctx)
2249*333d2b36SAndroid Build Coastguard Worker	}
2250*333d2b36SAndroid Build Coastguard Worker	if c.compiler != nil {
2251*333d2b36SAndroid Build Coastguard Worker		c.compiler.compilerInit(ctx)
2252*333d2b36SAndroid Build Coastguard Worker	}
2253*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
2254*333d2b36SAndroid Build Coastguard Worker		c.linker.linkerInit(ctx)
2255*333d2b36SAndroid Build Coastguard Worker	}
2256*333d2b36SAndroid Build Coastguard Worker	if c.stl != nil {
2257*333d2b36SAndroid Build Coastguard Worker		c.stl.begin(ctx)
2258*333d2b36SAndroid Build Coastguard Worker	}
2259*333d2b36SAndroid Build Coastguard Worker	if c.sanitize != nil {
2260*333d2b36SAndroid Build Coastguard Worker		c.sanitize.begin(ctx)
2261*333d2b36SAndroid Build Coastguard Worker	}
2262*333d2b36SAndroid Build Coastguard Worker	if c.coverage != nil {
2263*333d2b36SAndroid Build Coastguard Worker		c.coverage.begin(ctx)
2264*333d2b36SAndroid Build Coastguard Worker	}
2265*333d2b36SAndroid Build Coastguard Worker	if c.afdo != nil {
2266*333d2b36SAndroid Build Coastguard Worker		c.afdo.begin(ctx)
2267*333d2b36SAndroid Build Coastguard Worker	}
2268*333d2b36SAndroid Build Coastguard Worker	if c.lto != nil {
2269*333d2b36SAndroid Build Coastguard Worker		c.lto.begin(ctx)
2270*333d2b36SAndroid Build Coastguard Worker	}
2271*333d2b36SAndroid Build Coastguard Worker	if c.orderfile != nil {
2272*333d2b36SAndroid Build Coastguard Worker		c.orderfile.begin(ctx)
2273*333d2b36SAndroid Build Coastguard Worker	}
2274*333d2b36SAndroid Build Coastguard Worker	if ctx.useSdk() && c.IsSdkVariant() {
2275*333d2b36SAndroid Build Coastguard Worker		version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
2276*333d2b36SAndroid Build Coastguard Worker		if err != nil {
2277*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("sdk_version", err.Error())
2278*333d2b36SAndroid Build Coastguard Worker			c.Properties.Sdk_version = nil
2279*333d2b36SAndroid Build Coastguard Worker		} else {
2280*333d2b36SAndroid Build Coastguard Worker			c.Properties.Sdk_version = StringPtr(version.String())
2281*333d2b36SAndroid Build Coastguard Worker		}
2282*333d2b36SAndroid Build Coastguard Worker	}
2283*333d2b36SAndroid Build Coastguard Worker}
2284*333d2b36SAndroid Build Coastguard Worker
2285*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) deps(ctx DepsContext) Deps {
2286*333d2b36SAndroid Build Coastguard Worker	deps := Deps{}
2287*333d2b36SAndroid Build Coastguard Worker
2288*333d2b36SAndroid Build Coastguard Worker	for _, generator := range c.generators {
2289*333d2b36SAndroid Build Coastguard Worker		deps = generator.GeneratorDeps(ctx, deps)
2290*333d2b36SAndroid Build Coastguard Worker	}
2291*333d2b36SAndroid Build Coastguard Worker	if c.compiler != nil {
2292*333d2b36SAndroid Build Coastguard Worker		deps = c.compiler.compilerDeps(ctx, deps)
2293*333d2b36SAndroid Build Coastguard Worker	}
2294*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
2295*333d2b36SAndroid Build Coastguard Worker		deps = c.linker.linkerDeps(ctx, deps)
2296*333d2b36SAndroid Build Coastguard Worker	}
2297*333d2b36SAndroid Build Coastguard Worker	if c.stl != nil {
2298*333d2b36SAndroid Build Coastguard Worker		deps = c.stl.deps(ctx, deps)
2299*333d2b36SAndroid Build Coastguard Worker	}
2300*333d2b36SAndroid Build Coastguard Worker	if c.coverage != nil {
2301*333d2b36SAndroid Build Coastguard Worker		deps = c.coverage.deps(ctx, deps)
2302*333d2b36SAndroid Build Coastguard Worker	}
2303*333d2b36SAndroid Build Coastguard Worker
2304*333d2b36SAndroid Build Coastguard Worker	deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2305*333d2b36SAndroid Build Coastguard Worker	deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2306*333d2b36SAndroid Build Coastguard Worker	deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2307*333d2b36SAndroid Build Coastguard Worker	deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2308*333d2b36SAndroid Build Coastguard Worker	deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2309*333d2b36SAndroid Build Coastguard Worker	deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
2310*333d2b36SAndroid Build Coastguard Worker	deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
2311*333d2b36SAndroid Build Coastguard Worker	deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
2312*333d2b36SAndroid Build Coastguard Worker
2313*333d2b36SAndroid Build Coastguard Worker	if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2314*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2315*333d2b36SAndroid Build Coastguard Worker	}
2316*333d2b36SAndroid Build Coastguard Worker
2317*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.ReexportSharedLibHeaders {
2318*333d2b36SAndroid Build Coastguard Worker		if !inList(lib, deps.SharedLibs) {
2319*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2320*333d2b36SAndroid Build Coastguard Worker		}
2321*333d2b36SAndroid Build Coastguard Worker	}
2322*333d2b36SAndroid Build Coastguard Worker
2323*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.ReexportStaticLibHeaders {
2324*333d2b36SAndroid Build Coastguard Worker		if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2325*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs or whole_static_libs: '%s'", lib)
2326*333d2b36SAndroid Build Coastguard Worker		}
2327*333d2b36SAndroid Build Coastguard Worker	}
2328*333d2b36SAndroid Build Coastguard Worker
2329*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.ReexportHeaderLibHeaders {
2330*333d2b36SAndroid Build Coastguard Worker		if !inList(lib, deps.HeaderLibs) {
2331*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2332*333d2b36SAndroid Build Coastguard Worker		}
2333*333d2b36SAndroid Build Coastguard Worker	}
2334*333d2b36SAndroid Build Coastguard Worker
2335*333d2b36SAndroid Build Coastguard Worker	for _, gen := range deps.ReexportGeneratedHeaders {
2336*333d2b36SAndroid Build Coastguard Worker		if !inList(gen, deps.GeneratedHeaders) {
2337*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2338*333d2b36SAndroid Build Coastguard Worker		}
2339*333d2b36SAndroid Build Coastguard Worker	}
2340*333d2b36SAndroid Build Coastguard Worker
2341*333d2b36SAndroid Build Coastguard Worker	return deps
2342*333d2b36SAndroid Build Coastguard Worker}
2343*333d2b36SAndroid Build Coastguard Worker
2344*333d2b36SAndroid Build Coastguard Workerfunc checkConflictingExplicitVersions(libs []string) error {
2345*333d2b36SAndroid Build Coastguard Worker	withoutVersion := func(s string) string {
2346*333d2b36SAndroid Build Coastguard Worker		name, _ := StubsLibNameAndVersion(s)
2347*333d2b36SAndroid Build Coastguard Worker		return name
2348*333d2b36SAndroid Build Coastguard Worker	}
2349*333d2b36SAndroid Build Coastguard Worker	var errs []error
2350*333d2b36SAndroid Build Coastguard Worker	for i, lib := range libs {
2351*333d2b36SAndroid Build Coastguard Worker		libName := withoutVersion(lib)
2352*333d2b36SAndroid Build Coastguard Worker		libsToCompare := libs[i+1:]
2353*333d2b36SAndroid Build Coastguard Worker		j := slices.IndexFunc(libsToCompare, func(s string) bool {
2354*333d2b36SAndroid Build Coastguard Worker			return withoutVersion(s) == libName
2355*333d2b36SAndroid Build Coastguard Worker		})
2356*333d2b36SAndroid Build Coastguard Worker		if j >= 0 {
2357*333d2b36SAndroid Build Coastguard Worker			errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2358*333d2b36SAndroid Build Coastguard Worker				lib, libsToCompare[j]))
2359*333d2b36SAndroid Build Coastguard Worker		}
2360*333d2b36SAndroid Build Coastguard Worker	}
2361*333d2b36SAndroid Build Coastguard Worker	return errors.Join(errs...)
2362*333d2b36SAndroid Build Coastguard Worker}
2363*333d2b36SAndroid Build Coastguard Worker
2364*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
2365*333d2b36SAndroid Build Coastguard Worker	ctx := &baseModuleContext{
2366*333d2b36SAndroid Build Coastguard Worker		BaseModuleContext: actx,
2367*333d2b36SAndroid Build Coastguard Worker		moduleContextImpl: moduleContextImpl{
2368*333d2b36SAndroid Build Coastguard Worker			mod: c,
2369*333d2b36SAndroid Build Coastguard Worker		},
2370*333d2b36SAndroid Build Coastguard Worker	}
2371*333d2b36SAndroid Build Coastguard Worker	ctx.ctx = ctx
2372*333d2b36SAndroid Build Coastguard Worker
2373*333d2b36SAndroid Build Coastguard Worker	c.begin(ctx)
2374*333d2b36SAndroid Build Coastguard Worker}
2375*333d2b36SAndroid Build Coastguard Worker
2376*333d2b36SAndroid Build Coastguard Worker// Split name#version into name and version
2377*333d2b36SAndroid Build Coastguard Workerfunc StubsLibNameAndVersion(name string) (string, string) {
2378*333d2b36SAndroid Build Coastguard Worker	if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2379*333d2b36SAndroid Build Coastguard Worker		version := name[sharp+1:]
2380*333d2b36SAndroid Build Coastguard Worker		libname := name[:sharp]
2381*333d2b36SAndroid Build Coastguard Worker		return libname, version
2382*333d2b36SAndroid Build Coastguard Worker	}
2383*333d2b36SAndroid Build Coastguard Worker	return name, ""
2384*333d2b36SAndroid Build Coastguard Worker}
2385*333d2b36SAndroid Build Coastguard Worker
2386*333d2b36SAndroid Build Coastguard Workerfunc GetCrtVariations(ctx android.BottomUpMutatorContext,
2387*333d2b36SAndroid Build Coastguard Worker	m LinkableInterface) []blueprint.Variation {
2388*333d2b36SAndroid Build Coastguard Worker	if ctx.Os() != android.Android {
2389*333d2b36SAndroid Build Coastguard Worker		return nil
2390*333d2b36SAndroid Build Coastguard Worker	}
2391*333d2b36SAndroid Build Coastguard Worker	if m.UseSdk() {
2392*333d2b36SAndroid Build Coastguard Worker		// Choose the CRT that best satisfies the min_sdk_version requirement of this module
2393*333d2b36SAndroid Build Coastguard Worker		minSdkVersion := m.MinSdkVersion()
2394*333d2b36SAndroid Build Coastguard Worker		if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2395*333d2b36SAndroid Build Coastguard Worker			minSdkVersion = m.SdkVersion()
2396*333d2b36SAndroid Build Coastguard Worker		}
2397*333d2b36SAndroid Build Coastguard Worker		apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2398*333d2b36SAndroid Build Coastguard Worker		if err != nil {
2399*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("min_sdk_version", err.Error())
2400*333d2b36SAndroid Build Coastguard Worker		}
2401*333d2b36SAndroid Build Coastguard Worker
2402*333d2b36SAndroid Build Coastguard Worker		// Raise the minSdkVersion to the minimum supported for the architecture.
2403*333d2b36SAndroid Build Coastguard Worker		minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
2404*333d2b36SAndroid Build Coastguard Worker		if apiLevel.LessThan(minApiForArch) {
2405*333d2b36SAndroid Build Coastguard Worker			apiLevel = minApiForArch
2406*333d2b36SAndroid Build Coastguard Worker		}
2407*333d2b36SAndroid Build Coastguard Worker
2408*333d2b36SAndroid Build Coastguard Worker		return []blueprint.Variation{
2409*333d2b36SAndroid Build Coastguard Worker			{Mutator: "sdk", Variation: "sdk"},
2410*333d2b36SAndroid Build Coastguard Worker			{Mutator: "version", Variation: apiLevel.String()},
2411*333d2b36SAndroid Build Coastguard Worker		}
2412*333d2b36SAndroid Build Coastguard Worker	}
2413*333d2b36SAndroid Build Coastguard Worker	return []blueprint.Variation{
2414*333d2b36SAndroid Build Coastguard Worker		{Mutator: "sdk", Variation: ""},
2415*333d2b36SAndroid Build Coastguard Worker	}
2416*333d2b36SAndroid Build Coastguard Worker}
2417*333d2b36SAndroid Build Coastguard Worker
2418*333d2b36SAndroid Build Coastguard Workerfunc AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2419*333d2b36SAndroid Build Coastguard Worker	variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
2420*333d2b36SAndroid Build Coastguard Worker
2421*333d2b36SAndroid Build Coastguard Worker	variations = append([]blueprint.Variation(nil), variations...)
2422*333d2b36SAndroid Build Coastguard Worker
2423*333d2b36SAndroid Build Coastguard Worker	if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
2424*333d2b36SAndroid Build Coastguard Worker		// Version is explicitly specified. i.e. libFoo#30
2425*333d2b36SAndroid Build Coastguard Worker		if version == "impl" {
2426*333d2b36SAndroid Build Coastguard Worker			version = ""
2427*333d2b36SAndroid Build Coastguard Worker		}
2428*333d2b36SAndroid Build Coastguard Worker		variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
2429*333d2b36SAndroid Build Coastguard Worker		if tag, ok := depTag.(libraryDependencyTag); ok {
2430*333d2b36SAndroid Build Coastguard Worker			tag.explicitlyVersioned = true
2431*333d2b36SAndroid Build Coastguard Worker			// depTag is an interface that contains a concrete non-pointer struct.  That makes the local
2432*333d2b36SAndroid Build Coastguard Worker			// tag variable a copy of the contents of depTag, and updating it doesn't change depTag.  Reassign
2433*333d2b36SAndroid Build Coastguard Worker			// the modified copy to depTag.
2434*333d2b36SAndroid Build Coastguard Worker			depTag = tag
2435*333d2b36SAndroid Build Coastguard Worker		} else {
2436*333d2b36SAndroid Build Coastguard Worker			panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2437*333d2b36SAndroid Build Coastguard Worker		}
2438*333d2b36SAndroid Build Coastguard Worker	}
2439*333d2b36SAndroid Build Coastguard Worker
2440*333d2b36SAndroid Build Coastguard Worker	if far {
2441*333d2b36SAndroid Build Coastguard Worker		ctx.AddFarVariationDependencies(variations, depTag, name)
2442*333d2b36SAndroid Build Coastguard Worker	} else {
2443*333d2b36SAndroid Build Coastguard Worker		ctx.AddVariationDependencies(variations, depTag, name)
2444*333d2b36SAndroid Build Coastguard Worker	}
2445*333d2b36SAndroid Build Coastguard Worker}
2446*333d2b36SAndroid Build Coastguard Worker
2447*333d2b36SAndroid Build Coastguard Workerfunc GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2448*333d2b36SAndroid Build Coastguard Worker	if snapshot, ok := replaceMap[lib]; ok {
2449*333d2b36SAndroid Build Coastguard Worker		return snapshot
2450*333d2b36SAndroid Build Coastguard Worker	}
2451*333d2b36SAndroid Build Coastguard Worker
2452*333d2b36SAndroid Build Coastguard Worker	return lib
2453*333d2b36SAndroid Build Coastguard Worker}
2454*333d2b36SAndroid Build Coastguard Worker
2455*333d2b36SAndroid Build Coastguard Worker// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
2456*333d2b36SAndroid Build Coastguard Worker// of names:
2457*333d2b36SAndroid Build Coastguard Worker//
2458*333d2b36SAndroid Build Coastguard Worker// 1. Name of an NDK library that refers to an ndk_library module.
2459*333d2b36SAndroid Build Coastguard Worker//
2460*333d2b36SAndroid Build Coastguard Worker//	For each of these, it adds the name of the ndk_library module to the list of
2461*333d2b36SAndroid Build Coastguard Worker//	variant libs.
2462*333d2b36SAndroid Build Coastguard Worker//
2463*333d2b36SAndroid Build Coastguard Worker// 2. Anything else (so anything that isn't an NDK library).
2464*333d2b36SAndroid Build Coastguard Worker//
2465*333d2b36SAndroid Build Coastguard Worker//	It adds these to the nonvariantLibs list.
2466*333d2b36SAndroid Build Coastguard Worker//
2467*333d2b36SAndroid Build Coastguard Worker// The caller can then know to add the variantLibs dependencies differently from the
2468*333d2b36SAndroid Build Coastguard Worker// nonvariantLibs
2469*333d2b36SAndroid Build Coastguard Workerfunc FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2470*333d2b36SAndroid Build Coastguard Worker	variantLibs = []string{}
2471*333d2b36SAndroid Build Coastguard Worker
2472*333d2b36SAndroid Build Coastguard Worker	nonvariantLibs = []string{}
2473*333d2b36SAndroid Build Coastguard Worker	for _, entry := range list {
2474*333d2b36SAndroid Build Coastguard Worker		// strip #version suffix out
2475*333d2b36SAndroid Build Coastguard Worker		name, _ := StubsLibNameAndVersion(entry)
2476*333d2b36SAndroid Build Coastguard Worker		if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2477*333d2b36SAndroid Build Coastguard Worker			variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2478*333d2b36SAndroid Build Coastguard Worker		} else {
2479*333d2b36SAndroid Build Coastguard Worker			nonvariantLibs = append(nonvariantLibs, entry)
2480*333d2b36SAndroid Build Coastguard Worker		}
2481*333d2b36SAndroid Build Coastguard Worker	}
2482*333d2b36SAndroid Build Coastguard Worker	return nonvariantLibs, variantLibs
2483*333d2b36SAndroid Build Coastguard Worker
2484*333d2b36SAndroid Build Coastguard Worker}
2485*333d2b36SAndroid Build Coastguard Worker
2486*333d2b36SAndroid Build Coastguard Workerfunc rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2487*333d2b36SAndroid Build Coastguard Worker	nonVariantLibs := []string{}
2488*333d2b36SAndroid Build Coastguard Worker	variantLibs := []string{}
2489*333d2b36SAndroid Build Coastguard Worker
2490*333d2b36SAndroid Build Coastguard Worker	for _, lib := range libs {
2491*333d2b36SAndroid Build Coastguard Worker		replaceLibName := GetReplaceModuleName(lib, replaceList)
2492*333d2b36SAndroid Build Coastguard Worker		if replaceLibName == lib {
2493*333d2b36SAndroid Build Coastguard Worker			// Do not handle any libs which are not in API imports
2494*333d2b36SAndroid Build Coastguard Worker			nonVariantLibs = append(nonVariantLibs, replaceLibName)
2495*333d2b36SAndroid Build Coastguard Worker		} else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2496*333d2b36SAndroid Build Coastguard Worker			variantLibs = append(variantLibs, replaceLibName)
2497*333d2b36SAndroid Build Coastguard Worker		} else {
2498*333d2b36SAndroid Build Coastguard Worker			nonVariantLibs = append(nonVariantLibs, replaceLibName)
2499*333d2b36SAndroid Build Coastguard Worker		}
2500*333d2b36SAndroid Build Coastguard Worker	}
2501*333d2b36SAndroid Build Coastguard Worker
2502*333d2b36SAndroid Build Coastguard Worker	return nonVariantLibs, variantLibs
2503*333d2b36SAndroid Build Coastguard Worker}
2504*333d2b36SAndroid Build Coastguard Worker
2505*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) shouldUseApiSurface() bool {
2506*333d2b36SAndroid Build Coastguard Worker	if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2507*333d2b36SAndroid Build Coastguard Worker		if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2508*333d2b36SAndroid Build Coastguard Worker			// LLNDK Variant
2509*333d2b36SAndroid Build Coastguard Worker			return true
2510*333d2b36SAndroid Build Coastguard Worker		}
2511*333d2b36SAndroid Build Coastguard Worker
2512*333d2b36SAndroid Build Coastguard Worker		if c.Properties.IsSdkVariant {
2513*333d2b36SAndroid Build Coastguard Worker			// NDK Variant
2514*333d2b36SAndroid Build Coastguard Worker			return true
2515*333d2b36SAndroid Build Coastguard Worker		}
2516*333d2b36SAndroid Build Coastguard Worker	}
2517*333d2b36SAndroid Build Coastguard Worker
2518*333d2b36SAndroid Build Coastguard Worker	return false
2519*333d2b36SAndroid Build Coastguard Worker}
2520*333d2b36SAndroid Build Coastguard Worker
2521*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
2522*333d2b36SAndroid Build Coastguard Worker	if !c.Enabled(actx) {
2523*333d2b36SAndroid Build Coastguard Worker		return
2524*333d2b36SAndroid Build Coastguard Worker	}
2525*333d2b36SAndroid Build Coastguard Worker
2526*333d2b36SAndroid Build Coastguard Worker	ctx := &depsContext{
2527*333d2b36SAndroid Build Coastguard Worker		BottomUpMutatorContext: actx,
2528*333d2b36SAndroid Build Coastguard Worker		moduleContextImpl: moduleContextImpl{
2529*333d2b36SAndroid Build Coastguard Worker			mod: c,
2530*333d2b36SAndroid Build Coastguard Worker		},
2531*333d2b36SAndroid Build Coastguard Worker	}
2532*333d2b36SAndroid Build Coastguard Worker	ctx.ctx = ctx
2533*333d2b36SAndroid Build Coastguard Worker
2534*333d2b36SAndroid Build Coastguard Worker	deps := c.deps(ctx)
2535*333d2b36SAndroid Build Coastguard Worker
2536*333d2b36SAndroid Build Coastguard Worker	apiNdkLibs := []string{}
2537*333d2b36SAndroid Build Coastguard Worker	apiLateNdkLibs := []string{}
2538*333d2b36SAndroid Build Coastguard Worker
2539*333d2b36SAndroid Build Coastguard Worker	c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2540*333d2b36SAndroid Build Coastguard Worker
2541*333d2b36SAndroid Build Coastguard Worker	variantNdkLibs := []string{}
2542*333d2b36SAndroid Build Coastguard Worker	variantLateNdkLibs := []string{}
2543*333d2b36SAndroid Build Coastguard Worker	if ctx.Os() == android.Android {
2544*333d2b36SAndroid Build Coastguard Worker		deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2545*333d2b36SAndroid Build Coastguard Worker		deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2546*333d2b36SAndroid Build Coastguard Worker		deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
2547*333d2b36SAndroid Build Coastguard Worker	}
2548*333d2b36SAndroid Build Coastguard Worker
2549*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.HeaderLibs {
2550*333d2b36SAndroid Build Coastguard Worker		depTag := libraryDependencyTag{Kind: headerLibraryDependency}
2551*333d2b36SAndroid Build Coastguard Worker		if inList(lib, deps.ReexportHeaderLibHeaders) {
2552*333d2b36SAndroid Build Coastguard Worker			depTag.reexportFlags = true
2553*333d2b36SAndroid Build Coastguard Worker		}
2554*333d2b36SAndroid Build Coastguard Worker
2555*333d2b36SAndroid Build Coastguard Worker		if c.isNDKStubLibrary() {
2556*333d2b36SAndroid Build Coastguard Worker			variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2557*333d2b36SAndroid Build Coastguard Worker			if variationExists {
2558*333d2b36SAndroid Build Coastguard Worker				actx.AddVariationDependencies(nil, depTag, lib)
2559*333d2b36SAndroid Build Coastguard Worker			} else {
2560*333d2b36SAndroid Build Coastguard Worker				// dependencies to ndk_headers fall here as ndk_headers do not have
2561*333d2b36SAndroid Build Coastguard Worker				// any variants.
2562*333d2b36SAndroid Build Coastguard Worker				actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2563*333d2b36SAndroid Build Coastguard Worker			}
2564*333d2b36SAndroid Build Coastguard Worker		} else if c.IsStubs() {
2565*333d2b36SAndroid Build Coastguard Worker			actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
2566*333d2b36SAndroid Build Coastguard Worker				depTag, lib)
2567*333d2b36SAndroid Build Coastguard Worker		} else {
2568*333d2b36SAndroid Build Coastguard Worker			actx.AddVariationDependencies(nil, depTag, lib)
2569*333d2b36SAndroid Build Coastguard Worker		}
2570*333d2b36SAndroid Build Coastguard Worker	}
2571*333d2b36SAndroid Build Coastguard Worker
2572*333d2b36SAndroid Build Coastguard Worker	if c.isNDKStubLibrary() {
2573*333d2b36SAndroid Build Coastguard Worker		// NDK stubs depend on their implementation because the ABI dumps are
2574*333d2b36SAndroid Build Coastguard Worker		// generated from the implementation library.
2575*333d2b36SAndroid Build Coastguard Worker
2576*333d2b36SAndroid Build Coastguard Worker		actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2577*333d2b36SAndroid Build Coastguard Worker			c.ImageVariation(),
2578*333d2b36SAndroid Build Coastguard Worker			blueprint.Variation{Mutator: "link", Variation: "shared"},
2579*333d2b36SAndroid Build Coastguard Worker		), stubImplementation, c.BaseModuleName())
2580*333d2b36SAndroid Build Coastguard Worker	}
2581*333d2b36SAndroid Build Coastguard Worker
2582*333d2b36SAndroid Build Coastguard Worker	// If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2583*333d2b36SAndroid Build Coastguard Worker	if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2584*333d2b36SAndroid Build Coastguard Worker		c.Target().NativeBridge == android.NativeBridgeDisabled {
2585*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies(
2586*333d2b36SAndroid Build Coastguard Worker			[]blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
2587*333d2b36SAndroid Build Coastguard Worker			llndkHeaderLibTag,
2588*333d2b36SAndroid Build Coastguard Worker			deps.LlndkHeaderLibs...)
2589*333d2b36SAndroid Build Coastguard Worker	}
2590*333d2b36SAndroid Build Coastguard Worker
2591*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.WholeStaticLibs {
2592*333d2b36SAndroid Build Coastguard Worker		depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
2593*333d2b36SAndroid Build Coastguard Worker
2594*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies([]blueprint.Variation{
2595*333d2b36SAndroid Build Coastguard Worker			{Mutator: "link", Variation: "static"},
2596*333d2b36SAndroid Build Coastguard Worker		}, depTag, lib)
2597*333d2b36SAndroid Build Coastguard Worker	}
2598*333d2b36SAndroid Build Coastguard Worker
2599*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.StaticLibs {
2600*333d2b36SAndroid Build Coastguard Worker		// Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
2601*333d2b36SAndroid Build Coastguard Worker		depTag := libraryDependencyTag{Kind: staticLibraryDependency}
2602*333d2b36SAndroid Build Coastguard Worker
2603*333d2b36SAndroid Build Coastguard Worker		if inList(lib, deps.ReexportStaticLibHeaders) {
2604*333d2b36SAndroid Build Coastguard Worker			depTag.reexportFlags = true
2605*333d2b36SAndroid Build Coastguard Worker		}
2606*333d2b36SAndroid Build Coastguard Worker		if inList(lib, deps.ExcludeLibsForApex) {
2607*333d2b36SAndroid Build Coastguard Worker			depTag.excludeInApex = true
2608*333d2b36SAndroid Build Coastguard Worker		}
2609*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies([]blueprint.Variation{
2610*333d2b36SAndroid Build Coastguard Worker			{Mutator: "link", Variation: "static"},
2611*333d2b36SAndroid Build Coastguard Worker		}, depTag, lib)
2612*333d2b36SAndroid Build Coastguard Worker	}
2613*333d2b36SAndroid Build Coastguard Worker
2614*333d2b36SAndroid Build Coastguard Worker	// staticUnwinderDep is treated as staticDep for Q apexes
2615*333d2b36SAndroid Build Coastguard Worker	// so that native libraries/binaries are linked with static unwinder
2616*333d2b36SAndroid Build Coastguard Worker	// because Q libc doesn't have unwinder APIs
2617*333d2b36SAndroid Build Coastguard Worker	if deps.StaticUnwinderIfLegacy {
2618*333d2b36SAndroid Build Coastguard Worker		depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
2619*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies([]blueprint.Variation{
2620*333d2b36SAndroid Build Coastguard Worker			{Mutator: "link", Variation: "static"},
2621*333d2b36SAndroid Build Coastguard Worker		}, depTag, staticUnwinder(actx))
2622*333d2b36SAndroid Build Coastguard Worker	}
2623*333d2b36SAndroid Build Coastguard Worker
2624*333d2b36SAndroid Build Coastguard Worker	// shared lib names without the #version suffix
2625*333d2b36SAndroid Build Coastguard Worker	var sharedLibNames []string
2626*333d2b36SAndroid Build Coastguard Worker
2627*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.SharedLibs {
2628*333d2b36SAndroid Build Coastguard Worker		depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
2629*333d2b36SAndroid Build Coastguard Worker		if inList(lib, deps.ReexportSharedLibHeaders) {
2630*333d2b36SAndroid Build Coastguard Worker			depTag.reexportFlags = true
2631*333d2b36SAndroid Build Coastguard Worker		}
2632*333d2b36SAndroid Build Coastguard Worker		if inList(lib, deps.ExcludeLibsForApex) {
2633*333d2b36SAndroid Build Coastguard Worker			depTag.excludeInApex = true
2634*333d2b36SAndroid Build Coastguard Worker		}
2635*333d2b36SAndroid Build Coastguard Worker		if inList(lib, deps.ExcludeLibsForNonApex) {
2636*333d2b36SAndroid Build Coastguard Worker			depTag.excludeInNonApex = true
2637*333d2b36SAndroid Build Coastguard Worker		}
2638*333d2b36SAndroid Build Coastguard Worker
2639*333d2b36SAndroid Build Coastguard Worker		name, version := StubsLibNameAndVersion(lib)
2640*333d2b36SAndroid Build Coastguard Worker		sharedLibNames = append(sharedLibNames, name)
2641*333d2b36SAndroid Build Coastguard Worker
2642*333d2b36SAndroid Build Coastguard Worker		variations := []blueprint.Variation{
2643*333d2b36SAndroid Build Coastguard Worker			{Mutator: "link", Variation: "shared"},
2644*333d2b36SAndroid Build Coastguard Worker		}
2645*333d2b36SAndroid Build Coastguard Worker		AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2646*333d2b36SAndroid Build Coastguard Worker	}
2647*333d2b36SAndroid Build Coastguard Worker
2648*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.LateStaticLibs {
2649*333d2b36SAndroid Build Coastguard Worker		depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2650*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies([]blueprint.Variation{
2651*333d2b36SAndroid Build Coastguard Worker			{Mutator: "link", Variation: "static"},
2652*333d2b36SAndroid Build Coastguard Worker		}, depTag, lib)
2653*333d2b36SAndroid Build Coastguard Worker	}
2654*333d2b36SAndroid Build Coastguard Worker
2655*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.UnexportedStaticLibs {
2656*333d2b36SAndroid Build Coastguard Worker		depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2657*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies([]blueprint.Variation{
2658*333d2b36SAndroid Build Coastguard Worker			{Mutator: "link", Variation: "static"},
2659*333d2b36SAndroid Build Coastguard Worker		}, depTag, lib)
2660*333d2b36SAndroid Build Coastguard Worker	}
2661*333d2b36SAndroid Build Coastguard Worker
2662*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.LateSharedLibs {
2663*333d2b36SAndroid Build Coastguard Worker		if inList(lib, sharedLibNames) {
2664*333d2b36SAndroid Build Coastguard Worker			// This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2665*333d2b36SAndroid Build Coastguard Worker			// are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2666*333d2b36SAndroid Build Coastguard Worker			// linking against both the stubs lib and the non-stubs lib at the same time.
2667*333d2b36SAndroid Build Coastguard Worker			continue
2668*333d2b36SAndroid Build Coastguard Worker		}
2669*333d2b36SAndroid Build Coastguard Worker		depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
2670*333d2b36SAndroid Build Coastguard Worker		variations := []blueprint.Variation{
2671*333d2b36SAndroid Build Coastguard Worker			{Mutator: "link", Variation: "shared"},
2672*333d2b36SAndroid Build Coastguard Worker		}
2673*333d2b36SAndroid Build Coastguard Worker		AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
2674*333d2b36SAndroid Build Coastguard Worker	}
2675*333d2b36SAndroid Build Coastguard Worker
2676*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies([]blueprint.Variation{
2677*333d2b36SAndroid Build Coastguard Worker		{Mutator: "link", Variation: "shared"},
2678*333d2b36SAndroid Build Coastguard Worker	}, dataLibDepTag, deps.DataLibs...)
2679*333d2b36SAndroid Build Coastguard Worker
2680*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2681*333d2b36SAndroid Build Coastguard Worker
2682*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies([]blueprint.Variation{
2683*333d2b36SAndroid Build Coastguard Worker		{Mutator: "link", Variation: "shared"},
2684*333d2b36SAndroid Build Coastguard Worker	}, runtimeDepTag, deps.RuntimeLibs...)
2685*333d2b36SAndroid Build Coastguard Worker
2686*333d2b36SAndroid Build Coastguard Worker	actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
2687*333d2b36SAndroid Build Coastguard Worker
2688*333d2b36SAndroid Build Coastguard Worker	for _, gen := range deps.GeneratedHeaders {
2689*333d2b36SAndroid Build Coastguard Worker		depTag := genHeaderDepTag
2690*333d2b36SAndroid Build Coastguard Worker		if inList(gen, deps.ReexportGeneratedHeaders) {
2691*333d2b36SAndroid Build Coastguard Worker			depTag = genHeaderExportDepTag
2692*333d2b36SAndroid Build Coastguard Worker		}
2693*333d2b36SAndroid Build Coastguard Worker		actx.AddDependency(c, depTag, gen)
2694*333d2b36SAndroid Build Coastguard Worker	}
2695*333d2b36SAndroid Build Coastguard Worker
2696*333d2b36SAndroid Build Coastguard Worker	for _, gen := range deps.DeviceFirstGeneratedHeaders {
2697*333d2b36SAndroid Build Coastguard Worker		depTag := genHeaderDepTag
2698*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2699*333d2b36SAndroid Build Coastguard Worker	}
2700*333d2b36SAndroid Build Coastguard Worker
2701*333d2b36SAndroid Build Coastguard Worker	crtVariations := GetCrtVariations(ctx, c)
2702*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
2703*333d2b36SAndroid Build Coastguard Worker	for _, crt := range deps.CrtBegin {
2704*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
2705*333d2b36SAndroid Build Coastguard Worker			crt)
2706*333d2b36SAndroid Build Coastguard Worker	}
2707*333d2b36SAndroid Build Coastguard Worker	for _, crt := range deps.CrtEnd {
2708*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
2709*333d2b36SAndroid Build Coastguard Worker			crt)
2710*333d2b36SAndroid Build Coastguard Worker	}
2711*333d2b36SAndroid Build Coastguard Worker	if deps.DynamicLinker != "" {
2712*333d2b36SAndroid Build Coastguard Worker		actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
2713*333d2b36SAndroid Build Coastguard Worker	}
2714*333d2b36SAndroid Build Coastguard Worker
2715*333d2b36SAndroid Build Coastguard Worker	version := ctx.sdkVersion()
2716*333d2b36SAndroid Build Coastguard Worker
2717*333d2b36SAndroid Build Coastguard Worker	ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
2718*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies([]blueprint.Variation{
2719*333d2b36SAndroid Build Coastguard Worker		{Mutator: "version", Variation: version},
2720*333d2b36SAndroid Build Coastguard Worker		{Mutator: "link", Variation: "shared"},
2721*333d2b36SAndroid Build Coastguard Worker	}, ndkStubDepTag, variantNdkLibs...)
2722*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies([]blueprint.Variation{
2723*333d2b36SAndroid Build Coastguard Worker		{Mutator: "version", Variation: version},
2724*333d2b36SAndroid Build Coastguard Worker		{Mutator: "link", Variation: "shared"},
2725*333d2b36SAndroid Build Coastguard Worker	}, ndkStubDepTag, apiNdkLibs...)
2726*333d2b36SAndroid Build Coastguard Worker
2727*333d2b36SAndroid Build Coastguard Worker	ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
2728*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies([]blueprint.Variation{
2729*333d2b36SAndroid Build Coastguard Worker		{Mutator: "version", Variation: version},
2730*333d2b36SAndroid Build Coastguard Worker		{Mutator: "link", Variation: "shared"},
2731*333d2b36SAndroid Build Coastguard Worker	}, ndkLateStubDepTag, variantLateNdkLibs...)
2732*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies([]blueprint.Variation{
2733*333d2b36SAndroid Build Coastguard Worker		{Mutator: "version", Variation: version},
2734*333d2b36SAndroid Build Coastguard Worker		{Mutator: "link", Variation: "shared"},
2735*333d2b36SAndroid Build Coastguard Worker	}, ndkLateStubDepTag, apiLateNdkLibs...)
2736*333d2b36SAndroid Build Coastguard Worker
2737*333d2b36SAndroid Build Coastguard Worker	if len(deps.AidlLibs) > 0 {
2738*333d2b36SAndroid Build Coastguard Worker		actx.AddDependency(
2739*333d2b36SAndroid Build Coastguard Worker			c,
2740*333d2b36SAndroid Build Coastguard Worker			aidlLibraryTag,
2741*333d2b36SAndroid Build Coastguard Worker			deps.AidlLibs...,
2742*333d2b36SAndroid Build Coastguard Worker		)
2743*333d2b36SAndroid Build Coastguard Worker	}
2744*333d2b36SAndroid Build Coastguard Worker
2745*333d2b36SAndroid Build Coastguard Worker}
2746*333d2b36SAndroid Build Coastguard Worker
2747*333d2b36SAndroid Build Coastguard Workerfunc BeginMutator(ctx android.BottomUpMutatorContext) {
2748*333d2b36SAndroid Build Coastguard Worker	if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
2749*333d2b36SAndroid Build Coastguard Worker		c.beginMutator(ctx)
2750*333d2b36SAndroid Build Coastguard Worker	}
2751*333d2b36SAndroid Build Coastguard Worker}
2752*333d2b36SAndroid Build Coastguard Worker
2753*333d2b36SAndroid Build Coastguard Worker// Whether a module can link to another module, taking into
2754*333d2b36SAndroid Build Coastguard Worker// account NDK linking.
2755*333d2b36SAndroid Build Coastguard Workerfunc checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
2756*333d2b36SAndroid Build Coastguard Worker	tag blueprint.DependencyTag) {
2757*333d2b36SAndroid Build Coastguard Worker
2758*333d2b36SAndroid Build Coastguard Worker	switch t := tag.(type) {
2759*333d2b36SAndroid Build Coastguard Worker	case dependencyTag:
2760*333d2b36SAndroid Build Coastguard Worker		if t != vndkExtDepTag {
2761*333d2b36SAndroid Build Coastguard Worker			return
2762*333d2b36SAndroid Build Coastguard Worker		}
2763*333d2b36SAndroid Build Coastguard Worker	case libraryDependencyTag:
2764*333d2b36SAndroid Build Coastguard Worker	default:
2765*333d2b36SAndroid Build Coastguard Worker		return
2766*333d2b36SAndroid Build Coastguard Worker	}
2767*333d2b36SAndroid Build Coastguard Worker
2768*333d2b36SAndroid Build Coastguard Worker	if from.Target().Os != android.Android {
2769*333d2b36SAndroid Build Coastguard Worker		// Host code is not restricted
2770*333d2b36SAndroid Build Coastguard Worker		return
2771*333d2b36SAndroid Build Coastguard Worker	}
2772*333d2b36SAndroid Build Coastguard Worker
2773*333d2b36SAndroid Build Coastguard Worker	if from.SdkVersion() == "" {
2774*333d2b36SAndroid Build Coastguard Worker		// Platform code can link to anything
2775*333d2b36SAndroid Build Coastguard Worker		return
2776*333d2b36SAndroid Build Coastguard Worker	}
2777*333d2b36SAndroid Build Coastguard Worker	if from.InRamdisk() {
2778*333d2b36SAndroid Build Coastguard Worker		// Ramdisk code is not NDK
2779*333d2b36SAndroid Build Coastguard Worker		return
2780*333d2b36SAndroid Build Coastguard Worker	}
2781*333d2b36SAndroid Build Coastguard Worker	if from.InVendorRamdisk() {
2782*333d2b36SAndroid Build Coastguard Worker		// Vendor ramdisk code is not NDK
2783*333d2b36SAndroid Build Coastguard Worker		return
2784*333d2b36SAndroid Build Coastguard Worker	}
2785*333d2b36SAndroid Build Coastguard Worker	if from.InRecovery() {
2786*333d2b36SAndroid Build Coastguard Worker		// Recovery code is not NDK
2787*333d2b36SAndroid Build Coastguard Worker		return
2788*333d2b36SAndroid Build Coastguard Worker	}
2789*333d2b36SAndroid Build Coastguard Worker	if c, ok := to.(*Module); ok {
2790*333d2b36SAndroid Build Coastguard Worker		if c.StubDecorator() {
2791*333d2b36SAndroid Build Coastguard Worker			// These aren't real libraries, but are the stub shared libraries that are included in
2792*333d2b36SAndroid Build Coastguard Worker			// the NDK.
2793*333d2b36SAndroid Build Coastguard Worker			return
2794*333d2b36SAndroid Build Coastguard Worker		}
2795*333d2b36SAndroid Build Coastguard Worker	}
2796*333d2b36SAndroid Build Coastguard Worker
2797*333d2b36SAndroid Build Coastguard Worker	if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
2798*333d2b36SAndroid Build Coastguard Worker		// Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2799*333d2b36SAndroid Build Coastguard Worker		// to link to libc++ (non-NDK and without sdk_version).
2800*333d2b36SAndroid Build Coastguard Worker		return
2801*333d2b36SAndroid Build Coastguard Worker	}
2802*333d2b36SAndroid Build Coastguard Worker
2803*333d2b36SAndroid Build Coastguard Worker	if to.SdkVersion() == "" {
2804*333d2b36SAndroid Build Coastguard Worker		// NDK code linking to platform code is never okay.
2805*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("depends on non-NDK-built library %q",
2806*333d2b36SAndroid Build Coastguard Worker			ctx.OtherModuleName(to.Module()))
2807*333d2b36SAndroid Build Coastguard Worker		return
2808*333d2b36SAndroid Build Coastguard Worker	}
2809*333d2b36SAndroid Build Coastguard Worker
2810*333d2b36SAndroid Build Coastguard Worker	// At this point we know we have two NDK libraries, but we need to
2811*333d2b36SAndroid Build Coastguard Worker	// check that we're not linking against anything built against a higher
2812*333d2b36SAndroid Build Coastguard Worker	// API level, as it is only valid to link against older or equivalent
2813*333d2b36SAndroid Build Coastguard Worker	// APIs.
2814*333d2b36SAndroid Build Coastguard Worker
2815*333d2b36SAndroid Build Coastguard Worker	// Current can link against anything.
2816*333d2b36SAndroid Build Coastguard Worker	if from.SdkVersion() != "current" {
2817*333d2b36SAndroid Build Coastguard Worker		// Otherwise we need to check.
2818*333d2b36SAndroid Build Coastguard Worker		if to.SdkVersion() == "current" {
2819*333d2b36SAndroid Build Coastguard Worker			// Current can't be linked against by anything else.
2820*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("links %q built against newer API version %q",
2821*333d2b36SAndroid Build Coastguard Worker				ctx.OtherModuleName(to.Module()), "current")
2822*333d2b36SAndroid Build Coastguard Worker		} else {
2823*333d2b36SAndroid Build Coastguard Worker			fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
2824*333d2b36SAndroid Build Coastguard Worker			if err != nil {
2825*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf("sdk_version",
2826*333d2b36SAndroid Build Coastguard Worker					"Invalid sdk_version value (must be int, preview or current): %q",
2827*333d2b36SAndroid Build Coastguard Worker					from.SdkVersion())
2828*333d2b36SAndroid Build Coastguard Worker			}
2829*333d2b36SAndroid Build Coastguard Worker			toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
2830*333d2b36SAndroid Build Coastguard Worker			if err != nil {
2831*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf("sdk_version",
2832*333d2b36SAndroid Build Coastguard Worker					"Invalid sdk_version value (must be int, preview or current): %q",
2833*333d2b36SAndroid Build Coastguard Worker					to.SdkVersion())
2834*333d2b36SAndroid Build Coastguard Worker			}
2835*333d2b36SAndroid Build Coastguard Worker
2836*333d2b36SAndroid Build Coastguard Worker			if toApi.GreaterThan(fromApi) {
2837*333d2b36SAndroid Build Coastguard Worker				ctx.ModuleErrorf("links %q built against newer API version %q",
2838*333d2b36SAndroid Build Coastguard Worker					ctx.OtherModuleName(to.Module()), to.SdkVersion())
2839*333d2b36SAndroid Build Coastguard Worker			}
2840*333d2b36SAndroid Build Coastguard Worker		}
2841*333d2b36SAndroid Build Coastguard Worker	}
2842*333d2b36SAndroid Build Coastguard Worker
2843*333d2b36SAndroid Build Coastguard Worker	// Also check that the two STL choices are compatible.
2844*333d2b36SAndroid Build Coastguard Worker	fromStl := from.SelectedStl()
2845*333d2b36SAndroid Build Coastguard Worker	toStl := to.SelectedStl()
2846*333d2b36SAndroid Build Coastguard Worker	if fromStl == "" || toStl == "" {
2847*333d2b36SAndroid Build Coastguard Worker		// Libraries that don't use the STL are unrestricted.
2848*333d2b36SAndroid Build Coastguard Worker	} else if fromStl == "ndk_system" || toStl == "ndk_system" {
2849*333d2b36SAndroid Build Coastguard Worker		// We can be permissive with the system "STL" since it is only the C++
2850*333d2b36SAndroid Build Coastguard Worker		// ABI layer, but in the future we should make sure that everyone is
2851*333d2b36SAndroid Build Coastguard Worker		// using either libc++ or nothing.
2852*333d2b36SAndroid Build Coastguard Worker	} else if getNdkStlFamily(from) != getNdkStlFamily(to) {
2853*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
2854*333d2b36SAndroid Build Coastguard Worker			from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2855*333d2b36SAndroid Build Coastguard Worker			to.SelectedStl())
2856*333d2b36SAndroid Build Coastguard Worker	}
2857*333d2b36SAndroid Build Coastguard Worker}
2858*333d2b36SAndroid Build Coastguard Worker
2859*333d2b36SAndroid Build Coastguard Workerfunc checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2860*333d2b36SAndroid Build Coastguard Worker	if c, ok := ctx.Module().(*Module); ok {
2861*333d2b36SAndroid Build Coastguard Worker		ctx.VisitDirectDeps(func(dep android.Module) {
2862*333d2b36SAndroid Build Coastguard Worker			depTag := ctx.OtherModuleDependencyTag(dep)
2863*333d2b36SAndroid Build Coastguard Worker			ccDep, ok := dep.(LinkableInterface)
2864*333d2b36SAndroid Build Coastguard Worker			if ok {
2865*333d2b36SAndroid Build Coastguard Worker				checkLinkType(ctx, c, ccDep, depTag)
2866*333d2b36SAndroid Build Coastguard Worker			}
2867*333d2b36SAndroid Build Coastguard Worker		})
2868*333d2b36SAndroid Build Coastguard Worker	}
2869*333d2b36SAndroid Build Coastguard Worker}
2870*333d2b36SAndroid Build Coastguard Worker
2871*333d2b36SAndroid Build Coastguard Worker// Tests whether the dependent library is okay to be double loaded inside a single process.
2872*333d2b36SAndroid Build Coastguard Worker// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2873*333d2b36SAndroid Build Coastguard Worker// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
2874*333d2b36SAndroid Build Coastguard Worker// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
2875*333d2b36SAndroid Build Coastguard Workerfunc checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
2876*333d2b36SAndroid Build Coastguard Worker	check := func(child, parent android.Module) bool {
2877*333d2b36SAndroid Build Coastguard Worker		to, ok := child.(*Module)
2878*333d2b36SAndroid Build Coastguard Worker		if !ok {
2879*333d2b36SAndroid Build Coastguard Worker			return false
2880*333d2b36SAndroid Build Coastguard Worker		}
2881*333d2b36SAndroid Build Coastguard Worker
2882*333d2b36SAndroid Build Coastguard Worker		if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2883*333d2b36SAndroid Build Coastguard Worker			return false
2884*333d2b36SAndroid Build Coastguard Worker		}
2885*333d2b36SAndroid Build Coastguard Worker
2886*333d2b36SAndroid Build Coastguard Worker		// These dependencies are not excercised at runtime. Tracking these will give us
2887*333d2b36SAndroid Build Coastguard Worker		// false negative, so skip.
2888*333d2b36SAndroid Build Coastguard Worker		depTag := ctx.OtherModuleDependencyTag(child)
2889*333d2b36SAndroid Build Coastguard Worker		if IsHeaderDepTag(depTag) {
2890*333d2b36SAndroid Build Coastguard Worker			return false
2891*333d2b36SAndroid Build Coastguard Worker		}
2892*333d2b36SAndroid Build Coastguard Worker		if depTag == staticVariantTag {
2893*333d2b36SAndroid Build Coastguard Worker			return false
2894*333d2b36SAndroid Build Coastguard Worker		}
2895*333d2b36SAndroid Build Coastguard Worker		if depTag == stubImplDepTag {
2896*333d2b36SAndroid Build Coastguard Worker			return false
2897*333d2b36SAndroid Build Coastguard Worker		}
2898*333d2b36SAndroid Build Coastguard Worker		if depTag == android.RequiredDepTag {
2899*333d2b36SAndroid Build Coastguard Worker			return false
2900*333d2b36SAndroid Build Coastguard Worker		}
2901*333d2b36SAndroid Build Coastguard Worker
2902*333d2b36SAndroid Build Coastguard Worker		// Even if target lib has no vendor variant, keep checking dependency
2903*333d2b36SAndroid Build Coastguard Worker		// graph in case it depends on vendor_available or product_available
2904*333d2b36SAndroid Build Coastguard Worker		// but not double_loadable transtively.
2905*333d2b36SAndroid Build Coastguard Worker		if !to.HasNonSystemVariants() {
2906*333d2b36SAndroid Build Coastguard Worker			return true
2907*333d2b36SAndroid Build Coastguard Worker		}
2908*333d2b36SAndroid Build Coastguard Worker
2909*333d2b36SAndroid Build Coastguard Worker		// The happy path. Keep tracking dependencies until we hit a non double-loadable
2910*333d2b36SAndroid Build Coastguard Worker		// one.
2911*333d2b36SAndroid Build Coastguard Worker		if Bool(to.VendorProperties.Double_loadable) {
2912*333d2b36SAndroid Build Coastguard Worker			return true
2913*333d2b36SAndroid Build Coastguard Worker		}
2914*333d2b36SAndroid Build Coastguard Worker
2915*333d2b36SAndroid Build Coastguard Worker		if to.IsLlndk() {
2916*333d2b36SAndroid Build Coastguard Worker			return false
2917*333d2b36SAndroid Build Coastguard Worker		}
2918*333d2b36SAndroid Build Coastguard Worker
2919*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2920*333d2b36SAndroid Build Coastguard Worker			"VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
2921*333d2b36SAndroid Build Coastguard Worker			"Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
2922*333d2b36SAndroid Build Coastguard Worker		return false
2923*333d2b36SAndroid Build Coastguard Worker	}
2924*333d2b36SAndroid Build Coastguard Worker	if module, ok := ctx.Module().(*Module); ok {
2925*333d2b36SAndroid Build Coastguard Worker		if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
2926*333d2b36SAndroid Build Coastguard Worker			if lib.hasLLNDKStubs() {
2927*333d2b36SAndroid Build Coastguard Worker				ctx.WalkDeps(check)
2928*333d2b36SAndroid Build Coastguard Worker			}
2929*333d2b36SAndroid Build Coastguard Worker		}
2930*333d2b36SAndroid Build Coastguard Worker	}
2931*333d2b36SAndroid Build Coastguard Worker}
2932*333d2b36SAndroid Build Coastguard Worker
2933*333d2b36SAndroid Build Coastguard Workerfunc findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
2934*333d2b36SAndroid Build Coastguard Worker	// For the dependency from platform to apex, use the latest stubs
2935*333d2b36SAndroid Build Coastguard Worker	apexSdkVersion := android.FutureApiLevel
2936*333d2b36SAndroid Build Coastguard Worker	if !apexInfo.IsForPlatform() {
2937*333d2b36SAndroid Build Coastguard Worker		apexSdkVersion = apexInfo.MinSdkVersion
2938*333d2b36SAndroid Build Coastguard Worker	}
2939*333d2b36SAndroid Build Coastguard Worker
2940*333d2b36SAndroid Build Coastguard Worker	if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2941*333d2b36SAndroid Build Coastguard Worker		// In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2942*333d2b36SAndroid Build Coastguard Worker		// so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2943*333d2b36SAndroid Build Coastguard Worker		// (b/144430859)
2944*333d2b36SAndroid Build Coastguard Worker		apexSdkVersion = android.FutureApiLevel
2945*333d2b36SAndroid Build Coastguard Worker	}
2946*333d2b36SAndroid Build Coastguard Worker
2947*333d2b36SAndroid Build Coastguard Worker	return apexSdkVersion
2948*333d2b36SAndroid Build Coastguard Worker}
2949*333d2b36SAndroid Build Coastguard Worker
2950*333d2b36SAndroid Build Coastguard Worker// Convert dependencies to paths.  Returns a PathDeps containing paths
2951*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
2952*333d2b36SAndroid Build Coastguard Worker	var depPaths PathDeps
2953*333d2b36SAndroid Build Coastguard Worker
2954*333d2b36SAndroid Build Coastguard Worker	var directStaticDeps []StaticLibraryInfo
2955*333d2b36SAndroid Build Coastguard Worker	var directSharedDeps []SharedLibraryInfo
2956*333d2b36SAndroid Build Coastguard Worker
2957*333d2b36SAndroid Build Coastguard Worker	reexportExporter := func(exporter FlagExporterInfo) {
2958*333d2b36SAndroid Build Coastguard Worker		depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2959*333d2b36SAndroid Build Coastguard Worker		depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2960*333d2b36SAndroid Build Coastguard Worker		depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2961*333d2b36SAndroid Build Coastguard Worker		depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2962*333d2b36SAndroid Build Coastguard Worker		depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
2963*333d2b36SAndroid Build Coastguard Worker	}
2964*333d2b36SAndroid Build Coastguard Worker
2965*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
2966*333d2b36SAndroid Build Coastguard Worker	c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
2967*333d2b36SAndroid Build Coastguard Worker
2968*333d2b36SAndroid Build Coastguard Worker	skipModuleList := map[string]bool{}
2969*333d2b36SAndroid Build Coastguard Worker
2970*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDeps(func(dep android.Module) {
2971*333d2b36SAndroid Build Coastguard Worker		depName := ctx.OtherModuleName(dep)
2972*333d2b36SAndroid Build Coastguard Worker		depTag := ctx.OtherModuleDependencyTag(dep)
2973*333d2b36SAndroid Build Coastguard Worker
2974*333d2b36SAndroid Build Coastguard Worker		if _, ok := skipModuleList[depName]; ok {
2975*333d2b36SAndroid Build Coastguard Worker			// skip this module because original module or API imported module matching with this should be used instead.
2976*333d2b36SAndroid Build Coastguard Worker			return
2977*333d2b36SAndroid Build Coastguard Worker		}
2978*333d2b36SAndroid Build Coastguard Worker
2979*333d2b36SAndroid Build Coastguard Worker		if depTag == android.DarwinUniversalVariantTag {
2980*333d2b36SAndroid Build Coastguard Worker			depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
2981*333d2b36SAndroid Build Coastguard Worker			return
2982*333d2b36SAndroid Build Coastguard Worker		}
2983*333d2b36SAndroid Build Coastguard Worker
2984*333d2b36SAndroid Build Coastguard Worker		if depTag == aidlLibraryTag {
2985*333d2b36SAndroid Build Coastguard Worker			if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
2986*333d2b36SAndroid Build Coastguard Worker				depPaths.AidlLibraryInfos = append(
2987*333d2b36SAndroid Build Coastguard Worker					depPaths.AidlLibraryInfos,
2988*333d2b36SAndroid Build Coastguard Worker					aidlLibraryInfo,
2989*333d2b36SAndroid Build Coastguard Worker				)
2990*333d2b36SAndroid Build Coastguard Worker			}
2991*333d2b36SAndroid Build Coastguard Worker		}
2992*333d2b36SAndroid Build Coastguard Worker
2993*333d2b36SAndroid Build Coastguard Worker		ccDep, ok := dep.(LinkableInterface)
2994*333d2b36SAndroid Build Coastguard Worker		if !ok {
2995*333d2b36SAndroid Build Coastguard Worker
2996*333d2b36SAndroid Build Coastguard Worker			// handling for a few module types that aren't cc Module but that are also supported
2997*333d2b36SAndroid Build Coastguard Worker			switch depTag {
2998*333d2b36SAndroid Build Coastguard Worker			case genSourceDepTag:
2999*333d2b36SAndroid Build Coastguard Worker				if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
3000*333d2b36SAndroid Build Coastguard Worker					depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3001*333d2b36SAndroid Build Coastguard Worker						genRule.GeneratedSourceFiles()...)
3002*333d2b36SAndroid Build Coastguard Worker				} else {
3003*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
3004*333d2b36SAndroid Build Coastguard Worker				}
3005*333d2b36SAndroid Build Coastguard Worker				// Support exported headers from a generated_sources dependency
3006*333d2b36SAndroid Build Coastguard Worker				fallthrough
3007*333d2b36SAndroid Build Coastguard Worker			case genHeaderDepTag, genHeaderExportDepTag:
3008*333d2b36SAndroid Build Coastguard Worker				if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
3009*333d2b36SAndroid Build Coastguard Worker					depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
3010*333d2b36SAndroid Build Coastguard Worker						genRule.GeneratedDeps()...)
3011*333d2b36SAndroid Build Coastguard Worker					dirs := genRule.GeneratedHeaderDirs()
3012*333d2b36SAndroid Build Coastguard Worker					depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
3013*333d2b36SAndroid Build Coastguard Worker					if depTag == genHeaderExportDepTag {
3014*333d2b36SAndroid Build Coastguard Worker						depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
3015*333d2b36SAndroid Build Coastguard Worker						depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3016*333d2b36SAndroid Build Coastguard Worker							genRule.GeneratedSourceFiles()...)
3017*333d2b36SAndroid Build Coastguard Worker						depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
3018*333d2b36SAndroid Build Coastguard Worker						// Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3019*333d2b36SAndroid Build Coastguard Worker						c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
3020*333d2b36SAndroid Build Coastguard Worker
3021*333d2b36SAndroid Build Coastguard Worker					}
3022*333d2b36SAndroid Build Coastguard Worker				} else {
3023*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleErrorf("module %q is not a genrule", depName)
3024*333d2b36SAndroid Build Coastguard Worker				}
3025*333d2b36SAndroid Build Coastguard Worker			case CrtBeginDepTag:
3026*333d2b36SAndroid Build Coastguard Worker				depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3027*333d2b36SAndroid Build Coastguard Worker			case CrtEndDepTag:
3028*333d2b36SAndroid Build Coastguard Worker				depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
3029*333d2b36SAndroid Build Coastguard Worker			}
3030*333d2b36SAndroid Build Coastguard Worker			return
3031*333d2b36SAndroid Build Coastguard Worker		}
3032*333d2b36SAndroid Build Coastguard Worker
3033*333d2b36SAndroid Build Coastguard Worker		if depTag == android.ProtoPluginDepTag {
3034*333d2b36SAndroid Build Coastguard Worker			return
3035*333d2b36SAndroid Build Coastguard Worker		}
3036*333d2b36SAndroid Build Coastguard Worker
3037*333d2b36SAndroid Build Coastguard Worker		if depTag == android.RequiredDepTag {
3038*333d2b36SAndroid Build Coastguard Worker			return
3039*333d2b36SAndroid Build Coastguard Worker		}
3040*333d2b36SAndroid Build Coastguard Worker
3041*333d2b36SAndroid Build Coastguard Worker		if dep.Target().Os != ctx.Os() {
3042*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("OS mismatch between %q (%s) and %q (%s)", ctx.ModuleName(), ctx.Os().Name, depName, dep.Target().Os.Name)
3043*333d2b36SAndroid Build Coastguard Worker			return
3044*333d2b36SAndroid Build Coastguard Worker		}
3045*333d2b36SAndroid Build Coastguard Worker		if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
3046*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3047*333d2b36SAndroid Build Coastguard Worker				ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
3048*333d2b36SAndroid Build Coastguard Worker			return
3049*333d2b36SAndroid Build Coastguard Worker		}
3050*333d2b36SAndroid Build Coastguard Worker
3051*333d2b36SAndroid Build Coastguard Worker		if depTag == reuseObjTag {
3052*333d2b36SAndroid Build Coastguard Worker			// Skip reused objects for stub libraries, they use their own stub object file instead.
3053*333d2b36SAndroid Build Coastguard Worker			// The reuseObjTag dependency still exists because the LinkageMutator runs before the
3054*333d2b36SAndroid Build Coastguard Worker			// version mutator, so the stubs variant is created from the shared variant that
3055*333d2b36SAndroid Build Coastguard Worker			// already has the reuseObjTag dependency on the static variant.
3056*333d2b36SAndroid Build Coastguard Worker			if !c.library.buildStubs() {
3057*333d2b36SAndroid Build Coastguard Worker				staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3058*333d2b36SAndroid Build Coastguard Worker				objs := staticAnalogue.ReuseObjects
3059*333d2b36SAndroid Build Coastguard Worker				depPaths.Objs = depPaths.Objs.Append(objs)
3060*333d2b36SAndroid Build Coastguard Worker				depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3061*333d2b36SAndroid Build Coastguard Worker				reexportExporter(depExporterInfo)
3062*333d2b36SAndroid Build Coastguard Worker			}
3063*333d2b36SAndroid Build Coastguard Worker			return
3064*333d2b36SAndroid Build Coastguard Worker		}
3065*333d2b36SAndroid Build Coastguard Worker
3066*333d2b36SAndroid Build Coastguard Worker		if depTag == llndkHeaderLibTag {
3067*333d2b36SAndroid Build Coastguard Worker			depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3068*333d2b36SAndroid Build Coastguard Worker			depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3069*333d2b36SAndroid Build Coastguard Worker			depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3070*333d2b36SAndroid Build Coastguard Worker		}
3071*333d2b36SAndroid Build Coastguard Worker
3072*333d2b36SAndroid Build Coastguard Worker		linkFile := ccDep.OutputFile()
3073*333d2b36SAndroid Build Coastguard Worker
3074*333d2b36SAndroid Build Coastguard Worker		if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3075*333d2b36SAndroid Build Coastguard Worker			// Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
3076*333d2b36SAndroid Build Coastguard Worker			if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
3077*333d2b36SAndroid Build Coastguard Worker				return
3078*333d2b36SAndroid Build Coastguard Worker			}
3079*333d2b36SAndroid Build Coastguard Worker
3080*333d2b36SAndroid Build Coastguard Worker			if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3081*333d2b36SAndroid Build Coastguard Worker				return
3082*333d2b36SAndroid Build Coastguard Worker			}
3083*333d2b36SAndroid Build Coastguard Worker			if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3084*333d2b36SAndroid Build Coastguard Worker				return
3085*333d2b36SAndroid Build Coastguard Worker			}
3086*333d2b36SAndroid Build Coastguard Worker
3087*333d2b36SAndroid Build Coastguard Worker			depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3088*333d2b36SAndroid Build Coastguard Worker
3089*333d2b36SAndroid Build Coastguard Worker			var ptr *android.Paths
3090*333d2b36SAndroid Build Coastguard Worker			var depPtr *android.Paths
3091*333d2b36SAndroid Build Coastguard Worker
3092*333d2b36SAndroid Build Coastguard Worker			depFile := android.OptionalPath{}
3093*333d2b36SAndroid Build Coastguard Worker
3094*333d2b36SAndroid Build Coastguard Worker			switch {
3095*333d2b36SAndroid Build Coastguard Worker			case libDepTag.header():
3096*333d2b36SAndroid Build Coastguard Worker				if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
3097*333d2b36SAndroid Build Coastguard Worker					if !ctx.Config().AllowMissingDependencies() {
3098*333d2b36SAndroid Build Coastguard Worker						ctx.ModuleErrorf("module %q is not a header library", depName)
3099*333d2b36SAndroid Build Coastguard Worker					} else {
3100*333d2b36SAndroid Build Coastguard Worker						ctx.AddMissingDependencies([]string{depName})
3101*333d2b36SAndroid Build Coastguard Worker					}
3102*333d2b36SAndroid Build Coastguard Worker					return
3103*333d2b36SAndroid Build Coastguard Worker				}
3104*333d2b36SAndroid Build Coastguard Worker			case libDepTag.shared():
3105*333d2b36SAndroid Build Coastguard Worker				if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
3106*333d2b36SAndroid Build Coastguard Worker					if !ctx.Config().AllowMissingDependencies() {
3107*333d2b36SAndroid Build Coastguard Worker						ctx.ModuleErrorf("module %q is not a shared library", depName)
3108*333d2b36SAndroid Build Coastguard Worker					} else {
3109*333d2b36SAndroid Build Coastguard Worker						ctx.AddMissingDependencies([]string{depName})
3110*333d2b36SAndroid Build Coastguard Worker					}
3111*333d2b36SAndroid Build Coastguard Worker					return
3112*333d2b36SAndroid Build Coastguard Worker				}
3113*333d2b36SAndroid Build Coastguard Worker
3114*333d2b36SAndroid Build Coastguard Worker				sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3115*333d2b36SAndroid Build Coastguard Worker				depExporterInfo = returnedDepExporterInfo
3116*333d2b36SAndroid Build Coastguard Worker
3117*333d2b36SAndroid Build Coastguard Worker				// Stubs lib doesn't link to the shared lib dependencies. Don't set
3118*333d2b36SAndroid Build Coastguard Worker				// linkFile, depFile, and ptr.
3119*333d2b36SAndroid Build Coastguard Worker				if c.IsStubs() {
3120*333d2b36SAndroid Build Coastguard Worker					break
3121*333d2b36SAndroid Build Coastguard Worker				}
3122*333d2b36SAndroid Build Coastguard Worker
3123*333d2b36SAndroid Build Coastguard Worker				linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3124*333d2b36SAndroid Build Coastguard Worker				depFile = sharedLibraryInfo.TableOfContents
3125*333d2b36SAndroid Build Coastguard Worker
3126*333d2b36SAndroid Build Coastguard Worker				if !sharedLibraryInfo.IsStubs {
3127*333d2b36SAndroid Build Coastguard Worker					depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3128*333d2b36SAndroid Build Coastguard Worker					if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3129*333d2b36SAndroid Build Coastguard Worker						depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3130*333d2b36SAndroid Build Coastguard Worker					}
3131*333d2b36SAndroid Build Coastguard Worker				}
3132*333d2b36SAndroid Build Coastguard Worker
3133*333d2b36SAndroid Build Coastguard Worker				ptr = &depPaths.SharedLibs
3134*333d2b36SAndroid Build Coastguard Worker				switch libDepTag.Order {
3135*333d2b36SAndroid Build Coastguard Worker				case earlyLibraryDependency:
3136*333d2b36SAndroid Build Coastguard Worker					ptr = &depPaths.EarlySharedLibs
3137*333d2b36SAndroid Build Coastguard Worker					depPtr = &depPaths.EarlySharedLibsDeps
3138*333d2b36SAndroid Build Coastguard Worker				case normalLibraryDependency:
3139*333d2b36SAndroid Build Coastguard Worker					ptr = &depPaths.SharedLibs
3140*333d2b36SAndroid Build Coastguard Worker					depPtr = &depPaths.SharedLibsDeps
3141*333d2b36SAndroid Build Coastguard Worker					directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
3142*333d2b36SAndroid Build Coastguard Worker				case lateLibraryDependency:
3143*333d2b36SAndroid Build Coastguard Worker					ptr = &depPaths.LateSharedLibs
3144*333d2b36SAndroid Build Coastguard Worker					depPtr = &depPaths.LateSharedLibsDeps
3145*333d2b36SAndroid Build Coastguard Worker				default:
3146*333d2b36SAndroid Build Coastguard Worker					panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3147*333d2b36SAndroid Build Coastguard Worker				}
3148*333d2b36SAndroid Build Coastguard Worker
3149*333d2b36SAndroid Build Coastguard Worker			case libDepTag.static():
3150*333d2b36SAndroid Build Coastguard Worker				if ccDep.RustLibraryInterface() {
3151*333d2b36SAndroid Build Coastguard Worker					rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: ccDep.CrateName(), LinkDirs: ccDep.ExportedCrateLinkDirs()}
3152*333d2b36SAndroid Build Coastguard Worker					depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3153*333d2b36SAndroid Build Coastguard Worker					depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3154*333d2b36SAndroid Build Coastguard Worker					if libDepTag.wholeStatic {
3155*333d2b36SAndroid Build Coastguard Worker						depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3156*333d2b36SAndroid Build Coastguard Worker						depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
3157*333d2b36SAndroid Build Coastguard Worker
3158*333d2b36SAndroid Build Coastguard Worker						// If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3159*333d2b36SAndroid Build Coastguard Worker						// exported functions from the rust generated staticlib still exported.
3160*333d2b36SAndroid Build Coastguard Worker						if c.CcLibrary() && c.Shared() {
3161*333d2b36SAndroid Build Coastguard Worker							c.WholeRustStaticlib = true
3162*333d2b36SAndroid Build Coastguard Worker						}
3163*333d2b36SAndroid Build Coastguard Worker					}
3164*333d2b36SAndroid Build Coastguard Worker
3165*333d2b36SAndroid Build Coastguard Worker				} else {
3166*333d2b36SAndroid Build Coastguard Worker					staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3167*333d2b36SAndroid Build Coastguard Worker					if !isStaticLib {
3168*333d2b36SAndroid Build Coastguard Worker						if !ctx.Config().AllowMissingDependencies() {
3169*333d2b36SAndroid Build Coastguard Worker							ctx.ModuleErrorf("module %q is not a static library", depName)
3170*333d2b36SAndroid Build Coastguard Worker						} else {
3171*333d2b36SAndroid Build Coastguard Worker							ctx.AddMissingDependencies([]string{depName})
3172*333d2b36SAndroid Build Coastguard Worker						}
3173*333d2b36SAndroid Build Coastguard Worker						return
3174*333d2b36SAndroid Build Coastguard Worker					}
3175*333d2b36SAndroid Build Coastguard Worker
3176*333d2b36SAndroid Build Coastguard Worker					// Stubs lib doesn't link to the static lib dependencies. Don't set
3177*333d2b36SAndroid Build Coastguard Worker					// linkFile, depFile, and ptr.
3178*333d2b36SAndroid Build Coastguard Worker					if c.IsStubs() {
3179*333d2b36SAndroid Build Coastguard Worker						break
3180*333d2b36SAndroid Build Coastguard Worker					}
3181*333d2b36SAndroid Build Coastguard Worker
3182*333d2b36SAndroid Build Coastguard Worker					linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3183*333d2b36SAndroid Build Coastguard Worker					if libDepTag.wholeStatic {
3184*333d2b36SAndroid Build Coastguard Worker						ptr = &depPaths.WholeStaticLibs
3185*333d2b36SAndroid Build Coastguard Worker						if len(staticLibraryInfo.Objects.objFiles) > 0 {
3186*333d2b36SAndroid Build Coastguard Worker							depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3187*333d2b36SAndroid Build Coastguard Worker						} else {
3188*333d2b36SAndroid Build Coastguard Worker							// This case normally catches prebuilt static
3189*333d2b36SAndroid Build Coastguard Worker							// libraries, but it can also occur when
3190*333d2b36SAndroid Build Coastguard Worker							// AllowMissingDependencies is on and the
3191*333d2b36SAndroid Build Coastguard Worker							// dependencies has no sources of its own
3192*333d2b36SAndroid Build Coastguard Worker							// but has a whole_static_libs dependency
3193*333d2b36SAndroid Build Coastguard Worker							// on a missing library.  We want to depend
3194*333d2b36SAndroid Build Coastguard Worker							// on the .a file so that there is something
3195*333d2b36SAndroid Build Coastguard Worker							// in the dependency tree that contains the
3196*333d2b36SAndroid Build Coastguard Worker							// error rule for the missing transitive
3197*333d2b36SAndroid Build Coastguard Worker							// dependency.
3198*333d2b36SAndroid Build Coastguard Worker							depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3199*333d2b36SAndroid Build Coastguard Worker						}
3200*333d2b36SAndroid Build Coastguard Worker						depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3201*333d2b36SAndroid Build Coastguard Worker							staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3202*333d2b36SAndroid Build Coastguard Worker					} else {
3203*333d2b36SAndroid Build Coastguard Worker						switch libDepTag.Order {
3204*333d2b36SAndroid Build Coastguard Worker						case earlyLibraryDependency:
3205*333d2b36SAndroid Build Coastguard Worker							panic(fmt.Errorf("early static libs not supported"))
3206*333d2b36SAndroid Build Coastguard Worker						case normalLibraryDependency:
3207*333d2b36SAndroid Build Coastguard Worker							// static dependencies will be handled separately so they can be ordered
3208*333d2b36SAndroid Build Coastguard Worker							// using transitive dependencies.
3209*333d2b36SAndroid Build Coastguard Worker							ptr = nil
3210*333d2b36SAndroid Build Coastguard Worker							directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3211*333d2b36SAndroid Build Coastguard Worker						case lateLibraryDependency:
3212*333d2b36SAndroid Build Coastguard Worker							ptr = &depPaths.LateStaticLibs
3213*333d2b36SAndroid Build Coastguard Worker						default:
3214*333d2b36SAndroid Build Coastguard Worker							panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3215*333d2b36SAndroid Build Coastguard Worker						}
3216*333d2b36SAndroid Build Coastguard Worker					}
3217*333d2b36SAndroid Build Coastguard Worker
3218*333d2b36SAndroid Build Coastguard Worker					// Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3219*333d2b36SAndroid Build Coastguard Worker					depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3220*333d2b36SAndroid Build Coastguard Worker
3221*333d2b36SAndroid Build Coastguard Worker					if libDepTag.unexportedSymbols {
3222*333d2b36SAndroid Build Coastguard Worker						depPaths.LdFlags = append(depPaths.LdFlags,
3223*333d2b36SAndroid Build Coastguard Worker							"-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3224*333d2b36SAndroid Build Coastguard Worker					}
3225*333d2b36SAndroid Build Coastguard Worker				}
3226*333d2b36SAndroid Build Coastguard Worker			}
3227*333d2b36SAndroid Build Coastguard Worker
3228*333d2b36SAndroid Build Coastguard Worker			if libDepTag.static() && !libDepTag.wholeStatic && !ccDep.RustLibraryInterface() {
3229*333d2b36SAndroid Build Coastguard Worker				if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3230*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleErrorf("module %q not a static library", depName)
3231*333d2b36SAndroid Build Coastguard Worker					return
3232*333d2b36SAndroid Build Coastguard Worker				}
3233*333d2b36SAndroid Build Coastguard Worker
3234*333d2b36SAndroid Build Coastguard Worker				// When combining coverage files for shared libraries and executables, coverage files
3235*333d2b36SAndroid Build Coastguard Worker				// in static libraries act as if they were whole static libraries. The same goes for
3236*333d2b36SAndroid Build Coastguard Worker				// source based Abi dump files.
3237*333d2b36SAndroid Build Coastguard Worker				if c, ok := ccDep.(*Module); ok {
3238*333d2b36SAndroid Build Coastguard Worker					staticLib := c.linker.(libraryInterface)
3239*333d2b36SAndroid Build Coastguard Worker					depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3240*333d2b36SAndroid Build Coastguard Worker						staticLib.objs().coverageFiles...)
3241*333d2b36SAndroid Build Coastguard Worker					depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3242*333d2b36SAndroid Build Coastguard Worker						staticLib.objs().sAbiDumpFiles...)
3243*333d2b36SAndroid Build Coastguard Worker				} else {
3244*333d2b36SAndroid Build Coastguard Worker					// Handle non-CC modules here
3245*333d2b36SAndroid Build Coastguard Worker					depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3246*333d2b36SAndroid Build Coastguard Worker						ccDep.CoverageFiles()...)
3247*333d2b36SAndroid Build Coastguard Worker				}
3248*333d2b36SAndroid Build Coastguard Worker			}
3249*333d2b36SAndroid Build Coastguard Worker
3250*333d2b36SAndroid Build Coastguard Worker			if ptr != nil {
3251*333d2b36SAndroid Build Coastguard Worker				if !linkFile.Valid() {
3252*333d2b36SAndroid Build Coastguard Worker					if !ctx.Config().AllowMissingDependencies() {
3253*333d2b36SAndroid Build Coastguard Worker						ctx.ModuleErrorf("module %q missing output file", depName)
3254*333d2b36SAndroid Build Coastguard Worker					} else {
3255*333d2b36SAndroid Build Coastguard Worker						ctx.AddMissingDependencies([]string{depName})
3256*333d2b36SAndroid Build Coastguard Worker					}
3257*333d2b36SAndroid Build Coastguard Worker					return
3258*333d2b36SAndroid Build Coastguard Worker				}
3259*333d2b36SAndroid Build Coastguard Worker				*ptr = append(*ptr, linkFile.Path())
3260*333d2b36SAndroid Build Coastguard Worker			}
3261*333d2b36SAndroid Build Coastguard Worker
3262*333d2b36SAndroid Build Coastguard Worker			if depPtr != nil {
3263*333d2b36SAndroid Build Coastguard Worker				dep := depFile
3264*333d2b36SAndroid Build Coastguard Worker				if !dep.Valid() {
3265*333d2b36SAndroid Build Coastguard Worker					dep = linkFile
3266*333d2b36SAndroid Build Coastguard Worker				}
3267*333d2b36SAndroid Build Coastguard Worker				*depPtr = append(*depPtr, dep.Path())
3268*333d2b36SAndroid Build Coastguard Worker			}
3269*333d2b36SAndroid Build Coastguard Worker
3270*333d2b36SAndroid Build Coastguard Worker			depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3271*333d2b36SAndroid Build Coastguard Worker			depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3272*333d2b36SAndroid Build Coastguard Worker			depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3273*333d2b36SAndroid Build Coastguard Worker			depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3274*333d2b36SAndroid Build Coastguard Worker			depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3275*333d2b36SAndroid Build Coastguard Worker
3276*333d2b36SAndroid Build Coastguard Worker			// Only re-export RustRlibDeps for cc static libs
3277*333d2b36SAndroid Build Coastguard Worker			if c.static() {
3278*333d2b36SAndroid Build Coastguard Worker				depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3279*333d2b36SAndroid Build Coastguard Worker			}
3280*333d2b36SAndroid Build Coastguard Worker
3281*333d2b36SAndroid Build Coastguard Worker			if libDepTag.reexportFlags {
3282*333d2b36SAndroid Build Coastguard Worker				reexportExporter(depExporterInfo)
3283*333d2b36SAndroid Build Coastguard Worker				// Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3284*333d2b36SAndroid Build Coastguard Worker				// Re-exported shared library headers must be included as well since they can help us with type information
3285*333d2b36SAndroid Build Coastguard Worker				// about template instantiations (instantiated from their headers).
3286*333d2b36SAndroid Build Coastguard Worker				c.sabi.Properties.ReexportedIncludes = append(
3287*333d2b36SAndroid Build Coastguard Worker					c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
3288*333d2b36SAndroid Build Coastguard Worker				c.sabi.Properties.ReexportedSystemIncludes = append(
3289*333d2b36SAndroid Build Coastguard Worker					c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
3290*333d2b36SAndroid Build Coastguard Worker			}
3291*333d2b36SAndroid Build Coastguard Worker
3292*333d2b36SAndroid Build Coastguard Worker			makeLibName := MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName()) + libDepTag.makeSuffix
3293*333d2b36SAndroid Build Coastguard Worker			switch {
3294*333d2b36SAndroid Build Coastguard Worker			case libDepTag.header():
3295*333d2b36SAndroid Build Coastguard Worker				c.Properties.AndroidMkHeaderLibs = append(
3296*333d2b36SAndroid Build Coastguard Worker					c.Properties.AndroidMkHeaderLibs, makeLibName)
3297*333d2b36SAndroid Build Coastguard Worker			case libDepTag.shared():
3298*333d2b36SAndroid Build Coastguard Worker				// Note: the order of libs in this list is not important because
3299*333d2b36SAndroid Build Coastguard Worker				// they merely serve as Make dependencies and do not affect this lib itself.
3300*333d2b36SAndroid Build Coastguard Worker				c.Properties.AndroidMkSharedLibs = append(
3301*333d2b36SAndroid Build Coastguard Worker					c.Properties.AndroidMkSharedLibs, makeLibName)
3302*333d2b36SAndroid Build Coastguard Worker			case libDepTag.static():
3303*333d2b36SAndroid Build Coastguard Worker				if !ccDep.RustLibraryInterface() {
3304*333d2b36SAndroid Build Coastguard Worker					if libDepTag.wholeStatic {
3305*333d2b36SAndroid Build Coastguard Worker						c.Properties.AndroidMkWholeStaticLibs = append(
3306*333d2b36SAndroid Build Coastguard Worker							c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3307*333d2b36SAndroid Build Coastguard Worker					} else {
3308*333d2b36SAndroid Build Coastguard Worker						c.Properties.AndroidMkStaticLibs = append(
3309*333d2b36SAndroid Build Coastguard Worker							c.Properties.AndroidMkStaticLibs, makeLibName)
3310*333d2b36SAndroid Build Coastguard Worker					}
3311*333d2b36SAndroid Build Coastguard Worker				}
3312*333d2b36SAndroid Build Coastguard Worker			}
3313*333d2b36SAndroid Build Coastguard Worker		} else if !c.IsStubs() {
3314*333d2b36SAndroid Build Coastguard Worker			// Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3315*333d2b36SAndroid Build Coastguard Worker
3316*333d2b36SAndroid Build Coastguard Worker			switch depTag {
3317*333d2b36SAndroid Build Coastguard Worker			case runtimeDepTag:
3318*333d2b36SAndroid Build Coastguard Worker				c.Properties.AndroidMkRuntimeLibs = append(
3319*333d2b36SAndroid Build Coastguard Worker					c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName())+libDepTag.makeSuffix)
3320*333d2b36SAndroid Build Coastguard Worker			case objDepTag:
3321*333d2b36SAndroid Build Coastguard Worker				depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3322*333d2b36SAndroid Build Coastguard Worker			case CrtBeginDepTag:
3323*333d2b36SAndroid Build Coastguard Worker				depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
3324*333d2b36SAndroid Build Coastguard Worker			case CrtEndDepTag:
3325*333d2b36SAndroid Build Coastguard Worker				depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
3326*333d2b36SAndroid Build Coastguard Worker			case dynamicLinkerDepTag:
3327*333d2b36SAndroid Build Coastguard Worker				depPaths.DynamicLinker = linkFile
3328*333d2b36SAndroid Build Coastguard Worker			}
3329*333d2b36SAndroid Build Coastguard Worker		}
3330*333d2b36SAndroid Build Coastguard Worker	})
3331*333d2b36SAndroid Build Coastguard Worker
3332*333d2b36SAndroid Build Coastguard Worker	// use the ordered dependencies as this module's dependencies
3333*333d2b36SAndroid Build Coastguard Worker	orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3334*333d2b36SAndroid Build Coastguard Worker	depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3335*333d2b36SAndroid Build Coastguard Worker	depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
3336*333d2b36SAndroid Build Coastguard Worker
3337*333d2b36SAndroid Build Coastguard Worker	// Dedup exported flags from dependencies
3338*333d2b36SAndroid Build Coastguard Worker	depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
3339*333d2b36SAndroid Build Coastguard Worker	depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3340*333d2b36SAndroid Build Coastguard Worker	depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
3341*333d2b36SAndroid Build Coastguard Worker	depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
3342*333d2b36SAndroid Build Coastguard Worker	depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3343*333d2b36SAndroid Build Coastguard Worker
3344*333d2b36SAndroid Build Coastguard Worker	depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3345*333d2b36SAndroid Build Coastguard Worker	depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
3346*333d2b36SAndroid Build Coastguard Worker	depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
3347*333d2b36SAndroid Build Coastguard Worker	depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
3348*333d2b36SAndroid Build Coastguard Worker	depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
3349*333d2b36SAndroid Build Coastguard Worker	depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
3350*333d2b36SAndroid Build Coastguard Worker
3351*333d2b36SAndroid Build Coastguard Worker	if c.sabi != nil {
3352*333d2b36SAndroid Build Coastguard Worker		c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
3353*333d2b36SAndroid Build Coastguard Worker		c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
3354*333d2b36SAndroid Build Coastguard Worker	}
3355*333d2b36SAndroid Build Coastguard Worker
3356*333d2b36SAndroid Build Coastguard Worker	return depPaths
3357*333d2b36SAndroid Build Coastguard Worker}
3358*333d2b36SAndroid Build Coastguard Worker
3359*333d2b36SAndroid Build Coastguard Workerfunc ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool {
3360*333d2b36SAndroid Build Coastguard Worker	inVendorOrProduct := false
3361*333d2b36SAndroid Build Coastguard Worker	bootstrap := false
3362*333d2b36SAndroid Build Coastguard Worker	if linkable, ok := parent.(LinkableInterface); !ok {
3363*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3364*333d2b36SAndroid Build Coastguard Worker	} else {
3365*333d2b36SAndroid Build Coastguard Worker		inVendorOrProduct = linkable.InVendorOrProduct()
3366*333d2b36SAndroid Build Coastguard Worker		bootstrap = linkable.Bootstrap()
3367*333d2b36SAndroid Build Coastguard Worker	}
3368*333d2b36SAndroid Build Coastguard Worker
3369*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
3370*333d2b36SAndroid Build Coastguard Worker
3371*333d2b36SAndroid Build Coastguard Worker	useStubs := false
3372*333d2b36SAndroid Build Coastguard Worker
3373*333d2b36SAndroid Build Coastguard Worker	if lib := moduleLibraryInterface(dep); lib.buildStubs() && inVendorOrProduct { // LLNDK
3374*333d2b36SAndroid Build Coastguard Worker		if !apexInfo.IsForPlatform() {
3375*333d2b36SAndroid Build Coastguard Worker			// For platform libraries, use current version of LLNDK
3376*333d2b36SAndroid Build Coastguard Worker			// If this is for use_vendor apex we will apply the same rules
3377*333d2b36SAndroid Build Coastguard Worker			// of apex sdk enforcement below to choose right version.
3378*333d2b36SAndroid Build Coastguard Worker			useStubs = true
3379*333d2b36SAndroid Build Coastguard Worker		}
3380*333d2b36SAndroid Build Coastguard Worker	} else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3381*333d2b36SAndroid Build Coastguard Worker		// If not building for APEX or the containing APEX allows the use of
3382*333d2b36SAndroid Build Coastguard Worker		// platform APIs, use stubs only when it is from an APEX (and not from
3383*333d2b36SAndroid Build Coastguard Worker		// platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3384*333d2b36SAndroid Build Coastguard Worker		// bootstrap modules, always link to non-stub variant
3385*333d2b36SAndroid Build Coastguard Worker		isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3386*333d2b36SAndroid Build Coastguard Worker
3387*333d2b36SAndroid Build Coastguard Worker		useStubs = isNotInPlatform && !bootstrap
3388*333d2b36SAndroid Build Coastguard Worker	} else {
3389*333d2b36SAndroid Build Coastguard Worker		// If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3390*333d2b36SAndroid Build Coastguard Worker		useStubs = true
3391*333d2b36SAndroid Build Coastguard Worker	}
3392*333d2b36SAndroid Build Coastguard Worker
3393*333d2b36SAndroid Build Coastguard Worker	return useStubs
3394*333d2b36SAndroid Build Coastguard Worker}
3395*333d2b36SAndroid Build Coastguard Worker
3396*333d2b36SAndroid Build Coastguard Worker// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3397*333d2b36SAndroid Build Coastguard Worker// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3398*333d2b36SAndroid Build Coastguard Worker// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3399*333d2b36SAndroid Build Coastguard Worker// has different level of updatability. For example, if a library foo in an APEX depends on a
3400*333d2b36SAndroid Build Coastguard Worker// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3401*333d2b36SAndroid Build Coastguard Worker// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3402*333d2b36SAndroid Build Coastguard Worker// same APEX as foo, the non-stub variant of bar is used.
3403*333d2b36SAndroid Build Coastguard Workerfunc ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3404*333d2b36SAndroid Build Coastguard Worker	depTag := ctx.OtherModuleDependencyTag(dep)
3405*333d2b36SAndroid Build Coastguard Worker	libDepTag, ok := depTag.(libraryDependencyTag)
3406*333d2b36SAndroid Build Coastguard Worker	if !ok || !libDepTag.shared() {
3407*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3408*333d2b36SAndroid Build Coastguard Worker	}
3409*333d2b36SAndroid Build Coastguard Worker
3410*333d2b36SAndroid Build Coastguard Worker	sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3411*333d2b36SAndroid Build Coastguard Worker	depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3412*333d2b36SAndroid Build Coastguard Worker	sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
3413*333d2b36SAndroid Build Coastguard Worker
3414*333d2b36SAndroid Build Coastguard Worker	if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
3415*333d2b36SAndroid Build Coastguard Worker		// when to use (unspecified) stubs, use the latest one.
3416*333d2b36SAndroid Build Coastguard Worker		if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
3417*333d2b36SAndroid Build Coastguard Worker			stubs := sharedLibraryStubsInfo.SharedStubLibraries
3418*333d2b36SAndroid Build Coastguard Worker			toUse := stubs[len(stubs)-1]
3419*333d2b36SAndroid Build Coastguard Worker			sharedLibraryInfo = toUse.SharedLibraryInfo
3420*333d2b36SAndroid Build Coastguard Worker			depExporterInfo = toUse.FlagExporterInfo
3421*333d2b36SAndroid Build Coastguard Worker		}
3422*333d2b36SAndroid Build Coastguard Worker	}
3423*333d2b36SAndroid Build Coastguard Worker	return sharedLibraryInfo, depExporterInfo
3424*333d2b36SAndroid Build Coastguard Worker}
3425*333d2b36SAndroid Build Coastguard Worker
3426*333d2b36SAndroid Build Coastguard Worker// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3427*333d2b36SAndroid Build Coastguard Worker// to match the topological order of the dependency tree, including any static analogues of
3428*333d2b36SAndroid Build Coastguard Worker// direct shared libraries.  It returns the ordered static dependencies, and a depset.DepSet
3429*333d2b36SAndroid Build Coastguard Worker// of the transitive dependencies.
3430*333d2b36SAndroid Build Coastguard Workerfunc orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3431*333d2b36SAndroid Build Coastguard Worker	transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
3432*333d2b36SAndroid Build Coastguard Worker	var staticPaths android.Paths
3433*333d2b36SAndroid Build Coastguard Worker	for _, staticDep := range staticDeps {
3434*333d2b36SAndroid Build Coastguard Worker		staticPaths = append(staticPaths, staticDep.StaticLibrary)
3435*333d2b36SAndroid Build Coastguard Worker		transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3436*333d2b36SAndroid Build Coastguard Worker	}
3437*333d2b36SAndroid Build Coastguard Worker	for _, sharedDep := range sharedDeps {
3438*333d2b36SAndroid Build Coastguard Worker		transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
3439*333d2b36SAndroid Build Coastguard Worker	}
3440*333d2b36SAndroid Build Coastguard Worker	transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3441*333d2b36SAndroid Build Coastguard Worker
3442*333d2b36SAndroid Build Coastguard Worker	orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3443*333d2b36SAndroid Build Coastguard Worker
3444*333d2b36SAndroid Build Coastguard Worker	// reorder the dependencies based on transitive dependencies
3445*333d2b36SAndroid Build Coastguard Worker	staticPaths = android.FirstUniquePaths(staticPaths)
3446*333d2b36SAndroid Build Coastguard Worker	_, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3447*333d2b36SAndroid Build Coastguard Worker
3448*333d2b36SAndroid Build Coastguard Worker	if len(orderedStaticPaths) != len(staticPaths) {
3449*333d2b36SAndroid Build Coastguard Worker		missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3450*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3451*333d2b36SAndroid Build Coastguard Worker	}
3452*333d2b36SAndroid Build Coastguard Worker
3453*333d2b36SAndroid Build Coastguard Worker	return orderedStaticPaths, transitiveStaticLibs
3454*333d2b36SAndroid Build Coastguard Worker}
3455*333d2b36SAndroid Build Coastguard Worker
3456*333d2b36SAndroid Build Coastguard Worker// BaseLibName trims known prefixes and suffixes
3457*333d2b36SAndroid Build Coastguard Workerfunc BaseLibName(depName string) string {
3458*333d2b36SAndroid Build Coastguard Worker	libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3459*333d2b36SAndroid Build Coastguard Worker	libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
3460*333d2b36SAndroid Build Coastguard Worker	libName = android.RemoveOptionalPrebuiltPrefix(libName)
3461*333d2b36SAndroid Build Coastguard Worker	return libName
3462*333d2b36SAndroid Build Coastguard Worker}
3463*333d2b36SAndroid Build Coastguard Worker
3464*333d2b36SAndroid Build Coastguard Workerfunc MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
3465*333d2b36SAndroid Build Coastguard Worker	libName := BaseLibName(depName)
3466*333d2b36SAndroid Build Coastguard Worker	ccDepModule, _ := ccDep.(*Module)
3467*333d2b36SAndroid Build Coastguard Worker	isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
3468*333d2b36SAndroid Build Coastguard Worker	nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
3469*333d2b36SAndroid Build Coastguard Worker
3470*333d2b36SAndroid Build Coastguard Worker	if ccDepModule != nil {
3471*333d2b36SAndroid Build Coastguard Worker		// Use base module name for snapshots when exporting to Makefile.
3472*333d2b36SAndroid Build Coastguard Worker		if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
3473*333d2b36SAndroid Build Coastguard Worker			baseName := ccDepModule.BaseModuleName()
3474*333d2b36SAndroid Build Coastguard Worker
3475*333d2b36SAndroid Build Coastguard Worker			return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
3476*333d2b36SAndroid Build Coastguard Worker		}
3477*333d2b36SAndroid Build Coastguard Worker	}
3478*333d2b36SAndroid Build Coastguard Worker
3479*333d2b36SAndroid Build Coastguard Worker	if ccDep.InVendorOrProduct() && nonSystemVariantsExist {
3480*333d2b36SAndroid Build Coastguard Worker		// The vendor and product modules in Make will have been renamed to not conflict with the
3481*333d2b36SAndroid Build Coastguard Worker		// core module, so update the dependency name here accordingly.
3482*333d2b36SAndroid Build Coastguard Worker		return libName + ccDep.SubName()
3483*333d2b36SAndroid Build Coastguard Worker	} else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
3484*333d2b36SAndroid Build Coastguard Worker		return libName + RamdiskSuffix
3485*333d2b36SAndroid Build Coastguard Worker	} else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
3486*333d2b36SAndroid Build Coastguard Worker		return libName + VendorRamdiskSuffix
3487*333d2b36SAndroid Build Coastguard Worker	} else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
3488*333d2b36SAndroid Build Coastguard Worker		return libName + RecoverySuffix
3489*333d2b36SAndroid Build Coastguard Worker	} else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
3490*333d2b36SAndroid Build Coastguard Worker		return libName + NativeBridgeSuffix
3491*333d2b36SAndroid Build Coastguard Worker	} else {
3492*333d2b36SAndroid Build Coastguard Worker		return libName
3493*333d2b36SAndroid Build Coastguard Worker	}
3494*333d2b36SAndroid Build Coastguard Worker}
3495*333d2b36SAndroid Build Coastguard Worker
3496*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInData() bool {
3497*333d2b36SAndroid Build Coastguard Worker	if c.installer == nil {
3498*333d2b36SAndroid Build Coastguard Worker		return false
3499*333d2b36SAndroid Build Coastguard Worker	}
3500*333d2b36SAndroid Build Coastguard Worker	return c.installer.inData()
3501*333d2b36SAndroid Build Coastguard Worker}
3502*333d2b36SAndroid Build Coastguard Worker
3503*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInSanitizerDir() bool {
3504*333d2b36SAndroid Build Coastguard Worker	if c.installer == nil {
3505*333d2b36SAndroid Build Coastguard Worker		return false
3506*333d2b36SAndroid Build Coastguard Worker	}
3507*333d2b36SAndroid Build Coastguard Worker	if c.sanitize != nil && c.sanitize.inSanitizerDir() {
3508*333d2b36SAndroid Build Coastguard Worker		return true
3509*333d2b36SAndroid Build Coastguard Worker	}
3510*333d2b36SAndroid Build Coastguard Worker	return c.installer.inSanitizerDir()
3511*333d2b36SAndroid Build Coastguard Worker}
3512*333d2b36SAndroid Build Coastguard Worker
3513*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInRamdisk() bool {
3514*333d2b36SAndroid Build Coastguard Worker	return c.InRamdisk()
3515*333d2b36SAndroid Build Coastguard Worker}
3516*333d2b36SAndroid Build Coastguard Worker
3517*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInVendorRamdisk() bool {
3518*333d2b36SAndroid Build Coastguard Worker	return c.InVendorRamdisk()
3519*333d2b36SAndroid Build Coastguard Worker}
3520*333d2b36SAndroid Build Coastguard Worker
3521*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInRecovery() bool {
3522*333d2b36SAndroid Build Coastguard Worker	return c.InRecovery()
3523*333d2b36SAndroid Build Coastguard Worker}
3524*333d2b36SAndroid Build Coastguard Worker
3525*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) MakeUninstallable() {
3526*333d2b36SAndroid Build Coastguard Worker	if c.installer == nil {
3527*333d2b36SAndroid Build Coastguard Worker		c.ModuleBase.MakeUninstallable()
3528*333d2b36SAndroid Build Coastguard Worker		return
3529*333d2b36SAndroid Build Coastguard Worker	}
3530*333d2b36SAndroid Build Coastguard Worker	c.installer.makeUninstallable(c)
3531*333d2b36SAndroid Build Coastguard Worker}
3532*333d2b36SAndroid Build Coastguard Worker
3533*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HostToolPath() android.OptionalPath {
3534*333d2b36SAndroid Build Coastguard Worker	if c.installer == nil {
3535*333d2b36SAndroid Build Coastguard Worker		return android.OptionalPath{}
3536*333d2b36SAndroid Build Coastguard Worker	}
3537*333d2b36SAndroid Build Coastguard Worker	return c.installer.hostToolPath()
3538*333d2b36SAndroid Build Coastguard Worker}
3539*333d2b36SAndroid Build Coastguard Worker
3540*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IntermPathForModuleOut() android.OptionalPath {
3541*333d2b36SAndroid Build Coastguard Worker	return c.outputFile
3542*333d2b36SAndroid Build Coastguard Worker}
3543*333d2b36SAndroid Build Coastguard Worker
3544*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) static() bool {
3545*333d2b36SAndroid Build Coastguard Worker	if static, ok := c.linker.(interface {
3546*333d2b36SAndroid Build Coastguard Worker		static() bool
3547*333d2b36SAndroid Build Coastguard Worker	}); ok {
3548*333d2b36SAndroid Build Coastguard Worker		return static.static()
3549*333d2b36SAndroid Build Coastguard Worker	}
3550*333d2b36SAndroid Build Coastguard Worker	return false
3551*333d2b36SAndroid Build Coastguard Worker}
3552*333d2b36SAndroid Build Coastguard Worker
3553*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) staticBinary() bool {
3554*333d2b36SAndroid Build Coastguard Worker	if static, ok := c.linker.(interface {
3555*333d2b36SAndroid Build Coastguard Worker		staticBinary() bool
3556*333d2b36SAndroid Build Coastguard Worker	}); ok {
3557*333d2b36SAndroid Build Coastguard Worker		return static.staticBinary()
3558*333d2b36SAndroid Build Coastguard Worker	}
3559*333d2b36SAndroid Build Coastguard Worker	return false
3560*333d2b36SAndroid Build Coastguard Worker}
3561*333d2b36SAndroid Build Coastguard Worker
3562*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) testBinary() bool {
3563*333d2b36SAndroid Build Coastguard Worker	if test, ok := c.linker.(interface {
3564*333d2b36SAndroid Build Coastguard Worker		testBinary() bool
3565*333d2b36SAndroid Build Coastguard Worker	}); ok {
3566*333d2b36SAndroid Build Coastguard Worker		return test.testBinary()
3567*333d2b36SAndroid Build Coastguard Worker	}
3568*333d2b36SAndroid Build Coastguard Worker	return false
3569*333d2b36SAndroid Build Coastguard Worker}
3570*333d2b36SAndroid Build Coastguard Worker
3571*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) testLibrary() bool {
3572*333d2b36SAndroid Build Coastguard Worker	if test, ok := c.linker.(interface {
3573*333d2b36SAndroid Build Coastguard Worker		testLibrary() bool
3574*333d2b36SAndroid Build Coastguard Worker	}); ok {
3575*333d2b36SAndroid Build Coastguard Worker		return test.testLibrary()
3576*333d2b36SAndroid Build Coastguard Worker	}
3577*333d2b36SAndroid Build Coastguard Worker	return false
3578*333d2b36SAndroid Build Coastguard Worker}
3579*333d2b36SAndroid Build Coastguard Worker
3580*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) benchmarkBinary() bool {
3581*333d2b36SAndroid Build Coastguard Worker	if b, ok := c.linker.(interface {
3582*333d2b36SAndroid Build Coastguard Worker		benchmarkBinary() bool
3583*333d2b36SAndroid Build Coastguard Worker	}); ok {
3584*333d2b36SAndroid Build Coastguard Worker		return b.benchmarkBinary()
3585*333d2b36SAndroid Build Coastguard Worker	}
3586*333d2b36SAndroid Build Coastguard Worker	return false
3587*333d2b36SAndroid Build Coastguard Worker}
3588*333d2b36SAndroid Build Coastguard Worker
3589*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) fuzzBinary() bool {
3590*333d2b36SAndroid Build Coastguard Worker	if f, ok := c.linker.(interface {
3591*333d2b36SAndroid Build Coastguard Worker		fuzzBinary() bool
3592*333d2b36SAndroid Build Coastguard Worker	}); ok {
3593*333d2b36SAndroid Build Coastguard Worker		return f.fuzzBinary()
3594*333d2b36SAndroid Build Coastguard Worker	}
3595*333d2b36SAndroid Build Coastguard Worker	return false
3596*333d2b36SAndroid Build Coastguard Worker}
3597*333d2b36SAndroid Build Coastguard Worker
3598*333d2b36SAndroid Build Coastguard Worker// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3599*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Header() bool {
3600*333d2b36SAndroid Build Coastguard Worker	if h, ok := c.linker.(interface {
3601*333d2b36SAndroid Build Coastguard Worker		header() bool
3602*333d2b36SAndroid Build Coastguard Worker	}); ok {
3603*333d2b36SAndroid Build Coastguard Worker		return h.header()
3604*333d2b36SAndroid Build Coastguard Worker	}
3605*333d2b36SAndroid Build Coastguard Worker	return false
3606*333d2b36SAndroid Build Coastguard Worker}
3607*333d2b36SAndroid Build Coastguard Worker
3608*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Binary() bool {
3609*333d2b36SAndroid Build Coastguard Worker	if b, ok := c.linker.(interface {
3610*333d2b36SAndroid Build Coastguard Worker		binary() bool
3611*333d2b36SAndroid Build Coastguard Worker	}); ok {
3612*333d2b36SAndroid Build Coastguard Worker		return b.binary()
3613*333d2b36SAndroid Build Coastguard Worker	}
3614*333d2b36SAndroid Build Coastguard Worker	return false
3615*333d2b36SAndroid Build Coastguard Worker}
3616*333d2b36SAndroid Build Coastguard Worker
3617*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) StaticExecutable() bool {
3618*333d2b36SAndroid Build Coastguard Worker	if b, ok := c.linker.(*binaryDecorator); ok {
3619*333d2b36SAndroid Build Coastguard Worker		return b.static()
3620*333d2b36SAndroid Build Coastguard Worker	}
3621*333d2b36SAndroid Build Coastguard Worker	return false
3622*333d2b36SAndroid Build Coastguard Worker}
3623*333d2b36SAndroid Build Coastguard Worker
3624*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Object() bool {
3625*333d2b36SAndroid Build Coastguard Worker	if o, ok := c.linker.(interface {
3626*333d2b36SAndroid Build Coastguard Worker		object() bool
3627*333d2b36SAndroid Build Coastguard Worker	}); ok {
3628*333d2b36SAndroid Build Coastguard Worker		return o.object()
3629*333d2b36SAndroid Build Coastguard Worker	}
3630*333d2b36SAndroid Build Coastguard Worker	return false
3631*333d2b36SAndroid Build Coastguard Worker}
3632*333d2b36SAndroid Build Coastguard Worker
3633*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) Dylib() bool {
3634*333d2b36SAndroid Build Coastguard Worker	return false
3635*333d2b36SAndroid Build Coastguard Worker}
3636*333d2b36SAndroid Build Coastguard Worker
3637*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) Rlib() bool {
3638*333d2b36SAndroid Build Coastguard Worker	return false
3639*333d2b36SAndroid Build Coastguard Worker}
3640*333d2b36SAndroid Build Coastguard Worker
3641*333d2b36SAndroid Build Coastguard Workerfunc GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
3642*333d2b36SAndroid Build Coastguard Worker	if c.InVendorOrProduct() {
3643*333d2b36SAndroid Build Coastguard Worker		if c.IsLlndk() {
3644*333d2b36SAndroid Build Coastguard Worker			return "native:vndk"
3645*333d2b36SAndroid Build Coastguard Worker		}
3646*333d2b36SAndroid Build Coastguard Worker		if c.InProduct() {
3647*333d2b36SAndroid Build Coastguard Worker			return "native:product"
3648*333d2b36SAndroid Build Coastguard Worker		}
3649*333d2b36SAndroid Build Coastguard Worker		return "native:vendor"
3650*333d2b36SAndroid Build Coastguard Worker	} else if c.InRamdisk() {
3651*333d2b36SAndroid Build Coastguard Worker		return "native:ramdisk"
3652*333d2b36SAndroid Build Coastguard Worker	} else if c.InVendorRamdisk() {
3653*333d2b36SAndroid Build Coastguard Worker		return "native:vendor_ramdisk"
3654*333d2b36SAndroid Build Coastguard Worker	} else if c.InRecovery() {
3655*333d2b36SAndroid Build Coastguard Worker		return "native:recovery"
3656*333d2b36SAndroid Build Coastguard Worker	} else if c.Target().Os == android.Android && c.SdkVersion() != "" {
3657*333d2b36SAndroid Build Coastguard Worker		return "native:ndk:none:none"
3658*333d2b36SAndroid Build Coastguard Worker		// TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3659*333d2b36SAndroid Build Coastguard Worker		//family, link := getNdkStlFamilyAndLinkType(c)
3660*333d2b36SAndroid Build Coastguard Worker		//return fmt.Sprintf("native:ndk:%s:%s", family, link)
3661*333d2b36SAndroid Build Coastguard Worker	} else {
3662*333d2b36SAndroid Build Coastguard Worker		return "native:platform"
3663*333d2b36SAndroid Build Coastguard Worker	}
3664*333d2b36SAndroid Build Coastguard Worker}
3665*333d2b36SAndroid Build Coastguard Worker
3666*333d2b36SAndroid Build Coastguard Worker// Overrides ApexModule.IsInstallabeToApex()
3667*333d2b36SAndroid Build Coastguard Worker// Only shared/runtime libraries .
3668*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsInstallableToApex() bool {
3669*333d2b36SAndroid Build Coastguard Worker	if lib := c.library; lib != nil {
3670*333d2b36SAndroid Build Coastguard Worker		// Stub libs and prebuilt libs in a versioned SDK are not
3671*333d2b36SAndroid Build Coastguard Worker		// installable to APEX even though they are shared libs.
3672*333d2b36SAndroid Build Coastguard Worker		return lib.shared() && !lib.buildStubs()
3673*333d2b36SAndroid Build Coastguard Worker	}
3674*333d2b36SAndroid Build Coastguard Worker	return false
3675*333d2b36SAndroid Build Coastguard Worker}
3676*333d2b36SAndroid Build Coastguard Worker
3677*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) AvailableFor(what string) bool {
3678*333d2b36SAndroid Build Coastguard Worker	if linker, ok := c.linker.(interface {
3679*333d2b36SAndroid Build Coastguard Worker		availableFor(string) bool
3680*333d2b36SAndroid Build Coastguard Worker	}); ok {
3681*333d2b36SAndroid Build Coastguard Worker		return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3682*333d2b36SAndroid Build Coastguard Worker	} else {
3683*333d2b36SAndroid Build Coastguard Worker		return c.ApexModuleBase.AvailableFor(what)
3684*333d2b36SAndroid Build Coastguard Worker	}
3685*333d2b36SAndroid Build Coastguard Worker}
3686*333d2b36SAndroid Build Coastguard Worker
3687*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) EverInstallable() bool {
3688*333d2b36SAndroid Build Coastguard Worker	return c.installer != nil &&
3689*333d2b36SAndroid Build Coastguard Worker		// Check to see whether the module is actually ever installable.
3690*333d2b36SAndroid Build Coastguard Worker		c.installer.everInstallable()
3691*333d2b36SAndroid Build Coastguard Worker}
3692*333d2b36SAndroid Build Coastguard Worker
3693*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) PreventInstall() bool {
3694*333d2b36SAndroid Build Coastguard Worker	return c.Properties.PreventInstall
3695*333d2b36SAndroid Build Coastguard Worker}
3696*333d2b36SAndroid Build Coastguard Worker
3697*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Installable() *bool {
3698*333d2b36SAndroid Build Coastguard Worker	if c.library != nil {
3699*333d2b36SAndroid Build Coastguard Worker		if i := c.library.installable(); i != nil {
3700*333d2b36SAndroid Build Coastguard Worker			return i
3701*333d2b36SAndroid Build Coastguard Worker		}
3702*333d2b36SAndroid Build Coastguard Worker	}
3703*333d2b36SAndroid Build Coastguard Worker	return c.Properties.Installable
3704*333d2b36SAndroid Build Coastguard Worker}
3705*333d2b36SAndroid Build Coastguard Worker
3706*333d2b36SAndroid Build Coastguard Workerfunc installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
3707*333d2b36SAndroid Build Coastguard Worker	ret := c.EverInstallable() &&
3708*333d2b36SAndroid Build Coastguard Worker		// Check to see whether the module has been configured to not be installed.
3709*333d2b36SAndroid Build Coastguard Worker		proptools.BoolDefault(c.Installable(), true) &&
3710*333d2b36SAndroid Build Coastguard Worker		!c.PreventInstall() && c.OutputFile().Valid()
3711*333d2b36SAndroid Build Coastguard Worker
3712*333d2b36SAndroid Build Coastguard Worker	// The platform variant doesn't need further condition. Apex variants however might not
3713*333d2b36SAndroid Build Coastguard Worker	// be installable because it will likely to be included in the APEX and won't appear
3714*333d2b36SAndroid Build Coastguard Worker	// in the system partition.
3715*333d2b36SAndroid Build Coastguard Worker	if apexInfo.IsForPlatform() {
3716*333d2b36SAndroid Build Coastguard Worker		return ret
3717*333d2b36SAndroid Build Coastguard Worker	}
3718*333d2b36SAndroid Build Coastguard Worker
3719*333d2b36SAndroid Build Coastguard Worker	// Special case for modules that are configured to be installed to /data, which includes
3720*333d2b36SAndroid Build Coastguard Worker	// test modules. For these modules, both APEX and non-APEX variants are considered as
3721*333d2b36SAndroid Build Coastguard Worker	// installable. This is because even the APEX variants won't be included in the APEX, but
3722*333d2b36SAndroid Build Coastguard Worker	// will anyway be installed to /data/*.
3723*333d2b36SAndroid Build Coastguard Worker	// See b/146995717
3724*333d2b36SAndroid Build Coastguard Worker	if c.InstallInData() {
3725*333d2b36SAndroid Build Coastguard Worker		return ret
3726*333d2b36SAndroid Build Coastguard Worker	}
3727*333d2b36SAndroid Build Coastguard Worker
3728*333d2b36SAndroid Build Coastguard Worker	return false
3729*333d2b36SAndroid Build Coastguard Worker}
3730*333d2b36SAndroid Build Coastguard Worker
3731*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3732*333d2b36SAndroid Build Coastguard Worker	if c.linker != nil {
3733*333d2b36SAndroid Build Coastguard Worker		if library, ok := c.linker.(*libraryDecorator); ok {
3734*333d2b36SAndroid Build Coastguard Worker			library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3735*333d2b36SAndroid Build Coastguard Worker		}
3736*333d2b36SAndroid Build Coastguard Worker	}
3737*333d2b36SAndroid Build Coastguard Worker}
3738*333d2b36SAndroid Build Coastguard Worker
3739*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*Module)(nil)
3740*333d2b36SAndroid Build Coastguard Worker
3741*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule
3742*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
3743*333d2b36SAndroid Build Coastguard Worker	depTag := ctx.OtherModuleDependencyTag(dep)
3744*333d2b36SAndroid Build Coastguard Worker	libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3745*333d2b36SAndroid Build Coastguard Worker
3746*333d2b36SAndroid Build Coastguard Worker	if cc, ok := dep.(*Module); ok {
3747*333d2b36SAndroid Build Coastguard Worker		if cc.HasStubsVariants() {
3748*333d2b36SAndroid Build Coastguard Worker			if isLibDepTag && libDepTag.shared() {
3749*333d2b36SAndroid Build Coastguard Worker				// dynamic dep to a stubs lib crosses APEX boundary
3750*333d2b36SAndroid Build Coastguard Worker				return false
3751*333d2b36SAndroid Build Coastguard Worker			}
3752*333d2b36SAndroid Build Coastguard Worker			if IsRuntimeDepTag(depTag) {
3753*333d2b36SAndroid Build Coastguard Worker				// runtime dep to a stubs lib also crosses APEX boundary
3754*333d2b36SAndroid Build Coastguard Worker				return false
3755*333d2b36SAndroid Build Coastguard Worker			}
3756*333d2b36SAndroid Build Coastguard Worker		}
3757*333d2b36SAndroid Build Coastguard Worker		if cc.IsLlndk() {
3758*333d2b36SAndroid Build Coastguard Worker			return false
3759*333d2b36SAndroid Build Coastguard Worker		}
3760*333d2b36SAndroid Build Coastguard Worker		if isLibDepTag && c.static() && libDepTag.shared() {
3761*333d2b36SAndroid Build Coastguard Worker			// shared_lib dependency from a static lib is considered as crossing
3762*333d2b36SAndroid Build Coastguard Worker			// the APEX boundary because the dependency doesn't actually is
3763*333d2b36SAndroid Build Coastguard Worker			// linked; the dependency is used only during the compilation phase.
3764*333d2b36SAndroid Build Coastguard Worker			return false
3765*333d2b36SAndroid Build Coastguard Worker		}
3766*333d2b36SAndroid Build Coastguard Worker
3767*333d2b36SAndroid Build Coastguard Worker		if isLibDepTag && libDepTag.excludeInApex {
3768*333d2b36SAndroid Build Coastguard Worker			return false
3769*333d2b36SAndroid Build Coastguard Worker		}
3770*333d2b36SAndroid Build Coastguard Worker	}
3771*333d2b36SAndroid Build Coastguard Worker	if depTag == stubImplDepTag {
3772*333d2b36SAndroid Build Coastguard Worker		// We don't track from an implementation library to its stubs.
3773*333d2b36SAndroid Build Coastguard Worker		return false
3774*333d2b36SAndroid Build Coastguard Worker	}
3775*333d2b36SAndroid Build Coastguard Worker	if depTag == staticVariantTag {
3776*333d2b36SAndroid Build Coastguard Worker		// This dependency is for optimization (reuse *.o from the static lib). It doesn't
3777*333d2b36SAndroid Build Coastguard Worker		// actually mean that the static lib (and its dependencies) are copied into the
3778*333d2b36SAndroid Build Coastguard Worker		// APEX.
3779*333d2b36SAndroid Build Coastguard Worker		return false
3780*333d2b36SAndroid Build Coastguard Worker	}
3781*333d2b36SAndroid Build Coastguard Worker	return true
3782*333d2b36SAndroid Build Coastguard Worker}
3783*333d2b36SAndroid Build Coastguard Worker
3784*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule
3785*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3786*333d2b36SAndroid Build Coastguard Worker	sdkVersion android.ApiLevel) error {
3787*333d2b36SAndroid Build Coastguard Worker	// We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3788*333d2b36SAndroid Build Coastguard Worker	if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3789*333d2b36SAndroid Build Coastguard Worker		return nil
3790*333d2b36SAndroid Build Coastguard Worker	}
3791*333d2b36SAndroid Build Coastguard Worker	// We don't check for prebuilt modules
3792*333d2b36SAndroid Build Coastguard Worker	if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3793*333d2b36SAndroid Build Coastguard Worker		return nil
3794*333d2b36SAndroid Build Coastguard Worker	}
3795*333d2b36SAndroid Build Coastguard Worker
3796*333d2b36SAndroid Build Coastguard Worker	minSdkVersion := c.MinSdkVersion()
3797*333d2b36SAndroid Build Coastguard Worker	if minSdkVersion == "apex_inherit" {
3798*333d2b36SAndroid Build Coastguard Worker		return nil
3799*333d2b36SAndroid Build Coastguard Worker	}
3800*333d2b36SAndroid Build Coastguard Worker	if minSdkVersion == "" {
3801*333d2b36SAndroid Build Coastguard Worker		// JNI libs within APK-in-APEX fall into here
3802*333d2b36SAndroid Build Coastguard Worker		// Those are okay to set sdk_version instead
3803*333d2b36SAndroid Build Coastguard Worker		// We don't have to check if this is a SDK variant because
3804*333d2b36SAndroid Build Coastguard Worker		// non-SDK variant resets sdk_version, which works too.
3805*333d2b36SAndroid Build Coastguard Worker		minSdkVersion = c.SdkVersion()
3806*333d2b36SAndroid Build Coastguard Worker	}
3807*333d2b36SAndroid Build Coastguard Worker	if minSdkVersion == "" {
3808*333d2b36SAndroid Build Coastguard Worker		return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3809*333d2b36SAndroid Build Coastguard Worker	}
3810*333d2b36SAndroid Build Coastguard Worker	// Not using nativeApiLevelFromUser because the context here is not
3811*333d2b36SAndroid Build Coastguard Worker	// necessarily a native context.
3812*333d2b36SAndroid Build Coastguard Worker	ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
3813*333d2b36SAndroid Build Coastguard Worker	if err != nil {
3814*333d2b36SAndroid Build Coastguard Worker		return err
3815*333d2b36SAndroid Build Coastguard Worker	}
3816*333d2b36SAndroid Build Coastguard Worker
3817*333d2b36SAndroid Build Coastguard Worker	// A dependency only needs to support a min_sdk_version at least
3818*333d2b36SAndroid Build Coastguard Worker	// as high as  the api level that the architecture was introduced in.
3819*333d2b36SAndroid Build Coastguard Worker	// This allows introducing new architectures in the platform that
3820*333d2b36SAndroid Build Coastguard Worker	// need to be included in apexes that normally require an older
3821*333d2b36SAndroid Build Coastguard Worker	// min_sdk_version.
3822*333d2b36SAndroid Build Coastguard Worker	minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
3823*333d2b36SAndroid Build Coastguard Worker	if sdkVersion.LessThan(minApiForArch) {
3824*333d2b36SAndroid Build Coastguard Worker		sdkVersion = minApiForArch
3825*333d2b36SAndroid Build Coastguard Worker	}
3826*333d2b36SAndroid Build Coastguard Worker
3827*333d2b36SAndroid Build Coastguard Worker	if ver.GreaterThan(sdkVersion) {
3828*333d2b36SAndroid Build Coastguard Worker		return fmt.Errorf("newer SDK(%v)", ver)
3829*333d2b36SAndroid Build Coastguard Worker	}
3830*333d2b36SAndroid Build Coastguard Worker	return nil
3831*333d2b36SAndroid Build Coastguard Worker}
3832*333d2b36SAndroid Build Coastguard Worker
3833*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule
3834*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3835*333d2b36SAndroid Build Coastguard Worker	// stub libraries and native bridge libraries are always available to platform
3836*333d2b36SAndroid Build Coastguard Worker	return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3837*333d2b36SAndroid Build Coastguard Worker}
3838*333d2b36SAndroid Build Coastguard Worker
3839*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) overriddenModules() []string {
3840*333d2b36SAndroid Build Coastguard Worker	if o, ok := c.linker.(overridable); ok {
3841*333d2b36SAndroid Build Coastguard Worker		return o.overriddenModules()
3842*333d2b36SAndroid Build Coastguard Worker	}
3843*333d2b36SAndroid Build Coastguard Worker	return nil
3844*333d2b36SAndroid Build Coastguard Worker}
3845*333d2b36SAndroid Build Coastguard Worker
3846*333d2b36SAndroid Build Coastguard Workertype moduleType int
3847*333d2b36SAndroid Build Coastguard Worker
3848*333d2b36SAndroid Build Coastguard Workerconst (
3849*333d2b36SAndroid Build Coastguard Worker	unknownType moduleType = iota
3850*333d2b36SAndroid Build Coastguard Worker	binary
3851*333d2b36SAndroid Build Coastguard Worker	object
3852*333d2b36SAndroid Build Coastguard Worker	fullLibrary
3853*333d2b36SAndroid Build Coastguard Worker	staticLibrary
3854*333d2b36SAndroid Build Coastguard Worker	sharedLibrary
3855*333d2b36SAndroid Build Coastguard Worker	headerLibrary
3856*333d2b36SAndroid Build Coastguard Worker	testBin // testBinary already declared
3857*333d2b36SAndroid Build Coastguard Worker	ndkLibrary
3858*333d2b36SAndroid Build Coastguard Worker)
3859*333d2b36SAndroid Build Coastguard Worker
3860*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) typ() moduleType {
3861*333d2b36SAndroid Build Coastguard Worker	if c.testBinary() {
3862*333d2b36SAndroid Build Coastguard Worker		// testBinary is also a binary, so this comes before the c.Binary()
3863*333d2b36SAndroid Build Coastguard Worker		// conditional. A testBinary has additional implicit dependencies and
3864*333d2b36SAndroid Build Coastguard Worker		// other test-only semantics.
3865*333d2b36SAndroid Build Coastguard Worker		return testBin
3866*333d2b36SAndroid Build Coastguard Worker	} else if c.Binary() {
3867*333d2b36SAndroid Build Coastguard Worker		return binary
3868*333d2b36SAndroid Build Coastguard Worker	} else if c.Object() {
3869*333d2b36SAndroid Build Coastguard Worker		return object
3870*333d2b36SAndroid Build Coastguard Worker	} else if c.testLibrary() {
3871*333d2b36SAndroid Build Coastguard Worker		// TODO(b/244431896) properly convert cc_test_library to its own macro. This
3872*333d2b36SAndroid Build Coastguard Worker		// will let them add implicit compile deps on gtest, for example.
3873*333d2b36SAndroid Build Coastguard Worker		//
3874*333d2b36SAndroid Build Coastguard Worker		// For now, treat them as regular libraries.
3875*333d2b36SAndroid Build Coastguard Worker		return fullLibrary
3876*333d2b36SAndroid Build Coastguard Worker	} else if c.CcLibrary() {
3877*333d2b36SAndroid Build Coastguard Worker		static := false
3878*333d2b36SAndroid Build Coastguard Worker		shared := false
3879*333d2b36SAndroid Build Coastguard Worker		if library, ok := c.linker.(*libraryDecorator); ok {
3880*333d2b36SAndroid Build Coastguard Worker			static = library.MutatedProperties.BuildStatic
3881*333d2b36SAndroid Build Coastguard Worker			shared = library.MutatedProperties.BuildShared
3882*333d2b36SAndroid Build Coastguard Worker		} else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
3883*333d2b36SAndroid Build Coastguard Worker			static = library.MutatedProperties.BuildStatic
3884*333d2b36SAndroid Build Coastguard Worker			shared = library.MutatedProperties.BuildShared
3885*333d2b36SAndroid Build Coastguard Worker		}
3886*333d2b36SAndroid Build Coastguard Worker		if static && shared {
3887*333d2b36SAndroid Build Coastguard Worker			return fullLibrary
3888*333d2b36SAndroid Build Coastguard Worker		} else if !static && !shared {
3889*333d2b36SAndroid Build Coastguard Worker			return headerLibrary
3890*333d2b36SAndroid Build Coastguard Worker		} else if static {
3891*333d2b36SAndroid Build Coastguard Worker			return staticLibrary
3892*333d2b36SAndroid Build Coastguard Worker		}
3893*333d2b36SAndroid Build Coastguard Worker		return sharedLibrary
3894*333d2b36SAndroid Build Coastguard Worker	} else if c.isNDKStubLibrary() {
3895*333d2b36SAndroid Build Coastguard Worker		return ndkLibrary
3896*333d2b36SAndroid Build Coastguard Worker	}
3897*333d2b36SAndroid Build Coastguard Worker	return unknownType
3898*333d2b36SAndroid Build Coastguard Worker}
3899*333d2b36SAndroid Build Coastguard Worker
3900*333d2b36SAndroid Build Coastguard Worker// Defaults
3901*333d2b36SAndroid Build Coastguard Workertype Defaults struct {
3902*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
3903*333d2b36SAndroid Build Coastguard Worker	android.DefaultsModuleBase
3904*333d2b36SAndroid Build Coastguard Worker	android.ApexModuleBase
3905*333d2b36SAndroid Build Coastguard Worker}
3906*333d2b36SAndroid Build Coastguard Worker
3907*333d2b36SAndroid Build Coastguard Worker// cc_defaults provides a set of properties that can be inherited by other cc
3908*333d2b36SAndroid Build Coastguard Worker// modules. A module can use the properties from a cc_defaults using
3909*333d2b36SAndroid Build Coastguard Worker// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3910*333d2b36SAndroid Build Coastguard Worker// merged (when possible) by prepending the default module's values to the
3911*333d2b36SAndroid Build Coastguard Worker// depending module's values.
3912*333d2b36SAndroid Build Coastguard Workerfunc defaultsFactory() android.Module {
3913*333d2b36SAndroid Build Coastguard Worker	return DefaultsFactory()
3914*333d2b36SAndroid Build Coastguard Worker}
3915*333d2b36SAndroid Build Coastguard Worker
3916*333d2b36SAndroid Build Coastguard Workerfunc DefaultsFactory(props ...interface{}) android.Module {
3917*333d2b36SAndroid Build Coastguard Worker	module := &Defaults{}
3918*333d2b36SAndroid Build Coastguard Worker
3919*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(props...)
3920*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(
3921*333d2b36SAndroid Build Coastguard Worker		&BaseProperties{},
3922*333d2b36SAndroid Build Coastguard Worker		&VendorProperties{},
3923*333d2b36SAndroid Build Coastguard Worker		&BaseCompilerProperties{},
3924*333d2b36SAndroid Build Coastguard Worker		&BaseLinkerProperties{},
3925*333d2b36SAndroid Build Coastguard Worker		&ObjectLinkerProperties{},
3926*333d2b36SAndroid Build Coastguard Worker		&LibraryProperties{},
3927*333d2b36SAndroid Build Coastguard Worker		&StaticProperties{},
3928*333d2b36SAndroid Build Coastguard Worker		&SharedProperties{},
3929*333d2b36SAndroid Build Coastguard Worker		&FlagExporterProperties{},
3930*333d2b36SAndroid Build Coastguard Worker		&BinaryLinkerProperties{},
3931*333d2b36SAndroid Build Coastguard Worker		&TestLinkerProperties{},
3932*333d2b36SAndroid Build Coastguard Worker		&TestInstallerProperties{},
3933*333d2b36SAndroid Build Coastguard Worker		&TestBinaryProperties{},
3934*333d2b36SAndroid Build Coastguard Worker		&BenchmarkProperties{},
3935*333d2b36SAndroid Build Coastguard Worker		&fuzz.FuzzProperties{},
3936*333d2b36SAndroid Build Coastguard Worker		&StlProperties{},
3937*333d2b36SAndroid Build Coastguard Worker		&SanitizeProperties{},
3938*333d2b36SAndroid Build Coastguard Worker		&StripProperties{},
3939*333d2b36SAndroid Build Coastguard Worker		&InstallerProperties{},
3940*333d2b36SAndroid Build Coastguard Worker		&TidyProperties{},
3941*333d2b36SAndroid Build Coastguard Worker		&CoverageProperties{},
3942*333d2b36SAndroid Build Coastguard Worker		&SAbiProperties{},
3943*333d2b36SAndroid Build Coastguard Worker		&LTOProperties{},
3944*333d2b36SAndroid Build Coastguard Worker		&AfdoProperties{},
3945*333d2b36SAndroid Build Coastguard Worker		&OrderfileProperties{},
3946*333d2b36SAndroid Build Coastguard Worker		&android.ProtoProperties{},
3947*333d2b36SAndroid Build Coastguard Worker		// RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3948*333d2b36SAndroid Build Coastguard Worker		&RustBindgenClangProperties{},
3949*333d2b36SAndroid Build Coastguard Worker		&prebuiltLinkerProperties{},
3950*333d2b36SAndroid Build Coastguard Worker	)
3951*333d2b36SAndroid Build Coastguard Worker
3952*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultsModule(module)
3953*333d2b36SAndroid Build Coastguard Worker
3954*333d2b36SAndroid Build Coastguard Worker	return module
3955*333d2b36SAndroid Build Coastguard Worker}
3956*333d2b36SAndroid Build Coastguard Worker
3957*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsSdkVariant() bool {
3958*333d2b36SAndroid Build Coastguard Worker	return c.Properties.IsSdkVariant
3959*333d2b36SAndroid Build Coastguard Worker}
3960*333d2b36SAndroid Build Coastguard Worker
3961*333d2b36SAndroid Build Coastguard Workerfunc kytheExtractAllFactory() android.Singleton {
3962*333d2b36SAndroid Build Coastguard Worker	return &kytheExtractAllSingleton{}
3963*333d2b36SAndroid Build Coastguard Worker}
3964*333d2b36SAndroid Build Coastguard Worker
3965*333d2b36SAndroid Build Coastguard Workertype kytheExtractAllSingleton struct {
3966*333d2b36SAndroid Build Coastguard Worker}
3967*333d2b36SAndroid Build Coastguard Worker
3968*333d2b36SAndroid Build Coastguard Workerfunc (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3969*333d2b36SAndroid Build Coastguard Worker	var xrefTargets android.Paths
3970*333d2b36SAndroid Build Coastguard Worker	ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
3971*333d2b36SAndroid Build Coastguard Worker		files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).kytheFiles
3972*333d2b36SAndroid Build Coastguard Worker		if len(files) > 0 {
3973*333d2b36SAndroid Build Coastguard Worker			xrefTargets = append(xrefTargets, files...)
3974*333d2b36SAndroid Build Coastguard Worker		}
3975*333d2b36SAndroid Build Coastguard Worker	})
3976*333d2b36SAndroid Build Coastguard Worker	// TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3977*333d2b36SAndroid Build Coastguard Worker	if len(xrefTargets) > 0 {
3978*333d2b36SAndroid Build Coastguard Worker		ctx.Phony("xref_cxx", xrefTargets...)
3979*333d2b36SAndroid Build Coastguard Worker	}
3980*333d2b36SAndroid Build Coastguard Worker}
3981*333d2b36SAndroid Build Coastguard Worker
3982*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Partition() string {
3983*333d2b36SAndroid Build Coastguard Worker	if p, ok := c.installer.(interface {
3984*333d2b36SAndroid Build Coastguard Worker		getPartition() string
3985*333d2b36SAndroid Build Coastguard Worker	}); ok {
3986*333d2b36SAndroid Build Coastguard Worker		return p.getPartition()
3987*333d2b36SAndroid Build Coastguard Worker	}
3988*333d2b36SAndroid Build Coastguard Worker	return ""
3989*333d2b36SAndroid Build Coastguard Worker}
3990*333d2b36SAndroid Build Coastguard Worker
3991*333d2b36SAndroid Build Coastguard Workertype sourceModuleName interface {
3992*333d2b36SAndroid Build Coastguard Worker	sourceModuleName() string
3993*333d2b36SAndroid Build Coastguard Worker}
3994*333d2b36SAndroid Build Coastguard Worker
3995*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) BaseModuleName() string {
3996*333d2b36SAndroid Build Coastguard Worker	if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
3997*333d2b36SAndroid Build Coastguard Worker		// if the prebuilt module sets a source_module_name in Android.bp, use that
3998*333d2b36SAndroid Build Coastguard Worker		return smn.sourceModuleName()
3999*333d2b36SAndroid Build Coastguard Worker	}
4000*333d2b36SAndroid Build Coastguard Worker	return c.ModuleBase.BaseModuleName()
4001*333d2b36SAndroid Build Coastguard Worker}
4002*333d2b36SAndroid Build Coastguard Worker
4003*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) stubsSymbolFilePath() android.Path {
4004*333d2b36SAndroid Build Coastguard Worker	if library, ok := c.linker.(*libraryDecorator); ok {
4005*333d2b36SAndroid Build Coastguard Worker		return library.stubsSymbolFilePath
4006*333d2b36SAndroid Build Coastguard Worker	}
4007*333d2b36SAndroid Build Coastguard Worker	return android.OptionalPath{}.Path()
4008*333d2b36SAndroid Build Coastguard Worker}
4009*333d2b36SAndroid Build Coastguard Worker
4010*333d2b36SAndroid Build Coastguard Workervar Bool = proptools.Bool
4011*333d2b36SAndroid Build Coastguard Workervar BoolDefault = proptools.BoolDefault
4012*333d2b36SAndroid Build Coastguard Workervar BoolPtr = proptools.BoolPtr
4013*333d2b36SAndroid Build Coastguard Workervar String = proptools.String
4014*333d2b36SAndroid Build Coastguard Workervar StringPtr = proptools.StringPtr
4015