b6a55bf065
Test: go soong tests Test: bp2build generate & sync; mixed build libc; mixed build su (su is an Android.mk target that relies on converted a cc_library_headers) Bug: 181552740 Change-Id: I9efd587970551fd41f642a208f0aa0a80e8694e0
289 lines
9.5 KiB
Go
289 lines
9.5 KiB
Go
package cc
|
|
|
|
import (
|
|
"android/soong/android"
|
|
"android/soong/bazel/cquery"
|
|
|
|
"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
|
|
|
|
// IsDependencyRoot returns whether a module is of a type which cannot be a linkage dependency
|
|
// of another module. For example, cc_binary and rust_binary represent dependency roots as other
|
|
// modules cannot have linkage dependencies against these types.
|
|
IsDependencyRoot() 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
|
|
|
|
// SanitizeDep returns the value of the SanitizeDep flag, which is set if a module is a dependency of a
|
|
// sanitized module.
|
|
SanitizeDep() bool
|
|
|
|
// SetSanitizer enables or disables the specified sanitizer type if it's supported, otherwise this should panic.
|
|
SetSanitizer(t SanitizerType, b bool)
|
|
|
|
// SetSanitizerDep returns true if the module is statically linked.
|
|
SetSanitizeDep(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
|
|
|
|
// 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
|
|
|
|
// LinkableInterface is an interface for a type of module that is linkable in a C++ library.
|
|
type LinkableInterface interface {
|
|
android.Module
|
|
|
|
Module() android.Module
|
|
CcLibrary() bool
|
|
CcLibraryInterface() bool
|
|
|
|
OutputFile() android.OptionalPath
|
|
CoverageFiles() android.Paths
|
|
|
|
NonCcVariants() bool
|
|
|
|
SelectedStl() string
|
|
|
|
BuildStaticVariant() bool
|
|
BuildSharedVariant() bool
|
|
SetStatic()
|
|
SetShared()
|
|
Static() bool
|
|
Shared() bool
|
|
Header() bool
|
|
IsPrebuilt() bool
|
|
Toc() android.OptionalPath
|
|
|
|
Host() bool
|
|
|
|
InRamdisk() bool
|
|
OnlyInRamdisk() bool
|
|
|
|
InVendorRamdisk() bool
|
|
OnlyInVendorRamdisk() bool
|
|
|
|
InRecovery() bool
|
|
OnlyInRecovery() bool
|
|
|
|
InVendor() bool
|
|
|
|
UseSdk() bool
|
|
|
|
// IsLlndk returns true for both LLNDK (public) and LLNDK-private libs.
|
|
IsLlndk() bool
|
|
|
|
// IsLlndkPublic returns true only for LLNDK (public) libs.
|
|
IsLlndkPublic() bool
|
|
|
|
// IsLlndkHeaders returns true if this module is an LLNDK headers module.
|
|
IsLlndkHeaders() bool
|
|
|
|
// IsLlndkLibrary returns true if this module is an LLNDK library module.
|
|
IsLlndkLibrary() bool
|
|
|
|
// HasLlndkStubs returns true if this module has LLNDK stubs.
|
|
HasLlndkStubs() bool
|
|
|
|
UseVndk() bool
|
|
MustUseVendorVariant() bool
|
|
IsVndk() bool
|
|
IsVndkExt() bool
|
|
IsVndkPrivate() bool
|
|
HasVendorVariant() bool
|
|
HasProductVariant() bool
|
|
HasNonSystemVariants() bool
|
|
InProduct() 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
|
|
}
|
|
|
|
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
|
|
UnstrippedSharedLibrary android.Path
|
|
Target android.Target
|
|
|
|
TableOfContents android.OptionalPath
|
|
CoverageSharedLibrary android.OptionalPath
|
|
|
|
StaticAnalogue *StaticLibraryInfo
|
|
}
|
|
|
|
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
|
|
|
|
// 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
|
|
}
|
|
|
|
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)
|
|
|
|
return FlagExporterInfo{
|
|
IncludeDirs: includes,
|
|
SystemIncludeDirs: systemIncludes,
|
|
}
|
|
}
|