diff options
Diffstat (limited to 'android')
-rw-r--r-- | android/base_module_context.go | 51 | ||||
-rw-r--r-- | android/prebuilt.go | 8 | ||||
-rw-r--r-- | android/proto.go | 8 |
3 files changed, 53 insertions, 14 deletions
diff --git a/android/base_module_context.go b/android/base_module_context.go index 670537fb5..e24ce9d2b 100644 --- a/android/base_module_context.go +++ b/android/base_module_context.go @@ -136,12 +136,14 @@ type BaseModuleContext interface { // multiple direct dependencies on the same module visit will be called multiple times on // that module and OtherModuleDependencyTag will return a different tag for each. // - // The Module passed to the visit function should not be retained outside of the visit function, it may be + // The ModuleProxy passed to the visit function should not be retained outside of the visit function, it may be // invalidated by future mutators. - VisitDirectDepsProxyAllowDisabled(visit func(proxy Module)) + VisitDirectDepsProxyAllowDisabled(visit func(proxy ModuleProxy)) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) + VisitDirectDepsProxyWithTag(tag blueprint.DependencyTag, visit func(proxy ModuleProxy)) + // VisitDirectDepsIf calls pred for each direct dependency, and if pred returns true calls visit. If there are // multiple direct dependencies on the same module pred and visit will be called multiple times on that module and // OtherModuleDependencyTag will return a different tag for each. It skips any @@ -173,7 +175,7 @@ type BaseModuleContext interface { // // The Modules passed to the visit function should not be retained outside of the visit function, they may be // invalidated by future mutators. - WalkDepsProxy(visit func(child, parent Module) bool) + WalkDepsProxy(visit func(child, parent ModuleProxy) bool) // GetWalkPath is supposed to be called in visit function passed in WalkDeps() // and returns a top-down dependency path from a start module to current child module. @@ -314,6 +316,7 @@ func (b *baseModuleContext) getMissingDependencies() []string { type AllowDisabledModuleDependency interface { blueprint.DependencyTag AllowDisabledModuleDependency(target Module) bool + AllowDisabledModuleDependencyProxy(ctx OtherModuleProviderContext, target ModuleProxy) bool } type AlwaysAllowDisabledModuleDependencyTag struct{} @@ -322,6 +325,10 @@ func (t AlwaysAllowDisabledModuleDependencyTag) AllowDisabledModuleDependency(Mo return true } +func (t AlwaysAllowDisabledModuleDependencyTag) AllowDisabledModuleDependencyProxy(OtherModuleProviderContext, ModuleProxy) bool { + return true +} + func (b *baseModuleContext) validateAndroidModule(module blueprint.Module, tag blueprint.DependencyTag, strict bool) Module { aModule, _ := module.(Module) @@ -346,6 +353,28 @@ func (b *baseModuleContext) validateAndroidModule(module blueprint.Module, tag b return aModule } +func (b *baseModuleContext) validateAndroidModuleProxy( + module blueprint.ModuleProxy, tag blueprint.DependencyTag, strict bool) *ModuleProxy { + aModule := ModuleProxy{module: module} + + if !strict { + return &aModule + } + + if !OtherModuleProviderOrDefault(b, module, CommonPropertiesProviderKey).Enabled { + if t, ok := tag.(AllowDisabledModuleDependency); !ok || !t.AllowDisabledModuleDependencyProxy(b, aModule) { + if b.Config().AllowMissingDependencies() { + b.AddMissingDependencies([]string{b.OtherModuleName(aModule)}) + } else { + b.ModuleErrorf("depends on disabled module %q", b.OtherModuleName(aModule)) + } + } + return nil + } + + return &aModule +} + type dep struct { mod blueprint.Module tag blueprint.DependencyTag @@ -426,7 +455,7 @@ func (b *baseModuleContext) VisitDirectDepsAllowDisabled(visit func(Module)) { }) } -func (b *baseModuleContext) VisitDirectDepsProxyAllowDisabled(visit func(proxy Module)) { +func (b *baseModuleContext) VisitDirectDepsProxyAllowDisabled(visit func(proxy ModuleProxy)) { b.bp.VisitDirectDepsProxy(func(module blueprint.ModuleProxy) { visit(ModuleProxy{ module: module, @@ -437,13 +466,23 @@ func (b *baseModuleContext) VisitDirectDepsProxyAllowDisabled(visit func(proxy M func (b *baseModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) { b.bp.VisitDirectDeps(func(module blueprint.Module) { if b.bp.OtherModuleDependencyTag(module) == tag { - if aModule := b.validateAndroidModule(module, b.bp.OtherModuleDependencyTag(module), b.strictVisitDeps); aModule != nil { + if aModule := b.validateAndroidModule(module, tag, b.strictVisitDeps); aModule != nil { visit(aModule) } } }) } +func (b *baseModuleContext) VisitDirectDepsProxyWithTag(tag blueprint.DependencyTag, visit func(proxy ModuleProxy)) { + b.bp.VisitDirectDepsProxy(func(module blueprint.ModuleProxy) { + if b.bp.OtherModuleDependencyTag(module) == tag { + if aModule := b.validateAndroidModuleProxy(module, tag, b.strictVisitDeps); aModule != nil { + visit(*aModule) + } + } + }) +} + func (b *baseModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) { b.bp.VisitDirectDepsIf( // pred @@ -505,7 +544,7 @@ func (b *baseModuleContext) WalkDeps(visit func(Module, Module) bool) { }) } -func (b *baseModuleContext) WalkDepsProxy(visit func(Module, Module) bool) { +func (b *baseModuleContext) WalkDepsProxy(visit func(ModuleProxy, ModuleProxy) bool) { b.walkPath = []Module{ModuleProxy{blueprint.CreateModuleProxy(b.Module())}} b.tagPath = []blueprint.DependencyTag{} b.bp.WalkDepsProxy(func(child, parent blueprint.ModuleProxy) bool { diff --git a/android/prebuilt.go b/android/prebuilt.go index 017ba76c3..0b0c517ca 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -362,10 +362,10 @@ func GetEmbeddedPrebuilt(module Module) *Prebuilt { // the right module. This function is only safe to call after all TransitionMutators // have run, e.g. in GenerateAndroidBuildActions. func PrebuiltGetPreferred(ctx BaseModuleContext, module Module) Module { - if !module.IsReplacedByPrebuilt() { + if !OtherModuleProviderOrDefault(ctx, module, CommonPropertiesProviderKey).ReplacedByPrebuilt { return module } - if IsModulePrebuilt(module) { + if _, ok := OtherModuleProvider(ctx, module, PrebuiltModuleProviderKey); ok { // If we're given a prebuilt then assume there's no source module around. return module } @@ -373,11 +373,11 @@ func PrebuiltGetPreferred(ctx BaseModuleContext, module Module) Module { sourceModDepFound := false var prebuiltMod Module - ctx.WalkDeps(func(child, parent Module) bool { + ctx.WalkDepsProxy(func(child, parent ModuleProxy) bool { if prebuiltMod != nil { return false } - if parent == ctx.Module() { + if ctx.EqualModules(parent, ctx.Module()) { // First level: Only recurse if the module is found as a direct dependency. sourceModDepFound = child == module return sourceModDepFound diff --git a/android/proto.go b/android/proto.go index 0d8e0972a..66faa20ac 100644 --- a/android/proto.go +++ b/android/proto.go @@ -74,14 +74,14 @@ func GetProtoFlags(ctx ModuleContext, p *ProtoProperties) ProtoFlags { flags = append(flags, JoinWithPrefix(rootProtoIncludeDirs.Strings(), "-I")) } - ctx.VisitDirectDepsWithTag(ProtoPluginDepTag, func(dep Module) { - if hostTool, ok := dep.(HostToolProvider); !ok || !hostTool.HostToolPath().Valid() { + ctx.VisitDirectDepsProxyWithTag(ProtoPluginDepTag, func(dep ModuleProxy) { + if h, ok := OtherModuleProvider(ctx, dep, HostToolProviderKey); !ok || !h.HostToolPath.Valid() { ctx.PropertyErrorf("proto.plugin", "module %q is not a host tool provider", ctx.OtherModuleName(dep)) } else { plugin := String(p.Proto.Plugin) - deps = append(deps, hostTool.HostToolPath().Path()) - flags = append(flags, "--plugin=protoc-gen-"+plugin+"="+hostTool.HostToolPath().String()) + deps = append(deps, h.HostToolPath.Path()) + flags = append(flags, "--plugin=protoc-gen-"+plugin+"="+h.HostToolPath.String()) } }) |