From 8f101b45fc876b63f2a556c5b19801dbc8ac5fdc Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Wed, 17 Jun 2015 15:09:06 -0700 Subject: [PATCH] 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 --- cc/cc.go | 2 +- common/glob.go | 39 +++++++++------------------------------ common/module.go | 40 +++++++++++++++++++++++++++++++++++++--- genrule/genrule.go | 4 ++-- java/app.go | 4 ++-- java/java.go | 2 +- java/resources.go | 2 +- 7 files changed, 53 insertions(+), 40 deletions(-) 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"