Allow common.Glob to be called by singletons
Make common.Glob take an interface that is the intersection of
blueprint.ModuleContext and blueprint.SingletonContext used by
Glob and GlobRule, allowing it to be called on either. Also
move ExpandSources and Glob into AndroidModuleContext.
Change-Id: I8d1a3160c5dd201033afdb37210e82d8065b137d
diff --git a/common/glob.go b/common/glob.go
index 669d185..d63f87a 100644
--- a/common/glob.go
+++ b/common/glob.go
@@ -66,41 +66,20 @@
return false
}
-func expandGlobs(ctx AndroidModuleContext, in []string) []string {
- if !hasGlob(in) {
- return in
- }
-
- var excludes []string
- for _, s := range in {
- if s[0] == '-' {
- excludes = append(excludes, s[1:])
- }
- }
-
- out := make([]string, 0, len(in))
- for _, s := range in {
- if s[0] == '-' {
- continue
- } else if glob.IsGlob(s) {
- out = append(out, Glob(ctx, s, excludes)...)
- } else {
- out = append(out, s)
- }
- }
-
- return out
+// The subset of ModuleContext and SingletonContext needed by Glob
+type globContext interface {
+ Build(pctx *blueprint.PackageContext, params blueprint.BuildParams)
+ AddNinjaFileDeps(deps ...string)
}
-func Glob(ctx AndroidModuleContext, globPattern string, excludes []string) []string {
- fileListFile := filepath.Join(ModuleOutDir(ctx), "glob", globToString(globPattern))
+func Glob(ctx globContext, outDir string, globPattern string, excludes []string) ([]string, error) {
+ fileListFile := filepath.Join(outDir, "glob", globToString(globPattern))
depFile := fileListFile + ".d"
// Get a globbed file list, and write out fileListFile and depFile
files, err := glob.GlobWithDepFile(globPattern, fileListFile, depFile, excludes)
if err != nil {
- ctx.ModuleErrorf("glob: %s", err.Error())
- return []string{globPattern}
+ return nil, err
}
GlobRule(ctx, globPattern, excludes, fileListFile, depFile)
@@ -108,10 +87,10 @@
// Make build.ninja depend on the fileListFile
ctx.AddNinjaFileDeps(fileListFile)
- return files
+ return files, nil
}
-func GlobRule(ctx AndroidModuleContext, globPattern string, excludes []string,
+func GlobRule(ctx globContext, globPattern string, excludes []string,
fileListFile, depFile string) {
// Create a rule to rebuild fileListFile if a directory in depFile changes. fileListFile
diff --git a/common/module.go b/common/module.go
index 327aeca..33c586c 100644
--- a/common/module.go
+++ b/common/module.go
@@ -18,6 +18,8 @@
"path/filepath"
"runtime"
+ "android/soong/glob"
+
"github.com/google/blueprint"
)
@@ -49,6 +51,9 @@
blueprint.ModuleContext
androidBaseContext
+ ExpandSources(srcFiles []string) []string
+ Glob(globPattern string, excludes []string) []string
+
InstallFile(installPath, srcPath string, deps ...string) string
InstallFileName(installPath, name, srcPath string, deps ...string) string
CheckbuildFile(srcPath string)
@@ -465,7 +470,7 @@
return ok
}
-func ExpandSources(ctx AndroidModuleContext, srcFiles []string) []string {
+func (ctx *androidModuleContext) ExpandSources(srcFiles []string) []string {
prefix := ModuleSrcDir(ctx)
for i, srcFile := range srcFiles {
if srcFile[0] == '-' {
@@ -475,8 +480,37 @@
}
}
- srcFiles = expandGlobs(ctx, srcFiles)
- return srcFiles
+ if !hasGlob(srcFiles) {
+ return srcFiles
+ }
+
+ var excludes []string
+ for _, s := range srcFiles {
+ if s[0] == '-' {
+ excludes = append(excludes, s[1:])
+ }
+ }
+
+ globbedSrcFiles := make([]string, 0, len(srcFiles))
+ for _, s := range srcFiles {
+ if s[0] == '-' {
+ continue
+ } else if glob.IsGlob(s) {
+ globbedSrcFiles = append(globbedSrcFiles, ctx.Glob(s, excludes)...)
+ } else {
+ globbedSrcFiles = append(globbedSrcFiles, s)
+ }
+ }
+
+ return globbedSrcFiles
+}
+
+func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) []string {
+ ret, err := Glob(ctx, ModuleOutDir(ctx), globPattern, excludes)
+ if err != nil {
+ ctx.ModuleErrorf("glob: %s", err.Error())
+ }
+ return ret
}
func BuildTargetSingleton() blueprint.Singleton {