Merge "apexDepsMutator is a top-down mutator" am: 680afd7bc7
Change-Id: I531b18b61409e49cfb49b62ab6cdf16d4193b600
This commit is contained in:
@@ -38,9 +38,12 @@ type ApexModule interface {
|
|||||||
Module
|
Module
|
||||||
apexModuleBase() *ApexModuleBase
|
apexModuleBase() *ApexModuleBase
|
||||||
|
|
||||||
// Marks that this module should be built for the APEX of the specified name.
|
// Marks that this module should be built for the APEXes of the specified names.
|
||||||
// Call this before apex.apexMutator is run.
|
// Call this before apex.apexMutator is run.
|
||||||
BuildForApex(apexName string)
|
BuildForApexes(apexNames []string)
|
||||||
|
|
||||||
|
// Returns the name of the APEXes that this modoule will be built for
|
||||||
|
ApexVariations() []string
|
||||||
|
|
||||||
// Returns the name of APEX that this module will be built for. Empty string
|
// Returns the name of APEX that this module will be built for. Empty string
|
||||||
// is returned when 'IsForPlatform() == true'. Note that a module can be
|
// is returned when 'IsForPlatform() == true'. Note that a module can be
|
||||||
@@ -66,7 +69,7 @@ type ApexModule interface {
|
|||||||
IsInstallableToApex() bool
|
IsInstallableToApex() bool
|
||||||
|
|
||||||
// Mutate this module into one or more variants each of which is built
|
// Mutate this module into one or more variants each of which is built
|
||||||
// for an APEX marked via BuildForApex().
|
// for an APEX marked via BuildForApexes().
|
||||||
CreateApexVariations(mctx BottomUpMutatorContext) []Module
|
CreateApexVariations(mctx BottomUpMutatorContext) []Module
|
||||||
|
|
||||||
// Sets the name of the apex variant of this module. Called inside
|
// Sets the name of the apex variant of this module. Called inside
|
||||||
@@ -110,14 +113,20 @@ func (m *ApexModuleBase) apexModuleBase() *ApexModuleBase {
|
|||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ApexModuleBase) BuildForApex(apexName string) {
|
func (m *ApexModuleBase) BuildForApexes(apexNames []string) {
|
||||||
m.apexVariationsLock.Lock()
|
m.apexVariationsLock.Lock()
|
||||||
defer m.apexVariationsLock.Unlock()
|
defer m.apexVariationsLock.Unlock()
|
||||||
if !InList(apexName, m.apexVariations) {
|
for _, apexName := range apexNames {
|
||||||
m.apexVariations = append(m.apexVariations, apexName)
|
if !InList(apexName, m.apexVariations) {
|
||||||
|
m.apexVariations = append(m.apexVariations, apexName)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *ApexModuleBase) ApexVariations() []string {
|
||||||
|
return m.apexVariations
|
||||||
|
}
|
||||||
|
|
||||||
func (m *ApexModuleBase) ApexName() string {
|
func (m *ApexModuleBase) ApexName() string {
|
||||||
return m.ApexProperties.ApexName
|
return m.ApexProperties.ApexName
|
||||||
}
|
}
|
||||||
@@ -218,18 +227,20 @@ func apexNamesMap() map[string]map[string]bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update the map to mark that a module named moduleName is directly or indirectly
|
// Update the map to mark that a module named moduleName is directly or indirectly
|
||||||
// depended on by an APEX named apexName. Directly depending means that a module
|
// depended on by the specified APEXes. Directly depending means that a module
|
||||||
// is explicitly listed in the build definition of the APEX via properties like
|
// is explicitly listed in the build definition of the APEX via properties like
|
||||||
// native_shared_libs, java_libs, etc.
|
// native_shared_libs, java_libs, etc.
|
||||||
func UpdateApexDependency(apexName string, moduleName string, directDep bool) {
|
func UpdateApexDependency(apexNames []string, moduleName string, directDep bool) {
|
||||||
apexNamesMapMutex.Lock()
|
apexNamesMapMutex.Lock()
|
||||||
defer apexNamesMapMutex.Unlock()
|
defer apexNamesMapMutex.Unlock()
|
||||||
apexNames, ok := apexNamesMap()[moduleName]
|
for _, apexName := range apexNames {
|
||||||
if !ok {
|
apexesForModule, ok := apexNamesMap()[moduleName]
|
||||||
apexNames = make(map[string]bool)
|
if !ok {
|
||||||
apexNamesMap()[moduleName] = apexNames
|
apexesForModule = make(map[string]bool)
|
||||||
|
apexNamesMap()[moduleName] = apexesForModule
|
||||||
|
}
|
||||||
|
apexesForModule[apexName] = apexesForModule[apexName] || directDep
|
||||||
}
|
}
|
||||||
apexNames[apexName] = apexNames[apexName] || directDep
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(b/146393795): remove this when b/146393795 is fixed
|
// TODO(b/146393795): remove this when b/146393795 is fixed
|
||||||
|
39
apex/apex.go
39
apex/apex.go
@@ -1020,7 +1020,7 @@ func RegisterPreDepsMutators(ctx android.RegisterMutatorsContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RegisterPostDepsMutators(ctx android.RegisterMutatorsContext) {
|
func RegisterPostDepsMutators(ctx android.RegisterMutatorsContext) {
|
||||||
ctx.BottomUp("apex_deps", apexDepsMutator)
|
ctx.TopDown("apex_deps", apexDepsMutator)
|
||||||
ctx.BottomUp("apex", apexMutator).Parallel()
|
ctx.BottomUp("apex", apexMutator).Parallel()
|
||||||
ctx.BottomUp("apex_flattened", apexFlattenedMutator).Parallel()
|
ctx.BottomUp("apex_flattened", apexFlattenedMutator).Parallel()
|
||||||
ctx.BottomUp("apex_uses", apexUsesMutator).Parallel()
|
ctx.BottomUp("apex_uses", apexUsesMutator).Parallel()
|
||||||
@@ -1028,24 +1028,29 @@ func RegisterPostDepsMutators(ctx android.RegisterMutatorsContext) {
|
|||||||
|
|
||||||
// Mark the direct and transitive dependencies of apex bundles so that they
|
// Mark the direct and transitive dependencies of apex bundles so that they
|
||||||
// can be built for the apex bundles.
|
// can be built for the apex bundles.
|
||||||
func apexDepsMutator(mctx android.BottomUpMutatorContext) {
|
func apexDepsMutator(mctx android.TopDownMutatorContext) {
|
||||||
|
var apexBundleNames []string
|
||||||
|
var directDep bool
|
||||||
if a, ok := mctx.Module().(*apexBundle); ok && !a.vndkApex {
|
if a, ok := mctx.Module().(*apexBundle); ok && !a.vndkApex {
|
||||||
apexBundleName := mctx.ModuleName()
|
apexBundleNames = []string{mctx.ModuleName()}
|
||||||
mctx.WalkDeps(func(child, parent android.Module) bool {
|
directDep = true
|
||||||
depName := mctx.OtherModuleName(child)
|
} else if am, ok := mctx.Module().(android.ApexModule); ok {
|
||||||
// If the parent is apexBundle, this child is directly depended.
|
apexBundleNames = am.ApexVariations()
|
||||||
_, directDep := parent.(*apexBundle)
|
directDep = false
|
||||||
android.UpdateApexDependency(apexBundleName, depName, directDep)
|
|
||||||
|
|
||||||
if am, ok := child.(android.ApexModule); ok && am.CanHaveApexVariants() &&
|
|
||||||
(directDep || am.DepIsInSameApex(mctx, child)) {
|
|
||||||
am.BuildForApex(apexBundleName)
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(apexBundleNames) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mctx.VisitDirectDeps(func(child android.Module) {
|
||||||
|
depName := mctx.OtherModuleName(child)
|
||||||
|
if am, ok := child.(android.ApexModule); ok && am.CanHaveApexVariants() &&
|
||||||
|
(directDep || am.DepIsInSameApex(mctx, child)) {
|
||||||
|
android.UpdateApexDependency(apexBundleNames, depName, directDep)
|
||||||
|
am.BuildForApexes(apexBundleNames)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create apex variations if a module is included in APEX(s).
|
// Create apex variations if a module is included in APEX(s).
|
||||||
|
Reference in New Issue
Block a user