diff options
author | Colin Cross <ccross@android.com> | 2016-11-01 11:10:51 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2016-11-03 13:54:03 -0700 |
commit | 127d2eae8b7e706540e40c0422bfd41b063ca3e7 (patch) | |
tree | 64137bae7834b5439dd499ea76c29d6fbefc77ce /bootstrap/bpglob/bpglob.go | |
parent | b589835c0dbaf1ad0e830c6043a0481ca916b084 (diff) | |
download | android_build_blueprint-127d2eae8b7e706540e40c0422bfd41b063ca3e7.tar.gz android_build_blueprint-127d2eae8b7e706540e40c0422bfd41b063ca3e7.tar.bz2 android_build_blueprint-127d2eae8b7e706540e40c0422bfd41b063ca3e7.zip |
Import globbing from Soong
Add globbing with dependency checking to blueprint. Calling
ModuleContext.GlobWithDeps or SingletonContext.GlobWithDeps will return
a list of files that match the globs, while also adding efficient
dependencies to rerun the primary builder if a file that matches the
glob is added or removed.
Also use the globbing support for optional_subdirs=, subdirs= and build=
lines in blueprints files. The globbing slightly changes the behavior
of subname= lines, it no longer falls back to looking for a file called
"Blueprints". Blueprint files that need to include a subdirectory with
a different name can use build= instead of subdir= to directly include
them. The Blueprints file is updated to reset subname="Blueprints" in
case we want to include subdirectories inside blueprint and the primary
builder has changed the subname.
Also adds a new test directory that contains a simple primary builder
tree to test regeneration for globbing, and runs the tests in travis.
Change-Id: I83ce525fd11e11579cc58ba5308d01ca8eea7bc6
Diffstat (limited to 'bootstrap/bpglob/bpglob.go')
-rw-r--r-- | bootstrap/bpglob/bpglob.go | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/bootstrap/bpglob/bpglob.go b/bootstrap/bpglob/bpglob.go new file mode 100644 index 0000000..cb6633b --- /dev/null +++ b/bootstrap/bpglob/bpglob.go @@ -0,0 +1,77 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// bpglob is the command line tool that checks if the list of files matching a glob has +// changed, and only updates the output file list if it has changed. It is used to optimize +// out build.ninja regenerations when non-matching files are added. See +// github.com/google/blueprint/bootstrap/glob.go for a longer description. +package main + +import ( + "flag" + "fmt" + "os" + + "github.com/google/blueprint/pathtools" +) + +var ( + out = flag.String("o", "", "file to write list of files that match glob") + + excludes multiArg +) + +func init() { + flag.Var(&excludes, "e", "pattern to exclude from results") +} + +type multiArg []string + +func (m *multiArg) String() string { + return `""` +} + +func (m *multiArg) Set(s string) error { + *m = append(*m, s) + return nil +} + +func (m *multiArg) Get() interface{} { + return m +} + +func usage() { + fmt.Fprintf(os.Stderr, "usage: bpglob -o out glob\n") + flag.PrintDefaults() + os.Exit(2) +} + +func main() { + flag.Parse() + + if *out == "" { + fmt.Fprintf(os.Stderr, "error: -o is required\n") + usage() + } + + if flag.NArg() != 1 { + usage() + } + + _, err := pathtools.GlobWithDepFile(flag.Arg(0), *out, *out+".d", excludes) + if err != nil { + fmt.Fprintf(os.Stderr, "error: %s\n", err.Error()) + os.Exit(1) + } +} |