Convert python_version mutator to TransitionMutator

Replace python.versionMutator with a TransitionMutator.

Bug: 319288033
Flag: EXEMPT refactor
Test: all soong tests pass
Change-Id: I12eafbe0563b202db8cadf69cbacdf39ce6f11b5
This commit is contained in:
Colin Cross
2024-05-21 15:19:18 -07:00
parent 8a49a3dd76
commit e0771288c1

View File

@@ -38,7 +38,7 @@ func registerPythonMutators(ctx android.RegistrationContext) {
// Exported to support other packages using Python modules in tests. // Exported to support other packages using Python modules in tests.
func RegisterPythonPreDepsMutators(ctx android.RegisterMutatorsContext) { func RegisterPythonPreDepsMutators(ctx android.RegisterMutatorsContext) {
ctx.BottomUp("python_version", versionSplitMutator()).Parallel() ctx.Transition("python_version", &versionSplitTransitionMutator{})
} }
// the version-specific properties that apply to python modules. // the version-specific properties that apply to python modules.
@@ -245,7 +245,6 @@ var (
protoExt = ".proto" protoExt = ".proto"
pyVersion2 = "PY2" pyVersion2 = "PY2"
pyVersion3 = "PY3" pyVersion3 = "PY3"
pyVersion2And3 = "PY2ANDPY3"
internalPath = "internal" internalPath = "internal"
) )
@@ -253,46 +252,68 @@ type basePropertiesProvider interface {
getBaseProperties() *BaseProperties getBaseProperties() *BaseProperties
} }
// versionSplitMutator creates version variants for modules and appends the version-specific type versionSplitTransitionMutator struct{}
// properties for a given variant to the properties in the variant module
func versionSplitMutator() func(android.BottomUpMutatorContext) { func (versionSplitTransitionMutator) Split(ctx android.BaseModuleContext) []string {
return func(mctx android.BottomUpMutatorContext) { if base, ok := ctx.Module().(basePropertiesProvider); ok {
if base, ok := mctx.Module().(basePropertiesProvider); ok { props := base.getBaseProperties()
props := base.getBaseProperties() var variants []string
var versionNames []string // PY3 is first so that we alias the PY3 variant rather than PY2 if both
// collect version specific properties, so that we can merge version-specific properties // are available
// into the module's overall properties if proptools.BoolDefault(props.Version.Py3.Enabled, true) {
var versionProps []VersionProperties variants = append(variants, pyVersion3)
// PY3 is first so that we alias the PY3 variant rather than PY2 if both }
// are available if proptools.BoolDefault(props.Version.Py2.Enabled, false) {
if proptools.BoolDefault(props.Version.Py3.Enabled, true) { if !ctx.DeviceConfig().BuildBrokenUsesSoongPython2Modules() &&
versionNames = append(versionNames, pyVersion3) ctx.ModuleName() != "py2-cmd" &&
versionProps = append(versionProps, props.Version.Py3) ctx.ModuleName() != "py2-stdlib" {
} ctx.PropertyErrorf("version.py2.enabled", "Python 2 is no longer supported, please convert to python 3. This error can be temporarily overridden by setting BUILD_BROKEN_USES_SOONG_PYTHON2_MODULES := true in the product configuration")
if proptools.BoolDefault(props.Version.Py2.Enabled, false) {
if !mctx.DeviceConfig().BuildBrokenUsesSoongPython2Modules() &&
mctx.ModuleName() != "py2-cmd" &&
mctx.ModuleName() != "py2-stdlib" {
mctx.PropertyErrorf("version.py2.enabled", "Python 2 is no longer supported, please convert to python 3. This error can be temporarily overridden by setting BUILD_BROKEN_USES_SOONG_PYTHON2_MODULES := true in the product configuration")
}
versionNames = append(versionNames, pyVersion2)
versionProps = append(versionProps, props.Version.Py2)
}
modules := mctx.CreateLocalVariations(versionNames...)
// Alias module to the first variant
if len(versionNames) > 0 {
mctx.AliasVariation(versionNames[0])
}
for i, v := range versionNames {
// set the actual version for Python module.
newProps := modules[i].(basePropertiesProvider).getBaseProperties()
newProps.Actual_version = v
// append versioned properties for the Python module to the overall properties
err := proptools.AppendMatchingProperties([]interface{}{newProps}, &versionProps[i], nil)
if err != nil {
panic(err)
}
} }
variants = append(variants, pyVersion2)
}
return variants
}
return []string{""}
}
func (versionSplitTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string {
return ""
}
func (versionSplitTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string {
if incomingVariation != "" {
return incomingVariation
}
if base, ok := ctx.Module().(basePropertiesProvider); ok {
props := base.getBaseProperties()
if proptools.BoolDefault(props.Version.Py3.Enabled, true) {
return pyVersion3
} else {
return pyVersion2
}
}
return ""
}
func (versionSplitTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) {
if variation == "" {
return
}
if base, ok := ctx.Module().(basePropertiesProvider); ok {
props := base.getBaseProperties()
props.Actual_version = variation
var versionProps *VersionProperties
if variation == pyVersion3 {
versionProps = &props.Version.Py3
} else if variation == pyVersion2 {
versionProps = &props.Version.Py2
}
err := proptools.AppendMatchingProperties([]interface{}{props}, versionProps, nil)
if err != nil {
panic(err)
} }
} }
} }