commit
503b811a8e
5 changed files with 100 additions and 100 deletions
|
@ -2,6 +2,7 @@ bootstrap_go_package(
|
|||
name = "blueprint",
|
||||
deps = [
|
||||
"blueprint-parser",
|
||||
"blueprint-pathtools",
|
||||
"blueprint-proptools",
|
||||
],
|
||||
pkgPath = "github.com/google/blueprint",
|
||||
|
|
|
@ -65,8 +65,9 @@ build .bootstrap/blueprint/pkg/github.com/google/blueprint.a: g.bootstrap.gc $
|
|||
${g.bootstrap.srcDir}/singleton_ctx.go ${g.bootstrap.srcDir}/unpack.go $
|
||||
| ${g.bootstrap.gcCmd} $
|
||||
.bootstrap/blueprint-parser/pkg/github.com/google/blueprint/parser.a $
|
||||
.bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
|
||||
.bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a
|
||||
incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-proptools/pkg
|
||||
incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg
|
||||
pkgPath = github.com/google/blueprint
|
||||
default .bootstrap/blueprint/pkg/github.com/google/blueprint.a
|
||||
|
||||
|
@ -75,7 +76,7 @@ default .bootstrap/blueprint/pkg/github.com/google/blueprint.a
|
|||
# Variant:
|
||||
# Type: bootstrap_go_package
|
||||
# Factory: github.com/google/blueprint/bootstrap.newGoPackageModule
|
||||
# Defined: Blueprints:55:1
|
||||
# Defined: Blueprints:56:1
|
||||
|
||||
build $
|
||||
.bootstrap/blueprint-bootstrap/pkg/github.com/google/blueprint/bootstrap.a $
|
||||
|
@ -85,11 +86,11 @@ build $
|
|||
${g.bootstrap.srcDir}/bootstrap/config.go $
|
||||
${g.bootstrap.srcDir}/bootstrap/doc.go | ${g.bootstrap.gcCmd} $
|
||||
.bootstrap/blueprint-parser/pkg/github.com/google/blueprint/parser.a $
|
||||
.bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
|
||||
.bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a $
|
||||
.bootstrap/blueprint/pkg/github.com/google/blueprint.a $
|
||||
.bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a $
|
||||
.bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a
|
||||
incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-pathtools/pkg
|
||||
.bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a
|
||||
incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg
|
||||
pkgPath = github.com/google/blueprint/bootstrap
|
||||
default $
|
||||
.bootstrap/blueprint-bootstrap/pkg/github.com/google/blueprint/bootstrap.a
|
||||
|
@ -99,7 +100,7 @@ default $
|
|||
# Variant:
|
||||
# Type: bootstrap_go_package
|
||||
# Factory: github.com/google/blueprint/bootstrap.newGoPackageModule
|
||||
# Defined: Blueprints:34:1
|
||||
# Defined: Blueprints:35:1
|
||||
|
||||
build .bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a $
|
||||
: g.bootstrap.gc ${g.bootstrap.srcDir}/deptools/depfile.go | $
|
||||
|
@ -113,7 +114,7 @@ default $
|
|||
# Variant:
|
||||
# Type: bootstrap_go_package
|
||||
# Factory: github.com/google/blueprint/bootstrap.newGoPackageModule
|
||||
# Defined: Blueprints:23:1
|
||||
# Defined: Blueprints:24:1
|
||||
|
||||
build .bootstrap/blueprint-parser/pkg/github.com/google/blueprint/parser.a: $
|
||||
g.bootstrap.gc ${g.bootstrap.srcDir}/parser/modify.go $
|
||||
|
@ -128,7 +129,7 @@ default .bootstrap/blueprint-parser/pkg/github.com/google/blueprint/parser.a
|
|||
# Variant:
|
||||
# Type: bootstrap_go_package
|
||||
# Factory: github.com/google/blueprint/bootstrap.newGoPackageModule
|
||||
# Defined: Blueprints:40:1
|
||||
# Defined: Blueprints:41:1
|
||||
|
||||
build $
|
||||
.bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
|
||||
|
@ -143,7 +144,7 @@ default $
|
|||
# Variant:
|
||||
# Type: bootstrap_go_package
|
||||
# Factory: github.com/google/blueprint/bootstrap.newGoPackageModule
|
||||
# Defined: Blueprints:49:1
|
||||
# Defined: Blueprints:50:1
|
||||
|
||||
build $
|
||||
.bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a $
|
||||
|
@ -158,7 +159,7 @@ default $
|
|||
# Variant:
|
||||
# Type: bootstrap_go_binary
|
||||
# Factory: github.com/google/blueprint/bootstrap.newGoBinaryModule
|
||||
# Defined: Blueprints:81:1
|
||||
# Defined: Blueprints:82:1
|
||||
|
||||
build .bootstrap/bpfmt/obj/bpfmt.a: g.bootstrap.gc $
|
||||
${g.bootstrap.srcDir}/bpfmt/bpfmt.go | ${g.bootstrap.gcCmd} $
|
||||
|
@ -180,7 +181,7 @@ default .bootstrap/bin/bpfmt
|
|||
# Variant:
|
||||
# Type: bootstrap_go_binary
|
||||
# Factory: github.com/google/blueprint/bootstrap.newGoBinaryModule
|
||||
# Defined: Blueprints:87:1
|
||||
# Defined: Blueprints:88:1
|
||||
|
||||
build .bootstrap/bpmodify/obj/bpmodify.a: g.bootstrap.gc $
|
||||
${g.bootstrap.srcDir}/bpmodify/bpmodify.go | ${g.bootstrap.gcCmd} $
|
||||
|
@ -202,23 +203,23 @@ default .bootstrap/bin/bpmodify
|
|||
# Variant:
|
||||
# Type: bootstrap_go_binary
|
||||
# Factory: github.com/google/blueprint/bootstrap.newGoBinaryModule
|
||||
# Defined: Blueprints:72:1
|
||||
# Defined: Blueprints:73:1
|
||||
|
||||
build .bootstrap/minibp/obj/minibp.a: g.bootstrap.gc $
|
||||
${g.bootstrap.srcDir}/bootstrap/minibp/main.go | ${g.bootstrap.gcCmd} $
|
||||
.bootstrap/blueprint-parser/pkg/github.com/google/blueprint/parser.a $
|
||||
.bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
|
||||
.bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a $
|
||||
.bootstrap/blueprint/pkg/github.com/google/blueprint.a $
|
||||
.bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a $
|
||||
.bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
|
||||
.bootstrap/blueprint-bootstrap/pkg/github.com/google/blueprint/bootstrap.a
|
||||
incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-bootstrap/pkg
|
||||
incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap/pkg
|
||||
pkgPath = minibp
|
||||
default .bootstrap/minibp/obj/minibp.a
|
||||
|
||||
build .bootstrap/minibp/obj/a.out: g.bootstrap.link $
|
||||
.bootstrap/minibp/obj/minibp.a | ${g.bootstrap.linkCmd}
|
||||
libDirFlags = -L .bootstrap/blueprint-parser/pkg -L .bootstrap/blueprint-proptools/pkg -L .bootstrap/blueprint/pkg -L .bootstrap/blueprint-deptools/pkg -L .bootstrap/blueprint-pathtools/pkg -L .bootstrap/blueprint-bootstrap/pkg
|
||||
libDirFlags = -L .bootstrap/blueprint-parser/pkg -L .bootstrap/blueprint-pathtools/pkg -L .bootstrap/blueprint-proptools/pkg -L .bootstrap/blueprint/pkg -L .bootstrap/blueprint-deptools/pkg -L .bootstrap/blueprint-bootstrap/pkg
|
||||
default .bootstrap/minibp/obj/a.out
|
||||
|
||||
build .bootstrap/bin/minibp: g.bootstrap.cp .bootstrap/minibp/obj/a.out
|
||||
|
|
126
context.go
126
context.go
|
@ -19,6 +19,7 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"github.com/google/blueprint/parser"
|
||||
"github.com/google/blueprint/pathtools"
|
||||
"github.com/google/blueprint/proptools"
|
||||
"io"
|
||||
"os"
|
||||
|
@ -471,6 +472,7 @@ func (c *Context) parse(rootDir, filename string, r io.Reader,
|
|||
}
|
||||
|
||||
subdirs, newErrs := c.processSubdirs(scope)
|
||||
|
||||
if len(newErrs) > 0 {
|
||||
errs = append(errs, newErrs...)
|
||||
}
|
||||
|
@ -590,77 +592,50 @@ func (c *Context) parseBlueprintsFile(filename string, scope *parser.Scope, root
|
|||
modulesCh <- modules
|
||||
|
||||
for _, subdir := range subdirs {
|
||||
subdir = filepath.Join(dir, subdir)
|
||||
globPattern := filepath.Join(dir, subdir)
|
||||
matches, matchedDirs, err := pathtools.Glob(globPattern)
|
||||
if err != nil {
|
||||
errsCh <- []error{err}
|
||||
return
|
||||
}
|
||||
|
||||
dirPart, filePart := filepath.Split(subdir)
|
||||
dirPart = filepath.Clean(dirPart)
|
||||
// Depend on all searched directories so we pick up future changes.
|
||||
for _, matchedDir := range matchedDirs {
|
||||
depsCh <- matchedDir
|
||||
}
|
||||
|
||||
if filePart == "*" {
|
||||
foundSubdirs, err := listSubdirs(dirPart)
|
||||
if err != nil {
|
||||
errsCh <- []error{err}
|
||||
return
|
||||
for _, foundSubdir := range matches {
|
||||
fileInfo, subdirStatErr := os.Stat(foundSubdir)
|
||||
if subdirStatErr != nil {
|
||||
errsCh <- []error{subdirStatErr}
|
||||
continue
|
||||
}
|
||||
|
||||
for _, foundSubdir := range foundSubdirs {
|
||||
subBlueprints := filepath.Join(dirPart, foundSubdir,
|
||||
"Blueprints")
|
||||
// Skip files
|
||||
if !fileInfo.IsDir() {
|
||||
continue
|
||||
}
|
||||
|
||||
_, err := os.Stat(subBlueprints)
|
||||
if os.IsNotExist(err) {
|
||||
// There is no Blueprints file in this subdirectory. We
|
||||
// need to add the directory to the list of dependencies
|
||||
// so that if someone adds a Blueprints file in the
|
||||
// future we'll pick it up.
|
||||
depsCh <- filepath.Dir(subBlueprints)
|
||||
} else {
|
||||
depsCh <- subBlueprints
|
||||
blueprintsCh <- stringAndScope{
|
||||
subBlueprints,
|
||||
subScope,
|
||||
}
|
||||
subBlueprints := filepath.Join(foundSubdir, "Blueprints")
|
||||
|
||||
_, err := os.Stat(subBlueprints)
|
||||
if os.IsNotExist(err) {
|
||||
// There is no Blueprints file in this subdirectory. We
|
||||
// need to add the directory to the list of dependencies
|
||||
// so that if someone adds a Blueprints file in the
|
||||
// future we'll pick it up.
|
||||
depsCh <- filepath.Dir(subBlueprints)
|
||||
} else {
|
||||
depsCh <- subBlueprints
|
||||
blueprintsCh <- stringAndScope{
|
||||
subBlueprints,
|
||||
subScope,
|
||||
}
|
||||
}
|
||||
|
||||
// We now depend on the directory itself because if any new
|
||||
// subdirectories get added or removed we need to rebuild the
|
||||
// Ninja manifest.
|
||||
depsCh <- dirPart
|
||||
} else {
|
||||
subBlueprints := filepath.Join(subdir, "Blueprints")
|
||||
depsCh <- subBlueprints
|
||||
blueprintsCh <- stringAndScope{
|
||||
subBlueprints,
|
||||
subScope,
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func listSubdirs(dir string) ([]string, error) {
|
||||
d, err := os.Open(dir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer d.Close()
|
||||
|
||||
infos, err := d.Readdir(-1)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var subdirs []string
|
||||
for _, info := range infos {
|
||||
isDotFile := strings.HasPrefix(info.Name(), ".")
|
||||
if info.IsDir() && !isDotFile {
|
||||
subdirs = append(subdirs, info.Name())
|
||||
}
|
||||
}
|
||||
|
||||
return subdirs, nil
|
||||
}
|
||||
|
||||
func (c *Context) processSubdirs(
|
||||
scope *parser.Scope) (subdirs []string, errs []error) {
|
||||
|
||||
|
@ -675,19 +650,6 @@ func (c *Context) processSubdirs(
|
|||
panic("non-string value found in list")
|
||||
}
|
||||
|
||||
dirPart, filePart := filepath.Split(value.StringValue)
|
||||
if (filePart != "*" && strings.ContainsRune(filePart, '*')) ||
|
||||
strings.ContainsRune(dirPart, '*') {
|
||||
|
||||
errs = append(errs, &Error{
|
||||
Err: fmt.Errorf("subdirs may only wildcard whole " +
|
||||
"directories"),
|
||||
Pos: value.Pos,
|
||||
})
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
subdirs = append(subdirs, value.StringValue)
|
||||
}
|
||||
|
||||
|
@ -1415,11 +1377,13 @@ func (c *Context) runTopDownMutator(config interface{},
|
|||
func (c *Context) runBottomUpMutator(config interface{},
|
||||
name string, mutator BottomUpMutator) (errs []error) {
|
||||
|
||||
dependenciesModified := false
|
||||
|
||||
for _, module := range c.modulesSorted {
|
||||
newModules := make([]*moduleInfo, 0, 1)
|
||||
|
||||
if module.splitModules != nil {
|
||||
panic("split module found in sorted module list")
|
||||
}
|
||||
|
||||
mctx := &mutatorContext{
|
||||
baseModuleContext: baseModuleContext{
|
||||
context: c,
|
||||
|
@ -1443,10 +1407,6 @@ func (c *Context) runBottomUpMutator(config interface{},
|
|||
}
|
||||
}
|
||||
|
||||
if mctx.dependenciesModified {
|
||||
dependenciesModified = true
|
||||
}
|
||||
|
||||
if module.splitModules != nil {
|
||||
newModules = append(newModules, module.splitModules...)
|
||||
} else {
|
||||
|
@ -1456,11 +1416,9 @@ func (c *Context) runBottomUpMutator(config interface{},
|
|||
module.group.modules = spliceModules(module.group.modules, module, newModules)
|
||||
}
|
||||
|
||||
if dependenciesModified {
|
||||
errs = c.updateDependencies()
|
||||
if len(errs) > 0 {
|
||||
return errs
|
||||
}
|
||||
errs = c.updateDependencies()
|
||||
if len(errs) > 0 {
|
||||
return errs
|
||||
}
|
||||
|
||||
return errs
|
||||
|
|
|
@ -20,6 +20,16 @@ import (
|
|||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
pathEscaper = strings.NewReplacer(
|
||||
`\`, `\\`,
|
||||
` `, `\ `,
|
||||
`#`, `\#`,
|
||||
`*`, `\*`,
|
||||
`[`, `\[`,
|
||||
`|`, `\|`)
|
||||
)
|
||||
|
||||
// WriteDepFile creates a new gcc-style depfile and populates it with content
|
||||
// indicating that target depends on deps.
|
||||
func WriteDepFile(filename, target string, deps []string) error {
|
||||
|
@ -29,8 +39,14 @@ func WriteDepFile(filename, target string, deps []string) error {
|
|||
}
|
||||
defer f.Close()
|
||||
|
||||
var escapedDeps []string
|
||||
|
||||
for _, dep := range deps {
|
||||
escapedDeps = append(escapedDeps, pathEscaper.Replace(dep))
|
||||
}
|
||||
|
||||
_, err = fmt.Fprintf(f, "%s: \\\n %s\n", target,
|
||||
strings.Join(deps, " \\\n "))
|
||||
strings.Join(escapedDeps, " \\\n "))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -59,3 +59,27 @@ func wildElements(pattern string) []int {
|
|||
func isWild(pattern string) bool {
|
||||
return strings.ContainsAny(pattern, "*?[")
|
||||
}
|
||||
|
||||
func GlobPatternList(patterns []string, prefix string) (globedList []string, depDirs []string, err error) {
|
||||
var (
|
||||
matches []string
|
||||
deps []string
|
||||
)
|
||||
|
||||
globedList = make([]string, 0)
|
||||
depDirs = make([]string, 0)
|
||||
|
||||
for _, pattern := range patterns {
|
||||
if isWild(pattern) {
|
||||
matches, deps, err = Glob(filepath.Join(prefix, pattern))
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
globedList = append(globedList, matches...)
|
||||
depDirs = append(depDirs, deps...)
|
||||
} else {
|
||||
globedList = append(globedList, filepath.Join(prefix, pattern))
|
||||
}
|
||||
}
|
||||
return globedList, depDirs, nil
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue