| package cc | 
 |  | 
 | import ( | 
 | 	"android/soong/android" | 
 | 	"android/soong/bazel/cquery" | 
 | 	"android/soong/fuzz" | 
 | 	"android/soong/snapshot" | 
 |  | 
 | 	"github.com/google/blueprint" | 
 | ) | 
 |  | 
 | // PlatformSanitizeable is an interface for sanitizing platform modules. | 
 | type PlatformSanitizeable interface { | 
 | 	LinkableInterface | 
 |  | 
 | 	// SanitizePropDefined returns whether the Sanitizer properties struct for this module is defined. | 
 | 	SanitizePropDefined() bool | 
 |  | 
 | 	// IsSanitizerEnabled returns whether a sanitizer is enabled. | 
 | 	IsSanitizerEnabled(t SanitizerType) bool | 
 |  | 
 | 	// IsSanitizerExplicitlyDisabled returns whether a sanitizer has been explicitly disabled (set to false) rather | 
 | 	// than left undefined. | 
 | 	IsSanitizerExplicitlyDisabled(t SanitizerType) bool | 
 |  | 
 | 	// SetSanitizer enables or disables the specified sanitizer type if it's supported, otherwise this should panic. | 
 | 	SetSanitizer(t SanitizerType, b bool) | 
 |  | 
 | 	// StaticallyLinked returns true if the module is statically linked. | 
 | 	StaticallyLinked() bool | 
 |  | 
 | 	// SetInSanitizerDir sets the module installation to the sanitizer directory. | 
 | 	SetInSanitizerDir() | 
 |  | 
 | 	// SanitizeNever returns true if this module should never be sanitized. | 
 | 	SanitizeNever() bool | 
 |  | 
 | 	// SanitizerSupported returns true if a sanitizer type is supported by this modules compiler. | 
 | 	SanitizerSupported(t SanitizerType) bool | 
 |  | 
 | 	// MinimalRuntimeDep returns true if this module needs to link the minimal UBSan runtime, | 
 | 	// either because it requires it or because a dependent module which requires it to be linked in this module. | 
 | 	MinimalRuntimeDep() bool | 
 |  | 
 | 	// UbsanRuntimeDep returns true if this module needs to link the full UBSan runtime, | 
 | 	// either because it requires it or because a dependent module which requires it to be linked in this module. | 
 | 	UbsanRuntimeDep() bool | 
 |  | 
 | 	// UbsanRuntimeNeeded returns true if the full UBSan runtime is required by this module. | 
 | 	UbsanRuntimeNeeded() bool | 
 |  | 
 | 	// MinimalRuntimeNeeded returns true if the minimal UBSan runtime is required by this module | 
 | 	MinimalRuntimeNeeded() bool | 
 |  | 
 | 	// SanitizableDepTagChecker returns a SantizableDependencyTagChecker function type. | 
 | 	SanitizableDepTagChecker() SantizableDependencyTagChecker | 
 | } | 
 |  | 
 | // SantizableDependencyTagChecker functions check whether or not a dependency | 
 | // tag can be sanitized. These functions should return true if the tag can be | 
 | // sanitized, otherwise they should return false. These functions should also | 
 | // handle all possible dependency tags in the dependency tree. For example, | 
 | // Rust modules can depend on both Rust and CC libraries, so the Rust module | 
 | // implementation should handle tags from both. | 
 | type SantizableDependencyTagChecker func(tag blueprint.DependencyTag) bool | 
 |  | 
 | // Snapshottable defines those functions necessary for handling module snapshots. | 
 | type Snapshottable interface { | 
 | 	snapshot.VendorSnapshotModuleInterface | 
 | 	snapshot.RecoverySnapshotModuleInterface | 
 |  | 
 | 	// SnapshotHeaders returns a list of header paths provided by this module. | 
 | 	SnapshotHeaders() android.Paths | 
 |  | 
 | 	// SnapshotLibrary returns true if this module is a snapshot library. | 
 | 	IsSnapshotLibrary() bool | 
 |  | 
 | 	// EffectiveLicenseFiles returns the list of License files for this module. | 
 | 	EffectiveLicenseFiles() android.Paths | 
 |  | 
 | 	// SnapshotRuntimeLibs returns a list of libraries needed by this module at runtime but which aren't build dependencies. | 
 | 	SnapshotRuntimeLibs() []string | 
 |  | 
 | 	// SnapshotSharedLibs returns the list of shared library dependencies for this module. | 
 | 	SnapshotSharedLibs() []string | 
 |  | 
 | 	// SnapshotStaticLibs returns the list of static library dependencies for this module. | 
 | 	SnapshotStaticLibs() []string | 
 |  | 
 | 	// SnapshotDylibs returns the list of dylib library dependencies for this module. | 
 | 	SnapshotDylibs() []string | 
 |  | 
 | 	// SnapshotRlibs returns the list of rlib library dependencies for this module. | 
 | 	SnapshotRlibs() []string | 
 |  | 
 | 	// IsSnapshotPrebuilt returns true if this module is a snapshot prebuilt. | 
 | 	IsSnapshotPrebuilt() bool | 
 |  | 
 | 	// IsSnapshotSanitizer returns true if this snapshot module implements SnapshotSanitizer. | 
 | 	IsSnapshotSanitizer() bool | 
 |  | 
 | 	// IsSnapshotSanitizerAvailable returns true if this snapshot module has a sanitizer source available (cfi, hwasan). | 
 | 	IsSnapshotSanitizerAvailable(t SanitizerType) bool | 
 |  | 
 | 	// SetSnapshotSanitizerVariation sets the sanitizer variation type for this snapshot module. | 
 | 	SetSnapshotSanitizerVariation(t SanitizerType, enabled bool) | 
 |  | 
 | 	// IsSnapshotUnsanitizedVariant returns true if this is the unsanitized snapshot module variant. | 
 | 	IsSnapshotUnsanitizedVariant() bool | 
 | } | 
 |  | 
 | // LinkableInterface is an interface for a type of module that is linkable in a C++ library. | 
 | type LinkableInterface interface { | 
 | 	android.Module | 
 | 	Snapshottable | 
 |  | 
 | 	Module() android.Module | 
 | 	CcLibrary() bool | 
 | 	CcLibraryInterface() bool | 
 |  | 
 | 	// RustLibraryInterface returns true if this is a Rust library module | 
 | 	RustLibraryInterface() bool | 
 |  | 
 | 	// BaseModuleName returns the android.ModuleBase.BaseModuleName() value for this module. | 
 | 	BaseModuleName() string | 
 |  | 
 | 	OutputFile() android.OptionalPath | 
 | 	UnstrippedOutputFile() android.Path | 
 | 	CoverageFiles() android.Paths | 
 |  | 
 | 	// CoverageOutputFile returns the output archive of gcno coverage information files. | 
 | 	CoverageOutputFile() android.OptionalPath | 
 |  | 
 | 	NonCcVariants() bool | 
 |  | 
 | 	SelectedStl() string | 
 |  | 
 | 	BuildStaticVariant() bool | 
 | 	BuildSharedVariant() bool | 
 | 	SetStatic() | 
 | 	SetShared() | 
 | 	IsPrebuilt() bool | 
 | 	Toc() android.OptionalPath | 
 |  | 
 | 	// IsFuzzModule returns true if this a *_fuzz module. | 
 | 	IsFuzzModule() bool | 
 |  | 
 | 	// FuzzPackagedModule returns the fuzz.FuzzPackagedModule for this module. | 
 | 	// Expects that IsFuzzModule returns true. | 
 | 	FuzzPackagedModule() fuzz.FuzzPackagedModule | 
 |  | 
 | 	// FuzzSharedLibraries returns the shared library dependencies for this module. | 
 | 	// Expects that IsFuzzModule returns true. | 
 | 	FuzzSharedLibraries() android.RuleBuilderInstalls | 
 |  | 
 | 	Device() bool | 
 | 	Host() bool | 
 |  | 
 | 	InRamdisk() bool | 
 | 	OnlyInRamdisk() bool | 
 |  | 
 | 	InVendorRamdisk() bool | 
 | 	OnlyInVendorRamdisk() bool | 
 |  | 
 | 	InRecovery() bool | 
 | 	OnlyInRecovery() bool | 
 |  | 
 | 	InVendor() bool | 
 |  | 
 | 	UseSdk() bool | 
 |  | 
 | 	// IsNdk returns true if the library is in the configs known NDK list. | 
 | 	IsNdk(config android.Config) bool | 
 |  | 
 | 	// IsStubs returns true if the this is a stubs library. | 
 | 	IsStubs() bool | 
 |  | 
 | 	// IsLlndk returns true for both LLNDK (public) and LLNDK-private libs. | 
 | 	IsLlndk() bool | 
 |  | 
 | 	// IsLlndkPublic returns true only for LLNDK (public) libs. | 
 | 	IsLlndkPublic() bool | 
 |  | 
 | 	// HasLlndkStubs returns true if this library has a variant that will build LLNDK stubs. | 
 | 	HasLlndkStubs() bool | 
 |  | 
 | 	// NeedsLlndkVariants returns true if this module has LLNDK stubs or provides LLNDK headers. | 
 | 	NeedsLlndkVariants() bool | 
 |  | 
 | 	// NeedsVendorPublicLibraryVariants returns true if this module has vendor public library stubs. | 
 | 	NeedsVendorPublicLibraryVariants() bool | 
 |  | 
 | 	//StubsVersion returns the stubs version for this module. | 
 | 	StubsVersion() string | 
 |  | 
 | 	// UseVndk returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64. | 
 | 	// "product" and "vendor" variant modules return true for this function. | 
 | 	// When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true", | 
 | 	// "soc_specific: true" and more vendor installed modules are included here. | 
 | 	// When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "vendor_available: true" or | 
 | 	// "product_specific: true" modules are included here. | 
 | 	UseVndk() bool | 
 |  | 
 | 	// Bootstrap tests if this module is allowed to use non-APEX version of libraries. | 
 | 	Bootstrap() bool | 
 |  | 
 | 	// IsVndkSp returns true if this is a VNDK-SP module. | 
 | 	IsVndkSp() bool | 
 |  | 
 | 	MustUseVendorVariant() bool | 
 | 	IsVndk() bool | 
 | 	IsVndkExt() bool | 
 | 	IsVndkPrivate() bool | 
 | 	IsVendorPublicLibrary() bool | 
 | 	IsVndkPrebuiltLibrary() bool | 
 | 	HasVendorVariant() bool | 
 | 	HasProductVariant() bool | 
 | 	HasNonSystemVariants() bool | 
 | 	ProductSpecific() bool | 
 | 	InProduct() bool | 
 | 	SdkAndPlatformVariantVisibleToMake() bool | 
 |  | 
 | 	// SubName returns the modules SubName, used for image and NDK/SDK variations. | 
 | 	SubName() string | 
 |  | 
 | 	SdkVersion() string | 
 | 	MinSdkVersion() string | 
 | 	AlwaysSdk() bool | 
 | 	IsSdkVariant() bool | 
 |  | 
 | 	SplitPerApiLevel() bool | 
 |  | 
 | 	// SetPreventInstall sets the PreventInstall property to 'true' for this module. | 
 | 	SetPreventInstall() | 
 | 	// SetHideFromMake sets the HideFromMake property to 'true' for this module. | 
 | 	SetHideFromMake() | 
 |  | 
 | 	// KernelHeadersDecorator returns true if this is a kernel headers decorator module. | 
 | 	// This is specific to cc and should always return false for all other packages. | 
 | 	KernelHeadersDecorator() bool | 
 |  | 
 | 	// HiddenFromMake returns true if this module is hidden from Make. | 
 | 	HiddenFromMake() bool | 
 |  | 
 | 	// RelativeInstallPath returns the relative install path for this module. | 
 | 	RelativeInstallPath() string | 
 |  | 
 | 	// Binary returns true if this is a binary module. | 
 | 	Binary() bool | 
 |  | 
 | 	// Object returns true if this is an object module. | 
 | 	Object() bool | 
 |  | 
 | 	// Rlib returns true if this is an rlib module. | 
 | 	Rlib() bool | 
 |  | 
 | 	// Dylib returns true if this is an dylib module. | 
 | 	Dylib() bool | 
 |  | 
 | 	// RlibStd returns true if this is an rlib which links against an rlib libstd. | 
 | 	RlibStd() bool | 
 |  | 
 | 	// Static returns true if this is a static library module. | 
 | 	Static() bool | 
 |  | 
 | 	// Shared returns true if this is a shared library module. | 
 | 	Shared() bool | 
 |  | 
 | 	// Header returns true if this is a library headers module. | 
 | 	Header() bool | 
 |  | 
 | 	// StaticExecutable returns true if this is a binary module with "static_executable: true". | 
 | 	StaticExecutable() bool | 
 |  | 
 | 	// EverInstallable returns true if the module is ever installable | 
 | 	EverInstallable() bool | 
 |  | 
 | 	// PreventInstall returns true if this module is prevented from installation. | 
 | 	PreventInstall() bool | 
 |  | 
 | 	// InstallInData returns true if this module is installed in data. | 
 | 	InstallInData() bool | 
 |  | 
 | 	// Installable returns a bool pointer to the module installable property. | 
 | 	Installable() *bool | 
 |  | 
 | 	// Symlinks returns a list of symlinks that should be created for this module. | 
 | 	Symlinks() []string | 
 |  | 
 | 	// VndkVersion returns the VNDK version string for this module. | 
 | 	VndkVersion() string | 
 |  | 
 | 	// Partition returns the partition string for this module. | 
 | 	Partition() string | 
 |  | 
 | 	// FuzzModule returns the fuzz.FuzzModule associated with the module. | 
 | 	FuzzModuleStruct() fuzz.FuzzModule | 
 | } | 
 |  | 
 | var ( | 
 | 	// Dependency tag for crtbegin, an object file responsible for initialization. | 
 | 	CrtBeginDepTag = dependencyTag{name: "crtbegin"} | 
 | 	// Dependency tag for crtend, an object file responsible for program termination. | 
 | 	CrtEndDepTag = dependencyTag{name: "crtend"} | 
 | 	// Dependency tag for coverage library. | 
 | 	CoverageDepTag = dependencyTag{name: "coverage"} | 
 | ) | 
 |  | 
 | // GetImageVariantType returns the ImageVariantType string value for the given module | 
 | // (these are defined in cc/image.go). | 
 | func GetImageVariantType(c LinkableInterface) ImageVariantType { | 
 | 	if c.Host() { | 
 | 		return hostImageVariant | 
 | 	} else if c.InVendor() { | 
 | 		return vendorImageVariant | 
 | 	} else if c.InProduct() { | 
 | 		return productImageVariant | 
 | 	} else if c.InRamdisk() { | 
 | 		return ramdiskImageVariant | 
 | 	} else if c.InVendorRamdisk() { | 
 | 		return vendorRamdiskImageVariant | 
 | 	} else if c.InRecovery() { | 
 | 		return recoveryImageVariant | 
 | 	} else { | 
 | 		return coreImageVariant | 
 | 	} | 
 | } | 
 |  | 
 | // DepTagMakeSuffix returns the makeSuffix value of a particular library dependency tag. | 
 | // Returns an empty string if not a library dependency tag. | 
 | func DepTagMakeSuffix(depTag blueprint.DependencyTag) string { | 
 | 	if libDepTag, ok := depTag.(libraryDependencyTag); ok { | 
 | 		return libDepTag.makeSuffix | 
 | 	} | 
 | 	return "" | 
 | } | 
 |  | 
 | // SharedDepTag returns the dependency tag for any C++ shared libraries. | 
 | func SharedDepTag() blueprint.DependencyTag { | 
 | 	return libraryDependencyTag{Kind: sharedLibraryDependency} | 
 | } | 
 |  | 
 | // StaticDepTag returns the dependency tag for any C++ static libraries. | 
 | func StaticDepTag(wholeStatic bool) blueprint.DependencyTag { | 
 | 	return libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: wholeStatic} | 
 | } | 
 |  | 
 | // IsWholeStaticLib whether a dependency tag is a whole static library dependency. | 
 | func IsWholeStaticLib(depTag blueprint.DependencyTag) bool { | 
 | 	if tag, ok := depTag.(libraryDependencyTag); ok { | 
 | 		return tag.wholeStatic | 
 | 	} | 
 | 	return false | 
 | } | 
 |  | 
 | // HeaderDepTag returns the dependency tag for any C++ "header-only" libraries. | 
 | func HeaderDepTag() blueprint.DependencyTag { | 
 | 	return libraryDependencyTag{Kind: headerLibraryDependency} | 
 | } | 
 |  | 
 | // SharedLibraryInfo is a provider to propagate information about a shared C++ library. | 
 | type SharedLibraryInfo struct { | 
 | 	SharedLibrary android.Path | 
 | 	Target        android.Target | 
 |  | 
 | 	TableOfContents android.OptionalPath | 
 |  | 
 | 	// should be obtained from static analogue | 
 | 	TransitiveStaticLibrariesForOrdering *android.DepSet[android.Path] | 
 | } | 
 |  | 
 | var SharedLibraryInfoProvider = blueprint.NewProvider(SharedLibraryInfo{}) | 
 |  | 
 | // SharedStubLibrary is a struct containing information about a stub shared library. | 
 | // Stub libraries are used for cross-APEX dependencies; when a library is to depend on a shared | 
 | // library in another APEX, it must depend on the stub version of that library. | 
 | type SharedStubLibrary struct { | 
 | 	// The version of the stub (corresponding to the stable version of the shared library being | 
 | 	// stubbed). | 
 | 	Version           string | 
 | 	SharedLibraryInfo SharedLibraryInfo | 
 | 	FlagExporterInfo  FlagExporterInfo | 
 | } | 
 |  | 
 | // SharedLibraryStubsInfo is a provider to propagate information about all shared library stubs | 
 | // which are dependencies of a library. | 
 | // Stub libraries are used for cross-APEX dependencies; when a library is to depend on a shared | 
 | // library in another APEX, it must depend on the stub version of that library. | 
 | type SharedLibraryStubsInfo struct { | 
 | 	SharedStubLibraries []SharedStubLibrary | 
 |  | 
 | 	IsLLNDK bool | 
 | } | 
 |  | 
 | var SharedLibraryStubsProvider = blueprint.NewProvider(SharedLibraryStubsInfo{}) | 
 |  | 
 | // StaticLibraryInfo is a provider to propagate information about a static C++ library. | 
 | type StaticLibraryInfo struct { | 
 | 	StaticLibrary android.Path | 
 | 	Objects       Objects | 
 | 	ReuseObjects  Objects | 
 |  | 
 | 	// A static library may contain prebuilt static libraries included with whole_static_libs | 
 | 	// that won't appear in Objects.  They are transitively available in | 
 | 	// WholeStaticLibsFromPrebuilts. | 
 | 	WholeStaticLibsFromPrebuilts android.Paths | 
 |  | 
 | 	// This isn't the actual transitive DepSet, shared library dependencies have been | 
 | 	// converted into static library analogues.  It is only used to order the static | 
 | 	// library dependencies that were specified for the current module. | 
 | 	TransitiveStaticLibrariesForOrdering *android.DepSet[android.Path] | 
 | } | 
 |  | 
 | var StaticLibraryInfoProvider = blueprint.NewProvider(StaticLibraryInfo{}) | 
 |  | 
 | // HeaderLibraryInfo is a marker provider that identifies a module as a header library. | 
 | type HeaderLibraryInfo struct { | 
 | } | 
 |  | 
 | // HeaderLibraryInfoProvider is a marker provider that identifies a module as a header library. | 
 | var HeaderLibraryInfoProvider = blueprint.NewProvider(HeaderLibraryInfo{}) | 
 |  | 
 | // FlagExporterInfo is a provider to propagate transitive library information | 
 | // pertaining to exported include paths and flags. | 
 | type FlagExporterInfo struct { | 
 | 	IncludeDirs       android.Paths // Include directories to be included with -I | 
 | 	SystemIncludeDirs android.Paths // System include directories to be included with -isystem | 
 | 	Flags             []string      // Exported raw flags. | 
 | 	Deps              android.Paths | 
 | 	GeneratedHeaders  android.Paths | 
 | } | 
 |  | 
 | var FlagExporterInfoProvider = blueprint.NewProvider(FlagExporterInfo{}) | 
 |  | 
 | // flagExporterInfoFromCcInfo populates FlagExporterInfo provider with information from Bazel. | 
 | func flagExporterInfoFromCcInfo(ctx android.ModuleContext, ccInfo cquery.CcInfo) FlagExporterInfo { | 
 |  | 
 | 	includes := android.PathsForBazelOut(ctx, ccInfo.Includes) | 
 | 	systemIncludes := android.PathsForBazelOut(ctx, ccInfo.SystemIncludes) | 
 | 	headers := android.PathsForBazelOut(ctx, ccInfo.Headers) | 
 |  | 
 | 	return FlagExporterInfo{ | 
 | 		IncludeDirs:       android.FirstUniquePaths(includes), | 
 | 		SystemIncludeDirs: android.FirstUniquePaths(systemIncludes), | 
 | 		GeneratedHeaders:  headers, | 
 | 		// necessary to ensure generated headers are considered implicit deps of dependent actions | 
 | 		Deps: headers, | 
 | 	} | 
 | } |