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
8import sys
9import os
10import optparse
11
12REWRITE_PREFIX = ['-I',
13                  '-idirafter',
14                  '-imacros',
15                  '-imultilib',
16                  '-include',
17                  '-iprefix',
18                  '-iquote',
19                  '-isystem',
20                  '-L']
21
22def 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
35def 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
58def 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
70if __name__ == '__main__':
71  sys.exit(main(sys.argv))
72