xref: /aosp_15_r20/build/blueprint/deptools/depfile.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2014 Google Inc. All rights reserved.
2*1fa6dee9SAndroid Build Coastguard Worker//
3*1fa6dee9SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*1fa6dee9SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*1fa6dee9SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*1fa6dee9SAndroid Build Coastguard Worker//
7*1fa6dee9SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*1fa6dee9SAndroid Build Coastguard Worker//
9*1fa6dee9SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*1fa6dee9SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*1fa6dee9SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*1fa6dee9SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*1fa6dee9SAndroid Build Coastguard Worker// limitations under the License.
14*1fa6dee9SAndroid Build Coastguard Worker
15*1fa6dee9SAndroid Build Coastguard Workerpackage deptools
16*1fa6dee9SAndroid Build Coastguard Worker
17*1fa6dee9SAndroid Build Coastguard Workerimport (
18*1fa6dee9SAndroid Build Coastguard Worker	"fmt"
19*1fa6dee9SAndroid Build Coastguard Worker	"os"
20*1fa6dee9SAndroid Build Coastguard Worker	"strings"
21*1fa6dee9SAndroid Build Coastguard Worker)
22*1fa6dee9SAndroid Build Coastguard Worker
23*1fa6dee9SAndroid Build Coastguard Workervar (
24*1fa6dee9SAndroid Build Coastguard Worker	pathEscaper = strings.NewReplacer(
25*1fa6dee9SAndroid Build Coastguard Worker		`\`, `\\`,
26*1fa6dee9SAndroid Build Coastguard Worker		` `, `\ `,
27*1fa6dee9SAndroid Build Coastguard Worker		`#`, `\#`,
28*1fa6dee9SAndroid Build Coastguard Worker		`*`, `\*`,
29*1fa6dee9SAndroid Build Coastguard Worker		`[`, `\[`,
30*1fa6dee9SAndroid Build Coastguard Worker		`|`, `\|`)
31*1fa6dee9SAndroid Build Coastguard Worker)
32*1fa6dee9SAndroid Build Coastguard Worker
33*1fa6dee9SAndroid Build Coastguard Worker// WriteDepFile creates a new gcc-style depfile and populates it with content
34*1fa6dee9SAndroid Build Coastguard Worker// indicating that target depends on deps.
35*1fa6dee9SAndroid Build Coastguard Workerfunc WriteDepFile(filename, target string, deps []string) error {
36*1fa6dee9SAndroid Build Coastguard Worker	f, err := os.Create(filename)
37*1fa6dee9SAndroid Build Coastguard Worker	if err != nil {
38*1fa6dee9SAndroid Build Coastguard Worker		return err
39*1fa6dee9SAndroid Build Coastguard Worker	}
40*1fa6dee9SAndroid Build Coastguard Worker	defer f.Close()
41*1fa6dee9SAndroid Build Coastguard Worker
42*1fa6dee9SAndroid Build Coastguard Worker	var escapedDeps []string
43*1fa6dee9SAndroid Build Coastguard Worker
44*1fa6dee9SAndroid Build Coastguard Worker	for _, dep := range deps {
45*1fa6dee9SAndroid Build Coastguard Worker		escapedDeps = append(escapedDeps, pathEscaper.Replace(dep))
46*1fa6dee9SAndroid Build Coastguard Worker	}
47*1fa6dee9SAndroid Build Coastguard Worker
48*1fa6dee9SAndroid Build Coastguard Worker	_, err = fmt.Fprintf(f, "%s: \\\n %s\n", target,
49*1fa6dee9SAndroid Build Coastguard Worker		strings.Join(escapedDeps, " \\\n "))
50*1fa6dee9SAndroid Build Coastguard Worker	if err != nil {
51*1fa6dee9SAndroid Build Coastguard Worker		return err
52*1fa6dee9SAndroid Build Coastguard Worker	}
53*1fa6dee9SAndroid Build Coastguard Worker
54*1fa6dee9SAndroid Build Coastguard Worker	return nil
55*1fa6dee9SAndroid Build Coastguard Worker}
56