|
1 #!/usr/bin/env python |
|
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
|
3 # Use of this source code is governed by a BSD-style license that can be |
|
4 # found in the LICENSE file. |
|
5 |
|
6 """Rewrites paths in -I, -L and other option to be relative to a sysroot.""" |
|
7 |
|
8 import sys |
|
9 import os |
|
10 import optparse |
|
11 |
|
12 REWRITE_PREFIX = ['-I', |
|
13 '-idirafter', |
|
14 '-imacros', |
|
15 '-imultilib', |
|
16 '-include', |
|
17 '-iprefix', |
|
18 '-iquote', |
|
19 '-isystem', |
|
20 '-L'] |
|
21 |
|
22 def RewritePath(path, opts): |
|
23 """Rewrites a path by stripping the prefix and prepending the sysroot.""" |
|
24 sysroot = opts.sysroot |
|
25 prefix = opts.strip_prefix |
|
26 if os.path.isabs(path) and not path.startswith(sysroot): |
|
27 if path.startswith(prefix): |
|
28 path = path[len(prefix):] |
|
29 path = path.lstrip('/') |
|
30 return os.path.join(sysroot, path) |
|
31 else: |
|
32 return path |
|
33 |
|
34 |
|
35 def RewriteLine(line, opts): |
|
36 """Rewrites all the paths in recognized options.""" |
|
37 args = line.split() |
|
38 count = len(args) |
|
39 i = 0 |
|
40 while i < count: |
|
41 for prefix in REWRITE_PREFIX: |
|
42 # The option can be either in the form "-I /path/to/dir" or |
|
43 # "-I/path/to/dir" so handle both. |
|
44 if args[i] == prefix: |
|
45 i += 1 |
|
46 try: |
|
47 args[i] = RewritePath(args[i], opts) |
|
48 except IndexError: |
|
49 sys.stderr.write('Missing argument following %s\n' % prefix) |
|
50 break |
|
51 elif args[i].startswith(prefix): |
|
52 args[i] = prefix + RewritePath(args[i][len(prefix):], opts) |
|
53 i += 1 |
|
54 |
|
55 return ' '.join(args) |
|
56 |
|
57 |
|
58 def main(argv): |
|
59 parser = optparse.OptionParser() |
|
60 parser.add_option('-s', '--sysroot', default='/', help='sysroot to prepend') |
|
61 parser.add_option('-p', '--strip-prefix', default='', help='prefix to strip') |
|
62 opts, args = parser.parse_args(argv[1:]) |
|
63 |
|
64 for line in sys.stdin.readlines(): |
|
65 line = RewriteLine(line.strip(), opts) |
|
66 print line |
|
67 return 0 |
|
68 |
|
69 |
|
70 if __name__ == '__main__': |
|
71 sys.exit(main(sys.argv)) |