#!/usr/bin/env python
# Copyright (c) 2011 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.

"""Rewrites paths in -I, -L and other option to be relative to a sysroot."""

import sys
import os
import optparse

REWRITE_PREFIX = ['-I',
                  '-idirafter',
                  '-imacros',
                  '-imultilib',
                  '-include',
                  '-iprefix',
                  '-iquote',
                  '-isystem',
                  '-L']

def RewritePath(path, opts):
  """Rewrites a path by stripping the prefix and prepending the sysroot."""
  sysroot = opts.sysroot
  prefix = opts.strip_prefix
  if os.path.isabs(path) and not path.startswith(sysroot):
    if path.startswith(prefix):
      path = path[len(prefix):]
    path = path.lstrip('/')
    return os.path.join(sysroot, path)
  else:
    return path


def RewriteLine(line, opts):
  """Rewrites all the paths in recognized options."""
  args = line.split()
  count = len(args)
  i = 0
  while i < count:
    for prefix in REWRITE_PREFIX:
      # The option can be either in the form "-I /path/to/dir" or
      # "-I/path/to/dir" so handle both.
      if args[i] == prefix:
        i += 1
        try:
          args[i] = RewritePath(args[i], opts)
        except IndexError:
          sys.stderr.write('Missing argument following %s\n' % prefix)
          break
      elif args[i].startswith(prefix):
        args[i] = prefix + RewritePath(args[i][len(prefix):], opts)
    i += 1

  return ' '.join(args)


def main(argv):
  parser = optparse.OptionParser()
  parser.add_option('-s', '--sysroot', default='/', help='sysroot to prepend')
  parser.add_option('-p', '--strip-prefix', default='', help='prefix to strip')
  opts, args = parser.parse_args(argv[1:])

  for line in sys.stdin.readlines():
    line = RewriteLine(line.strip(), opts)
    print line
  return 0


if __name__ == '__main__':
  sys.exit(main(sys.argv))
