diff options
| -rw-r--r-- | android/filegroup.go | 6 | ||||
| -rw-r--r-- | android/module.go | 70 | ||||
| -rw-r--r-- | 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 |