From 540a78c1ce0519b8085a5f5388474b0a3a4350b1 Mon Sep 17 00:00:00 2001 From: Dan Willemsen Date: Mon, 26 Feb 2018 21:50:08 -0800 Subject: [PATCH] Turn GlobFiles into a Glob for files, use it GlobFiles had allowed results to be anywhere in the source tree, restrict it to results within the current module directory. Then use it for ExpandSources and other places where we only want files. This fixes using '*' in cc_test's `data` property, which can only support files. The only thing this changes today is that java_resource_dirs and java_resources no longer pass directories to soong_zip's -f argument. core-libart previously added some icu directories, now it only passes files. Bug: 71906438 Test: only expected changes in out/soong/build.ninja Test: add data: ["**/*"] to a cc_test, build successfully Change-Id: Iff1bd8c005a48e431c740706d7e23f4f957d8b1d --- android/module.go | 18 ++++-------------- android/paths.go | 7 +++++-- cc/llndk_library.go | 2 +- cc/ndk_headers.go | 2 +- java/app.go | 17 ++--------------- 5 files changed, 13 insertions(+), 33 deletions(-) diff --git a/android/module.go b/android/module.go index 07c4e8fce..4a8e8acf6 100644 --- a/android/module.go +++ b/android/module.go @@ -1220,7 +1220,7 @@ func (ctx *androidModuleContext) ExpandSourcesSubDir(srcFiles, excludes []string ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m) } } else if pathtools.IsGlob(s) { - globbedSrcFiles := ctx.Glob(filepath.Join(prefix, s), expandedExcludes) + globbedSrcFiles := ctx.GlobFiles(filepath.Join(prefix, s), expandedExcludes) for i, s := range globbedSrcFiles { globbedSrcFiles[i] = s.(ModuleSrcPath).WithSubDir(ctx, subDir) } @@ -1246,25 +1246,15 @@ func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) Pat if err != nil { ctx.ModuleErrorf("glob: %s", err.Error()) } - return pathsForModuleSrcFromFullPath(ctx, ret) + return pathsForModuleSrcFromFullPath(ctx, ret, true) } -// glob only "files" under the directory relative to top of the source tree. func (ctx *androidModuleContext) GlobFiles(globPattern string, excludes []string) Paths { - paths, err := ctx.GlobWithDeps(globPattern, excludes) + ret, err := ctx.GlobWithDeps(globPattern, excludes) if err != nil { ctx.ModuleErrorf("glob: %s", err.Error()) } - var ret []Path - for _, p := range paths { - if isDir, err := ctx.Fs().IsDir(p); err != nil { - ctx.ModuleErrorf("error in IsDir(%s): %s", p, err.Error()) - return nil - } else if !isDir { - ret = append(ret, PathForSource(ctx, p)) - } - } - return ret + return pathsForModuleSrcFromFullPath(ctx, ret, false) } func init() { diff --git a/android/paths.go b/android/paths.go index 3b1cea67d..ffdb39354 100644 --- a/android/paths.go +++ b/android/paths.go @@ -228,14 +228,17 @@ func PathsForModuleSrc(ctx ModuleContext, paths []string) Paths { // pathsForModuleSrcFromFullPath returns Paths rooted from the module's local // source directory, but strip the local source directory from the beginning of -// each string. -func pathsForModuleSrcFromFullPath(ctx ModuleContext, paths []string) Paths { +// each string. If incDirs is false, strip paths with a trailing '/' from the list. +func pathsForModuleSrcFromFullPath(ctx ModuleContext, paths []string, incDirs bool) Paths { prefix := filepath.Join(ctx.Config().srcDir, ctx.ModuleDir()) + "/" if prefix == "./" { prefix = "" } ret := make(Paths, 0, len(paths)) for _, p := range paths { + if !incDirs && strings.HasSuffix(p, "/") { + continue + } path := filepath.Clean(p) if !strings.HasPrefix(path, prefix) { reportPathErrorf(ctx, "Path '%s' is not in module source directory '%s'", p, prefix) diff --git a/cc/llndk_library.go b/cc/llndk_library.go index e824d0f6e..b573c2e65 100644 --- a/cc/llndk_library.go +++ b/cc/llndk_library.go @@ -100,7 +100,7 @@ func (stub *llndkStubDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flag func (stub *llndkStubDecorator) processHeaders(ctx ModuleContext, srcHeaderDir string, outDir android.ModuleGenPath) android.Path { srcDir := android.PathForModuleSrc(ctx, srcHeaderDir) - srcFiles := ctx.Glob(filepath.Join(srcDir.String(), "**/*.h"), nil) + srcFiles := ctx.GlobFiles(filepath.Join(srcDir.String(), "**/*.h"), nil) var installPaths []android.WritablePath for _, header := range srcFiles { diff --git a/cc/ndk_headers.go b/cc/ndk_headers.go index d7c2a0619..9fabc97cb 100644 --- a/cc/ndk_headers.go +++ b/cc/ndk_headers.go @@ -202,7 +202,7 @@ func (m *preprocessedHeaderModule) GenerateAndroidBuildActions(ctx android.Modul fromSrcPath := android.PathForModuleSrc(ctx, String(m.properties.From)) toOutputPath := getCurrentIncludePath(ctx).Join(ctx, String(m.properties.To)) - srcFiles := ctx.Glob(filepath.Join(fromSrcPath.String(), "**/*.h"), nil) + srcFiles := ctx.GlobFiles(filepath.Join(fromSrcPath.String(), "**/*.h"), nil) var installPaths []android.WritablePath for _, header := range srcFiles { installDir := getHeaderInstallDir(ctx, header, String(m.properties.From), String(m.properties.To)) diff --git a/java/app.go b/java/app.go index 34f05b736..ac88df798 100644 --- a/java/app.go +++ b/java/app.go @@ -342,17 +342,7 @@ func AndroidAppFactory() android.Module { } func resourceGlob(ctx android.ModuleContext, dir android.Path) android.Paths { - var ret android.Paths - files := ctx.Glob(filepath.Join(dir.String(), "**/*"), aaptIgnoreFilenames) - for _, f := range files { - if isDir, err := ctx.Fs().IsDir(f.String()); err != nil { - ctx.ModuleErrorf("error in IsDir(%s): %s", f.String(), err.Error()) - return nil - } else if !isDir { - ret = append(ret, f) - } - } - return ret + return ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), aaptIgnoreFilenames) } type overlayGlobResult struct { @@ -440,10 +430,7 @@ func (overlaySingleton) GenerateBuildActions(ctx android.SingletonContext) { } var paths android.Paths for _, f := range files { - if isDir, err := ctx.Fs().IsDir(f); err != nil { - ctx.Errorf("error in IsDir(%s): %s", f, err.Error()) - return - } else if !isDir { + if !strings.HasSuffix(f, "/") { paths = append(paths, android.PathForSource(ctx, f)) } }