Create product variant for product partition
When PRODUCT_PRODUCT_VNDK_VERSION is set to 'current', product
modules are enforced to use only VNDK libs from the system partition
as BOARD_VNDK_VERSION does to vendor partition.
Modules with 'vendor_available: true' create product variant as well
as core and vendor variants. The product variant as an image variant
is used for the modules in /product or /system/product.
It must not affect the current build behavior without
PRODUCT_PRODUCT_VNDK_VERSION set.
Bug: 134099726
Bug: 138966004
Bug: 144534640
Test: build without PRODUCT_PRODUCT_VNDK_VERSION set
Change-Id: I4d3585c110d84493e45bf76d550dc240bb26137f
diff --git a/cc/cc_test.go b/cc/cc_test.go
index 27ff38f..1e70529 100644
--- a/cc/cc_test.go
+++ b/cc/cc_test.go
@@ -82,11 +82,8 @@
return testCcWithConfig(t, config)
}
-func testCcError(t *testing.T, pattern string, bp string) {
+func testCcErrorWithConfig(t *testing.T, pattern string, config android.Config) {
t.Helper()
- config := TestConfig(buildDir, android.Android, nil, bp, nil)
- config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
- config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
ctx := CreateTestContext()
ctx.Register(config)
@@ -106,9 +103,27 @@
t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
}
+func testCcError(t *testing.T, pattern string, bp string) {
+ config := TestConfig(buildDir, android.Android, nil, bp, nil)
+ config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
+ config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
+ testCcErrorWithConfig(t, pattern, config)
+ return
+}
+
+func testCcErrorProductVndk(t *testing.T, pattern string, bp string) {
+ config := TestConfig(buildDir, android.Android, nil, bp, nil)
+ config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
+ config.TestProductVariables.ProductVndkVersion = StringPtr("current")
+ config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
+ testCcErrorWithConfig(t, pattern, config)
+ return
+}
+
const (
coreVariant = "android_arm64_armv8-a_shared"
vendorVariant = "android_vendor.VER_arm64_armv8-a_shared"
+ productVariant = "android_product.VER_arm64_armv8-a_shared"
recoveryVariant = "android_recovery_arm64_armv8-a_shared"
)
@@ -1445,6 +1460,160 @@
`)
}
+func TestEnforceProductVndkVersion(t *testing.T) {
+ bp := `
+ cc_library {
+ name: "libllndk",
+ }
+ llndk_library {
+ name: "libllndk",
+ symbol_file: "",
+ }
+ cc_library {
+ name: "libvndk",
+ vendor_available: true,
+ vndk: {
+ enabled: true,
+ },
+ nocrt: true,
+ }
+ cc_library {
+ name: "libvndk_sp",
+ vendor_available: true,
+ vndk: {
+ enabled: true,
+ support_system_process: true,
+ },
+ nocrt: true,
+ }
+ cc_library {
+ name: "libva",
+ vendor_available: true,
+ nocrt: true,
+ }
+ cc_library {
+ name: "libproduct_va",
+ product_specific: true,
+ vendor_available: true,
+ nocrt: true,
+ }
+ cc_library {
+ name: "libprod",
+ product_specific: true,
+ shared_libs: [
+ "libllndk",
+ "libvndk",
+ "libvndk_sp",
+ "libva",
+ "libproduct_va",
+ ],
+ nocrt: true,
+ }
+ cc_library {
+ name: "libvendor",
+ vendor: true,
+ shared_libs: [
+ "libllndk",
+ "libvndk",
+ "libvndk_sp",
+ "libva",
+ "libproduct_va",
+ ],
+ nocrt: true,
+ }
+ `
+
+ config := TestConfig(buildDir, android.Android, nil, bp, nil)
+ config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
+ config.TestProductVariables.ProductVndkVersion = StringPtr("current")
+ config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
+
+ ctx := testCcWithConfig(t, config)
+
+ checkVndkModule(t, ctx, "libvndk", "vndk-VER", false, "")
+ checkVndkModule(t, ctx, "libvndk_sp", "vndk-sp-VER", true, "")
+}
+
+func TestEnforceProductVndkVersionErrors(t *testing.T) {
+ testCcErrorProductVndk(t, "dependency \".*\" of \".*\" missing variant:\n.*image:product.VER", `
+ cc_library {
+ name: "libprod",
+ product_specific: true,
+ shared_libs: [
+ "libvendor",
+ ],
+ nocrt: true,
+ }
+ cc_library {
+ name: "libvendor",
+ vendor: true,
+ nocrt: true,
+ }
+ `)
+ testCcErrorProductVndk(t, "dependency \".*\" of \".*\" missing variant:\n.*image:product.VER", `
+ cc_library {
+ name: "libprod",
+ product_specific: true,
+ shared_libs: [
+ "libsystem",
+ ],
+ nocrt: true,
+ }
+ cc_library {
+ name: "libsystem",
+ nocrt: true,
+ }
+ `)
+ testCcErrorProductVndk(t, "Vendor module that is not VNDK should not link to \".*\" which is marked as `vendor_available: false`", `
+ cc_library {
+ name: "libprod",
+ product_specific: true,
+ shared_libs: [
+ "libvndk_private",
+ ],
+ nocrt: true,
+ }
+ cc_library {
+ name: "libvndk_private",
+ vendor_available: false,
+ vndk: {
+ enabled: true,
+ },
+ nocrt: true,
+ }
+ `)
+ testCcErrorProductVndk(t, "dependency \".*\" of \".*\" missing variant:\n.*image:product.VER", `
+ cc_library {
+ name: "libprod",
+ product_specific: true,
+ shared_libs: [
+ "libsystem_ext",
+ ],
+ nocrt: true,
+ }
+ cc_library {
+ name: "libsystem_ext",
+ system_ext_specific: true,
+ nocrt: true,
+ }
+ `)
+ testCcErrorProductVndk(t, "dependency \".*\" of \".*\" missing variant:\n.*image:", `
+ cc_library {
+ name: "libsystem",
+ shared_libs: [
+ "libproduct_va",
+ ],
+ nocrt: true,
+ }
+ cc_library {
+ name: "libproduct_va",
+ product_specific: true,
+ vendor_available: true,
+ nocrt: true,
+ }
+ `)
+}
+
func TestMakeLinkType(t *testing.T) {
bp := `
cc_library {