blob: 337b4594357655d4e030e7a2eb9712435801f292 [file] [log] [blame]
Ivan Lozano183a3212019-10-18 14:18:45 -07001package cc
2
3import (
Ivan Lozano183a3212019-10-18 14:18:45 -07004 "android/soong/android"
Ivan Lozano0f9963e2023-02-06 13:31:02 -05005 "android/soong/fuzz"
Colin Cross6e511a92020-07-27 21:26:48 -07006
7 "github.com/google/blueprint"
Colin Crossa14fb6a2024-10-23 16:57:06 -07008 "github.com/google/blueprint/depset"
Ivan Lozano183a3212019-10-18 14:18:45 -07009)
10
Ivan Lozano3968d8f2020-12-14 11:27:52 -050011// PlatformSanitizeable is an interface for sanitizing platform modules.
12type PlatformSanitizeable interface {
13 LinkableInterface
14
15 // SanitizePropDefined returns whether the Sanitizer properties struct for this module is defined.
16 SanitizePropDefined() bool
17
Ivan Lozano3968d8f2020-12-14 11:27:52 -050018 // IsSanitizerEnabled returns whether a sanitizer is enabled.
19 IsSanitizerEnabled(t SanitizerType) bool
20
21 // IsSanitizerExplicitlyDisabled returns whether a sanitizer has been explicitly disabled (set to false) rather
22 // than left undefined.
23 IsSanitizerExplicitlyDisabled(t SanitizerType) bool
24
Ivan Lozano3968d8f2020-12-14 11:27:52 -050025 // SetSanitizer enables or disables the specified sanitizer type if it's supported, otherwise this should panic.
26 SetSanitizer(t SanitizerType, b bool)
27
Ivan Lozano3968d8f2020-12-14 11:27:52 -050028 // StaticallyLinked returns true if the module is statically linked.
29 StaticallyLinked() bool
30
31 // SetInSanitizerDir sets the module installation to the sanitizer directory.
32 SetInSanitizerDir()
33
34 // SanitizeNever returns true if this module should never be sanitized.
35 SanitizeNever() bool
36
37 // SanitizerSupported returns true if a sanitizer type is supported by this modules compiler.
38 SanitizerSupported(t SanitizerType) bool
39
Ivan Lozanod7586b62021-04-01 09:49:36 -040040 // MinimalRuntimeDep returns true if this module needs to link the minimal UBSan runtime,
41 // either because it requires it or because a dependent module which requires it to be linked in this module.
42 MinimalRuntimeDep() bool
43
44 // UbsanRuntimeDep returns true if this module needs to link the full UBSan runtime,
45 // either because it requires it or because a dependent module which requires it to be linked in this module.
46 UbsanRuntimeDep() bool
47
48 // UbsanRuntimeNeeded returns true if the full UBSan runtime is required by this module.
49 UbsanRuntimeNeeded() bool
50
51 // MinimalRuntimeNeeded returns true if the minimal UBSan runtime is required by this module
52 MinimalRuntimeNeeded() bool
53
Ivan Lozano3968d8f2020-12-14 11:27:52 -050054 // SanitizableDepTagChecker returns a SantizableDependencyTagChecker function type.
55 SanitizableDepTagChecker() SantizableDependencyTagChecker
Ivan Lozano9eaacc82024-10-30 14:28:17 +000056
57 // ForceDisableSanitizers sets the ForceDisable sanitize property
58 ForceDisableSanitizers()
Ivan Lozano3968d8f2020-12-14 11:27:52 -050059}
60
61// SantizableDependencyTagChecker functions check whether or not a dependency
62// tag can be sanitized. These functions should return true if the tag can be
63// sanitized, otherwise they should return false. These functions should also
64// handle all possible dependency tags in the dependency tree. For example,
65// Rust modules can depend on both Rust and CC libraries, so the Rust module
66// implementation should handle tags from both.
67type SantizableDependencyTagChecker func(tag blueprint.DependencyTag) bool
68
Ivan Lozano9eaacc82024-10-30 14:28:17 +000069type VersionedLinkableInterface interface {
70 LinkableInterface
71 android.ApexModule
72
73 // VersionedInterface returns the VersionedInterface for this module
74 // (e.g. c.library), or nil if this is module is not a VersionedInterface.
75 VersionedInterface() VersionedInterface
76
77 // HasStubsVariants true if this module is a stub or has a sibling variant
78 // that is a stub.
79 HasStubsVariants() bool
80
81 // SetStl sets the stl property for CC modules. Does not panic if for other module types.
82 SetStl(string)
83 SetSdkVersion(string)
84 SetMinSdkVersion(version string)
85 ApexSdkVersion() android.ApiLevel
86 ImplementationModuleNameForMake(ctx android.BaseModuleContext) string
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +000087
88 // RustApexExclude returns ApexExclude() for Rust modules; always returns false for all non-Rust modules.
89 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
90 RustApexExclude() bool
Ivan Lozano9eaacc82024-10-30 14:28:17 +000091}
92
Chris Parsons3c27ca32020-11-20 12:42:07 -050093// LinkableInterface is an interface for a type of module that is linkable in a C++ library.
Ivan Lozano183a3212019-10-18 14:18:45 -070094type LinkableInterface interface {
Ivan Lozanof9e21722020-12-02 09:00:51 -050095 android.Module
96
Ivan Lozano183a3212019-10-18 14:18:45 -070097 Module() android.Module
98 CcLibrary() bool
99 CcLibraryInterface() bool
100
Ivan Lozano61c02cc2023-06-09 14:06:44 -0400101 // RustLibraryInterface returns true if this is a Rust library module
102 RustLibraryInterface() bool
103
Ivan Lozano0a468a42024-05-13 21:03:34 -0400104 // CrateName returns the crateName for a Rust library, panics if not a Rust library.
105 CrateName() string
106
107 // DepFlags returns a slice of Rustc string flags, panics if not a Rust library
108 ExportedCrateLinkDirs() []string
109
Ivan Lozanod7586b62021-04-01 09:49:36 -0400110 // BaseModuleName returns the android.ModuleBase.BaseModuleName() value for this module.
111 BaseModuleName() string
112
Ivan Lozano183a3212019-10-18 14:18:45 -0700113 OutputFile() android.OptionalPath
Ivan Lozano39b0bf02021-10-14 12:22:09 -0400114 UnstrippedOutputFile() android.Path
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400115 CoverageFiles() android.Paths
Ivan Lozano183a3212019-10-18 14:18:45 -0700116
Ivan Lozano7f67c2a2022-06-27 16:00:26 -0400117 // CoverageOutputFile returns the output archive of gcno coverage information files.
118 CoverageOutputFile() android.OptionalPath
119
Ivan Lozano2b262972019-11-21 12:30:50 -0800120 NonCcVariants() bool
121
Ivan Lozano52767be2019-10-18 14:49:46 -0700122 SelectedStl() string
Ivan Lozano183a3212019-10-18 14:18:45 -0700123
124 BuildStaticVariant() bool
Ivan Lozanofd47b1a2024-05-17 14:13:41 -0400125 BuildRlibVariant() bool
Ivan Lozano183a3212019-10-18 14:18:45 -0700126 BuildSharedVariant() bool
127 SetStatic()
128 SetShared()
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500129 IsPrebuilt() bool
Ivan Lozano52767be2019-10-18 14:49:46 -0700130 Toc() android.OptionalPath
131
Ivan Lozano0f9963e2023-02-06 13:31:02 -0500132 // IsFuzzModule returns true if this a *_fuzz module.
133 IsFuzzModule() bool
134
135 // FuzzPackagedModule returns the fuzz.FuzzPackagedModule for this module.
136 // Expects that IsFuzzModule returns true.
137 FuzzPackagedModule() fuzz.FuzzPackagedModule
138
139 // FuzzSharedLibraries returns the shared library dependencies for this module.
140 // Expects that IsFuzzModule returns true.
Hamzeh Zawawy38917492023-04-05 22:08:46 +0000141 FuzzSharedLibraries() android.RuleBuilderInstalls
Ivan Lozano0f9963e2023-02-06 13:31:02 -0500142
Yi-Yo Chiang36d8e4e2021-07-02 21:21:13 +0800143 Device() bool
Jooyung Han624d35c2020-04-10 12:57:24 +0900144 Host() bool
145
Yifan Hong1b3348d2020-01-21 15:53:22 -0800146 InRamdisk() bool
147 OnlyInRamdisk() bool
148
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700149 InVendorRamdisk() bool
150 OnlyInVendorRamdisk() bool
151
Ivan Lozano52767be2019-10-18 14:49:46 -0700152 InRecovery() bool
153 OnlyInRecovery() bool
154
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500155 InVendor() bool
156
Colin Crossc511bc52020-04-07 16:50:32 +0000157 UseSdk() bool
Ivan Lozano3a7d0002021-03-30 12:19:36 -0400158
Ivan Lozano7f67c2a2022-06-27 16:00:26 -0400159 // IsNdk returns true if the library is in the configs known NDK list.
160 IsNdk(config android.Config) bool
161
162 // IsStubs returns true if the this is a stubs library.
163 IsStubs() bool
164
Ivan Lozano3a7d0002021-03-30 12:19:36 -0400165 // IsLlndk returns true for both LLNDK (public) and LLNDK-private libs.
166 IsLlndk() bool
167
Colin Cross1f3f1302021-04-26 18:37:44 -0700168 // NeedsLlndkVariants returns true if this module has LLNDK stubs or provides LLNDK headers.
169 NeedsLlndkVariants() bool
Ivan Lozano3a7d0002021-03-30 12:19:36 -0400170
Colin Cross5271fea2021-04-27 13:06:04 -0700171 // NeedsVendorPublicLibraryVariants returns true if this module has vendor public library stubs.
172 NeedsVendorPublicLibraryVariants() bool
173
Ivan Lozanod7586b62021-04-01 09:49:36 -0400174 // UseVndk returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64.
175 // "product" and "vendor" variant modules return true for this function.
176 // When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true",
177 // "soc_specific: true" and more vendor installed modules are included here.
178 // When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "vendor_available: true" or
179 // "product_specific: true" modules are included here.
Ivan Lozano52767be2019-10-18 14:49:46 -0700180 UseVndk() bool
Ivan Lozanod7586b62021-04-01 09:49:36 -0400181
Jiyong Park7d55b612021-06-11 17:22:09 +0900182 // Bootstrap tests if this module is allowed to use non-APEX version of libraries.
183 Bootstrap() bool
184
Ivan Lozanof1868af2022-04-12 13:08:36 -0400185 IsVendorPublicLibrary() bool
186 IsVndkPrebuiltLibrary() bool
Ivan Lozano52767be2019-10-18 14:49:46 -0700187 HasVendorVariant() bool
Justin Yuncbca3732021-02-03 19:24:13 +0900188 HasProductVariant() bool
189 HasNonSystemVariants() bool
Ivan Lozanof1868af2022-04-12 13:08:36 -0400190 ProductSpecific() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500191 InProduct() bool
Ivan Lozanof1868af2022-04-12 13:08:36 -0400192 SdkAndPlatformVariantVisibleToMake() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900193 InVendorOrProduct() bool
Ivan Lozano52767be2019-10-18 14:49:46 -0700194
Ivan Lozanoc08897c2021-04-02 12:41:32 -0400195 // SubName returns the modules SubName, used for image and NDK/SDK variations.
196 SubName() string
197
Ivan Lozano52767be2019-10-18 14:49:46 -0700198 SdkVersion() string
Jiyong Parkfdaa5f72021-03-19 22:18:04 +0900199 MinSdkVersion() string
Colin Crossc511bc52020-04-07 16:50:32 +0000200 AlwaysSdk() bool
Jiyong Park2286afd2020-06-16 21:58:53 +0900201 IsSdkVariant() bool
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000202 Multilib() string
Ivan Lozano52767be2019-10-18 14:49:46 -0700203
Colin Cross1348ce32020-10-01 13:37:16 -0700204 SplitPerApiLevel() bool
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500205
206 // SetPreventInstall sets the PreventInstall property to 'true' for this module.
207 SetPreventInstall()
208 // SetHideFromMake sets the HideFromMake property to 'true' for this module.
209 SetHideFromMake()
Ivan Lozano3a7d0002021-03-30 12:19:36 -0400210
211 // KernelHeadersDecorator returns true if this is a kernel headers decorator module.
212 // This is specific to cc and should always return false for all other packages.
213 KernelHeadersDecorator() bool
Ivan Lozanod7586b62021-04-01 09:49:36 -0400214
215 // HiddenFromMake returns true if this module is hidden from Make.
216 HiddenFromMake() bool
217
218 // RelativeInstallPath returns the relative install path for this module.
219 RelativeInstallPath() string
220
221 // Binary returns true if this is a binary module.
222 Binary() bool
223
224 // Object returns true if this is an object module.
225 Object() bool
226
227 // Rlib returns true if this is an rlib module.
228 Rlib() bool
229
230 // Dylib returns true if this is an dylib module.
231 Dylib() bool
232
Ivan Lozanoadd122a2023-07-13 11:01:41 -0400233 // RlibStd returns true if this is an rlib which links against an rlib libstd.
234 RlibStd() bool
235
Ivan Lozanod7586b62021-04-01 09:49:36 -0400236 // Static returns true if this is a static library module.
237 Static() bool
238
239 // Shared returns true if this is a shared library module.
240 Shared() bool
241
242 // Header returns true if this is a library headers module.
243 Header() bool
244
Justin Yun5e035862021-06-29 20:50:37 +0900245 // StaticExecutable returns true if this is a binary module with "static_executable: true".
246 StaticExecutable() bool
247
Ivan Lozanod7586b62021-04-01 09:49:36 -0400248 // EverInstallable returns true if the module is ever installable
249 EverInstallable() bool
250
251 // PreventInstall returns true if this module is prevented from installation.
252 PreventInstall() bool
253
254 // InstallInData returns true if this module is installed in data.
255 InstallInData() bool
256
257 // Installable returns a bool pointer to the module installable property.
258 Installable() *bool
259
260 // Symlinks returns a list of symlinks that should be created for this module.
261 Symlinks() []string
262
263 // VndkVersion returns the VNDK version string for this module.
264 VndkVersion() string
Jihoon Kangf78a8902022-09-01 22:47:07 +0000265
266 // Partition returns the partition string for this module.
267 Partition() string
Ivan Lozano0f9963e2023-02-06 13:31:02 -0500268
269 // FuzzModule returns the fuzz.FuzzModule associated with the module.
270 FuzzModuleStruct() fuzz.FuzzModule
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000271 IsCrt() bool
Ivan Lozano183a3212019-10-18 14:18:45 -0700272}
273
Colin Cross6e511a92020-07-27 21:26:48 -0700274var (
Chris Parsons3c27ca32020-11-20 12:42:07 -0500275 // Dependency tag for crtbegin, an object file responsible for initialization.
Colin Cross6e511a92020-07-27 21:26:48 -0700276 CrtBeginDepTag = dependencyTag{name: "crtbegin"}
Chris Parsons3c27ca32020-11-20 12:42:07 -0500277 // Dependency tag for crtend, an object file responsible for program termination.
278 CrtEndDepTag = dependencyTag{name: "crtend"}
279 // Dependency tag for coverage library.
Colin Cross6e511a92020-07-27 21:26:48 -0700280 CoverageDepTag = dependencyTag{name: "coverage"}
281)
Ivan Lozano183a3212019-10-18 14:18:45 -0700282
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500283// GetImageVariantType returns the ImageVariantType string value for the given module
284// (these are defined in cc/image.go).
285func GetImageVariantType(c LinkableInterface) ImageVariantType {
286 if c.Host() {
287 return hostImageVariant
288 } else if c.InVendor() {
289 return vendorImageVariant
290 } else if c.InProduct() {
291 return productImageVariant
292 } else if c.InRamdisk() {
293 return ramdiskImageVariant
294 } else if c.InVendorRamdisk() {
295 return vendorRamdiskImageVariant
296 } else if c.InRecovery() {
297 return recoveryImageVariant
298 } else {
299 return coreImageVariant
300 }
301}
302
Ivan Lozanoc08897c2021-04-02 12:41:32 -0400303// DepTagMakeSuffix returns the makeSuffix value of a particular library dependency tag.
304// Returns an empty string if not a library dependency tag.
305func DepTagMakeSuffix(depTag blueprint.DependencyTag) string {
306 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
307 return libDepTag.makeSuffix
308 }
309 return ""
310}
311
Chris Parsons3c27ca32020-11-20 12:42:07 -0500312// SharedDepTag returns the dependency tag for any C++ shared libraries.
Colin Cross8acea3e2024-12-12 14:53:30 -0800313func SharedDepTag() blueprint.DependencyTag {
314 return libraryDependencyTag{Kind: sharedLibraryDependency}
Ivan Lozano183a3212019-10-18 14:18:45 -0700315}
316
Chris Parsons3c27ca32020-11-20 12:42:07 -0500317// StaticDepTag returns the dependency tag for any C++ static libraries.
Ivan Lozano63bb7682021-03-23 15:53:44 -0400318func StaticDepTag(wholeStatic bool) blueprint.DependencyTag {
319 return libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: wholeStatic}
320}
321
322// IsWholeStaticLib whether a dependency tag is a whole static library dependency.
323func IsWholeStaticLib(depTag blueprint.DependencyTag) bool {
324 if tag, ok := depTag.(libraryDependencyTag); ok {
325 return tag.wholeStatic
326 }
327 return false
Colin Cross6e511a92020-07-27 21:26:48 -0700328}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700329
Chris Parsons3c27ca32020-11-20 12:42:07 -0500330// HeaderDepTag returns the dependency tag for any C++ "header-only" libraries.
Zach Johnson3df4e632020-11-06 11:56:27 -0800331func HeaderDepTag() blueprint.DependencyTag {
332 return libraryDependencyTag{Kind: headerLibraryDependency}
333}
334
Chris Parsons3c27ca32020-11-20 12:42:07 -0500335// SharedLibraryInfo is a provider to propagate information about a shared C++ library.
Colin Cross0de8a1e2020-09-18 14:15:30 -0700336type SharedLibraryInfo struct {
Liz Kammeref6dfea2021-06-08 15:37:09 -0400337 SharedLibrary android.Path
338 Target android.Target
Colin Cross0de8a1e2020-09-18 14:15:30 -0700339
Colin Crossb614cd42024-10-11 12:52:21 -0700340 TableOfContents android.OptionalPath
341 IsStubs bool
342 ImplementationDeps depset.DepSet[string]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700343
Liz Kammeref6dfea2021-06-08 15:37:09 -0400344 // should be obtained from static analogue
Colin Crossa14fb6a2024-10-23 16:57:06 -0700345 TransitiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700346}
347
Colin Crossbc7d76c2023-12-12 16:39:03 -0800348var SharedLibraryInfoProvider = blueprint.NewProvider[SharedLibraryInfo]()
Colin Cross0de8a1e2020-09-18 14:15:30 -0700349
Chris Parsons3c27ca32020-11-20 12:42:07 -0500350// SharedStubLibrary is a struct containing information about a stub shared library.
351// Stub libraries are used for cross-APEX dependencies; when a library is to depend on a shared
352// library in another APEX, it must depend on the stub version of that library.
353type SharedStubLibrary struct {
354 // The version of the stub (corresponding to the stable version of the shared library being
355 // stubbed).
Colin Cross0de8a1e2020-09-18 14:15:30 -0700356 Version string
357 SharedLibraryInfo SharedLibraryInfo
358 FlagExporterInfo FlagExporterInfo
359}
360
Chris Parsons3c27ca32020-11-20 12:42:07 -0500361// SharedLibraryStubsInfo is a provider to propagate information about all shared library stubs
362// which are dependencies of a library.
363// Stub libraries are used for cross-APEX dependencies; when a library is to depend on a shared
364// library in another APEX, it must depend on the stub version of that library.
365type SharedLibraryStubsInfo struct {
366 SharedStubLibraries []SharedStubLibrary
Colin Cross0de8a1e2020-09-18 14:15:30 -0700367
Chris Parsons3c27ca32020-11-20 12:42:07 -0500368 IsLLNDK bool
369}
370
Colin Crossbc7d76c2023-12-12 16:39:03 -0800371var SharedLibraryStubsProvider = blueprint.NewProvider[SharedLibraryStubsInfo]()
Chris Parsons3c27ca32020-11-20 12:42:07 -0500372
373// StaticLibraryInfo is a provider to propagate information about a static C++ library.
Colin Cross0de8a1e2020-09-18 14:15:30 -0700374type StaticLibraryInfo struct {
375 StaticLibrary android.Path
376 Objects Objects
377 ReuseObjects Objects
378
Colin Crossa2bcf2c2022-02-11 13:11:55 -0800379 // A static library may contain prebuilt static libraries included with whole_static_libs
380 // that won't appear in Objects. They are transitively available in
381 // WholeStaticLibsFromPrebuilts.
382 WholeStaticLibsFromPrebuilts android.Paths
383
Colin Cross0de8a1e2020-09-18 14:15:30 -0700384 // This isn't the actual transitive DepSet, shared library dependencies have been
385 // converted into static library analogues. It is only used to order the static
386 // library dependencies that were specified for the current module.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700387 TransitiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700388}
389
Colin Crossbc7d76c2023-12-12 16:39:03 -0800390var StaticLibraryInfoProvider = blueprint.NewProvider[StaticLibraryInfo]()
Colin Cross0de8a1e2020-09-18 14:15:30 -0700391
Colin Cross649d8172020-12-10 12:30:21 -0800392// HeaderLibraryInfo is a marker provider that identifies a module as a header library.
393type HeaderLibraryInfo struct {
394}
395
396// HeaderLibraryInfoProvider is a marker provider that identifies a module as a header library.
Colin Crossbc7d76c2023-12-12 16:39:03 -0800397var HeaderLibraryInfoProvider = blueprint.NewProvider[HeaderLibraryInfo]()
Colin Cross649d8172020-12-10 12:30:21 -0800398
Chris Parsons3c27ca32020-11-20 12:42:07 -0500399// FlagExporterInfo is a provider to propagate transitive library information
400// pertaining to exported include paths and flags.
Colin Cross0de8a1e2020-09-18 14:15:30 -0700401type FlagExporterInfo struct {
Chris Parsons3c27ca32020-11-20 12:42:07 -0500402 IncludeDirs android.Paths // Include directories to be included with -I
403 SystemIncludeDirs android.Paths // System include directories to be included with -isystem
404 Flags []string // Exported raw flags.
Colin Cross0de8a1e2020-09-18 14:15:30 -0700405 Deps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400406 RustRlibDeps []RustRlibDep
Colin Cross0de8a1e2020-09-18 14:15:30 -0700407 GeneratedHeaders android.Paths
408}
409
Colin Crossbc7d76c2023-12-12 16:39:03 -0800410var FlagExporterInfoProvider = blueprint.NewProvider[FlagExporterInfo]()
Colin Crossb614cd42024-10-11 12:52:21 -0700411
412var ImplementationDepInfoProvider = blueprint.NewProvider[*ImplementationDepInfo]()
413
414type ImplementationDepInfo struct {
415 ImplementationDeps depset.DepSet[android.Path]
416}