diff --git a/cc/cc.go b/cc/cc.go index 260fcf1d5..4d8f4e1a1 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -1135,9 +1135,9 @@ func (c *Module) IsLlndkLibrary() bool { return false } -func (m *Module) HasLlndkStubs() bool { +func (m *Module) NeedsLlndkVariants() bool { lib := moduleLibraryInterface(m) - return lib != nil && lib.hasLLNDKStubs() + return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders()) } // isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs diff --git a/cc/image.go b/cc/image.go index c1e5dfeec..6265b132e 100644 --- a/cc/image.go +++ b/cc/image.go @@ -437,13 +437,13 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) { productVndkVersion = platformVndkVersion } - if m.IsLlndkLibrary() || m.IsLlndkHeaders() || m.HasLlndkStubs() { + if m.IsLlndkLibrary() || m.IsLlndkHeaders() || m.NeedsLlndkVariants() { // This is an LLNDK library. The implementation of the library will be on /system, // and vendor and product variants will be created with LLNDK stubs. // The LLNDK libraries need vendor variants even if there is no VNDK. // The obsolete llndk_library and llndk_headers modules also need the vendor variants // so the cc_library LLNDK stubs can depend on them. - if m.HasLlndkStubs() { + if m.NeedsLlndkVariants() { coreVariantNeeded = true } if platformVndkVersion != "" { diff --git a/cc/library.go b/cc/library.go index f49698e7a..3ac7e115c 100644 --- a/cc/library.go +++ b/cc/library.go @@ -868,6 +868,7 @@ type versionedInterface interface { implementationModuleName(name string) string hasLLNDKStubs() bool + hasLLNDKHeaders() bool } var _ libraryInterface = (*libraryDecorator)(nil) @@ -1682,6 +1683,12 @@ func (library *libraryDecorator) hasVestigialLLNDKLibrary() bool { return String(library.Properties.Llndk_stubs) != "" } +// hasLLNDKHeaders returns true if this cc_library module has a variant that provides headers +// to a module that sets llndk.symbol_file. +func (library *libraryDecorator) hasLLNDKHeaders() bool { + return Bool(library.Properties.Llndk.Llndk_headers) +} + func (library *libraryDecorator) implementationModuleName(name string) string { return name } diff --git a/cc/linkable.go b/cc/linkable.go index 2fa12f61c..8fe0b4a9d 100644 --- a/cc/linkable.go +++ b/cc/linkable.go @@ -112,8 +112,8 @@ type LinkableInterface interface { // IsLlndkLibrary returns true if this module is an LLNDK library module. IsLlndkLibrary() bool - // HasLlndkStubs returns true if this module has LLNDK stubs. - HasLlndkStubs() bool + // NeedsLlndkVariants returns true if this module has LLNDK stubs or provides LLNDK headers. + NeedsLlndkVariants() bool UseVndk() bool MustUseVendorVariant() bool diff --git a/cc/llndk_library.go b/cc/llndk_library.go index d05dbce4c..ad19e47f3 100644 --- a/cc/llndk_library.go +++ b/cc/llndk_library.go @@ -69,6 +69,10 @@ type llndkLibraryProperties struct { // vendor nor product libraries. This effectively hides this module from // non-system modules. Default value is false. Private *bool + + // if true, make this module available to provide headers to other modules that set + // llndk.symbol_file. + Llndk_headers *bool } type llndkStubDecorator struct { diff --git a/rust/rust.go b/rust/rust.go index 78a793de9..e1a69c047 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -274,7 +274,7 @@ func (mod *Module) KernelHeadersDecorator() bool { return false } -func (m *Module) HasLlndkStubs() bool { +func (m *Module) NeedsLlndkVariants() bool { return false }