Define product_available property
To make a module available to product variants, it must define `product_available: true`. `vendor_available: true` will not create product variants any more. However, in this CL, we don't change the behavior of `vendor_available` property. It still creates both variants. After we update all Android.bp files that need to provide product variants with `product_available: true`, we may upload the remaining patches. Bug: 150902910 Test: lunch aosp_arm64-userdebug && m Change-Id: I0fd5be7bbae2c45d5cab3c3c2ca49f53a9b6f975
This commit is contained in:
110
cc/image.go
110
cc/image.go
@@ -65,8 +65,9 @@ const (
|
||||
)
|
||||
|
||||
func (ctx *moduleContext) ProductSpecific() bool {
|
||||
//TODO(b/150902910): Replace HasNonSystemVariants() with HasProductVariant()
|
||||
return ctx.ModuleContext.ProductSpecific() ||
|
||||
(ctx.mod.HasVendorVariant() && ctx.mod.inProduct())
|
||||
(ctx.mod.HasNonSystemVariants() && ctx.mod.inProduct())
|
||||
}
|
||||
|
||||
func (ctx *moduleContext) SocSpecific() bool {
|
||||
@@ -94,12 +95,21 @@ func (ctx *moduleContextImpl) inRecovery() bool {
|
||||
return ctx.mod.InRecovery()
|
||||
}
|
||||
|
||||
// Returns true only when this module is configured to have core, product and vendor
|
||||
// variants.
|
||||
// Returns true when this module is configured to have core and vendor variants.
|
||||
func (c *Module) HasVendorVariant() bool {
|
||||
return c.IsVndk() || Bool(c.VendorProperties.Vendor_available)
|
||||
}
|
||||
|
||||
// Returns true when this module is configured to have core and product variants.
|
||||
func (c *Module) HasProductVariant() bool {
|
||||
return c.IsVndk() || Bool(c.VendorProperties.Product_available)
|
||||
}
|
||||
|
||||
// Returns true when this module is configured to have core and either product or vendor variants.
|
||||
func (c *Module) HasNonSystemVariants() bool {
|
||||
return c.IsVndk() || Bool(c.VendorProperties.Vendor_available) || Bool(c.VendorProperties.Product_available)
|
||||
}
|
||||
|
||||
// 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
|
||||
@@ -139,9 +149,30 @@ func (m *Module) ImageMutatorBegin(mctx android.BaseModuleContext) {
|
||||
vendorSpecific := mctx.SocSpecific() || mctx.DeviceSpecific()
|
||||
productSpecific := mctx.ProductSpecific()
|
||||
|
||||
if m.VendorProperties.Vendor_available != nil && vendorSpecific {
|
||||
mctx.PropertyErrorf("vendor_available",
|
||||
"doesn't make sense at the same time as `vendor: true`, `proprietary: true`, or `device_specific:true`")
|
||||
if m.VendorProperties.Vendor_available != nil {
|
||||
if vendorSpecific {
|
||||
mctx.PropertyErrorf("vendor_available",
|
||||
"doesn't make sense at the same time as `vendor: true`, `proprietary: true`, or `device_specific:true`")
|
||||
}
|
||||
// If defined, make sure vendor_available and product_available has the
|
||||
// same value since `false` for these properties means the module is
|
||||
// for system only but provides the variant.
|
||||
if m.VendorProperties.Product_available != nil {
|
||||
if Bool(m.VendorProperties.Vendor_available) != Bool(m.VendorProperties.Product_available) {
|
||||
mctx.PropertyErrorf("product_available", "may not have different value than `vendor_available`")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if m.VendorProperties.Product_available != nil {
|
||||
if productSpecific {
|
||||
mctx.PropertyErrorf("product_available",
|
||||
"doesn't make sense at the same time as `product_specific: true`")
|
||||
}
|
||||
if vendorSpecific {
|
||||
mctx.PropertyErrorf("product_available",
|
||||
"cannot provide product variant from a vendor module. Please use `product_specific: true` with `vendor_available: true`")
|
||||
}
|
||||
}
|
||||
|
||||
if vndkdep := m.vndkdep; vndkdep != nil {
|
||||
@@ -153,6 +184,9 @@ func (m *Module) ImageMutatorBegin(mctx android.BaseModuleContext) {
|
||||
} else if m.VendorProperties.Vendor_available != nil {
|
||||
mctx.PropertyErrorf("vendor_available",
|
||||
"must not set at the same time as `vndk: {extends: \"...\"}`")
|
||||
} else if m.VendorProperties.Product_available != nil {
|
||||
mctx.PropertyErrorf("product_available",
|
||||
"must not set at the same time as `vndk: {extends: \"...\"}`")
|
||||
}
|
||||
} else {
|
||||
if vndkdep.isVndkExt() {
|
||||
@@ -231,21 +265,25 @@ func (m *Module) ImageMutatorBegin(mctx android.BaseModuleContext) {
|
||||
} else {
|
||||
mctx.ModuleErrorf("version is unknown for snapshot prebuilt")
|
||||
}
|
||||
} else if m.HasVendorVariant() && !m.isVndkExt() {
|
||||
// This will be available in /system, /vendor and /product
|
||||
// or a /system directory that is available to vendor and product.
|
||||
} else if m.HasNonSystemVariants() && !m.isVndkExt() {
|
||||
// This will be available to /system unless it is product_specific
|
||||
// which will be handled later.
|
||||
coreVariantNeeded = true
|
||||
|
||||
// We assume that modules under proprietary paths are compatible for
|
||||
// BOARD_VNDK_VERSION. The other modules are regarded as AOSP, or
|
||||
// PLATFORM_VNDK_VERSION.
|
||||
if isVendorProprietaryModule(mctx) {
|
||||
vendorVariants = append(vendorVariants, boardVndkVersion)
|
||||
} else {
|
||||
vendorVariants = append(vendorVariants, platformVndkVersion)
|
||||
if m.HasVendorVariant() {
|
||||
if isVendorProprietaryModule(mctx) {
|
||||
vendorVariants = append(vendorVariants, boardVndkVersion)
|
||||
} else {
|
||||
vendorVariants = append(vendorVariants, platformVndkVersion)
|
||||
}
|
||||
}
|
||||
|
||||
// vendor_available modules are also available to /product.
|
||||
// TODO(b/150902910): product variant will be created only if
|
||||
// m.HasProductVariant() is true.
|
||||
productVariants = append(productVariants, platformVndkVersion)
|
||||
// VNDK is always PLATFORM_VNDK_VERSION
|
||||
if !m.IsVndk() {
|
||||
@@ -351,6 +389,51 @@ func (c *Module) ExtraImageVariations(ctx android.BaseModuleContext) []string {
|
||||
return c.Properties.ExtraVariants
|
||||
}
|
||||
|
||||
func squashVendorSrcs(m *Module) {
|
||||
if lib, ok := m.compiler.(*libraryDecorator); ok {
|
||||
lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
|
||||
lib.baseCompiler.Properties.Target.Vendor.Srcs...)
|
||||
|
||||
lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
|
||||
lib.baseCompiler.Properties.Target.Vendor.Exclude_srcs...)
|
||||
|
||||
lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
|
||||
lib.baseCompiler.Properties.Target.Vendor.Exclude_generated_sources...)
|
||||
}
|
||||
}
|
||||
|
||||
func squashProductSrcs(m *Module) {
|
||||
if lib, ok := m.compiler.(*libraryDecorator); ok {
|
||||
lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
|
||||
lib.baseCompiler.Properties.Target.Product.Srcs...)
|
||||
|
||||
lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
|
||||
lib.baseCompiler.Properties.Target.Product.Exclude_srcs...)
|
||||
|
||||
lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
|
||||
lib.baseCompiler.Properties.Target.Product.Exclude_generated_sources...)
|
||||
}
|
||||
}
|
||||
|
||||
func squashRecoverySrcs(m *Module) {
|
||||
if lib, ok := m.compiler.(*libraryDecorator); ok {
|
||||
lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
|
||||
lib.baseCompiler.Properties.Target.Recovery.Srcs...)
|
||||
|
||||
lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
|
||||
lib.baseCompiler.Properties.Target.Recovery.Exclude_srcs...)
|
||||
|
||||
lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
|
||||
lib.baseCompiler.Properties.Target.Recovery.Exclude_generated_sources...)
|
||||
}
|
||||
}
|
||||
|
||||
func squashVendorRamdiskSrcs(m *Module) {
|
||||
if lib, ok := m.compiler.(*libraryDecorator); ok {
|
||||
lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs, lib.baseCompiler.Properties.Target.Vendor_ramdisk.Exclude_srcs...)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Module) SetImageVariation(ctx android.BaseModuleContext, variant string, module android.Module) {
|
||||
m := module.(*Module)
|
||||
if variant == android.RamdiskVariation {
|
||||
@@ -376,6 +459,7 @@ func (c *Module) SetImageVariation(ctx android.BaseModuleContext, variant string
|
||||
} else if strings.HasPrefix(variant, ProductVariationPrefix) {
|
||||
m.Properties.ImageVariationPrefix = ProductVariationPrefix
|
||||
m.Properties.VndkVersion = strings.TrimPrefix(variant, ProductVariationPrefix)
|
||||
// TODO (b/150902910): This will be replaced with squashProductSrcs(m).
|
||||
squashVendorSrcs(m)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user