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