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, } }