You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.8 KiB
108 lines
2.8 KiB
9 years ago
|
#!/usr/bin/env python
|
||
|
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||
|
# Use of this source code is governed by a BSD-style license that can be
|
||
|
# found in the LICENSE file.
|
||
|
|
||
|
"""Fixup GCC-generated dependency files.
|
||
|
|
||
|
Modify GCC generated dependency files so they are more suitable for including
|
||
|
in a GNU Makefile. Without the fixups, deleting or renaming headers can cause
|
||
|
the build to be broken.
|
||
|
|
||
|
See http://mad-scientist.net/make/autodep.html for more details of the problem.
|
||
|
"""
|
||
|
|
||
|
import argparse
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
TAG_LINE = '# Updated by fix_deps.py\n'
|
||
|
|
||
|
|
||
|
class Error(Exception):
|
||
|
pass
|
||
|
|
||
|
|
||
|
def ParseLine(line, new_target):
|
||
|
"""Parse one line of a GCC-generated deps file.
|
||
|
|
||
|
Each line contains an optional target and then a list
|
||
|
of space seperated dependencies. Spaces within filenames
|
||
|
are escaped with a backslash.
|
||
|
"""
|
||
|
filenames = []
|
||
|
|
||
|
if new_target and ':' in line:
|
||
|
line = line.split(':', 1)[1]
|
||
|
|
||
|
line = line.strip()
|
||
|
line = line.rstrip('\\')
|
||
|
|
||
|
while True:
|
||
|
# Find the next non-escaped space
|
||
|
line = line.strip()
|
||
|
pos = line.find(' ')
|
||
|
while pos > 0 and line[pos-1] == '\\':
|
||
|
pos = line.find(' ', pos+1)
|
||
|
|
||
|
if pos == -1:
|
||
|
filenames.append(line)
|
||
|
break
|
||
|
filenames.append(line[:pos])
|
||
|
line = line[pos+1:]
|
||
|
|
||
|
return filenames
|
||
|
|
||
|
|
||
|
def FixupDepFile(filename, output_filename=None):
|
||
|
if not os.path.exists(filename):
|
||
|
raise Error('File not found: %s' % filename)
|
||
|
|
||
|
if output_filename is None:
|
||
|
output_filename = filename
|
||
|
|
||
|
outlines = [TAG_LINE]
|
||
|
deps = []
|
||
|
new_target = True
|
||
|
with open(filename) as infile:
|
||
|
for line in infile:
|
||
|
if line == TAG_LINE:
|
||
|
raise Error('Already processed: %s' % filename)
|
||
|
outlines.append(line)
|
||
|
deps += ParseLine(line, new_target)
|
||
|
new_target = line.endswith('\\')
|
||
|
|
||
|
# For every depenency found output a dummy target with no rules
|
||
|
for dep in deps:
|
||
|
outlines.append('%s:\n' % dep)
|
||
|
|
||
|
with open(output_filename, 'w') as outfile:
|
||
|
for line in outlines:
|
||
|
outfile.write(line)
|
||
|
|
||
|
|
||
|
def main(argv):
|
||
|
parser = argparse.ArgumentParser(description=__doc__)
|
||
|
parser.add_argument('-o', '--output', help='Output filename (defaults to '
|
||
|
'input name with .deps extension')
|
||
|
parser.add_argument('-c', '--clean', action='store_true',
|
||
|
help='Remove input file after writing output')
|
||
|
parser.add_argument('dep_file')
|
||
|
options = parser.parse_args(argv)
|
||
|
output_filename = options.output
|
||
|
if not output_filename:
|
||
|
output_filename = os.path.splitext(options.dep_file)[0] + '.deps'
|
||
|
FixupDepFile(options.dep_file, output_filename)
|
||
|
if options.clean and options.dep_file != output_filename:
|
||
|
os.remove(options.dep_file)
|
||
|
|
||
|
return 0
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
try:
|
||
|
sys.exit(main(sys.argv[1:]))
|
||
|
except Error as e:
|
||
|
sys.stderr.write('%s: %s\n' % (os.path.basename(__file__), e))
|
||
|
sys.exit(1)
|