diff options
Diffstat (limited to 'android/paths.go')
-rw-r--r-- | android/paths.go | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/android/paths.go b/android/paths.go index 9cb872d6f..3f67c55b2 100644 --- a/android/paths.go +++ b/android/paths.go @@ -91,6 +91,8 @@ type ModuleWithDepsPathContext interface { EarlyModulePathContext OtherModuleProviderContext VisitDirectDeps(visit func(Module)) + VisitDirectDepsProxy(visit func(ModuleProxy)) + VisitDirectDepsProxyWithTag(tag blueprint.DependencyTag, visit func(ModuleProxy)) OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag HasMutatorFinished(mutatorName string) bool } @@ -598,7 +600,7 @@ func DirectoryPathsForModuleSrc(ctx ModuleMissingDepsPathContext, paths []string for _, path := range paths { if m, t := SrcIsModuleWithTag(path); m != "" { - module := GetModuleFromPathDep(ctx, m, t) + module := GetModuleProxyFromPathDep(ctx, m, t) if module == nil { ctx.ModuleErrorf(`missing dependency on %q, is the property annotated with android:"path"?`, m) continue @@ -611,7 +613,7 @@ func DirectoryPathsForModuleSrc(ctx ModuleMissingDepsPathContext, paths []string if !ok { panic(fmt.Errorf("%s is not an OtherModuleProviderContext", ctx)) } - if dirProvider, ok := OtherModuleProvider(mctx, module, DirProvider); ok { + if dirProvider, ok := OtherModuleProvider(mctx, *module, DirProvider); ok { ret = append(ret, dirProvider.Dirs...) } else { ReportPathErrorf(ctx, "module %q does not implement DirProvider", module) @@ -669,14 +671,15 @@ func (p OutputPaths) Strings() []string { // If the dependency is not found, a missingErrorDependency is returned. // If the module dependency is not a SourceFileProducer or OutputFileProducer, appropriate errors will be returned. func getPathsFromModuleDep(ctx ModuleWithDepsPathContext, path, moduleName, tag string) (Paths, error) { - module := GetModuleFromPathDep(ctx, moduleName, tag) + module := GetModuleProxyFromPathDep(ctx, moduleName, tag) if module == nil { return nil, missingDependencyError{[]string{moduleName}} } - if aModule, ok := module.(Module); ok && !aModule.Enabled(ctx) { + if !OtherModuleProviderOrDefault(ctx, *module, CommonPropertiesProviderKey).Enabled { return nil, missingDependencyError{[]string{moduleName}} } - outputFiles, err := outputFilesForModule(ctx, module, tag) + + outputFiles, err := outputFilesForModule(ctx, *module, tag) if outputFiles != nil && err == nil { return outputFiles, nil } else { @@ -684,7 +687,7 @@ func getPathsFromModuleDep(ctx ModuleWithDepsPathContext, path, moduleName, tag } } -// GetModuleFromPathDep will return the module that was added as a dependency automatically for +// GetModuleProxyFromPathDep will return the module that was added as a dependency automatically for // properties tagged with `android:"path"` or manually using ExtractSourceDeps or // ExtractSourcesDeps. // @@ -694,6 +697,27 @@ func getPathsFromModuleDep(ctx ModuleWithDepsPathContext, path, moduleName, tag // // If tag is "" then the returned module will be the dependency that was added for ":moduleName". // Otherwise, it is the dependency that was added for ":moduleName{tag}". +func GetModuleProxyFromPathDep(ctx ModuleWithDepsPathContext, moduleName, tag string) *ModuleProxy { + var found *ModuleProxy + // The sourceOrOutputDepTag uniquely identifies the module dependency as it contains both the + // module name and the tag. Dependencies added automatically for properties tagged with + // `android:"path"` are deduped so are guaranteed to be unique. It is possible for duplicate + // dependencies to be added manually using ExtractSourcesDeps or ExtractSourceDeps but even then + // it will always be the case that the dependencies will be identical, i.e. the same tag and same + // moduleName referring to the same dependency module. + // + // It does not matter whether the moduleName is a fully qualified name or if the module + // dependency is a prebuilt module. All that matters is the same information is supplied to + // create the tag here as was supplied to create the tag when the dependency was added so that + // this finds the matching dependency module. + expectedTag := sourceOrOutputDepTag(moduleName, tag) + ctx.VisitDirectDepsProxyWithTag(expectedTag, func(module ModuleProxy) { + found = &module + }) + return found +} + +// Deprecated: use GetModuleProxyFromPathDep func GetModuleFromPathDep(ctx ModuleWithDepsPathContext, moduleName, tag string) blueprint.Module { var found blueprint.Module // The sourceOrOutputDepTag uniquely identifies the module dependency as it contains both the |