Create os and arch variants for GoBinaryTool modules

AddFarVariationDependencies was broken, which allowed modules to add
dependencies on GoBinaryTool modules using os and arch variations
even though GoBinaryTool modules did not have any variations.  Mutate
GoBinaryTool modules in the os and arch mutators so that they have the
expected os and arch variations.

Test: all soong tests
Change-Id: Ida7bc75a51ab1d2d38a6be11f574399097380cc9
This commit is contained in:
Colin Cross 2020-08-24 18:04:09 -07:00
parent 9e93b1bb12
commit 1ec1255476
2 changed files with 44 additions and 13 deletions

View File

@ -23,6 +23,7 @@ import (
"strings"
"github.com/google/blueprint"
"github.com/google/blueprint/bootstrap"
"github.com/google/blueprint/proptools"
)
@ -689,15 +690,24 @@ func (target Target) Variations() []blueprint.Variation {
}
}
func osMutator(mctx BottomUpMutatorContext) {
func osMutator(bpctx blueprint.BottomUpMutatorContext) {
var module Module
var ok bool
if module, ok = mctx.Module().(Module); !ok {
if module, ok = bpctx.Module().(Module); !ok {
if _, ok := bpctx.Module().(bootstrap.GoBinaryTool); ok {
// Go tools are always build OS tools.
bpctx.CreateVariations(bpctx.Config().(Config).BuildOSTarget.OsVariation())
}
return
}
base := module.base()
// GoBinaryTool support above requires this mutator to be a blueprint.BottomUpMutatorContext
// because android.BottomUpMutatorContext filters out non-Soong modules. Now that we've
// handled them, create a normal android.BottomUpMutatorContext.
mctx := bottomUpMutatorContextFactory(bpctx, module, false)
if !base.ArchSpecific() {
return
}
@ -819,15 +829,24 @@ func GetOsSpecificVariantsOfCommonOSVariant(mctx BaseModuleContext) []Module {
//
// Modules can be initialized with InitAndroidMultiTargetsArchModule, in which case they will be split by OsClass,
// but will have a common Target that is expected to handle all other selected Targets via ctx.MultiTargets().
func archMutator(mctx BottomUpMutatorContext) {
func archMutator(bpctx blueprint.BottomUpMutatorContext) {
var module Module
var ok bool
if module, ok = mctx.Module().(Module); !ok {
if module, ok = bpctx.Module().(Module); !ok {
if _, ok := bpctx.Module().(bootstrap.GoBinaryTool); ok {
// Go tools are always build OS tools.
bpctx.CreateVariations(bpctx.Config().(Config).BuildOSTarget.ArchVariation())
}
return
}
base := module.base()
// GoBinaryTool support above requires this mutator to be a blueprint.BottomUpMutatorContext
// because android.BottomUpMutatorContext filters out non-Soong modules. Now that we've
// handled them, create a normal android.BottomUpMutatorContext.
mctx := bottomUpMutatorContextFactory(bpctx, module, false)
if !base.ArchSpecific() {
return
}
@ -903,7 +922,7 @@ func archMutator(mctx BottomUpMutatorContext) {
modules := mctx.CreateVariations(targetNames...)
for i, m := range modules {
addTargetProperties(m, targets[i], multiTargets, i == 0)
m.(Module).base().setArchProperties(mctx)
m.base().setArchProperties(mctx)
}
}

View File

@ -75,6 +75,7 @@ type registerMutatorsContext struct {
type RegisterMutatorsContext interface {
TopDown(name string, m TopDownMutator) MutatorHandle
BottomUp(name string, m BottomUpMutator) MutatorHandle
BottomUpBlueprint(name string, m blueprint.BottomUpMutator) MutatorHandle
}
type RegisterMutatorFunc func(RegisterMutatorsContext)
@ -143,9 +144,9 @@ var preArch = []RegisterMutatorFunc{
}
func registerArchMutator(ctx RegisterMutatorsContext) {
ctx.BottomUp("os", osMutator).Parallel()
ctx.BottomUpBlueprint("os", osMutator).Parallel()
ctx.BottomUp("image", imageMutator).Parallel()
ctx.BottomUp("arch", archMutator).Parallel()
ctx.BottomUpBlueprint("arch", archMutator).Parallel()
}
var preDeps = []RegisterMutatorFunc{
@ -225,16 +226,21 @@ type bottomUpMutatorContext struct {
finalPhase bool
}
func bottomUpMutatorContextFactory(ctx blueprint.BottomUpMutatorContext, a Module,
finalPhase bool) BottomUpMutatorContext {
return &bottomUpMutatorContext{
bp: ctx,
baseModuleContext: a.base().baseModuleContextFactory(ctx),
finalPhase: finalPhase,
}
}
func (x *registerMutatorsContext) BottomUp(name string, m BottomUpMutator) MutatorHandle {
finalPhase := x.finalPhase
f := func(ctx blueprint.BottomUpMutatorContext) {
if a, ok := ctx.Module().(Module); ok {
actx := &bottomUpMutatorContext{
bp: ctx,
baseModuleContext: a.base().baseModuleContextFactory(ctx),
finalPhase: finalPhase,
}
m(actx)
m(bottomUpMutatorContextFactory(ctx, a, finalPhase))
}
}
mutator := &mutator{name: name, bottomUpMutator: f}
@ -242,6 +248,12 @@ func (x *registerMutatorsContext) BottomUp(name string, m BottomUpMutator) Mutat
return mutator
}
func (x *registerMutatorsContext) BottomUpBlueprint(name string, m blueprint.BottomUpMutator) MutatorHandle {
mutator := &mutator{name: name, bottomUpMutator: m}
x.mutators = append(x.mutators, mutator)
return mutator
}
func (x *registerMutatorsContext) TopDown(name string, m TopDownMutator) MutatorHandle {
f := func(ctx blueprint.TopDownMutatorContext) {
if a, ok := ctx.Module().(Module); ok {