diff --git a/cc/cc.go b/cc/cc.go index d282b6e35..707de026f 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -2891,12 +2891,12 @@ func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, ccDepModule, _ := ccDep.(*Module) isLLndk := ccDepModule != nil && ccDepModule.IsLlndk() isVendorPublicLib := inList(libName, *vendorPublicLibraries) - bothVendorAndCoreVariantsExist := ccDep.HasVendorVariant() || isLLndk + nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk - if c, ok := ccDep.(*Module); ok { + if ccDepModule != nil { // Use base module name for snapshots when exporting to Makefile. - if snapshotPrebuilt, ok := c.linker.(snapshotInterface); ok { - baseName := c.BaseModuleName() + if snapshotPrebuilt, ok := ccDepModule.linker.(snapshotInterface); ok { + baseName := ccDepModule.BaseModuleName() return baseName + snapshotPrebuilt.snapshotAndroidMkSuffix() } @@ -2907,10 +2907,10 @@ func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, // The vendor module is a no-vendor-variant VNDK library. Depend on the // core module instead. return libName - } else if c.UseVndk() && bothVendorAndCoreVariantsExist { - // The vendor module in Make will have been renamed to not conflict with the core - // module, so update the dependency name here accordingly. - return libName + c.getNameSuffixWithVndkVersion(ctx) + } else if ccDep.UseVndk() && nonSystemVariantsExist && ccDepModule != nil { + // The vendor and product modules in Make will have been renamed to not conflict with the + // core module, so update the dependency name here accordingly. + return libName + ccDepModule.Properties.SubName } else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib { return libName + vendorPublicLibrarySuffix } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() { diff --git a/cc/cc_test.go b/cc/cc_test.go index 7288cc476..d272a3220 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -2711,6 +2711,14 @@ const runtimeLibAndroidBp = ` nocrt : true, system_shared_libs : [], } + cc_library { + name: "libproduct_vendor", + product_specific: true, + vendor_available: true, + no_libcrt : true, + nocrt : true, + system_shared_libs : [], + } cc_library { name: "libcore", runtime_libs: ["liball_available"], @@ -2728,7 +2736,7 @@ const runtimeLibAndroidBp = ` cc_library { name: "libvendor2", vendor: true, - runtime_libs: ["liball_available", "libvendor1"], + runtime_libs: ["liball_available", "libvendor1", "libproduct_vendor"], no_libcrt : true, nocrt : true, system_shared_libs : [], @@ -2751,7 +2759,7 @@ const runtimeLibAndroidBp = ` cc_library { name: "libproduct2", product_specific: true, - runtime_libs: ["liball_available", "libproduct1"], + runtime_libs: ["liball_available", "libproduct1", "libproduct_vendor"], no_libcrt : true, nocrt : true, system_shared_libs : [], @@ -2781,7 +2789,7 @@ func TestRuntimeLibs(t *testing.T) { checkRuntimeLibs(t, []string{"liball_available.vendor"}, module) module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"liball_available.vendor", "libvendor1"}, module) + checkRuntimeLibs(t, []string{"liball_available.vendor", "libvendor1", "libproduct_vendor.vendor"}, module) // runtime_libs for product variants have '.product' suffixes if the modules have both core // and product variants. @@ -2791,7 +2799,7 @@ func TestRuntimeLibs(t *testing.T) { checkRuntimeLibs(t, []string{"liball_available.product"}, module) module = ctx.ModuleForTests("libproduct2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"liball_available.product", "libproduct1"}, module) + checkRuntimeLibs(t, []string{"liball_available.product", "libproduct1", "libproduct_vendor.product"}, module) } func TestExcludeRuntimeLibs(t *testing.T) { @@ -2817,10 +2825,10 @@ func TestRuntimeLibsNoVndk(t *testing.T) { checkRuntimeLibs(t, []string{"liball_available"}, module) module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"liball_available", "libvendor1"}, module) + checkRuntimeLibs(t, []string{"liball_available", "libvendor1", "libproduct_vendor"}, module) module = ctx.ModuleForTests("libproduct2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"liball_available", "libproduct1"}, module) + checkRuntimeLibs(t, []string{"liball_available", "libproduct1", "libproduct_vendor"}, module) } func checkStaticLibs(t *testing.T, expected []string, module *Module) { diff --git a/cc/linkable.go b/cc/linkable.go index ab5a552c1..58919a060 100644 --- a/cc/linkable.go +++ b/cc/linkable.go @@ -106,6 +106,8 @@ type LinkableInterface interface { IsVndkExt() bool IsVndkPrivate() bool HasVendorVariant() bool + HasProductVariant() bool + HasNonSystemVariants() bool InProduct() bool SdkVersion() string diff --git a/rust/image.go b/rust/image.go index 5ff10ae22..ac8c1b32c 100644 --- a/rust/image.go +++ b/rust/image.go @@ -71,6 +71,15 @@ func (mod *Module) HasVendorVariant() bool { return Bool(mod.VendorProperties.Vendor_available) || Bool(mod.VendorProperties.Odm_available) } +// Always returns false because rust modules do not support product variant. +func (mod *Module) HasProductVariant() bool { + return Bool(mod.VendorProperties.Product_available) +} + +func (mod *Module) HasNonSystemVariants() bool { + return mod.HasVendorVariant() || mod.HasProductVariant() +} + func (c *Module) InProduct() bool { return false }