Implement OtherModulePropertyErrorf proxies
Also move EvaluateConfiguration() to a standalone configurationEvalutor object, which can be constructed from a ModuleBase and a minimial context. This allows us to evaluate configurable properties in scenarios where we don't have much more than the module. Bug: 323382414 Test: m nothing --no-skip-soong-tests Change-Id: I2d1c9f42a469c399f34c759410509aeae095becb
This commit is contained in:
@@ -29,6 +29,7 @@ import (
|
||||
"android/soong/bazel"
|
||||
|
||||
"github.com/google/blueprint"
|
||||
"github.com/google/blueprint/parser"
|
||||
"github.com/google/blueprint/proptools"
|
||||
)
|
||||
|
||||
@@ -123,6 +124,8 @@ type Module interface {
|
||||
// TransitivePackagingSpecs returns the PackagingSpecs for this module and any transitive
|
||||
// dependencies with dependency tags for which IsInstallDepNeeded() returns true.
|
||||
TransitivePackagingSpecs() []PackagingSpec
|
||||
|
||||
ConfigurableEvaluator(ctx ConfigAndErrorContext) proptools.ConfigurableEvaluator
|
||||
}
|
||||
|
||||
// Qualified id for a module
|
||||
@@ -1230,6 +1233,10 @@ func (m *ModuleBase) GenerateTaggedDistFiles(ctx BaseModuleContext) TaggedDistFi
|
||||
return distFiles
|
||||
}
|
||||
|
||||
func (m *ModuleBase) ArchReady() bool {
|
||||
return m.commonProperties.ArchReady
|
||||
}
|
||||
|
||||
func (m *ModuleBase) Target() Target {
|
||||
return m.commonProperties.CompileTarget
|
||||
}
|
||||
@@ -2104,6 +2111,65 @@ func (m *ModuleBase) IsNativeBridgeSupported() bool {
|
||||
return proptools.Bool(m.commonProperties.Native_bridge_supported)
|
||||
}
|
||||
|
||||
type ConfigAndErrorContext interface {
|
||||
Config() Config
|
||||
OtherModulePropertyErrorf(module Module, property string, fmt string, args ...interface{})
|
||||
}
|
||||
|
||||
type configurationEvalutor struct {
|
||||
ctx ConfigAndErrorContext
|
||||
m Module
|
||||
}
|
||||
|
||||
func (m *ModuleBase) ConfigurableEvaluator(ctx ConfigAndErrorContext) proptools.ConfigurableEvaluator {
|
||||
return configurationEvalutor{
|
||||
ctx: ctx,
|
||||
m: m.module,
|
||||
}
|
||||
}
|
||||
|
||||
func (e configurationEvalutor) PropertyErrorf(property string, fmt string, args ...interface{}) {
|
||||
e.ctx.OtherModulePropertyErrorf(e.m, property, fmt, args)
|
||||
}
|
||||
|
||||
func (e configurationEvalutor) EvaluateConfiguration(ty parser.SelectType, property, condition string) (string, bool) {
|
||||
ctx := e.ctx
|
||||
m := e.m
|
||||
switch ty {
|
||||
case parser.SelectTypeReleaseVariable:
|
||||
if v, ok := ctx.Config().productVariables.BuildFlags[condition]; ok {
|
||||
return v, true
|
||||
}
|
||||
return "", false
|
||||
case parser.SelectTypeProductVariable:
|
||||
// TODO(b/323382414): Might add these on a case-by-case basis
|
||||
ctx.OtherModulePropertyErrorf(m, property, "TODO(b/323382414): Product variables are not yet supported in selects")
|
||||
return "", false
|
||||
case parser.SelectTypeSoongConfigVariable:
|
||||
parts := strings.Split(condition, ":")
|
||||
namespace := parts[0]
|
||||
variable := parts[1]
|
||||
if n, ok := ctx.Config().productVariables.VendorVars[namespace]; ok {
|
||||
if v, ok := n[variable]; ok {
|
||||
return v, true
|
||||
}
|
||||
}
|
||||
return "", false
|
||||
case parser.SelectTypeVariant:
|
||||
if condition == "arch" {
|
||||
if !m.base().ArchReady() {
|
||||
ctx.OtherModulePropertyErrorf(m, property, "A select on arch was attempted before the arch mutator ran")
|
||||
return "", false
|
||||
}
|
||||
return m.base().Arch().ArchType.Name, true
|
||||
}
|
||||
ctx.OtherModulePropertyErrorf(m, property, "Unknown variant %s", condition)
|
||||
return "", false
|
||||
default:
|
||||
panic("Should be unreachable")
|
||||
}
|
||||
}
|
||||
|
||||
// ModuleNameWithPossibleOverride returns the name of the OverrideModule that overrides the current
|
||||
// variant of this OverridableModule, or ctx.ModuleName() if this module is not an OverridableModule
|
||||
// or if this variant is not overridden.
|
||||
|
Reference in New Issue
Block a user