diff --git a/cc/cc.go b/cc/cc.go index 61e256847..051bbaf9e 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -531,7 +531,7 @@ func (c *CCBase) customCompileObjs(ctx common.AndroidModuleContext, flags CCFlag buildFlags := ccFlagsToBuilderFlags(flags) - srcFiles = common.ExpandSources(ctx, srcFiles) + srcFiles = ctx.ExpandSources(srcFiles) srcFiles, deps := genSources(ctx, srcFiles, buildFlags) return TransformSourceToObj(ctx, subdir, srcFiles, buildFlags, deps) diff --git a/common/glob.go b/common/glob.go index 669d18577..d63f87a27 100644 --- a/common/glob.go +++ b/common/glob.go @@ -66,41 +66,20 @@ func hasGlob(in []string) bool { 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 @@ func Glob(ctx AndroidModuleContext, globPattern string, excludes []string) []str // 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 327aeca5f..33c586cd3 100644 --- a/common/module.go +++ b/common/module.go @@ -18,6 +18,8 @@ import ( "path/filepath" "runtime" + "android/soong/glob" + "github.com/google/blueprint" ) @@ -49,6 +51,9 @@ type AndroidModuleContext interface { 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 @@ func isAndroidModule(m blueprint.Module) bool { 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 @@ func ExpandSources(ctx AndroidModuleContext, srcFiles []string) []string { } } - 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 { diff --git a/genrule/genrule.go b/genrule/genrule.go index 42ab047a0..ea30e3d1e 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -132,7 +132,7 @@ func GenSrcsFactory() (blueprint.Module, []interface{}) { properties := &genSrcsProperties{} tasks := func(ctx common.AndroidModuleContext) []generateTask { - srcFiles := common.ExpandSources(ctx, properties.Srcs) + srcFiles := ctx.ExpandSources(properties.Srcs) tasks := make([]generateTask, 0, len(srcFiles)) for _, in := range srcFiles { out := pathtools.ReplaceExtension(in, properties.Output_extension) @@ -159,7 +159,7 @@ func GenRuleFactory() (blueprint.Module, []interface{}) { tasks := func(ctx common.AndroidModuleContext) []generateTask { return []generateTask{ { - in: common.ExpandSources(ctx, properties.Srcs), + in: ctx.ExpandSources(properties.Srcs), out: filepath.Join(common.ModuleGenDir(ctx), properties.Out), }, } diff --git a/java/app.go b/java/app.go index 869cfea09..5f153cf40 100644 --- a/java/app.go +++ b/java/app.go @@ -244,14 +244,14 @@ func (a *AndroidApp) aaptFlags(ctx common.AndroidModuleContext) ([]string, []str var aaptDeps []string var hasResources bool for _, d := range resourceDirs { - newDeps := common.Glob(ctx, filepath.Join(d, "**/*"), aaptIgnoreFilenames) + newDeps := ctx.Glob(filepath.Join(d, "**/*"), aaptIgnoreFilenames) aaptDeps = append(aaptDeps, newDeps...) if len(newDeps) > 0 { hasResources = true } } for _, d := range assetDirs { - newDeps := common.Glob(ctx, filepath.Join(d, "**/*"), aaptIgnoreFilenames) + newDeps := ctx.Glob(filepath.Join(d, "**/*"), aaptIgnoreFilenames) aaptDeps = append(aaptDeps, newDeps...) } diff --git a/java/java.go b/java/java.go index d22f47a75..9787d6025 100644 --- a/java/java.go +++ b/java/java.go @@ -292,7 +292,7 @@ func (j *javaBase) GenerateJavaBuildActions(ctx common.AndroidModuleContext) { javacDeps = append(javacDeps, classpath...) } - srcFiles := common.ExpandSources(ctx, j.properties.Srcs) + srcFiles := ctx.ExpandSources(j.properties.Srcs) srcFiles = j.genSources(ctx, srcFiles, flags) diff --git a/java/resources.go b/java/resources.go index 7aa909eef..f9d7a05b2 100644 --- a/java/resources.go +++ b/java/resources.go @@ -47,7 +47,7 @@ func ResourceDirsToJarSpecs(ctx common.AndroidModuleContext, resourceDirs []stri continue } resourceDir := filepath.Join(common.ModuleSrcDir(ctx), resourceDir) - dirs := common.Glob(ctx, resourceDir, nil) + dirs := ctx.Glob(resourceDir, nil) for _, dir := range dirs { fileListFile := filepath.Join(common.ModuleOutDir(ctx), "res", dir, "resources.list") depFile := fileListFile + ".d"