# -*- Mode: Python -*-
# bootstrap the compiler.
import os
def getenv_or (name, default):
v = os.getenv (name)
if v is not None:
return v
else:
return default
gcc = getenv_or ('CC', 'gcc')
cflags = getenv_or ('CFLAGS', '-g -I.')
try:
if os.uname()[0] == 'Darwin' and gcc == 'gcc':
# stock xcode gcc has nested functions disabled by default
cflags += ' -fnested-functions'
windows = False
except:
# probably on windows
windows = True
# this is frustrating, I could have sworn win32 would take either
# forward or backslash...
def tweak (s):
if windows:
return s.replace ('/', '\\')
else:
return s
def system (cmd):
if windows:
cmd = tweak (cmd)
print cmd
os.system (cmd)
def move (p0, p1):
if windows:
system ('move %s %s' % (p0, p1))
else:
system ('mv %s %s' % (p0, p1))
def copy (p0, p1):
if windows:
system ('copy %s %s' % (p0, p1))
else:
system ('cp %s %s' % (p0, p1))
open ('self/flags.scm', 'wb').write (
"""
(define CC "%s")
(define CFLAGS "%s")
""" % (gcc, cflags))
print 'protecting bootstrap compiler'
copy ('self/compile.c', 'self/compile.backup.c')
print 'compiling stage0 binary:'
system ('%s %s self/compile.c -o self/compile' % (gcc, cflags))
print 'compiling stage1 binary:'
system ('self/compile self/compile.scm')
move ('self/compile.c', 'self/compile.1.c')
print 'compiling stage2 binary:'
system ('self/compile self/compile.scm')
move ('self/compile.c', 'self/compile.2.c')
def diff (p0, p1):
import os
p0, p1 = tweak (p0), tweak (p1)
if os.stat(p0).st_size == os.stat(p1).st_size:
f0 = open (p0, 'rb')
f1 = open (p1, 'rb')
while 1:
b0 = f0.read (32700)
b1 = f1.read (32700)
if b0 != b1:
return False
if not b0:
break
return True
# file comparison on windows? duh, should just do it in python.
samesame = diff ('self/compile.1.c', 'self/compile.2.c')
if samesame:
print 'stage1 and stage2 identical, party on wayne!'
else:
print 'stage1 and stage2 output differs'
def unlink (p):
try:
os.unlink (tweak (p))
except:
pass
unlink ('self/compile.1.c')
move ('self/compile.2.c', 'self/compile.c')
unlink ('self/compile.backup.c')