From 8a2600cfc94b89e63e8afd6c13321346a872bc1e Mon Sep 17 00:00:00 2001 From: Justin Yun Date: Mon, 7 Dec 2020 12:44:03 +0900 Subject: [PATCH] Create vndkproduct.libraries.txt Some VNDKs will be available to product modules by adding 'product_available' property. These VNDK libs will be listed in vndkproduct.libraries.txt and tracked by the build system for the changes. The product available VNDK list will be frozen by the release process. Bug: 174323911 Test: build Change-Id: Ie1b085851413a8f2273925fefdc14fec3bfc7892 --- apex/apex_test.go | 5 +- apex/vndk_test.go | 1 + cc/cc_test.go | 123 ++++++++++++++++++++++++++++++++++++---------- cc/image.go | 3 +- cc/vndk.go | 38 ++++++++++---- 5 files changed, 130 insertions(+), 40 deletions(-) diff --git a/apex/apex_test.go b/apex/apex_test.go index 84a835639..9d43348c8 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -3150,6 +3150,7 @@ func TestVndkApexCurrent(t *testing.T) { "etc/vndkcore.libraries.VER.txt", "etc/vndksp.libraries.VER.txt", "etc/vndkprivate.libraries.VER.txt", + "etc/vndkproduct.libraries.VER.txt", }) } @@ -3216,7 +3217,7 @@ func TestVndkApexWithPrebuilt(t *testing.T) { func vndkLibrariesTxtFiles(vers ...string) (result string) { for _, v := range vers { if v == "current" { - for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} { + for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} { result += ` vndk_libraries_txt { name: "` + txt + `.libraries.txt", @@ -3224,7 +3225,7 @@ func vndkLibrariesTxtFiles(vers ...string) (result string) { ` } } else { - for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} { + for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} { result += ` prebuilt_etc { name: "` + txt + `.libraries.` + v + `.txt", diff --git a/apex/vndk_test.go b/apex/vndk_test.go index 27d93ee0a..ccf4e57e6 100644 --- a/apex/vndk_test.go +++ b/apex/vndk_test.go @@ -60,6 +60,7 @@ func TestVndkApexForVndkLite(t *testing.T) { "etc/vndkcore.libraries.VER.txt", "etc/vndksp.libraries.VER.txt", "etc/vndkprivate.libraries.VER.txt", + "etc/vndkproduct.libraries.VER.txt", }) } diff --git a/cc/cc_test.go b/cc/cc_test.go index fb8533641..a8aa8a143 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -68,6 +68,7 @@ func testCc(t *testing.T, bp string) *android.TestContext { t.Helper() 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") return testCcWithConfig(t, config) @@ -81,6 +82,15 @@ func testCcNoVndk(t *testing.T, bp string) *android.TestContext { return testCcWithConfig(t, config) } +func testCcNoProductVndk(t *testing.T, bp string) *android.TestContext { + t.Helper() + config := TestConfig(buildDir, android.Android, nil, bp, nil) + config.TestProductVariables.DeviceVndkVersion = StringPtr("current") + config.TestProductVariables.Platform_vndk_version = StringPtr("VER") + + return testCcWithConfig(t, config) +} + func testCcErrorWithConfig(t *testing.T, pattern string, config android.Config) { t.Helper() @@ -420,6 +430,9 @@ func TestVndk(t *testing.T) { vndk_libraries_txt { name: "vndkprivate.libraries.txt", } + vndk_libraries_txt { + name: "vndkproduct.libraries.txt", + } vndk_libraries_txt { name: "vndkcorevariant.libraries.txt", } @@ -445,7 +458,6 @@ func TestVndk(t *testing.T) { checkVndkModule(t, ctx, "libvndk_sp_product_private", "", true, "", productVariant) // Check VNDK snapshot output. - snapshotDir := "vndk-snapshot" snapshotVariantPath := filepath.Join(buildDir, snapshotDir, "arm64") @@ -476,6 +488,7 @@ func TestVndk(t *testing.T) { checkSnapshot(t, ctx, snapshotSingleton, "vndkcore.libraries.txt", "vndkcore.libraries.txt", snapshotConfigsPath, "") checkSnapshot(t, ctx, snapshotSingleton, "vndksp.libraries.txt", "vndksp.libraries.txt", snapshotConfigsPath, "") checkSnapshot(t, ctx, snapshotSingleton, "vndkprivate.libraries.txt", "vndkprivate.libraries.txt", snapshotConfigsPath, "") + checkSnapshot(t, ctx, snapshotSingleton, "vndkproduct.libraries.txt", "vndkproduct.libraries.txt", snapshotConfigsPath, "") checkVndkOutput(t, ctx, "vndk/vndk.libraries.txt", []string{ "LLNDK: libc.so", @@ -493,11 +506,15 @@ func TestVndk(t *testing.T) { "VNDK-private: libvndk-private.so", "VNDK-private: libvndk_sp_private-x.so", "VNDK-private: libvndk_sp_product_private-x.so", + "VNDK-product: libc++.so", + "VNDK-product: libvndk_product.so", + "VNDK-product: libvndk_sp_product_private-x.so", }) checkVndkLibrariesOutput(t, ctx, "llndk.libraries.txt", []string{"libc.so", "libdl.so", "libft2.so", "libm.so"}) checkVndkLibrariesOutput(t, ctx, "vndkcore.libraries.txt", []string{"libvndk-private.so", "libvndk.so", "libvndk_product.so"}) checkVndkLibrariesOutput(t, ctx, "vndksp.libraries.txt", []string{"libc++.so", "libvndk_sp-x.so", "libvndk_sp_private-x.so", "libvndk_sp_product_private-x.so"}) checkVndkLibrariesOutput(t, ctx, "vndkprivate.libraries.txt", []string{"libft2.so", "libvndk-private.so", "libvndk_sp_private-x.so", "libvndk_sp_product_private-x.so"}) + checkVndkLibrariesOutput(t, ctx, "vndkproduct.libraries.txt", []string{"libc++.so", "libvndk_product.so", "libvndk_sp_product_private-x.so"}) checkVndkLibrariesOutput(t, ctx, "vndkcorevariant.libraries.txt", nil) } @@ -711,6 +728,15 @@ func TestVndkWhenVndkVersionIsNotSet(t *testing.T) { }, nocrt: true, } + cc_library { + name: "libvndk-private", + vendor_available: false, + product_available: false, + vndk: { + enabled: true, + }, + nocrt: true, + } `) checkVndkOutput(t, ctx, "vndk/vndk.libraries.txt", []string{ @@ -719,8 +745,13 @@ func TestVndkWhenVndkVersionIsNotSet(t *testing.T) { "LLNDK: libft2.so", "LLNDK: libm.so", "VNDK-SP: libc++.so", + "VNDK-core: libvndk-private.so", "VNDK-core: libvndk.so", "VNDK-private: libft2.so", + "VNDK-private: libvndk-private.so", + "VNDK-product: libc++.so", + "VNDK-product: libvndk-private.so", + "VNDK-product: libvndk.so", }) } @@ -2088,7 +2119,7 @@ func TestVndkExtWithoutBoardVndkVersion(t *testing.T) { func TestVndkExtWithoutProductVndkVersion(t *testing.T) { // This test checks the VNDK-Ext properties when PRODUCT_PRODUCT_VNDK_VERSION is not set. - ctx := testCc(t, ` + ctx := testCcNoProductVndk(t, ` cc_library { name: "libvndk", vendor_available: true, @@ -3399,9 +3430,18 @@ func checkRuntimeLibs(t *testing.T, expected []string, module *Module) { } const runtimeLibAndroidBp = ` + cc_library { + name: "liball_available", + vendor_available: true, + product_available: true, + no_libcrt : true, + nocrt : true, + system_shared_libs : [], + } cc_library { name: "libvendor_available1", vendor_available: true, + runtime_libs: ["liball_available"], no_libcrt : true, nocrt : true, system_shared_libs : [], @@ -3409,18 +3449,10 @@ const runtimeLibAndroidBp = ` cc_library { name: "libvendor_available2", vendor_available: true, - runtime_libs: ["libvendor_available1"], - no_libcrt : true, - nocrt : true, - system_shared_libs : [], - } - cc_library { - name: "libvendor_available3", - vendor_available: true, - runtime_libs: ["libvendor_available1"], + runtime_libs: ["liball_available"], target: { vendor: { - exclude_runtime_libs: ["libvendor_available1"], + exclude_runtime_libs: ["liball_available"], } }, no_libcrt : true, @@ -3429,7 +3461,7 @@ const runtimeLibAndroidBp = ` } cc_library { name: "libcore", - runtime_libs: ["libvendor_available1"], + runtime_libs: ["liball_available"], no_libcrt : true, nocrt : true, system_shared_libs : [], @@ -3444,7 +3476,30 @@ const runtimeLibAndroidBp = ` cc_library { name: "libvendor2", vendor: true, - runtime_libs: ["libvendor_available1", "libvendor1"], + runtime_libs: ["liball_available", "libvendor1"], + no_libcrt : true, + nocrt : true, + system_shared_libs : [], + } + cc_library { + name: "libproduct_available1", + product_available: true, + runtime_libs: ["liball_available"], + no_libcrt : true, + nocrt : true, + system_shared_libs : [], + } + cc_library { + name: "libproduct1", + product_specific: true, + no_libcrt : true, + nocrt : true, + system_shared_libs : [], + } + cc_library { + name: "libproduct2", + product_specific: true, + runtime_libs: ["liball_available", "libproduct1"], no_libcrt : true, nocrt : true, system_shared_libs : [], @@ -3457,32 +3512,45 @@ func TestRuntimeLibs(t *testing.T) { // runtime_libs for core variants use the module names without suffixes. variant := "android_arm64_armv8-a_shared" - module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"libvendor_available1"}, module) + module := ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module) + checkRuntimeLibs(t, []string{"liball_available"}, module) + + module = ctx.ModuleForTests("libproduct_available1", variant).Module().(*Module) + checkRuntimeLibs(t, []string{"liball_available"}, module) module = ctx.ModuleForTests("libcore", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"libvendor_available1"}, module) + checkRuntimeLibs(t, []string{"liball_available"}, module) // runtime_libs for vendor variants have '.vendor' suffixes if the modules have both core // and vendor variants. variant = "android_vendor.VER_arm64_armv8-a_shared" - module = ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"libvendor_available1.vendor"}, module) + module = ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module) + checkRuntimeLibs(t, []string{"liball_available.vendor"}, module) module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"libvendor_available1.vendor", "libvendor1"}, module) + checkRuntimeLibs(t, []string{"liball_available.vendor", "libvendor1"}, module) + + // runtime_libs for product variants have '.product' suffixes if the modules have both core + // and product variants. + variant = "android_product.VER_arm64_armv8-a_shared" + + module = ctx.ModuleForTests("libproduct_available1", variant).Module().(*Module) + checkRuntimeLibs(t, []string{"liball_available.product"}, module) + + module = ctx.ModuleForTests("libproduct2", variant).Module().(*Module) + checkRuntimeLibs(t, []string{"liball_available.product", "libproduct1"}, module) } func TestExcludeRuntimeLibs(t *testing.T) { ctx := testCc(t, runtimeLibAndroidBp) variant := "android_arm64_armv8-a_shared" - module := ctx.ModuleForTests("libvendor_available3", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"libvendor_available1"}, module) + module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module) + checkRuntimeLibs(t, []string{"liball_available"}, module) variant = "android_vendor.VER_arm64_armv8-a_shared" - module = ctx.ModuleForTests("libvendor_available3", variant).Module().(*Module) + module = ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module) checkRuntimeLibs(t, nil, module) } @@ -3493,11 +3561,14 @@ func TestRuntimeLibsNoVndk(t *testing.T) { variant := "android_arm64_armv8-a_shared" - module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"libvendor_available1"}, module) + module := ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module) + checkRuntimeLibs(t, []string{"liball_available"}, module) module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"libvendor_available1", "libvendor1"}, module) + checkRuntimeLibs(t, []string{"liball_available", "libvendor1"}, module) + + module = ctx.ModuleForTests("libproduct2", variant).Module().(*Module) + checkRuntimeLibs(t, []string{"liball_available", "libproduct1"}, module) } func checkStaticLibs(t *testing.T, expected []string, module *Module) { diff --git a/cc/image.go b/cc/image.go index 13d77cc2d..623b9eea2 100644 --- a/cc/image.go +++ b/cc/image.go @@ -67,9 +67,8 @@ const ( ) func (ctx *moduleContext) ProductSpecific() bool { - //TODO(b/150902910): Replace HasNonSystemVariants() with HasProductVariant() return ctx.ModuleContext.ProductSpecific() || - (ctx.mod.HasNonSystemVariants() && ctx.mod.InProduct()) + (ctx.mod.HasProductVariant() && ctx.mod.InProduct()) } func (ctx *moduleContext) SocSpecific() bool { diff --git a/cc/vndk.go b/cc/vndk.go index 6bc713135..2071a0302 100644 --- a/cc/vndk.go +++ b/cc/vndk.go @@ -35,6 +35,7 @@ const ( vndkCoreLibrariesTxt = "vndkcore.libraries.txt" vndkSpLibrariesTxt = "vndksp.libraries.txt" vndkPrivateLibrariesTxt = "vndkprivate.libraries.txt" + vndkProductLibrariesTxt = "vndkproduct.libraries.txt" vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt" ) @@ -45,6 +46,7 @@ func VndkLibrariesTxtModules(vndkVersion string) []string { vndkCoreLibrariesTxt, vndkSpLibrariesTxt, vndkPrivateLibrariesTxt, + vndkProductLibrariesTxt, } } // Snapshot vndks have their own *.libraries.VER.txt files. @@ -54,6 +56,7 @@ func VndkLibrariesTxtModules(vndkVersion string) []string { insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion), insertVndkVersion(vndkSpLibrariesTxt, vndkVersion), insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion), + insertVndkVersion(vndkProductLibrariesTxt, vndkVersion), } } @@ -229,10 +232,11 @@ func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error { } var ( - vndkCoreLibrariesKey = android.NewOnceKey("vndkCoreLibrarires") - vndkSpLibrariesKey = android.NewOnceKey("vndkSpLibrarires") - llndkLibrariesKey = android.NewOnceKey("llndkLibrarires") - vndkPrivateLibrariesKey = android.NewOnceKey("vndkPrivateLibrarires") + vndkCoreLibrariesKey = android.NewOnceKey("vndkCoreLibraries") + vndkSpLibrariesKey = android.NewOnceKey("vndkSpLibraries") + llndkLibrariesKey = android.NewOnceKey("llndkLibraries") + vndkPrivateLibrariesKey = android.NewOnceKey("vndkPrivateLibraries") + vndkProductLibrariesKey = android.NewOnceKey("vndkProductLibraries") vndkUsingCoreVariantLibrariesKey = android.NewOnceKey("vndkUsingCoreVariantLibraries") vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey") vndkLibrariesLock sync.Mutex @@ -262,6 +266,12 @@ func vndkPrivateLibraries(config android.Config) map[string]string { }).(map[string]string) } +func vndkProductLibraries(config android.Config) map[string]string { + return config.Once(vndkProductLibrariesKey, func() interface{} { + return make(map[string]string) + }).(map[string]string) +} + func vndkUsingCoreVariantLibraries(config android.Config) map[string]string { return config.Once(vndkUsingCoreVariantLibrariesKey, func() interface{} { return make(map[string]string) @@ -299,6 +309,12 @@ func processLlndkLibrary(mctx android.BottomUpMutatorContext, m *Module) { } 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() filename, err := getVndkFileName(m) if err != nil { @@ -318,12 +334,6 @@ func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) { vndkLibrariesLock.Lock() defer vndkLibrariesLock.Unlock() - if m.InProduct() { - // We may skip the other steps for the product variants because they - // are already covered by the vendor variants. - return - } - if inList(name, vndkMustUseVendorVariantList(mctx.Config())) { m.Properties.MustUseVendorVariant = true } @@ -339,6 +349,9 @@ func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) { if m.IsVndkPrivate() { vndkPrivateLibraries(mctx.Config())[name] = filename } + if m.VendorProperties.Product_available != nil { + vndkProductLibraries(mctx.Config())[name] = filename + } } // Check for modules that mustn't be VNDK @@ -453,6 +466,7 @@ var _ android.OutputFileProducer = &vndkLibrariesTxt{} // - vndkcore.libraries.txt // - vndksp.libraries.txt // - vndkprivate.libraries.txt +// - vndkproduct.libraries.txt // - vndkcorevariant.libraries.txt // A module behaves like a prebuilt_etc but its content is generated by soong. // By being a soong module, these files can be referenced by other soong modules. @@ -486,6 +500,8 @@ func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleConte list = android.SortedStringMapValues(vndkSpLibraries(ctx.Config())) case vndkPrivateLibrariesTxt: list = android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config())) + case vndkProductLibrariesTxt: + list = android.SortedStringMapValues(vndkProductLibraries(ctx.Config())) case vndkUsingCoreVariantLibrariesTxt: list = android.SortedStringMapValues(vndkUsingCoreVariantLibraries(ctx.Config())) default: @@ -807,6 +823,7 @@ func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.Singleton vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config())) vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config())) vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config())) + vndkproduct := android.SortedStringMapValues(vndkProductLibraries(ctx.Config())) // Build list of vndk libs as merged & tagged & filter-out(libclang_rt): // Since each target have different set of libclang_rt.* files, @@ -824,6 +841,7 @@ func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.Singleton merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...) merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...) merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...) + merged = append(merged, addPrefix(filterOutLibClangRt(vndkproduct), "VNDK-product: ")...) c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt") android.WriteFileRule(ctx, c.vndkLibrariesFile, strings.Join(merged, "\n")) }