15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2011 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Rewrites paths in -I, -L and other option to be relative to a sysroot."""
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import optparse
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REWRITE_PREFIX = ['-I',
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  '-idirafter',
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  '-imacros',
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  '-imultilib',
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  '-include',
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  '-iprefix',
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  '-iquote',
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  '-isystem',
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  '-L']
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def RewritePath(path, opts):
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Rewrites a path by stripping the prefix and prepending the sysroot."""
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sysroot = opts.sysroot
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefix = opts.strip_prefix
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if os.path.isabs(path) and not path.startswith(sysroot):
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if path.startswith(prefix):
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      path = path[len(prefix):]
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.lstrip('/')
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return os.path.join(sysroot, path)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return path
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def RewriteLine(line, opts):
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Rewrites all the paths in recognized options."""
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args = line.split()
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = len(args)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i = 0
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while i < count:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for prefix in REWRITE_PREFIX:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # The option can be either in the form "-I /path/to/dir" or
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # "-I/path/to/dir" so handle both.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if args[i] == prefix:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i += 1
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        try:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          args[i] = RewritePath(args[i], opts)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        except IndexError:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sys.stderr.write('Missing argument following %s\n' % prefix)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      elif args[i].startswith(prefix):
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        args[i] = prefix + RewritePath(args[i][len(prefix):], opts)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i += 1
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ' '.join(args)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main(argv):
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser = optparse.OptionParser()
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option('-s', '--sysroot', default='/', help='sysroot to prepend')
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option('-p', '--strip-prefix', default='', help='prefix to strip')
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opts, args = parser.parse_args(argv[1:])
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for line in sys.stdin.readlines():
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line = RewriteLine(line.strip(), opts)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print line
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sys.exit(main(sys.argv))
72