#!/usr/bin/env python

import sys, os, string, re
from os import path

try: False, True
except NameError: False, True = xrange(2)

buildcmd = 'gcc -std=c99 %(executable-name)s.c %(flags)s -no-cpp-precomp -framework Carbon -o %(executable-name)s'

if len(sys.argv) > 1 and sys.argv[1][:2] == '--':
	if sys.argv[1] == '--debug':
		extraflag = '-g -DDEBUG'
		del sys.argv[1]
	elif sys.argv[1] == '--profilable':
		extraflag = '-pg'
		del sys.argv[1]
	elif sys.argv[1] in ('--no-optimisation', '--no-optimization'):
		extraflag = '-s'
		del sys.argv[1]
	elif sys.argv[1] == '--install':
		from os import path
		bindir = path.normpath(os.environ.get('BINDIR', '/usr/local/bin'))
		if not os.access(bindir, os.W_OK):
			if not path.isdir(bindir):
				buildcmd = 'sudo mkdir -p -m0775 %(bindir)s/; install -c -m0755 %(executable-name)s %(bindir)s/clipboard'
			else:
				buildcmd = 'sudo install -c -oroot -m0755 %(executable-name)s %(bindir)s/clipboard'
		else:
			buildcmd = 'install -c -m0755 %(executable-name)s %(bindir)s/clipboard'
		extraflag = ''
		del sys.argv[1]
	elif sys.argv[1][:11] in ('--optimise=', '--optimize='):
		try:
			onum = int(sys.argv[1][11:])
		except ValueError:
			print >>sys.stderr, "--optimi%ce requires a number, not %s" % (sys.argv[1][8], sys.argv[1][11:])
			sys.exit(2)
		else:
			try: assert onum >= 0
			except AssertionError:
				print >>sys.stderr, "--optimi%ce requires a positive number, not %i" % (sys.argv[1][8], onum)
				sys.exit(3)
			else: extraflag = '-O%u -s' % (onum,)
			del sys.argv[1]
	elif sys.argv[1] in ('--optimise', '--optimize'):
		try:
			onum = int(sys.argv[2])
		except ValueError:
			print >>sys.stderr, "--optimi%ce requires a number, not %s" % (sys.argv[1][8], sys.argv[2])
			sys.exit(2)
		except IndexError:
			print >>sys.stderr, "--optimi%ce requires a number" % (sys.argv[1][8], sys.argv[2])
			sys.exit(2)
		else:
			try: assert onum >= 0
			except AssertionError:
				print >>sys.stderr, "--optimi%ce requires a positive number, not %i" % (sys.argv[1][8], onum)
				sys.exit(3)
			else: extraflag = '-O%u -s' % (onum,)
			del sys.argv[1]
	elif sys.argv[1][:7] == '--fast=':
		try:
			onum = int(sys.argv[1][8:])
		except ValueError:
			print >>sys.stderr, "--fast requires a CPU, not %s" % (sys.argv[1][7:],)
			sys.exit(2)
		else:
			try: assert onum >= 3
			except AssertionError:
				print >>sys.stderr, "--fast CPU must be G3, G4, or G5, not" % (sys.argv[1][7:],)
				sys.exit(3)
			else: extraflag = '-fast -mcpu=G%u -mtune=G%u -s' % (onum, onum)
			del sys.argv[1]
	else:
		print >>sys.stderr, "Unrecognised flag %s" % sys.argv[1]
		sys.exit(1)
else:
	extraflag = '-O2 -s'

executablename = 'clipboard%s%s'
if len(sys.argv) > 1 and re.match(r'[0-9]{2,3}((d|a|b|rc)[0-9]+)?$', sys.argv[1]):
	executablename %= ('-', sys.argv[1])
	del sys.argv[1]
else:
	executablename %= ('','')

if len(sys.argv) > 1:
	bindir = path.normpath(sys.argv[1])
else:
	bindir = path.normpath(os.environ.get('BINDIR', '/usr/local/bin'))

extraargs = [extraflag] + sys.argv[1:] + filter(None, string.split(os.environ.get('CFLAGS', ''), ' '))

if os.environ.has_key('BUFSIZE'):
	dbufsize = '-DBUFSIZE='
	dbslen = len(dbufsize)
	for arg in extraargs:
		if arg[:dbslen] == dbufsize:
			break
	else:
		extraargs.append(dbufsize + os.environ['BUFSIZE'])

buildcmd %= {'executable-name': executablename, 'flags': string.join(extraargs, ' '), 'bindir': bindir}

def run(cmd):
	print cmd
	retval = os.system(cmd)
	if retval:
		sys.exit(retval)

run(buildcmd)

