#!/usr/bin/python

import os
import subprocess
import sys
import tempfile

def writeDummyFile(name):
  outfile = open(name, 'w')
  outfile.close()
  return


def compile(argv):
  pos = argv.index('-o') + 1
  name = argv[pos]
  writeDummyFile(name)

  argv[pos] = "/dev/null"
  argv.append('-H')
  argv.append('-E')
  buffer = tempfile.TemporaryFile()
  r = subprocess.call(argv, stderr=buffer)

  include = name + '.header_includes'
  outfile = open(include, 'w')

  buffer.seek(0)
  while True:
    line = buffer.readline()
    if not line:
      break
    if line.startswith('.'):
      outfile.write(line)
    else:
      sys.stderr.write(line)
  outfile.close()
  return r


def link(argv, this):
  name = argv[argv.index('-o') + 1]
  filename = os.path.basename(name)
  if filename in ('mksnapshot', 'ncdecode_table', 'ncdecode_tablegen'):
    if os.path.exists(name):
      return os.path.realpath(name) == os.path.realpath(this)
    os.symlink(this, name)
    return 0
  writeDummyFile(name)
  return 0


def main(argv):
  this = argv.pop(0)
  if argv[0] in ('gcc', 'g++'):
    # Someone else is running the preprocessor?
    if '-o' not in argv:
      return subprocess.call(argv)
    if '-c' in argv:
      return compile(argv)
    else:
      return link(argv, this)
  elif argv[0] == 'ar':
    writeDummyFile(argv[2])
    return 0

  # Special commands
  cmd = os.path.basename(this)
  if cmd in ('mksnapshot', 'ncdecode_table', 'ncdecode_tablegen'):
    for arg in argv:
      if arg.startswith('-'):
        continue
      writeDummyFile(arg)
    return 0
  # We shouldn't be here
  raise ValueError, this


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