xref: /aosp_15_r20/build/soong/cmd/dep_fixer/main.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Worker// This tool reads "make"-like dependency files, and outputs a canonical version
16*333d2b36SAndroid Build Coastguard Worker// that can be used by ninja. Ninja doesn't support multiple output files (even
17*333d2b36SAndroid Build Coastguard Worker// though it doesn't care what the output file is, or whether it matches what is
18*333d2b36SAndroid Build Coastguard Worker// expected).
19*333d2b36SAndroid Build Coastguard Workerpackage main
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Workerimport (
22*333d2b36SAndroid Build Coastguard Worker	"bytes"
23*333d2b36SAndroid Build Coastguard Worker	"flag"
24*333d2b36SAndroid Build Coastguard Worker	"fmt"
25*333d2b36SAndroid Build Coastguard Worker	"io/ioutil"
26*333d2b36SAndroid Build Coastguard Worker	"log"
27*333d2b36SAndroid Build Coastguard Worker	"os"
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Worker	"android/soong/makedeps"
30*333d2b36SAndroid Build Coastguard Worker)
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Workerfunc main() {
33*333d2b36SAndroid Build Coastguard Worker	flag.Usage = func() {
34*333d2b36SAndroid Build Coastguard Worker		fmt.Fprintf(os.Stderr, "Usage: %s [-o <output>] <depfile.d> [<depfile.d>...]", os.Args[0])
35*333d2b36SAndroid Build Coastguard Worker		flag.PrintDefaults()
36*333d2b36SAndroid Build Coastguard Worker	}
37*333d2b36SAndroid Build Coastguard Worker	output := flag.String("o", "", "Optional output file (defaults to rewriting source if necessary)")
38*333d2b36SAndroid Build Coastguard Worker	flag.Parse()
39*333d2b36SAndroid Build Coastguard Worker
40*333d2b36SAndroid Build Coastguard Worker	if flag.NArg() < 1 {
41*333d2b36SAndroid Build Coastguard Worker		log.Fatal("Expected at least one input file as an argument")
42*333d2b36SAndroid Build Coastguard Worker	}
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Worker	var mergedDeps *makedeps.Deps
45*333d2b36SAndroid Build Coastguard Worker	var firstInput []byte
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Worker	for i, arg := range flag.Args() {
48*333d2b36SAndroid Build Coastguard Worker		input, err := ioutil.ReadFile(arg)
49*333d2b36SAndroid Build Coastguard Worker		if err != nil {
50*333d2b36SAndroid Build Coastguard Worker			log.Fatalf("Error opening %q: %v", arg, err)
51*333d2b36SAndroid Build Coastguard Worker		}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Worker		deps, err := makedeps.Parse(arg, bytes.NewBuffer(append([]byte(nil), input...)))
54*333d2b36SAndroid Build Coastguard Worker		if err != nil {
55*333d2b36SAndroid Build Coastguard Worker			log.Fatalf("Failed to parse: %v", err)
56*333d2b36SAndroid Build Coastguard Worker		}
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker		if i == 0 {
59*333d2b36SAndroid Build Coastguard Worker			mergedDeps = deps
60*333d2b36SAndroid Build Coastguard Worker			firstInput = input
61*333d2b36SAndroid Build Coastguard Worker		} else {
62*333d2b36SAndroid Build Coastguard Worker			mergedDeps.Inputs = append(mergedDeps.Inputs, deps.Inputs...)
63*333d2b36SAndroid Build Coastguard Worker		}
64*333d2b36SAndroid Build Coastguard Worker	}
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker	new := mergedDeps.Print()
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker	if *output == "" || *output == flag.Arg(0) {
69*333d2b36SAndroid Build Coastguard Worker		if !bytes.Equal(firstInput, new) {
70*333d2b36SAndroid Build Coastguard Worker			err := ioutil.WriteFile(flag.Arg(0), new, 0666)
71*333d2b36SAndroid Build Coastguard Worker			if err != nil {
72*333d2b36SAndroid Build Coastguard Worker				log.Fatalf("Failed to write: %v", err)
73*333d2b36SAndroid Build Coastguard Worker			}
74*333d2b36SAndroid Build Coastguard Worker		}
75*333d2b36SAndroid Build Coastguard Worker	} else {
76*333d2b36SAndroid Build Coastguard Worker		err := ioutil.WriteFile(*output, new, 0666)
77*333d2b36SAndroid Build Coastguard Worker		if err != nil {
78*333d2b36SAndroid Build Coastguard Worker			log.Fatalf("Failed to write to %q: %v", *output, err)
79*333d2b36SAndroid Build Coastguard Worker		}
80*333d2b36SAndroid Build Coastguard Worker	}
81*333d2b36SAndroid Build Coastguard Worker}
82