Use target dependent module to update the name suffix

The module names for vendor and product variants have the image
variant suffix to avoid conflict with the core modules. It requires
updating the module names in the dependency tree with the suffixes.

We had a hidden bug that used the original module properties to
update the names of its dependent modules.
Also, it must cover the product variants modules.

Test: updated cc_test.go and build
Change-Id: I6b4ea062d13c8fac1e699138d44376e52e0d7852
This commit is contained in:
Justin Yun 2021-02-03 19:24:13 +09:00
parent e1f9b35d92
commit cbca373efa
4 changed files with 33 additions and 14 deletions

View file

@ -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() {

View file

@ -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) {

View file

@ -106,6 +106,8 @@ type LinkableInterface interface {
IsVndkExt() bool
IsVndkPrivate() bool
HasVendorVariant() bool
HasProductVariant() bool
HasNonSystemVariants() bool
InProduct() bool
SdkVersion() string

View file

@ -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
}