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:
@@ -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)
|
||||
|
Reference in New Issue
Block a user