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