Remove VNDK related code from Soong
As VNDK definition is fully removed from Android.bp, VNDK related code can be removed from Soong. This change removes VNDK related code except VNDK prebuilt which is required to build former versions of VNDK APEX with prebuilts. Bug: 330100430 Test: AOSP CF build succeeded Ignore-AOSP-First: Resolve Conflict Change-Id: Id9c8993343221c8464c97296bde0ff40b14b9b0b
This commit is contained in:
parent
67ca47524e
commit
9f26fcf88c
14 changed files with 44 additions and 767 deletions
|
@ -960,11 +960,6 @@ func (a *apexBundle) ApexInfoMutator(mctx android.TopDownMutatorContext) {
|
|||
if a.minSdkVersionValue(mctx) != "" {
|
||||
mctx.PropertyErrorf("use_vndk_as_stable", "not supported when min_sdk_version is set")
|
||||
}
|
||||
mctx.VisitDirectDepsWithTag(sharedLibTag, func(dep android.Module) {
|
||||
if c, ok := dep.(*cc.Module); ok && c.IsVndk() {
|
||||
mctx.PropertyErrorf("use_vndk_as_stable", "Trying to include a VNDK library(%s) while use_vndk_as_stable is true.", dep.Name())
|
||||
}
|
||||
})
|
||||
if mctx.Failed() {
|
||||
return
|
||||
}
|
||||
|
|
|
@ -3785,32 +3785,31 @@ func TestVndkApexNameRule(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
|
||||
testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
|
||||
testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
|
||||
apex_vndk {
|
||||
name: "com.android.vndk.current",
|
||||
key: "com.android.vndk.current.key",
|
||||
name: "com.android.vndk.v30",
|
||||
key: "com.android.vndk.v30.key",
|
||||
file_contexts: ":myapex-file_contexts",
|
||||
native_bridge_supported: true,
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "com.android.vndk.current.key",
|
||||
name: "com.android.vndk.v30.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
cc_library {
|
||||
vndk_prebuilt_shared {
|
||||
name: "libvndk",
|
||||
version: "30",
|
||||
target_arch: "arm",
|
||||
srcs: ["mylib.cpp"],
|
||||
vendor_available: true,
|
||||
product_available: true,
|
||||
native_bridge_supported: true,
|
||||
host_supported: true,
|
||||
vndk: {
|
||||
enabled: true,
|
||||
},
|
||||
system_shared_libs: [],
|
||||
stl: "none",
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
|
|
@ -104,16 +104,6 @@ func (c *Module) AndroidMkEntries() []android.AndroidMkEntries {
|
|||
entries.AddStrings("LOCAL_RUNTIME_LIBRARIES", c.Properties.AndroidMkRuntimeLibs...)
|
||||
}
|
||||
entries.SetString("LOCAL_SOONG_LINK_TYPE", c.makeLinkType)
|
||||
if c.InVendorOrProduct() {
|
||||
if c.IsVndk() && !c.static() {
|
||||
entries.SetString("LOCAL_SOONG_VNDK_VERSION", c.VndkVersion())
|
||||
// VNDK libraries available to vendor are not installed because
|
||||
// they are packaged in VNDK APEX and installed by APEX packages (apex/apex.go)
|
||||
if !c.IsVndkExt() {
|
||||
entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
|
||||
}
|
||||
}
|
||||
}
|
||||
if c.InVendor() {
|
||||
entries.SetBool("LOCAL_IN_VENDOR", true)
|
||||
} else if c.InProduct() {
|
||||
|
|
148
cc/cc.go
148
cc/cc.go
|
@ -49,7 +49,6 @@ func RegisterCCBuildComponents(ctx android.RegistrationContext) {
|
|||
|
||||
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
||||
ctx.BottomUp("sdk", sdkMutator).Parallel()
|
||||
ctx.BottomUp("vndk", VndkMutator).Parallel()
|
||||
ctx.BottomUp("llndk", llndkMutator).Parallel()
|
||||
ctx.BottomUp("link", LinkageMutator).Parallel()
|
||||
ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
|
||||
|
@ -475,19 +474,6 @@ type VendorProperties struct {
|
|||
// IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
|
||||
IsLLNDK bool `blueprint:"mutated"`
|
||||
|
||||
// IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
|
||||
IsVNDKCore bool `blueprint:"mutated"`
|
||||
|
||||
// IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
|
||||
IsVNDKSP bool `blueprint:"mutated"`
|
||||
|
||||
// IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
|
||||
// module sets the llndk.private property.
|
||||
IsVNDKPrivate bool `blueprint:"mutated"`
|
||||
|
||||
// IsVNDKProduct is set if a VNDK module sets the product_available property.
|
||||
IsVNDKProduct bool `blueprint:"mutated"`
|
||||
|
||||
// IsVendorPublicLibrary is set for the core and product variants of a library that has
|
||||
// vendor_public_library stubs.
|
||||
IsVendorPublicLibrary bool `blueprint:"mutated"`
|
||||
|
@ -514,12 +500,7 @@ type ModuleContextIntf interface {
|
|||
useVndk() bool
|
||||
isNdk(config android.Config) bool
|
||||
IsLlndk() bool
|
||||
IsLlndkPublic() bool
|
||||
isImplementationForLLNDKPublic() bool
|
||||
IsVndkPrivate() bool
|
||||
isVndk() bool
|
||||
isVndkSp() bool
|
||||
IsVndkExt() bool
|
||||
IsVendorPublicLibrary() bool
|
||||
inProduct() bool
|
||||
inVendor() bool
|
||||
|
@ -529,7 +510,6 @@ type ModuleContextIntf interface {
|
|||
InVendorOrProduct() bool
|
||||
selectedStl() string
|
||||
baseModuleName() string
|
||||
getVndkExtendsModuleName() string
|
||||
isAfdoCompile(ctx ModuleContext) bool
|
||||
isOrderfileCompile() bool
|
||||
isCfi() bool
|
||||
|
@ -894,7 +874,6 @@ type Module struct {
|
|||
coverage *coverage
|
||||
fuzzer *fuzzer
|
||||
sabi *sabi
|
||||
vndkdep *vndkdep
|
||||
lto *lto
|
||||
afdo *afdo
|
||||
orderfile *orderfile
|
||||
|
@ -968,12 +947,7 @@ func (c *Module) AddJSONData(d *map[string]interface{}) {
|
|||
"InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
|
||||
"InstallInRecovery": c.InstallInRecovery(),
|
||||
"InstallInRoot": c.InstallInRoot(),
|
||||
"IsVndk": c.IsVndk(),
|
||||
"IsVndkExt": c.IsVndkExt(),
|
||||
"IsVndkPrivate": c.IsVndkPrivate(),
|
||||
"IsVndkSp": c.IsVndkSp(),
|
||||
"IsLlndk": c.IsLlndk(),
|
||||
"IsLlndkPublic": c.IsLlndkPublic(),
|
||||
"IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
|
||||
"ApexSdkVersion": c.apexSdkVersion,
|
||||
"TestFor": c.TestFor(),
|
||||
|
@ -1278,9 +1252,6 @@ func (c *Module) Init() android.Module {
|
|||
if c.sabi != nil {
|
||||
c.AddProperties(c.sabi.props()...)
|
||||
}
|
||||
if c.vndkdep != nil {
|
||||
c.AddProperties(c.vndkdep.props()...)
|
||||
}
|
||||
if c.lto != nil {
|
||||
c.AddProperties(c.lto.props()...)
|
||||
}
|
||||
|
@ -1335,10 +1306,6 @@ func (c *Module) IsLlndk() bool {
|
|||
return c.VendorProperties.IsLLNDK
|
||||
}
|
||||
|
||||
func (c *Module) IsLlndkPublic() bool {
|
||||
return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
|
||||
}
|
||||
|
||||
func (m *Module) NeedsLlndkVariants() bool {
|
||||
lib := moduleLibraryInterface(m)
|
||||
return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
|
||||
|
@ -1385,31 +1352,6 @@ func (c *Module) isImplementationForLLNDKPublic() bool {
|
|||
!Bool(library.Properties.Llndk.Private)
|
||||
}
|
||||
|
||||
// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
|
||||
func (c *Module) IsVndkPrivate() bool {
|
||||
// Check if VNDK-core-private or VNDK-SP-private
|
||||
if c.IsVndk() {
|
||||
return Bool(c.vndkdep.Properties.Vndk.Private)
|
||||
}
|
||||
|
||||
// Check if LLNDK-private
|
||||
if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
|
||||
return Bool(library.Properties.Llndk.Private)
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// IsVndk() returns true if this module has a vndk variant.
|
||||
// Note that IsVndk() returns true for all variants of vndk-enabled libraries. Not only vendor variant,
|
||||
// but also platform and product variants of vndk-enabled libraries return true for IsVndk().
|
||||
func (c *Module) IsVndk() bool {
|
||||
if vndkdep := c.vndkdep; vndkdep != nil {
|
||||
return vndkdep.isVndk()
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
|
||||
if afdo := c.afdo; afdo != nil {
|
||||
return afdo.isAfdoCompile(ctx)
|
||||
|
@ -1445,31 +1387,10 @@ func (c *Module) isNDKStubLibrary() bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (c *Module) IsVndkSp() bool {
|
||||
if vndkdep := c.vndkdep; vndkdep != nil {
|
||||
return vndkdep.isVndkSp()
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (c *Module) IsVndkExt() bool {
|
||||
if vndkdep := c.vndkdep; vndkdep != nil {
|
||||
return vndkdep.isVndkExt()
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (c *Module) SubName() string {
|
||||
return c.Properties.SubName
|
||||
}
|
||||
|
||||
func (c *Module) getVndkExtendsModuleName() string {
|
||||
if vndkdep := c.vndkdep; vndkdep != nil {
|
||||
return vndkdep.getVndkExtendsModuleName()
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (c *Module) IsStubs() bool {
|
||||
if lib := c.library; lib != nil {
|
||||
return lib.buildStubs()
|
||||
|
@ -1699,22 +1620,10 @@ func (ctx *moduleContextImpl) IsLlndk() bool {
|
|||
return ctx.mod.IsLlndk()
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) IsLlndkPublic() bool {
|
||||
return ctx.mod.IsLlndkPublic()
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
|
||||
return ctx.mod.isImplementationForLLNDKPublic()
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) IsVndkPrivate() bool {
|
||||
return ctx.mod.IsVndkPrivate()
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) isVndk() bool {
|
||||
return ctx.mod.IsVndk()
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
|
||||
return ctx.mod.isAfdoCompile(mctx)
|
||||
}
|
||||
|
@ -1735,14 +1644,6 @@ func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
|
|||
return ctx.mod.isNDKStubLibrary()
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) isVndkSp() bool {
|
||||
return ctx.mod.IsVndkSp()
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) IsVndkExt() bool {
|
||||
return ctx.mod.IsVndkExt()
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
|
||||
return ctx.mod.IsVendorPublicLibrary()
|
||||
}
|
||||
|
@ -1762,10 +1663,6 @@ func (ctx *moduleContextImpl) baseModuleName() string {
|
|||
return ctx.mod.BaseModuleName()
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
|
||||
return ctx.mod.getVndkExtendsModuleName()
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) isForPlatform() bool {
|
||||
apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
|
||||
return apexInfo.IsForPlatform()
|
||||
|
@ -1830,7 +1727,6 @@ func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Mo
|
|||
module.coverage = &coverage{}
|
||||
module.fuzzer = &fuzzer{}
|
||||
module.sabi = &sabi{}
|
||||
module.vndkdep = &vndkdep{}
|
||||
module.lto = <o{}
|
||||
module.afdo = &afdo{}
|
||||
module.orderfile = &orderfile{}
|
||||
|
@ -2762,15 +2658,6 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|||
{Mutator: "link", Variation: "shared"},
|
||||
}, ndkLateStubDepTag, apiLateNdkLibs...)
|
||||
|
||||
if vndkdep := c.vndkdep; vndkdep != nil {
|
||||
if vndkdep.isVndkExt() {
|
||||
actx.AddVariationDependencies([]blueprint.Variation{
|
||||
c.ImageVariation(),
|
||||
{Mutator: "link", Variation: "shared"},
|
||||
}, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
|
||||
}
|
||||
}
|
||||
|
||||
if len(deps.AidlLibs) > 0 {
|
||||
actx.AddDependency(
|
||||
c,
|
||||
|
@ -2808,20 +2695,6 @@ func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to Lin
|
|||
return
|
||||
}
|
||||
|
||||
// VNDK is cc.Module supported only for now.
|
||||
if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
|
||||
// Though allowed dependency is limited by the image mutator,
|
||||
// each vendor and product module needs to check link-type
|
||||
// for VNDK.
|
||||
if ccTo, ok := to.(*Module); ok {
|
||||
if ccFrom.vndkdep != nil {
|
||||
ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
|
||||
}
|
||||
} else if _, ok := to.(LinkableInterface); !ok {
|
||||
ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
|
||||
}
|
||||
return
|
||||
}
|
||||
// TODO(b/244244438) : Remove this once all variants are implemented
|
||||
if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
|
||||
return
|
||||
|
@ -2976,7 +2849,7 @@ func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
|
|||
return true
|
||||
}
|
||||
|
||||
if to.IsVndkSp() || to.IsLlndk() {
|
||||
if to.IsLlndk() {
|
||||
return false
|
||||
}
|
||||
|
||||
|
@ -3810,15 +3683,6 @@ func (m *Module) Rlib() bool {
|
|||
func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
|
||||
if c.InVendorOrProduct() {
|
||||
if c.IsLlndk() {
|
||||
if !c.IsLlndkPublic() {
|
||||
return "native:vndk_private"
|
||||
}
|
||||
return "native:vndk"
|
||||
}
|
||||
if c.IsVndk() && !c.IsVndkExt() {
|
||||
if c.IsVndkPrivate() {
|
||||
return "native:vndk_private"
|
||||
}
|
||||
return "native:vndk"
|
||||
}
|
||||
if c.InProduct() {
|
||||
|
@ -4020,15 +3884,6 @@ func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
|
|||
return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
|
||||
}
|
||||
|
||||
// Overrides android.ApexModuleBase.UniqueApexVariations
|
||||
func (c *Module) UniqueApexVariations() bool {
|
||||
// When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
|
||||
// APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
|
||||
// variation of the VNDK lib because APEX variations are merged/grouped.
|
||||
// TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
|
||||
return c.UseVndk() && c.IsVndk()
|
||||
}
|
||||
|
||||
func (c *Module) overriddenModules() []string {
|
||||
if o, ok := c.linker.(overridable); ok {
|
||||
return o.overriddenModules()
|
||||
|
@ -4136,7 +3991,6 @@ func DefaultsFactory(props ...interface{}) android.Module {
|
|||
&TidyProperties{},
|
||||
&CoverageProperties{},
|
||||
&SAbiProperties{},
|
||||
&VndkProperties{},
|
||||
<OProperties{},
|
||||
&AfdoProperties{},
|
||||
&OrderfileProperties{},
|
||||
|
|
|
@ -658,7 +658,7 @@ func TestMakeLinkType(t *testing.T) {
|
|||
}{
|
||||
{vendorVariant, "libvendor", "native:vendor"},
|
||||
{vendorVariant, "libllndk", "native:vndk"},
|
||||
{vendorVariant27, "prevndk.vndk.27.arm.binder32", "native:vndk"},
|
||||
{vendorVariant27, "prevndk.vndk.27.arm.binder32", "native:vendor"},
|
||||
{coreVariant, "libllndk", "native:platform"},
|
||||
}
|
||||
for _, test := range tests {
|
||||
|
|
103
cc/image.go
103
cc/image.go
|
@ -17,8 +17,6 @@ package cc
|
|||
// functions to determine where a module is installed, etc.
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"android/soong/android"
|
||||
|
@ -157,52 +155,6 @@ func (c *Module) OnlyInRecovery() bool {
|
|||
return c.ModuleBase.InstallInRecovery()
|
||||
}
|
||||
|
||||
func visitPropsAndCompareVendorAndProductProps(v reflect.Value) bool {
|
||||
if v.Kind() != reflect.Struct {
|
||||
return true
|
||||
}
|
||||
for i := 0; i < v.NumField(); i++ {
|
||||
prop := v.Field(i)
|
||||
if prop.Kind() == reflect.Struct && v.Type().Field(i).Name == "Target" {
|
||||
vendor_prop := prop.FieldByName("Vendor")
|
||||
product_prop := prop.FieldByName("Product")
|
||||
if vendor_prop.Kind() != reflect.Struct && product_prop.Kind() != reflect.Struct {
|
||||
// Neither Target.Vendor nor Target.Product is defined
|
||||
continue
|
||||
}
|
||||
if vendor_prop.Kind() != reflect.Struct || product_prop.Kind() != reflect.Struct ||
|
||||
!reflect.DeepEqual(vendor_prop.Interface(), product_prop.Interface()) {
|
||||
// If only one of either Target.Vendor or Target.Product is
|
||||
// defined or they have different values, it fails the build
|
||||
// since VNDK must have the same properties for both vendor
|
||||
// and product variants.
|
||||
return false
|
||||
}
|
||||
} else if !visitPropsAndCompareVendorAndProductProps(prop) {
|
||||
// Visit the substructures to find Target.Vendor and Target.Product
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// In the case of VNDK, vendor and product variants must have the same properties.
|
||||
// VNDK installs only one file and shares it for both vendor and product modules on
|
||||
// runtime. We may not define different versions of a VNDK lib for each partition.
|
||||
// This function is used only for the VNDK modules that is available to both vendor
|
||||
// and product partitions.
|
||||
func (c *Module) compareVendorAndProductProps() bool {
|
||||
if !c.IsVndk() && !Bool(c.VendorProperties.Product_available) {
|
||||
panic(fmt.Errorf("This is only for product available VNDK libs. %q is not a VNDK library or not product available", c.Name()))
|
||||
}
|
||||
for _, properties := range c.GetProperties() {
|
||||
if !visitPropsAndCompareVendorAndProductProps(reflect.ValueOf(properties).Elem()) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// ImageMutatableModule provides a common image mutation interface for LinkableInterface modules.
|
||||
type ImageMutatableModule interface {
|
||||
android.Module
|
||||
|
@ -260,62 +212,9 @@ type ImageMutatableModule interface {
|
|||
var _ ImageMutatableModule = (*Module)(nil)
|
||||
|
||||
func (m *Module) ImageMutatorBegin(mctx android.BaseModuleContext) {
|
||||
m.CheckVndkProperties(mctx)
|
||||
MutateImage(mctx, m)
|
||||
}
|
||||
|
||||
// CheckVndkProperties checks whether the VNDK-related properties are set correctly.
|
||||
// If properties are not set correctly, results in a module context property error.
|
||||
func (m *Module) CheckVndkProperties(mctx android.BaseModuleContext) {
|
||||
vendorSpecific := mctx.SocSpecific() || mctx.DeviceSpecific()
|
||||
productSpecific := mctx.ProductSpecific()
|
||||
|
||||
if vndkdep := m.vndkdep; vndkdep != nil {
|
||||
if vndkdep.isVndk() {
|
||||
if vendorSpecific || productSpecific {
|
||||
if !vndkdep.isVndkExt() {
|
||||
mctx.PropertyErrorf("vndk",
|
||||
"must set `extends: \"...\"` to vndk extension")
|
||||
} else if Bool(m.VendorProperties.Vendor_available) {
|
||||
mctx.PropertyErrorf("vendor_available",
|
||||
"must not set at the same time as `vndk: {extends: \"...\"}`")
|
||||
} else if Bool(m.VendorProperties.Product_available) {
|
||||
mctx.PropertyErrorf("product_available",
|
||||
"must not set at the same time as `vndk: {extends: \"...\"}`")
|
||||
}
|
||||
} else {
|
||||
if vndkdep.isVndkExt() {
|
||||
mctx.PropertyErrorf("vndk",
|
||||
"must set `vendor: true` or `product_specific: true` to set `extends: %q`",
|
||||
m.getVndkExtendsModuleName())
|
||||
}
|
||||
if !Bool(m.VendorProperties.Vendor_available) {
|
||||
mctx.PropertyErrorf("vndk",
|
||||
"vendor_available must be set to true when `vndk: {enabled: true}`")
|
||||
}
|
||||
if Bool(m.VendorProperties.Product_available) {
|
||||
// If a VNDK module creates both product and vendor variants, they
|
||||
// must have the same properties since they share a single VNDK
|
||||
// library on runtime.
|
||||
if !m.compareVendorAndProductProps() {
|
||||
mctx.ModuleErrorf("product properties must have the same values with the vendor properties for VNDK modules")
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if vndkdep.isVndkSp() {
|
||||
mctx.PropertyErrorf("vndk",
|
||||
"must set `enabled: true` to set `support_system_process: true`")
|
||||
}
|
||||
if vndkdep.isVndkExt() {
|
||||
mctx.PropertyErrorf("vndk",
|
||||
"must set `enabled: true` to set `extends: %q`",
|
||||
m.getVndkExtendsModuleName())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Module) VendorAvailable() bool {
|
||||
return Bool(m.VendorProperties.Vendor_available)
|
||||
}
|
||||
|
@ -456,7 +355,7 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) {
|
|||
} else {
|
||||
vendorVariants = append(vendorVariants, m.SnapshotVersion(mctx))
|
||||
}
|
||||
} else if m.HasNonSystemVariants() && !m.IsVndkExt() {
|
||||
} else if m.HasNonSystemVariants() {
|
||||
// This will be available to /system unless it is product_specific
|
||||
// which will be handled later.
|
||||
coreVariantNeeded = true
|
||||
|
|
|
@ -1752,16 +1752,7 @@ func (library *libraryDecorator) installSymlinkToRuntimeApex(ctx ModuleContext,
|
|||
|
||||
func (library *libraryDecorator) install(ctx ModuleContext, file android.Path) {
|
||||
if library.shared() {
|
||||
if ctx.Device() && ctx.useVndk() {
|
||||
// set subDir for VNDK extensions
|
||||
if ctx.IsVndkExt() {
|
||||
if ctx.isVndkSp() {
|
||||
library.baseInstaller.subDir = "vndk-sp"
|
||||
} else {
|
||||
library.baseInstaller.subDir = "vndk"
|
||||
}
|
||||
}
|
||||
} else if library.hasStubsVariants() && !ctx.Host() && ctx.directlyInAnyApex() {
|
||||
if library.hasStubsVariants() && !ctx.Host() && ctx.directlyInAnyApex() {
|
||||
// Bionic libraries (e.g. libc.so) is installed to the bootstrap subdirectory.
|
||||
// The original path becomes a symlink to the corresponding file in the
|
||||
// runtime APEX.
|
||||
|
|
|
@ -136,9 +136,6 @@ type LinkableInterface interface {
|
|||
// IsLlndk returns true for both LLNDK (public) and LLNDK-private libs.
|
||||
IsLlndk() bool
|
||||
|
||||
// IsLlndkPublic returns true only for LLNDK (public) libs.
|
||||
IsLlndkPublic() bool
|
||||
|
||||
// HasLlndkStubs returns true if this library has a variant that will build LLNDK stubs.
|
||||
HasLlndkStubs() bool
|
||||
|
||||
|
@ -162,12 +159,6 @@ type LinkableInterface interface {
|
|||
// Bootstrap tests if this module is allowed to use non-APEX version of libraries.
|
||||
Bootstrap() bool
|
||||
|
||||
// IsVndkSp returns true if this is a VNDK-SP module.
|
||||
IsVndkSp() bool
|
||||
|
||||
IsVndk() bool
|
||||
IsVndkExt() bool
|
||||
IsVndkPrivate() bool
|
||||
IsVendorPublicLibrary() bool
|
||||
IsVndkPrebuiltLibrary() bool
|
||||
HasVendorVariant() bool
|
||||
|
|
|
@ -17,6 +17,7 @@ package cc
|
|||
import (
|
||||
"android/soong/android"
|
||||
"android/soong/etc"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
|
@ -120,6 +121,16 @@ func (txt *llndkLibrariesTxtModule) GenerateAndroidBuildActions(ctx android.Modu
|
|||
ctx.InstallFile(installPath, filename, txt.outputFile)
|
||||
}
|
||||
|
||||
func getVndkFileName(m *Module) (string, error) {
|
||||
if library, ok := m.linker.(*libraryDecorator); ok {
|
||||
return library.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
|
||||
}
|
||||
if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
|
||||
return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
|
||||
}
|
||||
return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
|
||||
}
|
||||
|
||||
func (txt *llndkLibrariesTxtModule) GenerateSingletonBuildActions(ctx android.SingletonContext) {
|
||||
if txt.outputFile.String() == "" {
|
||||
// Skip if target file path is empty
|
||||
|
@ -200,8 +211,10 @@ func llndkMutator(mctx android.BottomUpMutatorContext) {
|
|||
m.VendorProperties.IsLLNDK = true
|
||||
}
|
||||
|
||||
if m.IsVndkPrebuiltLibrary() && !m.IsVndk() {
|
||||
m.VendorProperties.IsLLNDK = true
|
||||
if vndkprebuilt, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
|
||||
if !Bool(vndkprebuilt.properties.Vndk.Enabled) {
|
||||
m.VendorProperties.IsLLNDK = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -681,12 +681,6 @@ func (sanitize *sanitize) begin(ctx BaseModuleContext) {
|
|||
s.Integer_overflow = nil
|
||||
}
|
||||
|
||||
// Also disable CFI for VNDK variants of components
|
||||
if ctx.isVndk() && ctx.useVndk() {
|
||||
s.Cfi = nil
|
||||
s.Diag.Cfi = nil
|
||||
}
|
||||
|
||||
if ctx.inRamdisk() || ctx.inVendorRamdisk() || ctx.inRecovery() {
|
||||
// HWASan ramdisk (which is built from recovery) goes over some bootloader limit.
|
||||
// Keep libc instrumented so that ramdisk / vendor_ramdisk / recovery can run hwasan-instrumented code if necessary.
|
||||
|
|
|
@ -555,7 +555,6 @@ var PrepareForTestWithCcBuildComponents = android.GroupFixturePreparers(
|
|||
ctx.RegisterModuleType("cc_test_library", TestLibraryFactory)
|
||||
ctx.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory)
|
||||
|
||||
RegisterVndkLibraryTxtTypes(ctx)
|
||||
RegisterLlndkLibraryTxtType(ctx)
|
||||
}),
|
||||
|
||||
|
@ -704,7 +703,6 @@ func CreateTestContext(config android.Config) *android.TestContext {
|
|||
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
|
||||
ctx.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory)
|
||||
|
||||
RegisterVndkLibraryTxtTypes(ctx)
|
||||
RegisterLlndkLibraryTxtType(ctx)
|
||||
|
||||
ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
|
||||
|
|
453
cc/vndk.go
453
cc/vndk.go
|
@ -15,25 +15,17 @@
|
|||
package cc
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"android/soong/android"
|
||||
"android/soong/etc"
|
||||
|
||||
"github.com/google/blueprint"
|
||||
"github.com/google/blueprint/proptools"
|
||||
)
|
||||
|
||||
const (
|
||||
llndkLibrariesTxt = "llndk.libraries.txt"
|
||||
llndkLibrariesTxtForApex = "llndk.libraries.txt.apex"
|
||||
vndkCoreLibrariesTxt = "vndkcore.libraries.txt"
|
||||
vndkSpLibrariesTxt = "vndksp.libraries.txt"
|
||||
vndkPrivateLibrariesTxt = "vndkprivate.libraries.txt"
|
||||
vndkProductLibrariesTxt = "vndkproduct.libraries.txt"
|
||||
vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt"
|
||||
llndkLibrariesTxt = "llndk.libraries.txt"
|
||||
vndkCoreLibrariesTxt = "vndkcore.libraries.txt"
|
||||
vndkSpLibrariesTxt = "vndksp.libraries.txt"
|
||||
vndkPrivateLibrariesTxt = "vndkprivate.libraries.txt"
|
||||
vndkProductLibrariesTxt = "vndkproduct.libraries.txt"
|
||||
)
|
||||
|
||||
func VndkLibrariesTxtModules(vndkVersion string, ctx android.BaseModuleContext) []string {
|
||||
|
@ -83,444 +75,9 @@ type VndkProperties struct {
|
|||
}
|
||||
}
|
||||
|
||||
type vndkdep struct {
|
||||
Properties VndkProperties
|
||||
}
|
||||
|
||||
func (vndk *vndkdep) props() []interface{} {
|
||||
return []interface{}{&vndk.Properties}
|
||||
}
|
||||
|
||||
func (vndk *vndkdep) isVndk() bool {
|
||||
return Bool(vndk.Properties.Vndk.Enabled)
|
||||
}
|
||||
|
||||
func (vndk *vndkdep) isVndkSp() bool {
|
||||
return Bool(vndk.Properties.Vndk.Support_system_process)
|
||||
}
|
||||
|
||||
func (vndk *vndkdep) isVndkExt() bool {
|
||||
return vndk.Properties.Vndk.Extends != nil
|
||||
}
|
||||
|
||||
func (vndk *vndkdep) getVndkExtendsModuleName() string {
|
||||
return String(vndk.Properties.Vndk.Extends)
|
||||
}
|
||||
|
||||
func (vndk *vndkdep) typeName() string {
|
||||
if !vndk.isVndk() {
|
||||
return "native:vendor"
|
||||
}
|
||||
if !vndk.isVndkExt() {
|
||||
if !vndk.isVndkSp() {
|
||||
return "native:vendor:vndk"
|
||||
}
|
||||
return "native:vendor:vndksp"
|
||||
}
|
||||
if !vndk.isVndkSp() {
|
||||
return "native:vendor:vndkext"
|
||||
}
|
||||
return "native:vendor:vndkspext"
|
||||
}
|
||||
|
||||
// VNDK link type check from a module with UseVndk() == true.
|
||||
func (vndk *vndkdep) vndkCheckLinkType(ctx android.BaseModuleContext, to *Module, tag blueprint.DependencyTag) {
|
||||
if to.linker == nil {
|
||||
return
|
||||
}
|
||||
if !vndk.isVndk() {
|
||||
// Non-VNDK modules those installed to /vendor, /system/vendor,
|
||||
// /product or /system/product cannot depend on VNDK-private modules
|
||||
// that include VNDK-core-private, VNDK-SP-private and LLNDK-private.
|
||||
if to.IsVndkPrivate() {
|
||||
ctx.ModuleErrorf("non-VNDK module should not link to %q which has `private: true`", to.Name())
|
||||
}
|
||||
}
|
||||
if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
|
||||
// Check only shared libraries.
|
||||
// Other (static) libraries are allowed to link.
|
||||
return
|
||||
}
|
||||
|
||||
if to.IsLlndk() {
|
||||
// LL-NDK libraries are allowed to link
|
||||
return
|
||||
}
|
||||
|
||||
if !to.UseVndk() {
|
||||
ctx.ModuleErrorf("(%s) should not link to %q which is not a vendor-available library",
|
||||
vndk.typeName(), to.Name())
|
||||
return
|
||||
}
|
||||
if tag == vndkExtDepTag {
|
||||
// Ensure `extends: "name"` property refers a vndk module that has vendor_available
|
||||
// and has identical vndk properties.
|
||||
if to.vndkdep == nil || !to.vndkdep.isVndk() {
|
||||
ctx.ModuleErrorf("`extends` refers a non-vndk module %q", to.Name())
|
||||
return
|
||||
}
|
||||
if vndk.isVndkSp() != to.vndkdep.isVndkSp() {
|
||||
ctx.ModuleErrorf(
|
||||
"`extends` refers a module %q with mismatched support_system_process",
|
||||
to.Name())
|
||||
return
|
||||
}
|
||||
if to.IsVndkPrivate() {
|
||||
ctx.ModuleErrorf(
|
||||
"`extends` refers module %q which has `private: true`",
|
||||
to.Name())
|
||||
return
|
||||
}
|
||||
}
|
||||
if to.vndkdep == nil {
|
||||
return
|
||||
}
|
||||
|
||||
// Check the dependencies of VNDK shared libraries.
|
||||
if err := vndkIsVndkDepAllowed(vndk, to.vndkdep); err != nil {
|
||||
ctx.ModuleErrorf("(%s) should not link to %q (%s): %v",
|
||||
vndk.typeName(), to.Name(), to.vndkdep.typeName(), err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
|
||||
// Check the dependencies of VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext and vendor modules.
|
||||
if from.isVndkExt() {
|
||||
if from.isVndkSp() {
|
||||
if to.isVndk() && !to.isVndkSp() {
|
||||
return errors.New("VNDK-SP extensions must not depend on VNDK or VNDK extensions")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// VNDK-Ext may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
|
||||
return nil
|
||||
}
|
||||
if from.isVndk() {
|
||||
if to.isVndkExt() {
|
||||
return errors.New("VNDK-core and VNDK-SP must not depend on VNDK extensions")
|
||||
}
|
||||
if from.isVndkSp() {
|
||||
if !to.isVndkSp() {
|
||||
return errors.New("VNDK-SP must only depend on VNDK-SP")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
if !to.isVndk() {
|
||||
return errors.New("VNDK-core must only depend on VNDK-core or VNDK-SP")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// Vendor modules may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
|
||||
return nil
|
||||
}
|
||||
|
||||
type moduleListerFunc func(ctx android.SingletonContext) (moduleNames, fileNames []string)
|
||||
|
||||
var (
|
||||
vndkSPLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKSP })
|
||||
vndkCoreLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKCore })
|
||||
vndkPrivateLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKPrivate })
|
||||
vndkProductLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKProduct })
|
||||
)
|
||||
|
||||
// vndkModuleLister takes a predicate that operates on a Module and returns a moduleListerFunc
|
||||
// that produces a list of module names and output file names for which the predicate returns true.
|
||||
func vndkModuleLister(predicate func(*Module) bool) moduleListerFunc {
|
||||
return func(ctx android.SingletonContext) (moduleNames, fileNames []string) {
|
||||
ctx.VisitAllModules(func(m android.Module) {
|
||||
if c, ok := m.(*Module); ok && predicate(c) && !c.IsVndkPrebuiltLibrary() {
|
||||
filename, err := getVndkFileName(c)
|
||||
if err != nil {
|
||||
ctx.ModuleErrorf(m, "%s", err)
|
||||
}
|
||||
moduleNames = append(moduleNames, ctx.ModuleName(m))
|
||||
fileNames = append(fileNames, filename)
|
||||
}
|
||||
})
|
||||
moduleNames = android.SortedUniqueStrings(moduleNames)
|
||||
fileNames = android.SortedUniqueStrings(fileNames)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// vndkModuleListRemover takes a moduleListerFunc and a prefix and returns a moduleListerFunc
|
||||
// that returns the same lists as the input moduleListerFunc, but with modules with the
|
||||
// given prefix removed.
|
||||
func vndkModuleListRemover(lister moduleListerFunc, prefix string) moduleListerFunc {
|
||||
return func(ctx android.SingletonContext) (moduleNames, fileNames []string) {
|
||||
moduleNames, fileNames = lister(ctx)
|
||||
filter := func(in []string) []string {
|
||||
out := make([]string, 0, len(in))
|
||||
for _, lib := range in {
|
||||
if strings.HasPrefix(lib, prefix) {
|
||||
continue
|
||||
}
|
||||
out = append(out, lib)
|
||||
}
|
||||
return out
|
||||
}
|
||||
return filter(moduleNames), filter(fileNames)
|
||||
}
|
||||
}
|
||||
|
||||
func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
|
||||
if m.InProduct() {
|
||||
// We may skip the steps for the product variants because they
|
||||
// are already covered by the vendor variants.
|
||||
return
|
||||
}
|
||||
|
||||
name := m.BaseModuleName()
|
||||
|
||||
if lib := m.library; lib != nil && lib.hasStubsVariants() && name != "libz" {
|
||||
// b/155456180 libz is the ONLY exception here. We don't want to make
|
||||
// libz an LLNDK library because we in general can't guarantee that
|
||||
// libz will behave consistently especially about the compression.
|
||||
// i.e. the compressed output might be different across releases.
|
||||
// As the library is an external one, it's risky to keep the compatibility
|
||||
// promise if it becomes an LLNDK.
|
||||
mctx.PropertyErrorf("vndk.enabled", "This library provides stubs. Shouldn't be VNDK. Consider making it as LLNDK")
|
||||
}
|
||||
|
||||
if m.vndkdep.isVndkSp() {
|
||||
m.VendorProperties.IsVNDKSP = true
|
||||
} else {
|
||||
m.VendorProperties.IsVNDKCore = true
|
||||
}
|
||||
if m.IsVndkPrivate() {
|
||||
m.VendorProperties.IsVNDKPrivate = true
|
||||
}
|
||||
if Bool(m.VendorProperties.Product_available) {
|
||||
m.VendorProperties.IsVNDKProduct = true
|
||||
}
|
||||
}
|
||||
|
||||
// Check for modules that mustn't be VNDK
|
||||
func shouldSkipVndkMutator(ctx android.ConfigAndErrorContext, m *Module) bool {
|
||||
if !m.Enabled(ctx) {
|
||||
return true
|
||||
}
|
||||
if !m.Device() {
|
||||
// Skip non-device modules
|
||||
return true
|
||||
}
|
||||
if m.Target().NativeBridge == android.NativeBridgeEnabled {
|
||||
// Skip native_bridge modules
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
|
||||
if shouldSkipVndkMutator(mctx, m) {
|
||||
return false
|
||||
}
|
||||
|
||||
// TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
|
||||
// When b/142675459 is landed, remove following check
|
||||
if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
|
||||
// prebuilt vndk modules should match with device
|
||||
if !p.MatchesWithDevice(mctx.DeviceConfig()) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
if lib, ok := m.linker.(libraryInterface); ok {
|
||||
// VNDK APEX doesn't need stub variants
|
||||
if lib.buildStubs() {
|
||||
return false
|
||||
}
|
||||
return lib.shared() && m.InVendor() && m.IsVndk() && !m.IsVndkExt()
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// gather list of vndk-core, vndk-sp, and ll-ndk libs
|
||||
func VndkMutator(mctx android.BottomUpMutatorContext) {
|
||||
m, ok := mctx.Module().(*Module)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
if shouldSkipVndkMutator(mctx, m) {
|
||||
return
|
||||
}
|
||||
|
||||
lib, isLib := m.linker.(*libraryDecorator)
|
||||
prebuiltLib, isPrebuiltLib := m.linker.(*prebuiltLibraryLinker)
|
||||
|
||||
if m.InVendorOrProduct() && isLib && lib.hasLLNDKStubs() {
|
||||
m.VendorProperties.IsVNDKPrivate = Bool(lib.Properties.Llndk.Private)
|
||||
}
|
||||
if m.InVendorOrProduct() && isPrebuiltLib && prebuiltLib.hasLLNDKStubs() {
|
||||
m.VendorProperties.IsVNDKPrivate = Bool(prebuiltLib.Properties.Llndk.Private)
|
||||
}
|
||||
|
||||
if (isLib && lib.buildShared()) || (isPrebuiltLib && prebuiltLib.buildShared()) {
|
||||
if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
|
||||
processVndkLibrary(mctx, m)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
RegisterVndkLibraryTxtTypes(android.InitRegistrationContext)
|
||||
}
|
||||
|
||||
func RegisterVndkLibraryTxtTypes(ctx android.RegistrationContext) {
|
||||
ctx.RegisterParallelSingletonModuleType("vndksp_libraries_txt", vndkSPLibrariesTxtFactory)
|
||||
ctx.RegisterParallelSingletonModuleType("vndkcore_libraries_txt", vndkCoreLibrariesTxtFactory)
|
||||
ctx.RegisterParallelSingletonModuleType("vndkprivate_libraries_txt", vndkPrivateLibrariesTxtFactory)
|
||||
ctx.RegisterParallelSingletonModuleType("vndkproduct_libraries_txt", vndkProductLibrariesTxtFactory)
|
||||
}
|
||||
|
||||
type vndkLibrariesTxt struct {
|
||||
android.SingletonModuleBase
|
||||
|
||||
lister moduleListerFunc
|
||||
makeVarName string
|
||||
filterOutFromMakeVar string
|
||||
|
||||
properties VndkLibrariesTxtProperties
|
||||
|
||||
outputFile android.OutputPath
|
||||
moduleNames []string
|
||||
fileNames []string
|
||||
}
|
||||
|
||||
type VndkLibrariesTxtProperties struct {
|
||||
Insert_vndk_version *bool
|
||||
Stem *string
|
||||
}
|
||||
|
||||
var _ etc.PrebuiltEtcModule = &vndkLibrariesTxt{}
|
||||
var _ android.OutputFileProducer = &vndkLibrariesTxt{}
|
||||
|
||||
// vndksp_libraries_txt is a singleton module whose content is a list of VNDKSP libraries
|
||||
// generated by Soong but can be referenced by other modules.
|
||||
// For example, apex_vndk can depend on these files as prebuilt.
|
||||
func vndkSPLibrariesTxtFactory() android.SingletonModule {
|
||||
return newVndkLibrariesTxt(vndkSPLibraries, "VNDK_SAMEPROCESS_LIBRARIES")
|
||||
}
|
||||
|
||||
// vndkcore_libraries_txt is a singleton module whose content is a list of VNDK core libraries
|
||||
// generated by Soong but can be referenced by other modules.
|
||||
// For example, apex_vndk can depend on these files as prebuilt.
|
||||
func vndkCoreLibrariesTxtFactory() android.SingletonModule {
|
||||
return newVndkLibrariesTxt(vndkCoreLibraries, "VNDK_CORE_LIBRARIES")
|
||||
}
|
||||
|
||||
// vndkprivate_libraries_txt is a singleton module whose content is a list of VNDK private libraries
|
||||
// generated by Soong but can be referenced by other modules.
|
||||
// For example, apex_vndk can depend on these files as prebuilt.
|
||||
func vndkPrivateLibrariesTxtFactory() android.SingletonModule {
|
||||
return newVndkLibrariesTxt(vndkPrivateLibraries, "VNDK_PRIVATE_LIBRARIES")
|
||||
}
|
||||
|
||||
// vndkproduct_libraries_txt is a singleton module whose content is a list of VNDK product libraries
|
||||
// generated by Soong but can be referenced by other modules.
|
||||
// For example, apex_vndk can depend on these files as prebuilt.
|
||||
func vndkProductLibrariesTxtFactory() android.SingletonModule {
|
||||
return newVndkLibrariesTxt(vndkProductLibraries, "VNDK_PRODUCT_LIBRARIES")
|
||||
}
|
||||
|
||||
func newVndkLibrariesWithMakeVarFilter(lister moduleListerFunc, makeVarName string, filter string) android.SingletonModule {
|
||||
m := &vndkLibrariesTxt{
|
||||
lister: lister,
|
||||
makeVarName: makeVarName,
|
||||
filterOutFromMakeVar: filter,
|
||||
}
|
||||
m.AddProperties(&m.properties)
|
||||
android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
|
||||
return m
|
||||
}
|
||||
|
||||
func newVndkLibrariesTxt(lister moduleListerFunc, makeVarName string) android.SingletonModule {
|
||||
return newVndkLibrariesWithMakeVarFilter(lister, makeVarName, "")
|
||||
}
|
||||
|
||||
func insertVndkVersion(filename string, vndkVersion string) string {
|
||||
if index := strings.LastIndex(filename, "."); index != -1 {
|
||||
return filename[:index] + "." + vndkVersion + filename[index:]
|
||||
}
|
||||
return filename
|
||||
}
|
||||
|
||||
func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
filename := proptools.StringDefault(txt.properties.Stem, txt.Name())
|
||||
|
||||
txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
|
||||
|
||||
installPath := android.PathForModuleInstall(ctx, "etc")
|
||||
ctx.InstallFile(installPath, filename, txt.outputFile)
|
||||
}
|
||||
|
||||
func (txt *vndkLibrariesTxt) GenerateSingletonBuildActions(ctx android.SingletonContext) {
|
||||
txt.moduleNames, txt.fileNames = txt.lister(ctx)
|
||||
android.WriteFileRule(ctx, txt.outputFile, strings.Join(txt.fileNames, "\n"))
|
||||
}
|
||||
|
||||
func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
|
||||
return []android.AndroidMkEntries{android.AndroidMkEntries{
|
||||
Class: "ETC",
|
||||
OutputFile: android.OptionalPathForPath(txt.outputFile),
|
||||
ExtraEntries: []android.AndroidMkExtraEntriesFunc{
|
||||
func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
|
||||
entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
|
||||
},
|
||||
},
|
||||
}}
|
||||
}
|
||||
|
||||
func (txt *vndkLibrariesTxt) MakeVars(ctx android.MakeVarsContext) {
|
||||
if txt.makeVarName == "" {
|
||||
return
|
||||
}
|
||||
|
||||
filter := func(modules []string, prefix string) []string {
|
||||
if prefix == "" {
|
||||
return modules
|
||||
}
|
||||
var result []string
|
||||
for _, module := range modules {
|
||||
if strings.HasPrefix(module, prefix) {
|
||||
continue
|
||||
} else {
|
||||
result = append(result, module)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
ctx.Strict(txt.makeVarName, strings.Join(filter(txt.moduleNames, txt.filterOutFromMakeVar), " "))
|
||||
}
|
||||
|
||||
// PrebuiltEtcModule interface
|
||||
func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
|
||||
return txt.outputFile
|
||||
}
|
||||
|
||||
// PrebuiltEtcModule interface
|
||||
func (txt *vndkLibrariesTxt) BaseDir() string {
|
||||
return "etc"
|
||||
}
|
||||
|
||||
// PrebuiltEtcModule interface
|
||||
func (txt *vndkLibrariesTxt) SubDir() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
|
||||
return android.Paths{txt.outputFile}, nil
|
||||
}
|
||||
|
||||
func getVndkFileName(m *Module) (string, error) {
|
||||
if library, ok := m.linker.(*libraryDecorator); ok {
|
||||
return library.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
|
||||
}
|
||||
if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
|
||||
return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
|
||||
}
|
||||
return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
|
||||
}
|
||||
|
|
|
@ -49,6 +49,8 @@ var (
|
|||
// },
|
||||
// }
|
||||
type vndkPrebuiltProperties struct {
|
||||
VndkProperties
|
||||
|
||||
// VNDK snapshot version.
|
||||
Version *string
|
||||
|
||||
|
@ -268,3 +270,14 @@ func VndkPrebuiltSharedFactory() android.Module {
|
|||
func init() {
|
||||
android.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory)
|
||||
}
|
||||
|
||||
func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
|
||||
if !m.Enabled(mctx) {
|
||||
return true
|
||||
}
|
||||
|
||||
if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
|
||||
return p.MatchesWithDevice(mctx.DeviceConfig()) && Bool(p.properties.Vndk.Enabled)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
|
17
rust/rust.go
17
rust/rust.go
|
@ -345,19 +345,6 @@ func (mod *Module) SubName() string {
|
|||
return mod.Properties.SubName
|
||||
}
|
||||
|
||||
func (mod *Module) IsVndk() bool {
|
||||
// TODO(b/165791368)
|
||||
return false
|
||||
}
|
||||
|
||||
func (mod *Module) IsVndkExt() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (mod *Module) IsVndkSp() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (mod *Module) IsVndkPrebuiltLibrary() bool {
|
||||
// Rust modules do not provide VNDK prebuilts
|
||||
return false
|
||||
|
@ -380,10 +367,6 @@ func (c *Module) IsLlndk() bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (c *Module) IsLlndkPublic() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (mod *Module) KernelHeadersDecorator() bool {
|
||||
return false
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue