1package cc 2 3import ( 4 "android/soong/android" 5 "android/soong/bazel/cquery" 6 7 "github.com/google/blueprint" 8) 9 10// PlatformSanitizeable is an interface for sanitizing platform modules. 11type PlatformSanitizeable interface { 12 LinkableInterface 13 14 // SanitizePropDefined returns whether the Sanitizer properties struct for this module is defined. 15 SanitizePropDefined() bool 16 17 // IsDependencyRoot returns whether a module is of a type which cannot be a linkage dependency 18 // of another module. For example, cc_binary and rust_binary represent dependency roots as other 19 // modules cannot have linkage dependencies against these types. 20 IsDependencyRoot() bool 21 22 // IsSanitizerEnabled returns whether a sanitizer is enabled. 23 IsSanitizerEnabled(t SanitizerType) bool 24 25 // IsSanitizerExplicitlyDisabled returns whether a sanitizer has been explicitly disabled (set to false) rather 26 // than left undefined. 27 IsSanitizerExplicitlyDisabled(t SanitizerType) bool 28 29 // SanitizeDep returns the value of the SanitizeDep flag, which is set if a module is a dependency of a 30 // sanitized module. 31 SanitizeDep() bool 32 33 // SetSanitizer enables or disables the specified sanitizer type if it's supported, otherwise this should panic. 34 SetSanitizer(t SanitizerType, b bool) 35 36 // SetSanitizerDep returns true if the module is statically linked. 37 SetSanitizeDep(b bool) 38 39 // StaticallyLinked returns true if the module is statically linked. 40 StaticallyLinked() bool 41 42 // SetInSanitizerDir sets the module installation to the sanitizer directory. 43 SetInSanitizerDir() 44 45 // SanitizeNever returns true if this module should never be sanitized. 46 SanitizeNever() bool 47 48 // SanitizerSupported returns true if a sanitizer type is supported by this modules compiler. 49 SanitizerSupported(t SanitizerType) bool 50 51 // MinimalRuntimeDep returns true if this module needs to link the minimal UBSan runtime, 52 // either because it requires it or because a dependent module which requires it to be linked in this module. 53 MinimalRuntimeDep() bool 54 55 // UbsanRuntimeDep returns true if this module needs to link the full UBSan runtime, 56 // either because it requires it or because a dependent module which requires it to be linked in this module. 57 UbsanRuntimeDep() bool 58 59 // UbsanRuntimeNeeded returns true if the full UBSan runtime is required by this module. 60 UbsanRuntimeNeeded() bool 61 62 // MinimalRuntimeNeeded returns true if the minimal UBSan runtime is required by this module 63 MinimalRuntimeNeeded() bool 64 65 // SanitizableDepTagChecker returns a SantizableDependencyTagChecker function type. 66 SanitizableDepTagChecker() SantizableDependencyTagChecker 67} 68 69// SantizableDependencyTagChecker functions check whether or not a dependency 70// tag can be sanitized. These functions should return true if the tag can be 71// sanitized, otherwise they should return false. These functions should also 72// handle all possible dependency tags in the dependency tree. For example, 73// Rust modules can depend on both Rust and CC libraries, so the Rust module 74// implementation should handle tags from both. 75type SantizableDependencyTagChecker func(tag blueprint.DependencyTag) bool 76 77// Snapshottable defines those functions necessary for handling module snapshots. 78type Snapshottable interface { 79 // SnapshotHeaders returns a list of header paths provided by this module. 80 SnapshotHeaders() android.Paths 81 82 // ExcludeFromVendorSnapshot returns true if this module should be otherwise excluded from the vendor snapshot. 83 ExcludeFromVendorSnapshot() bool 84 85 // ExcludeFromRecoverySnapshot returns true if this module should be otherwise excluded from the recovery snapshot. 86 ExcludeFromRecoverySnapshot() bool 87 88 // SnapshotLibrary returns true if this module is a snapshot library. 89 IsSnapshotLibrary() bool 90 91 // SnapshotRuntimeLibs returns a list of libraries needed by this module at runtime but which aren't build dependencies. 92 SnapshotRuntimeLibs() []string 93 94 // SnapshotSharedLibs returns the list of shared library dependencies for this module. 95 SnapshotSharedLibs() []string 96 97 // IsSnapshotPrebuilt returns true if this module is a snapshot prebuilt. 98 IsSnapshotPrebuilt() bool 99} 100 101// LinkableInterface is an interface for a type of module that is linkable in a C++ library. 102type LinkableInterface interface { 103 android.Module 104 Snapshottable 105 106 Module() android.Module 107 CcLibrary() bool 108 CcLibraryInterface() bool 109 110 // BaseModuleName returns the android.ModuleBase.BaseModuleName() value for this module. 111 BaseModuleName() string 112 113 OutputFile() android.OptionalPath 114 CoverageFiles() android.Paths 115 116 NonCcVariants() bool 117 118 SelectedStl() string 119 120 BuildStaticVariant() bool 121 BuildSharedVariant() bool 122 SetStatic() 123 SetShared() 124 IsPrebuilt() bool 125 Toc() android.OptionalPath 126 127 Host() bool 128 129 InRamdisk() bool 130 OnlyInRamdisk() bool 131 132 InVendorRamdisk() bool 133 OnlyInVendorRamdisk() bool 134 135 InRecovery() bool 136 OnlyInRecovery() bool 137 138 InVendor() bool 139 140 UseSdk() bool 141 142 // IsLlndk returns true for both LLNDK (public) and LLNDK-private libs. 143 IsLlndk() bool 144 145 // IsLlndkPublic returns true only for LLNDK (public) libs. 146 IsLlndkPublic() bool 147 148 // HasLlndkStubs returns true if this library has a variant that will build LLNDK stubs. 149 HasLlndkStubs() bool 150 151 // NeedsLlndkVariants returns true if this module has LLNDK stubs or provides LLNDK headers. 152 NeedsLlndkVariants() bool 153 154 // NeedsVendorPublicLibraryVariants returns true if this module has vendor public library stubs. 155 NeedsVendorPublicLibraryVariants() bool 156 157 //StubsVersion returns the stubs version for this module. 158 StubsVersion() string 159 160 // UseVndk returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64. 161 // "product" and "vendor" variant modules return true for this function. 162 // When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true", 163 // "soc_specific: true" and more vendor installed modules are included here. 164 // When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "vendor_available: true" or 165 // "product_specific: true" modules are included here. 166 UseVndk() bool 167 168 // IsVndkSp returns true if this is a VNDK-SP module. 169 IsVndkSp() bool 170 171 MustUseVendorVariant() bool 172 IsVndk() bool 173 IsVndkExt() bool 174 IsVndkPrivate() bool 175 HasVendorVariant() bool 176 HasProductVariant() bool 177 HasNonSystemVariants() bool 178 InProduct() bool 179 180 // SubName returns the modules SubName, used for image and NDK/SDK variations. 181 SubName() string 182 183 SdkVersion() string 184 MinSdkVersion() string 185 AlwaysSdk() bool 186 IsSdkVariant() bool 187 188 SplitPerApiLevel() bool 189 190 // SetPreventInstall sets the PreventInstall property to 'true' for this module. 191 SetPreventInstall() 192 // SetHideFromMake sets the HideFromMake property to 'true' for this module. 193 SetHideFromMake() 194 195 // KernelHeadersDecorator returns true if this is a kernel headers decorator module. 196 // This is specific to cc and should always return false for all other packages. 197 KernelHeadersDecorator() bool 198 199 // HiddenFromMake returns true if this module is hidden from Make. 200 HiddenFromMake() bool 201 202 // RelativeInstallPath returns the relative install path for this module. 203 RelativeInstallPath() string 204 205 // Binary returns true if this is a binary module. 206 Binary() bool 207 208 // Object returns true if this is an object module. 209 Object() bool 210 211 // Rlib returns true if this is an rlib module. 212 Rlib() bool 213 214 // Dylib returns true if this is an dylib module. 215 Dylib() bool 216 217 // Static returns true if this is a static library module. 218 Static() bool 219 220 // Shared returns true if this is a shared library module. 221 Shared() bool 222 223 // Header returns true if this is a library headers module. 224 Header() bool 225 226 // EverInstallable returns true if the module is ever installable 227 EverInstallable() bool 228 229 // PreventInstall returns true if this module is prevented from installation. 230 PreventInstall() bool 231 232 // InstallInData returns true if this module is installed in data. 233 InstallInData() bool 234 235 // Installable returns a bool pointer to the module installable property. 236 Installable() *bool 237 238 // Symlinks returns a list of symlinks that should be created for this module. 239 Symlinks() []string 240 241 // VndkVersion returns the VNDK version string for this module. 242 VndkVersion() string 243} 244 245var ( 246 // Dependency tag for crtbegin, an object file responsible for initialization. 247 CrtBeginDepTag = dependencyTag{name: "crtbegin"} 248 // Dependency tag for crtend, an object file responsible for program termination. 249 CrtEndDepTag = dependencyTag{name: "crtend"} 250 // Dependency tag for coverage library. 251 CoverageDepTag = dependencyTag{name: "coverage"} 252) 253 254// GetImageVariantType returns the ImageVariantType string value for the given module 255// (these are defined in cc/image.go). 256func GetImageVariantType(c LinkableInterface) ImageVariantType { 257 if c.Host() { 258 return hostImageVariant 259 } else if c.InVendor() { 260 return vendorImageVariant 261 } else if c.InProduct() { 262 return productImageVariant 263 } else if c.InRamdisk() { 264 return ramdiskImageVariant 265 } else if c.InVendorRamdisk() { 266 return vendorRamdiskImageVariant 267 } else if c.InRecovery() { 268 return recoveryImageVariant 269 } else { 270 return coreImageVariant 271 } 272} 273 274// DepTagMakeSuffix returns the makeSuffix value of a particular library dependency tag. 275// Returns an empty string if not a library dependency tag. 276func DepTagMakeSuffix(depTag blueprint.DependencyTag) string { 277 if libDepTag, ok := depTag.(libraryDependencyTag); ok { 278 return libDepTag.makeSuffix 279 } 280 return "" 281} 282 283// SharedDepTag returns the dependency tag for any C++ shared libraries. 284func SharedDepTag() blueprint.DependencyTag { 285 return libraryDependencyTag{Kind: sharedLibraryDependency} 286} 287 288// StaticDepTag returns the dependency tag for any C++ static libraries. 289func StaticDepTag(wholeStatic bool) blueprint.DependencyTag { 290 return libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: wholeStatic} 291} 292 293// IsWholeStaticLib whether a dependency tag is a whole static library dependency. 294func IsWholeStaticLib(depTag blueprint.DependencyTag) bool { 295 if tag, ok := depTag.(libraryDependencyTag); ok { 296 return tag.wholeStatic 297 } 298 return false 299} 300 301// HeaderDepTag returns the dependency tag for any C++ "header-only" libraries. 302func HeaderDepTag() blueprint.DependencyTag { 303 return libraryDependencyTag{Kind: headerLibraryDependency} 304} 305 306// SharedLibraryInfo is a provider to propagate information about a shared C++ library. 307type SharedLibraryInfo struct { 308 SharedLibrary android.Path 309 UnstrippedSharedLibrary android.Path 310 Target android.Target 311 312 TableOfContents android.OptionalPath 313 CoverageSharedLibrary android.OptionalPath 314 315 StaticAnalogue *StaticLibraryInfo 316} 317 318var SharedLibraryInfoProvider = blueprint.NewProvider(SharedLibraryInfo{}) 319 320// SharedStubLibrary is a struct containing information about a stub shared library. 321// Stub libraries are used for cross-APEX dependencies; when a library is to depend on a shared 322// library in another APEX, it must depend on the stub version of that library. 323type SharedStubLibrary struct { 324 // The version of the stub (corresponding to the stable version of the shared library being 325 // stubbed). 326 Version string 327 SharedLibraryInfo SharedLibraryInfo 328 FlagExporterInfo FlagExporterInfo 329} 330 331// SharedLibraryStubsInfo is a provider to propagate information about all shared library stubs 332// which are dependencies of a library. 333// Stub libraries are used for cross-APEX dependencies; when a library is to depend on a shared 334// library in another APEX, it must depend on the stub version of that library. 335type SharedLibraryStubsInfo struct { 336 SharedStubLibraries []SharedStubLibrary 337 338 IsLLNDK bool 339} 340 341var SharedLibraryStubsProvider = blueprint.NewProvider(SharedLibraryStubsInfo{}) 342 343// StaticLibraryInfo is a provider to propagate information about a static C++ library. 344type StaticLibraryInfo struct { 345 StaticLibrary android.Path 346 Objects Objects 347 ReuseObjects Objects 348 349 // This isn't the actual transitive DepSet, shared library dependencies have been 350 // converted into static library analogues. It is only used to order the static 351 // library dependencies that were specified for the current module. 352 TransitiveStaticLibrariesForOrdering *android.DepSet 353} 354 355var StaticLibraryInfoProvider = blueprint.NewProvider(StaticLibraryInfo{}) 356 357// HeaderLibraryInfo is a marker provider that identifies a module as a header library. 358type HeaderLibraryInfo struct { 359} 360 361// HeaderLibraryInfoProvider is a marker provider that identifies a module as a header library. 362var HeaderLibraryInfoProvider = blueprint.NewProvider(HeaderLibraryInfo{}) 363 364// FlagExporterInfo is a provider to propagate transitive library information 365// pertaining to exported include paths and flags. 366type FlagExporterInfo struct { 367 IncludeDirs android.Paths // Include directories to be included with -I 368 SystemIncludeDirs android.Paths // System include directories to be included with -isystem 369 Flags []string // Exported raw flags. 370 Deps android.Paths 371 GeneratedHeaders android.Paths 372} 373 374var FlagExporterInfoProvider = blueprint.NewProvider(FlagExporterInfo{}) 375 376// flagExporterInfoFromCcInfo populates FlagExporterInfo provider with information from Bazel. 377func flagExporterInfoFromCcInfo(ctx android.ModuleContext, ccInfo cquery.CcInfo) FlagExporterInfo { 378 379 includes := android.PathsForBazelOut(ctx, ccInfo.Includes) 380 systemIncludes := android.PathsForBazelOut(ctx, ccInfo.SystemIncludes) 381 382 return FlagExporterInfo{ 383 IncludeDirs: android.FirstUniquePaths(includes), 384 SystemIncludeDirs: android.FirstUniquePaths(systemIncludes), 385 } 386} 387