Define vndk.private property for VNDK-private libraries

To define VNDK-private libraries, we used `vendor_available: false`.
Because of it, `vendor_available == nil` had different meaning from
`vendor_available: false` for the VNDK libraries.
To clarify this, we change the logic for defining VNDK-private
libraries which was:

cc_library {
    name: "vndk_private",
    vendor_available: false,
    product_available: false,
    vndk: {
        enabled: true,
    },
}

It must be replaced with

cc_library {
    name: "vndk_private",
    vendor_available: true,
    product_available: true,
    vndk: {
        enabled: true,
        private: true,
    },
}

Bug: 175768895
Test: m nothing
Change-Id: I81769f57c2231e54b682a28e4b82631ab9f3d390
This commit is contained in:
Justin Yun 2020-12-23 18:23:14 +09:00
parent 6977e8a80c
commit fd9e804470
4 changed files with 76 additions and 85 deletions

View file

@ -1076,11 +1076,27 @@ func (c *Module) isImplementationForLLNDKPublic() bool {
c.BaseModuleName() != "libft2")
}
// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
func (c *Module) IsVndkPrivate() bool {
// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
library, _ := c.library.(*libraryDecorator)
return library != nil && !Bool(library.Properties.Llndk.Vendor_available) &&
!Bool(c.VendorProperties.Vendor_available) && !c.IsVndkExt()
// Check if VNDK-core-private or VNDK-SP-private
if c.IsVndk() {
if Bool(c.vndkdep.Properties.Vndk.Private) {
return true
}
// TODO(b/175768895) remove this when we clean up "vendor_available: false" use cases.
if c.VendorProperties.Vendor_available != nil && !Bool(c.VendorProperties.Vendor_available) {
return true
}
return false
}
// Check if LLNDK-private
if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
// TODO(b/175768895) replace this with 'private' property.
return !Bool(library.Properties.Llndk.Vendor_available)
}
return false
}
func (c *Module) IsVndk() bool {

View file

@ -334,9 +334,10 @@ func TestVndk(t *testing.T) {
cc_library {
name: "libvndk_private",
vendor_available: false,
vendor_available: true,
vndk: {
enabled: true,
private: true,
},
nocrt: true,
stem: "libvndk-private",
@ -373,10 +374,11 @@ func TestVndk(t *testing.T) {
cc_library {
name: "libvndk_sp_private",
vendor_available: false,
vendor_available: true,
vndk: {
enabled: true,
support_system_process: true,
private: true,
},
nocrt: true,
target: {
@ -388,11 +390,12 @@ func TestVndk(t *testing.T) {
cc_library {
name: "libvndk_sp_product_private",
vendor_available: false,
product_available: false,
vendor_available: true,
product_available: true,
vndk: {
enabled: true,
support_system_process: true,
private: true,
},
nocrt: true,
target: {
@ -574,10 +577,11 @@ func TestVndkUsingCoreVariant(t *testing.T) {
cc_library {
name: "libvndk2",
vendor_available: false,
product_available: false,
vendor_available: true,
product_available: true,
vndk: {
enabled: true,
private: true,
},
nocrt: true,
}
@ -743,18 +747,6 @@ func TestVndkModuleError(t *testing.T) {
}
`)
testCcErrorProductVndk(t, "product_available: may not have different value than `vendor_available` for a VNDK", `
cc_library {
name: "libvndk",
vendor_available: true,
product_available: false,
vndk: {
enabled: true,
},
nocrt: true,
}
`)
testCcErrorProductVndk(t, "product properties must have the same values with the vendor properties for VNDK modules", `
cc_library {
name: "libvndkprop",
@ -903,10 +895,11 @@ func TestVndkDepError(t *testing.T) {
testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
cc_library {
name: "libvndkprivate",
vendor_available: false,
product_available: false,
vendor_available: true,
product_available: true,
vndk: {
enabled: true,
private: true,
},
shared_libs: ["libnonvndk"],
nocrt: true,
@ -944,11 +937,12 @@ func TestVndkDepError(t *testing.T) {
testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
cc_library {
name: "libvndkspprivate",
vendor_available: false,
product_available: false,
vendor_available: true,
product_available: true,
vndk: {
enabled: true,
support_system_process: true,
private: true,
},
shared_libs: ["libnonvndk"],
nocrt: true,
@ -1039,10 +1033,11 @@ func TestDoubleLoadbleDep(t *testing.T) {
cc_library {
name: "libnondoubleloadable",
vendor_available: false,
product_available: false,
vendor_available: true,
product_available: true,
vndk: {
enabled: true,
private: true,
},
double_loadable: true,
}
@ -1908,10 +1903,11 @@ func TestDoubleLoadableDepError(t *testing.T) {
cc_library {
name: "libnondoubleloadable",
vendor_available: false,
product_available: false,
vendor_available: true,
product_available: true,
vndk: {
enabled: true,
private: true,
},
}
`)
@ -2262,14 +2258,15 @@ func TestVndkExtInconsistentSupportSystemProcessError(t *testing.T) {
func TestVndkExtVendorAvailableFalseError(t *testing.T) {
// This test ensures an error is emitted when a VNDK-Ext library extends a VNDK library
// with `vendor_available: false`.
testCcError(t, "`extends` refers module \".*\" which does not have `vendor_available: true`", `
// with `private: true`.
testCcError(t, "`extends` refers module \".*\" which has `private: true`", `
cc_library {
name: "libvndk",
vendor_available: false,
product_available: false,
vendor_available: true,
product_available: true,
vndk: {
enabled: true,
private: true,
},
nocrt: true,
}
@ -2285,13 +2282,14 @@ func TestVndkExtVendorAvailableFalseError(t *testing.T) {
}
`)
testCcErrorProductVndk(t, "`extends` refers module \".*\" which does not have `product_available: true`", `
testCcErrorProductVndk(t, "`extends` refers module \".*\" which has `private: true`", `
cc_library {
name: "libvndk",
vendor_available: false,
product_available: false,
vendor_available: true,
product_available: true,
vndk: {
enabled: true,
private: true,
},
nocrt: true,
}
@ -2873,7 +2871,7 @@ func TestEnforceProductVndkVersionErrors(t *testing.T) {
nocrt: true,
}
`)
testCcErrorProductVndk(t, "product module that is not VNDK should not link to \".*\" which is marked as `product_available: false`", `
testCcErrorProductVndk(t, "non-VNDK module should not link to \".*\" which has `private: true`", `
cc_library {
name: "libprod",
product_specific: true,
@ -2884,10 +2882,11 @@ func TestEnforceProductVndkVersionErrors(t *testing.T) {
}
cc_library {
name: "libvndk_private",
vendor_available: false,
product_available: false,
vendor_available: true,
product_available: true,
vndk: {
enabled: true,
private: true,
},
nocrt: true,
}
@ -2945,10 +2944,11 @@ func TestMakeLinkType(t *testing.T) {
}
cc_library {
name: "libvndkprivate",
vendor_available: false,
product_available: false,
vendor_available: true,
product_available: true,
vndk: {
enabled: true,
private: true,
},
}
cc_library {

View file

@ -245,13 +245,9 @@ func (m *Module) ImageMutatorBegin(mctx android.BaseModuleContext) {
"vendor_available must be set to either true or false when `vndk: {enabled: true}`")
}
if m.VendorProperties.Product_available != nil {
// If product_available is defined for a VNDK, make sure vendor_available and
// product_available has the same value since `false` for these properties
// means the module is VNDK-private.
if Bool(m.VendorProperties.Vendor_available) != Bool(m.VendorProperties.Product_available) {
mctx.PropertyErrorf("product_available", "may not have different value than `vendor_available` for a VNDK")
}
// Also, both variants must have the same properties since they share a single VNDK library on runtime.
// 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")
}

View file

@ -78,6 +78,13 @@ type VndkProperties struct {
// VNDK-SP or LL-NDK modules only.
Support_system_process *bool
// declared as a VNDK-private module.
// This module still creates the vendor and product variants refering
// to the `vendor_available: true` and `product_available: true`
// properties. However, it is only available to the other VNDK modules
// but not to the non-VNDK vendor or product modules.
Private *bool
// Extending another module
Extends *string
}
@ -135,31 +142,11 @@ func (vndk *vndkdep) vndkCheckLinkType(ctx android.BaseModuleContext, to *Module
return
}
if !vndk.isVndk() {
// Non-VNDK modules those installed to /vendor or /system/vendor
// can't depend on modules marked with vendor_available: false;
// or those installed to /product or /system/product can't depend
// on modules marked with product_available: false.
violation := false
variant := "vendor"
if lib, ok := to.linker.(*llndkStubDecorator); ok && !Bool(lib.Properties.Vendor_available) {
violation = true
if to.InProduct() {
variant = "product"
}
} else if _, ok := to.linker.(libraryInterface); ok {
if to.inVendor() && to.VendorProperties.Vendor_available != nil && !Bool(to.VendorProperties.Vendor_available) {
// A vendor module with Vendor_available == nil should be okay since it means a
// vendor-only library which is a valid dependency for non-VNDK vendor modules.
violation = true
} else if to.InProduct() && to.VendorProperties.Product_available != nil && !Bool(to.VendorProperties.Product_available) {
// A product module with Product_available == nil should be okay since it means a
// product-only library which is a valid dependency for non-VNDK product modules.
violation = true
variant = "product"
}
}
if violation {
ctx.ModuleErrorf("%s module that is not VNDK should not link to %q which is marked as `%s_available: false`", variant, to.Name(), variant)
// 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() {
@ -191,15 +178,9 @@ func (vndk *vndkdep) vndkCheckLinkType(ctx android.BaseModuleContext, to *Module
to.Name())
return
}
if to.inVendor() && !Bool(to.VendorProperties.Vendor_available) {
if to.IsVndkPrivate() {
ctx.ModuleErrorf(
"`extends` refers module %q which does not have `vendor_available: true`",
to.Name())
return
}
if to.InProduct() && !Bool(to.VendorProperties.Product_available) {
ctx.ModuleErrorf(
"`extends` refers module %q which does not have `product_available: true`",
"`extends` refers module %q which has `private: true`",
to.Name())
return
}
@ -355,9 +336,7 @@ func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
} else {
vndkCoreLibraries(mctx.Config())[name] = filename
}
// As `vendor_available` and `product_available` has the same value for VNDK modules,
// we don't need to check both values.
if !Bool(m.VendorProperties.Vendor_available) {
if m.IsVndkPrivate() {
vndkPrivateLibraries(mctx.Config())[name] = filename
}
}