Merge "Generate image variation without version" into main am: 6284e0a935 am: b562b4a727 am: a073285ee6

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/2894623

Change-Id: Idf03fc8ac2d339814abd8f2cd2b17c5e1137a826
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Kiyoung Kim
2024-01-05 06:48:47 +00:00
committed by Automerger Merge Worker
8 changed files with 127 additions and 45 deletions

View File

@@ -148,6 +148,7 @@ func TestAndroidMkCcLibrary(t *testing.T) {
cc_library {
name: "server_configurable_flags",
srcs: ["server_configurable_flags.cc"],
vendor_available: true,
}
`
result := android.GroupFixturePreparers(
@@ -155,7 +156,7 @@ func TestAndroidMkCcLibrary(t *testing.T) {
cc.PrepareForTestWithCcDefaultModules).
ExtendWithErrorHandler(android.FixtureExpectsNoErrors).RunTestWithBp(t, bp)
module := result.ModuleForTests("my_cc_library", "android_arm64_armv8-a_shared").Module()
module := result.ModuleForTests("my_cc_library", "android_vendor_arm64_armv8-a_shared").Module()
entry := android.AndroidMkEntriesForTest(t, result.TestContext, module)[0]

View File

@@ -719,7 +719,7 @@ func (a *apexBundle) combineProperties(ctx android.BottomUpMutatorContext) {
// getImageVariationPair returns a pair for the image variation name as its
// prefix and suffix. The prefix indicates whether it's core/vendor/product and the
// suffix indicates the vndk version when it's vendor or product.
// suffix indicates the vndk version for vendor/product if vndk is enabled.
// getImageVariation can simply join the result of this function to get the
// image variation name.
func (a *apexBundle) getImageVariationPair(deviceConfig android.DeviceConfig) (string, string) {
@@ -727,8 +727,8 @@ func (a *apexBundle) getImageVariationPair(deviceConfig android.DeviceConfig) (s
return cc.VendorVariationPrefix, a.vndkVersion(deviceConfig)
}
var prefix string
var vndkVersion string
prefix := android.CoreVariation
vndkVersion := ""
if deviceConfig.VndkVersion() != "" {
if a.SocSpecific() || a.DeviceSpecific() {
prefix = cc.VendorVariationPrefix
@@ -737,15 +737,18 @@ func (a *apexBundle) getImageVariationPair(deviceConfig android.DeviceConfig) (s
prefix = cc.ProductVariationPrefix
vndkVersion = deviceConfig.PlatformVndkVersion()
}
} else {
if a.SocSpecific() || a.DeviceSpecific() {
prefix = cc.VendorVariation
} else if a.ProductSpecific() {
prefix = cc.ProductVariation
}
}
if vndkVersion == "current" {
vndkVersion = deviceConfig.PlatformVndkVersion()
}
if vndkVersion != "" {
return prefix, vndkVersion
}
return android.CoreVariation, "" // The usual case
return prefix, vndkVersion
}
// getImageVariation returns the image variant name for this apexBundle. In most cases, it's simply

View File

@@ -25,6 +25,7 @@ import (
"strings"
"android/soong/testing"
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
@@ -300,8 +301,8 @@ type BaseProperties struct {
// Set by DepsMutator.
AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
// The name of the image this module is built for, suffixed with a '.'
ImageVariationPrefix string `blueprint:"mutated"`
// The name of the image this module is built for
ImageVariation string `blueprint:"mutated"`
// The VNDK version this module is built against. If empty, the module is not
// build against the VNDK.
@@ -2427,9 +2428,9 @@ func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.
// Only retrieve the snapshot on demand in order to avoid circular dependencies
// between the modules in the snapshot and the snapshot itself.
var snapshotModule []blueprint.Module
if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() && actx.OtherModuleExists("vendor_snapshot") {
snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
} else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
} else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() && actx.OtherModuleExists("recovery_snapshot") {
snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
}
if len(snapshotModule) > 0 && snapshotModule[0] != nil {

View File

@@ -26,6 +26,8 @@ import (
"android/soong/aidl_library"
"android/soong/android"
"github.com/google/blueprint"
)
func init() {
@@ -45,6 +47,14 @@ var prepareForCcTest = android.GroupFixturePreparers(
}),
)
// TODO(b/316829758) Update prepareForCcTest with this configuration and remove prepareForCcTestWithoutVndk
var prepareForCcTestWithoutVndk = android.GroupFixturePreparers(
PrepareForIntegrationTestWithCc,
android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
variables.VendorApiLevel = StringPtr("202404")
}),
)
var apexVariationName = "apex28"
var apexVersion = "28"
@@ -2640,6 +2650,7 @@ func TestLlndkLibrary(t *testing.T) {
name: "libexternal_headers",
export_include_dirs: ["include"],
vendor_available: true,
product_available: true,
}
cc_library_headers {
name: "libexternal_llndk_headers",
@@ -4784,3 +4795,51 @@ func TestStrippedAllOutputFile(t *testing.T) {
return
}
}
// TODO(b/316829758) Remove this test and do not set VNDK version from other tests
func TestImageVariantsWithoutVndk(t *testing.T) {
t.Parallel()
bp := `
cc_binary {
name: "binfoo",
srcs: ["binfoo.cc"],
vendor_available: true,
product_available: true,
shared_libs: ["libbar"]
}
cc_library {
name: "libbar",
srcs: ["libbar.cc"],
vendor_available: true,
product_available: true,
}
`
ctx := prepareForCcTestWithoutVndk.RunTestWithBp(t, bp)
hasDep := func(m android.Module, wantDep android.Module) bool {
t.Helper()
var found bool
ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
if dep == wantDep {
found = true
}
})
return found
}
testDepWithVariant := func(imageVariant string) {
imageVariantStr := ""
if imageVariant != "core" {
imageVariantStr = "_" + imageVariant
}
binFooModule := ctx.ModuleForTests("binfoo", "android"+imageVariantStr+"_arm64_armv8-a").Module()
libBarModule := ctx.ModuleForTests("libbar", "android"+imageVariantStr+"_arm64_armv8-a_shared").Module()
android.AssertBoolEquals(t, "binfoo should have dependency on libbar with image variant "+imageVariant, true, hasDep(binFooModule, libBarModule))
}
testDepWithVariant("core")
testDepWithVariant("vendor")
testDepWithVariant("product")
}

View File

@@ -42,10 +42,18 @@ const (
)
const (
// VendorVariation is the variant name used for /vendor code that does not
// compile against the VNDK.
VendorVariation = "vendor"
// VendorVariationPrefix is the variant prefix used for /vendor code that compiles
// against the VNDK.
VendorVariationPrefix = "vendor."
// ProductVariation is the variant name used for /product code that does not
// compile against the VNDK.
ProductVariation = "product"
// ProductVariationPrefix is the variant prefix used for /product code that compiles
// against the VNDK.
ProductVariationPrefix = "product."
@@ -112,12 +120,12 @@ func (c *Module) HasNonSystemVariants() bool {
// Returns true if the module is "product" variant. Usually these modules are installed in /product
func (c *Module) InProduct() bool {
return c.Properties.ImageVariationPrefix == ProductVariationPrefix
return c.Properties.ImageVariation == ProductVariation
}
// Returns true if the module is "vendor" variant. Usually these modules are installed in /vendor
func (c *Module) InVendor() bool {
return c.Properties.ImageVariationPrefix == VendorVariationPrefix
return c.Properties.ImageVariation == VendorVariation
}
func (c *Module) InRamdisk() bool {
@@ -439,10 +447,8 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) {
// and vendor and product variants will be created with LLNDK stubs.
// The LLNDK libraries need vendor variants even if there is no VNDK.
coreVariantNeeded = true
if platformVndkVersion != "" {
vendorVariants = append(vendorVariants, platformVndkVersion)
productVariants = append(productVariants, platformVndkVersion)
}
vendorVariants = append(vendorVariants, platformVndkVersion)
productVariants = append(productVariants, platformVndkVersion)
// Generate vendor variants for boardVndkVersion only if the VNDK snapshot does not
// provide the LLNDK stub libraries.
if needVndkVersionVendorVariantForLlndk {
@@ -453,13 +459,7 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) {
// for system and product.
coreVariantNeeded = true
vendorVariants = append(vendorVariants, boardVndkVersion)
if platformVndkVersion != "" {
productVariants = append(productVariants, platformVndkVersion)
}
} else if boardVndkVersion == "" {
// If the device isn't compiling against the VNDK, we always
// use the core mode.
coreVariantNeeded = true
productVariants = append(productVariants, platformVndkVersion)
} else if m.IsSnapshotPrebuilt() {
// Make vendor variants only for the versions in BOARD_VNDK_VERSION and
// PRODUCT_EXTRA_VNDK_VERSIONS.
@@ -557,11 +557,19 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) {
}
for _, variant := range android.FirstUniqueStrings(vendorVariants) {
m.AppendExtraVariant(VendorVariationPrefix + variant)
if variant == "" {
m.AppendExtraVariant(VendorVariation)
} else {
m.AppendExtraVariant(VendorVariationPrefix + variant)
}
}
for _, variant := range android.FirstUniqueStrings(productVariants) {
m.AppendExtraVariant(ProductVariationPrefix + variant)
if variant == "" {
m.AppendExtraVariant(ProductVariation)
} else {
m.AppendExtraVariant(ProductVariationPrefix + variant)
}
}
m.SetRamdiskVariantNeeded(ramdiskVariantNeeded)
@@ -672,9 +680,12 @@ func (c *Module) SetImageVariation(ctx android.BaseModuleContext, variant string
} else if variant == android.RecoveryVariation {
m.MakeAsPlatform()
squashRecoverySrcs(m)
} else if strings.HasPrefix(variant, VendorVariationPrefix) {
m.Properties.ImageVariationPrefix = VendorVariationPrefix
m.Properties.VndkVersion = strings.TrimPrefix(variant, VendorVariationPrefix)
} else if strings.HasPrefix(variant, VendorVariation) {
m.Properties.ImageVariation = VendorVariation
if strings.HasPrefix(variant, VendorVariationPrefix) {
m.Properties.VndkVersion = strings.TrimPrefix(variant, VendorVariationPrefix)
}
squashVendorSrcs(m)
// Makefile shouldn't know vendor modules other than BOARD_VNDK_VERSION.
@@ -684,9 +695,11 @@ func (c *Module) SetImageVariation(ctx android.BaseModuleContext, variant string
m.Properties.HideFromMake = true
m.HideFromMake()
}
} else if strings.HasPrefix(variant, ProductVariationPrefix) {
m.Properties.ImageVariationPrefix = ProductVariationPrefix
m.Properties.VndkVersion = strings.TrimPrefix(variant, ProductVariationPrefix)
} else if strings.HasPrefix(variant, ProductVariation) {
m.Properties.ImageVariation = ProductVariation
if strings.HasPrefix(variant, ProductVariationPrefix) {
m.Properties.VndkVersion = strings.TrimPrefix(variant, ProductVariationPrefix)
}
squashProductSrcs(m)
}

View File

@@ -2109,7 +2109,7 @@ func TestJNISDK(t *testing.T) {
Output("libjni.so").Output.String()
sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
Output("libjni.so").Output.String()
vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
vendorJNI := ctx.ModuleForTests("libvendorjni", "android_vendor_arm64_armv8-a_shared").
Output("libvendorjni.so").Output.String()
for _, test := range testCases {

View File

@@ -184,12 +184,12 @@ func (mod *Module) HasNonSystemVariants() bool {
}
func (mod *Module) InProduct() bool {
return mod.Properties.ImageVariationPrefix == cc.ProductVariationPrefix
return mod.Properties.ImageVariation == cc.ProductVariation
}
// Returns true if the module is "vendor" variant. Usually these modules are installed in /vendor
func (mod *Module) InVendor() bool {
return mod.Properties.ImageVariationPrefix == cc.VendorVariationPrefix
return mod.Properties.ImageVariation == cc.VendorVariation
}
func (mod *Module) SetImageVariation(ctx android.BaseModuleContext, variant string, module android.Module) {
@@ -198,9 +198,11 @@ func (mod *Module) SetImageVariation(ctx android.BaseModuleContext, variant stri
m.MakeAsPlatform()
} else if variant == android.RecoveryVariation {
m.MakeAsPlatform()
} else if strings.HasPrefix(variant, cc.VendorVariationPrefix) {
m.Properties.ImageVariationPrefix = cc.VendorVariationPrefix
m.Properties.VndkVersion = strings.TrimPrefix(variant, cc.VendorVariationPrefix)
} else if strings.HasPrefix(variant, cc.VendorVariation) {
m.Properties.ImageVariation = cc.VendorVariation
if strings.HasPrefix(variant, cc.VendorVariationPrefix) {
m.Properties.VndkVersion = strings.TrimPrefix(variant, cc.VendorVariationPrefix)
}
// Makefile shouldn't know vendor modules other than BOARD_VNDK_VERSION.
// Hide other vendor variants to avoid collision.
@@ -209,9 +211,11 @@ func (mod *Module) SetImageVariation(ctx android.BaseModuleContext, variant stri
m.Properties.HideFromMake = true
m.HideFromMake()
}
} else if strings.HasPrefix(variant, cc.ProductVariationPrefix) {
m.Properties.ImageVariationPrefix = cc.ProductVariationPrefix
m.Properties.VndkVersion = strings.TrimPrefix(variant, cc.ProductVariationPrefix)
} else if strings.HasPrefix(variant, cc.ProductVariation) {
m.Properties.ImageVariation = cc.ProductVariation
if strings.HasPrefix(variant, cc.ProductVariationPrefix) {
m.Properties.VndkVersion = strings.TrimPrefix(variant, cc.ProductVariationPrefix)
}
}
}

View File

@@ -20,6 +20,7 @@ import (
"android/soong/bloaty"
"android/soong/testing"
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
@@ -69,9 +70,9 @@ type BaseProperties struct {
AndroidMkProcMacroLibs []string `blueprint:"mutated"`
AndroidMkStaticLibs []string `blueprint:"mutated"`
ImageVariationPrefix string `blueprint:"mutated"`
VndkVersion string `blueprint:"mutated"`
SubName string `blueprint:"mutated"`
ImageVariation string `blueprint:"mutated"`
VndkVersion string `blueprint:"mutated"`
SubName string `blueprint:"mutated"`
// SubName is used by CC for tracking image variants / SDK versions. RustSubName is used for Rust-specific
// subnaming which shouldn't be visible to CC modules (such as the rlib stdlinkage subname). This should be