Add depfile support to RuleBuilder

Allow rules built with RuleBuilder to use depfiles.  Ninja only
supports a single depfile with single output.  If there are
multiple outputs in a rule, move all but the first to implicit
outputs.  If multiple depfiles are specified, use new support
in dep_fixer to combine additional depfiles into the first depfile.

Test: rule_builder_test.go
Change-Id: I7dd4ba7fdf9feaf89b3dd2b7abb0e79006e06018
This commit is contained in:
Colin Cross
2019-03-29 15:33:06 -07:00
parent 92b7d584c8
commit 1d2cf0494a
5 changed files with 171 additions and 43 deletions

View File

@@ -29,30 +29,42 @@ import (
func main() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: %s <depfile.d>", os.Args[0])
fmt.Fprintf(os.Stderr, "Usage: %s [-o <output>] <depfile.d> [<depfile.d>...]", os.Args[0])
flag.PrintDefaults()
}
output := flag.String("o", "", "Optional output file (defaults to rewriting source if necessary)")
flag.Parse()
if flag.NArg() != 1 {
log.Fatal("Expected a single file as an argument")
if flag.NArg() < 1 {
log.Fatal("Expected at least one input file as an argument")
}
old, err := ioutil.ReadFile(flag.Arg(0))
if err != nil {
log.Fatalf("Error opening %q: %v", flag.Arg(0), err)
var mergedDeps *Deps
var firstInput []byte
for i, arg := range flag.Args() {
input, err := ioutil.ReadFile(arg)
if err != nil {
log.Fatalf("Error opening %q: %v", arg, err)
}
deps, err := Parse(arg, bytes.NewBuffer(append([]byte(nil), input...)))
if err != nil {
log.Fatalf("Failed to parse: %v", err)
}
if i == 0 {
mergedDeps = deps
firstInput = input
} else {
mergedDeps.Inputs = append(mergedDeps.Inputs, deps.Inputs...)
}
}
deps, err := Parse(flag.Arg(0), bytes.NewBuffer(append([]byte(nil), old...)))
if err != nil {
log.Fatalf("Failed to parse: %v", err)
}
new := deps.Print()
new := mergedDeps.Print()
if *output == "" || *output == flag.Arg(0) {
if !bytes.Equal(old, new) {
if !bytes.Equal(firstInput, new) {
err := ioutil.WriteFile(flag.Arg(0), new, 0666)
if err != nil {
log.Fatalf("Failed to write: %v", err)