From 2fafa3ec49532d50aa4fabff891ee4aa213744fa Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 5 Mar 2019 12:39:51 -0800 Subject: [PATCH] Remove ExpandSourcesSubDir and ModuleSrcPath.WithSubDir Replace ExpandSourcesSubDir with ExpandSources plus PathsWithModuleSrcSubDir, which loops over the paths and uses Join to create paths relative to subdir on any results that are ModuleSrcPaths. Test: All soong tests Change-Id: I11a7face88641e2c26ccdca0a3117d5c38ab588e --- android/filegroup.go | 6 +++- android/module.go | 70 ++++++++++++++++++++------------------------ android/paths.go | 37 ++++++++++++++++++----- 3 files changed, 66 insertions(+), 47 deletions(-) diff --git a/android/filegroup.go b/android/filegroup.go index c2be22a32..0b716c649 100644 --- a/android/filegroup.go +++ b/android/filegroup.go @@ -60,7 +60,11 @@ func FileGroupFactory() Module { } func (fg *fileGroup) GenerateAndroidBuildActions(ctx ModuleContext) { - fg.srcs = ctx.ExpandSourcesSubDir(fg.properties.Srcs, fg.properties.Exclude_srcs, String(fg.properties.Path)) + fg.srcs = ctx.ExpandSources(fg.properties.Srcs, fg.properties.Exclude_srcs) + + if fg.properties.Path != nil { + fg.srcs = PathsWithModuleSrcSubDir(ctx, fg.srcs, String(fg.properties.Path)) + } } func (fg *fileGroup) Srcs() Paths { diff --git a/android/module.go b/android/module.go index 9a69a2631..dfeb45d14 100644 --- a/android/module.go +++ b/android/module.go @@ -117,7 +117,6 @@ type ModuleContext interface { ExpandSources(srcFiles, excludes []string) Paths ExpandSource(srcFile, prop string) Path ExpandOptionalSource(srcFile *string, prop string) OptionalPath - ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths Glob(globPattern string, excludes []string) Paths GlobFiles(globPattern string, excludes []string) Paths @@ -1421,39 +1420,6 @@ type SourceFileProducer interface { // Returns a list of paths expanded from globs and modules referenced using ":module" syntax. The property must // be tagged with `android:"path" to support automatic source module dependency resolution. func (ctx *androidModuleContext) ExpandSources(srcFiles, excludes []string) Paths { - return ctx.ExpandSourcesSubDir(srcFiles, excludes, "") -} - -// Returns a single path expanded from globs and modules referenced using ":module" syntax. The property must -// be tagged with `android:"path" to support automatic source module dependency resolution. -func (ctx *androidModuleContext) ExpandSource(srcFile, prop string) Path { - srcFiles := ctx.ExpandSourcesSubDir([]string{srcFile}, nil, "") - if len(srcFiles) == 1 { - return srcFiles[0] - } else if len(srcFiles) == 0 { - if ctx.Config().AllowMissingDependencies() { - ctx.AddMissingDependencies([]string{srcFile}) - } else { - ctx.PropertyErrorf(prop, "%s path %s does not exist", prop, srcFile) - } - return nil - } else { - ctx.PropertyErrorf(prop, "module providing %s must produce exactly one file", prop) - return nil - } -} - -// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if -// the srcFile is non-nil. The property must be tagged with `android:"path" to support automatic source module -// dependency resolution. -func (ctx *androidModuleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath { - if srcFile != nil { - return OptionalPathForPath(ctx.ExpandSource(*srcFile, prop)) - } - return OptionalPath{} -} - -func (ctx *androidModuleContext) ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths { prefix := PathForModuleSrc(ctx).String() var expandedExcludes []string @@ -1508,22 +1474,48 @@ func (ctx *androidModuleContext) ExpandSourcesSubDir(srcFiles, excludes []string } } else if pathtools.IsGlob(s) { globbedSrcFiles := ctx.GlobFiles(filepath.Join(prefix, s), expandedExcludes) - for i, s := range globbedSrcFiles { - globbedSrcFiles[i] = s.(ModuleSrcPath).WithSubDir(ctx, subDir) - } + globbedSrcFiles = PathsWithModuleSrcSubDir(ctx, globbedSrcFiles, "") expandedSrcFiles = append(expandedSrcFiles, globbedSrcFiles...) } else { - p := PathForModuleSrc(ctx, s).WithSubDir(ctx, subDir) + p := PathForModuleSrc(ctx, s) j := findStringInSlice(p.String(), expandedExcludes) if j == -1 { expandedSrcFiles = append(expandedSrcFiles, p) } - } } return expandedSrcFiles } +// Returns a single path expanded from globs and modules referenced using ":module" syntax. The property must +// be tagged with `android:"path" to support automatic source module dependency resolution. +func (ctx *androidModuleContext) ExpandSource(srcFile, prop string) Path { + srcFiles := ctx.ExpandSources([]string{srcFile}, nil) + if len(srcFiles) == 1 { + return srcFiles[0] + } else if len(srcFiles) == 0 { + if ctx.Config().AllowMissingDependencies() { + ctx.AddMissingDependencies([]string{srcFile}) + } else { + ctx.PropertyErrorf(prop, "%s path %s does not exist", prop, srcFile) + } + return nil + } else { + ctx.PropertyErrorf(prop, "module providing %s must produce exactly one file", prop) + return nil + } +} + +// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if +// the srcFile is non-nil. The property must be tagged with `android:"path" to support automatic source module +// dependency resolution. +func (ctx *androidModuleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath { + if srcFile != nil { + return OptionalPathForPath(ctx.ExpandSource(*srcFile, prop)) + } + return OptionalPath{} +} + func (ctx *androidModuleContext) RequiredModuleNames() []string { return ctx.module.base().commonProperties.Required } diff --git a/android/paths.go b/android/paths.go index afde55e02..a0ea7535b 100644 --- a/android/paths.go +++ b/android/paths.go @@ -620,6 +620,15 @@ func (p SourcePath) Join(ctx PathContext, paths ...string) SourcePath { return p.withRel(path) } +// join is like Join but does less path validation. +func (p SourcePath) join(ctx PathContext, paths ...string) SourcePath { + path, err := validateSafePath(paths...) + if err != nil { + reportPathError(ctx, err) + } + return p.withRel(path) +} + // OverlayPath returns the overlay for `path' if it exists. This assumes that the // SourcePath is the path to a resource overlay directory. func (p SourcePath) OverlayPath(ctx ModuleContext, path Path) OptionalPath { @@ -773,10 +782,30 @@ func PathForModuleSrc(ctx ModuleContext, paths ...string) ModuleSrcPath { } else if !exists { reportPathErrorf(ctx, "module source path %q does not exist", path) } - return path } +// PathsWithModuleSrcSubDir takes a list of Paths and returns a new list of Paths where Rel() on each path +// will return the path relative to subDir in the module's source directory. If any input paths are not located +// inside subDir then a path error will be reported. +func PathsWithModuleSrcSubDir(ctx ModuleContext, paths Paths, subDir string) Paths { + paths = append(Paths(nil), paths...) + subDirFullPath := PathForModuleSrc(ctx, subDir) + for i, path := range paths { + rel := Rel(ctx, subDirFullPath.String(), path.String()) + paths[i] = subDirFullPath.join(ctx, rel) + } + return paths +} + +// PathWithModuleSrcSubDir takes a Path and returns a Path where Rel() will return the path relative to subDir in the +// module's source directory. If the input path is not located inside subDir then a path error will be reported. +func PathWithModuleSrcSubDir(ctx ModuleContext, path Path, subDir string) Path { + subDirFullPath := PathForModuleSrc(ctx, subDir) + rel := Rel(ctx, subDirFullPath.String(), path.String()) + return subDirFullPath.Join(ctx, rel) +} + // OptionalPathForModuleSrc returns an OptionalPath. The OptionalPath contains a // valid path if p is non-nil. func OptionalPathForModuleSrc(ctx ModuleContext, p *string) OptionalPath { @@ -799,12 +828,6 @@ func (p ModuleSrcPath) resPathWithName(ctx ModuleContext, name string) ModuleRes return PathForModuleRes(ctx, p.path, name) } -func (p ModuleSrcPath) WithSubDir(ctx ModuleContext, subdir string) ModuleSrcPath { - subdir = PathForModuleSrc(ctx, subdir).String() - p.rel = Rel(ctx, subdir, p.path) - return p -} - // ModuleOutPath is a Path representing a module's output directory. type ModuleOutPath struct { OutputPath