Convert version mutator to TransitionMutator

Replace cc.versionMutator with a TransitionMutator.

Bug: 319288033
Flag: EXEMPT refactor
Test: all soong tests pass
Change-Id: Idfd4157115d6f03997a339b43b3da9c2dfe2418d
This commit is contained in:
Colin Cross
2024-05-22 09:57:59 -07:00
parent e0771288c1
commit add04a8c94
4 changed files with 96 additions and 72 deletions

View File

@@ -51,7 +51,7 @@ func RegisterCCBuildComponents(ctx android.RegistrationContext) {
ctx.BottomUp("sdk", sdkMutator).Parallel()
ctx.BottomUp("llndk", llndkMutator).Parallel()
ctx.BottomUp("link", LinkageMutator).Parallel()
ctx.BottomUp("version", versionMutator).Parallel()
ctx.Transition("version", &versionTransitionMutator{})
ctx.BottomUp("begin", BeginMutator).Parallel()
})

View File

@@ -19,6 +19,7 @@ import (
"io"
"path/filepath"
"regexp"
"slices"
"strconv"
"strings"
"sync"
@@ -711,7 +712,7 @@ type versionedInterface interface {
setStubsVersion(string)
stubsVersion() string
stubsVersions(ctx android.BaseMutatorContext) []string
stubsVersions(ctx android.BaseModuleContext) []string
setAllStubsVersions([]string)
allStubsVersions() []string
@@ -1903,7 +1904,7 @@ func (library *libraryDecorator) isStubsImplementationRequired() bool {
return BoolDefault(library.Properties.Stubs.Implementation_installable, true)
}
func (library *libraryDecorator) stubsVersions(ctx android.BaseMutatorContext) []string {
func (library *libraryDecorator) stubsVersions(ctx android.BaseModuleContext) []string {
if !library.hasStubsVariants() {
return nil
}
@@ -2204,64 +2205,14 @@ func normalizeVersions(ctx android.BaseModuleContext, versions []string) {
}
}
func createVersionVariations(mctx android.BottomUpMutatorContext, versions []string) {
// "" is for the non-stubs (implementation) variant for system modules, or the LLNDK variant
// for LLNDK modules.
variants := append(android.CopyOf(versions), "")
m := mctx.Module().(*Module)
isLLNDK := m.IsLlndk()
isVendorPublicLibrary := m.IsVendorPublicLibrary()
isImportedApiLibrary := m.isImportedApiLibrary()
modules := mctx.CreateLocalVariations(variants...)
for i, m := range modules {
if variants[i] != "" || isLLNDK || isVendorPublicLibrary || isImportedApiLibrary {
// A stubs or LLNDK stubs variant.
c := m.(*Module)
if c.sanitize != nil {
c.sanitize.Properties.ForceDisable = true
}
if c.stl != nil {
c.stl.Properties.Stl = StringPtr("none")
}
c.Properties.PreventInstall = true
lib := moduleLibraryInterface(m)
isLatest := i == (len(versions) - 1)
lib.setBuildStubs(isLatest)
if variants[i] != "" {
// A non-LLNDK stubs module is hidden from make and has a dependency from the
// implementation module to the stubs module.
c.Properties.HideFromMake = true
lib.setStubsVersion(variants[i])
mctx.AddInterVariantDependency(stubImplDepTag, modules[len(modules)-1], modules[i])
}
}
}
mctx.AliasVariation("")
latestVersion := ""
if len(versions) > 0 {
latestVersion = versions[len(versions)-1]
}
mctx.CreateAliasVariation("latest", latestVersion)
}
func createPerApiVersionVariations(mctx android.BottomUpMutatorContext, minSdkVersion string) {
func perApiVersionVariations(mctx android.BaseModuleContext, minSdkVersion string) []string {
from, err := nativeApiLevelFromUser(mctx, minSdkVersion)
if err != nil {
mctx.PropertyErrorf("min_sdk_version", err.Error())
return
return []string{""}
}
versionStrs := ndkLibraryVersions(mctx, from)
modules := mctx.CreateLocalVariations(versionStrs...)
for i, module := range modules {
module.(*Module).Properties.Sdk_version = StringPtr(versionStrs[i])
module.(*Module).Properties.Min_sdk_version = StringPtr(versionStrs[i])
}
return ndkLibraryVersions(mctx, from)
}
func canBeOrLinkAgainstVersionVariants(module interface {
@@ -2291,7 +2242,7 @@ func moduleLibraryInterface(module blueprint.Module) libraryInterface {
}
// setStubsVersions normalizes the versions in the Stubs.Versions property into MutatedProperties.AllStubsVersions.
func setStubsVersions(mctx android.BottomUpMutatorContext, library libraryInterface, module *Module) {
func setStubsVersions(mctx android.BaseModuleContext, library libraryInterface, module *Module) {
if !library.buildShared() || !canBeVersionVariant(module) {
return
}
@@ -2304,25 +2255,98 @@ func setStubsVersions(mctx android.BottomUpMutatorContext, library libraryInterf
library.setAllStubsVersions(versions)
}
// versionMutator splits a module into the mandatory non-stubs variant
// versionTransitionMutator splits a module into the mandatory non-stubs variant
// (which is unnamed) and zero or more stubs variants.
func versionMutator(mctx android.BottomUpMutatorContext) {
if mctx.Os() != android.Android {
return
type versionTransitionMutator struct{}
func (versionTransitionMutator) Split(ctx android.BaseModuleContext) []string {
if ctx.Os() != android.Android {
return []string{""}
}
m, ok := mctx.Module().(*Module)
if library := moduleLibraryInterface(mctx.Module()); library != nil && canBeVersionVariant(m) {
setStubsVersions(mctx, library, m)
m, ok := ctx.Module().(*Module)
if library := moduleLibraryInterface(ctx.Module()); library != nil && canBeVersionVariant(m) {
setStubsVersions(ctx, library, m)
createVersionVariations(mctx, library.allStubsVersions())
return
return append(slices.Clone(library.allStubsVersions()), "")
} else if ok && m.SplitPerApiLevel() && m.IsSdkVariant() {
return perApiVersionVariations(ctx, m.MinSdkVersion())
}
if ok {
if m.SplitPerApiLevel() && m.IsSdkVariant() {
createPerApiVersionVariations(mctx, m.MinSdkVersion())
return []string{""}
}
func (versionTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string {
return ""
}
func (versionTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string {
if ctx.Os() != android.Android {
return ""
}
m, ok := ctx.Module().(*Module)
if library := moduleLibraryInterface(ctx.Module()); library != nil && canBeVersionVariant(m) {
if incomingVariation == "latest" {
latestVersion := ""
versions := library.allStubsVersions()
if len(versions) > 0 {
latestVersion = versions[len(versions)-1]
}
return latestVersion
}
return incomingVariation
} else if ok && m.SplitPerApiLevel() && m.IsSdkVariant() {
// If this module only has variants with versions and the incoming dependency doesn't specify which one
// is needed then assume the latest version.
if incomingVariation == "" {
return android.FutureApiLevel.String()
}
return incomingVariation
}
return ""
}
func (versionTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) {
// Optimization: return early if this module can't be affected.
if ctx.Os() != android.Android {
return
}
m, ok := ctx.Module().(*Module)
if library := moduleLibraryInterface(ctx.Module()); library != nil && canBeVersionVariant(m) {
isLLNDK := m.IsLlndk()
isVendorPublicLibrary := m.IsVendorPublicLibrary()
isImportedApiLibrary := m.isImportedApiLibrary()
if variation != "" || isLLNDK || isVendorPublicLibrary || isImportedApiLibrary {
// A stubs or LLNDK stubs variant.
if m.sanitize != nil {
m.sanitize.Properties.ForceDisable = true
}
if m.stl != nil {
m.stl.Properties.Stl = StringPtr("none")
}
m.Properties.PreventInstall = true
lib := moduleLibraryInterface(m)
allStubsVersions := library.allStubsVersions()
isLatest := len(allStubsVersions) > 0 && variation == allStubsVersions[len(allStubsVersions)-1]
lib.setBuildStubs(isLatest)
}
if variation != "" {
// A non-LLNDK stubs module is hidden from make
library.setStubsVersion(variation)
m.Properties.HideFromMake = true
} else {
// A non-LLNDK implementation module has a dependency to all stubs versions
for _, version := range library.allStubsVersions() {
ctx.AddVariationDependencies([]blueprint.Variation{{"version", version}},
stubImplDepTag, ctx.ModuleName())
}
}
} else if ok && m.SplitPerApiLevel() && m.IsSdkVariant() {
m.Properties.Sdk_version = StringPtr(variation)
m.Properties.Min_sdk_version = StringPtr(variation)
}
}

View File

@@ -303,7 +303,7 @@ func (d *apiLibraryDecorator) hasStubsVariants() bool {
return d.hasApexStubs()
}
func (d *apiLibraryDecorator) stubsVersions(ctx android.BaseMutatorContext) []string {
func (d *apiLibraryDecorator) stubsVersions(ctx android.BaseModuleContext) []string {
m, ok := ctx.Module().(*Module)
if !ok {

View File

@@ -133,7 +133,7 @@ func (stub *stubDecorator) implementationModuleName(name string) string {
return strings.TrimSuffix(name, ndkLibrarySuffix)
}
func ndkLibraryVersions(ctx android.BaseMutatorContext, from android.ApiLevel) []string {
func ndkLibraryVersions(ctx android.BaseModuleContext, from android.ApiLevel) []string {
var versions []android.ApiLevel
versionStrs := []string{}
for _, version := range ctx.Config().AllSupportedApiLevels() {
@@ -147,7 +147,7 @@ func ndkLibraryVersions(ctx android.BaseMutatorContext, from android.ApiLevel) [
return versionStrs
}
func (this *stubDecorator) stubsVersions(ctx android.BaseMutatorContext) []string {
func (this *stubDecorator) stubsVersions(ctx android.BaseModuleContext) []string {
if !ctx.Module().Enabled(ctx) {
return nil
}