Add apex_available to control the availablity of a module to APEXes

apex_available property controls the availability of a module to APEXes.
For example, `apex_available: ["myapex", "otherapex"]` makes the module
available only to the two APEXes: myapex and otherapex, and nothing
else, even to the platform.

If the module is intended to be available to any APEX, then a pseudo
name "//apex_available:anyapex" can be used.

If the module is intended to be available to the platform, then another
pseudo name "//apex_available:platform" is used.

For now, if unspecified, this property defaults to ["//apex_available:platform",
"//apex_available:anyapex"], which means the module is available to everybody.
This will be reduced to ["//apex_available:platform"], when marking for
apex_available for existing modules are finished.

Bug: 139870423
Bug: 128708192
Test: m
Change-Id: Id4b233c3056c7858f984cbf9427cfac4118b2682
This commit is contained in:
Jiyong Park
2019-09-30 16:04:35 +09:00
parent fdc9afa15b
commit 127b40b316
3 changed files with 206 additions and 2 deletions

View File

@@ -78,12 +78,23 @@ type ApexModule interface {
// Return the no_apex property
NoApex() bool
// Tests if this module is available for the specified APEX or ":platform"
AvailableFor(what string) bool
}
type ApexProperties struct {
// Whether this module should not be part of any APEX. Default is false.
// TODO(b/128708192): remove this as this is equal to apex_available: [":platform"]
No_apex *bool
// Availability of this module in APEXes. Only the listed APEXes can include this module.
// "//apex_available:anyapex" is a pseudo APEX name that matches to any APEX.
// "//apex_available:platform" refers to non-APEX partitions like "system.img".
// Default is ["//apex_available:platform", "//apex_available:anyapex"].
// TODO(b/128708192) change the default to ["//apex_available:platform"]
Apex_available []string
// Name of the apex variant that this module is mutated into
ApexName string `blueprint:"mutated"`
}
@@ -136,15 +147,46 @@ func (m *ApexModuleBase) NoApex() bool {
return proptools.Bool(m.ApexProperties.No_apex)
}
const (
availableToPlatform = "//apex_available:platform"
availableToAnyApex = "//apex_available:anyapex"
)
func (m *ApexModuleBase) AvailableFor(what string) bool {
if len(m.ApexProperties.Apex_available) == 0 {
// apex_available defaults to ["//apex_available:platform", "//apex_available:anyapex"],
// which means 'available to everybody'.
return true
}
return InList(what, m.ApexProperties.Apex_available) ||
(what != availableToPlatform && InList(availableToAnyApex, m.ApexProperties.Apex_available))
}
func (m *ApexModuleBase) checkApexAvailableProperty(mctx BaseModuleContext) {
for _, n := range m.ApexProperties.Apex_available {
if n == availableToPlatform || n == availableToAnyApex {
continue
}
if !mctx.OtherModuleExists(n) {
mctx.PropertyErrorf("apex_available", "%q is not a valid module name", n)
}
}
}
func (m *ApexModuleBase) CreateApexVariations(mctx BottomUpMutatorContext) []blueprint.Module {
if len(m.apexVariations) > 0 {
m.checkApexAvailableProperty(mctx)
sort.Strings(m.apexVariations)
variations := []string{""} // Original variation for platform
variations := []string{}
availableForPlatform := m.AvailableFor(availableToPlatform)
if availableForPlatform {
variations = append(variations, "") // Original variation for platform
}
variations = append(variations, m.apexVariations...)
modules := mctx.CreateVariations(variations...)
for i, m := range modules {
if i == 0 {
if availableForPlatform && i == 0 {
continue
}
m.(ApexModule).setApexName(variations[i])