
srcdir = @srcdir@
builddir = @builddir@

# for version.mak:
mainsrcdir = @srcdir@/../..
@INCLUDEDEP@ @srcdir@/../version.mak

CC = @CC@
CPP = @CPP@
CXX = @CXX@
AR = @AR@
ARFLAGS = @ARFLAGS@
RANLIB = @RANLIB@

CPPFLAGS = @PREFLAGS@ @OPTIONS@ @GC2OPTIONS@ @MZOPTIONS@ -I$(builddir)/.. -I$(srcdir)/../include
CFLAGS = @CFLAGS@ $(CPPFLAGS) @COMPFLAGS@ @PROFFLAGS@
LIBS = @LIBS@

DEF_COLLECTS_DIR = +D INITIAL_COLLECTS_DIRECTORY='"'"`cd $(srcdir)/../../../collects; pwd`"'"'

XFORM_SETUP = ../mzscheme -rq $(srcdir)/xform.ss --setup
XFORM_NOPRECOMP = $(XFORM_SETUP) --cpp "$(CPP) $(CPPFLAGS)" -o
XSRCDIR = xsrc
XFORM = env XFORM_USE_PRECOMP=$(XSRCDIR)/precomp.h $(XFORM_NOPRECOMP)
SRCDIR = $(srcdir)/../src

OBJS =  salloc.@LTO@ \
	bignum.@LTO@ \
	bool.@LTO@ \
	builtin.@LTO@ \
	char.@LTO@ \
	complex.@LTO@ \
	dynext.@LTO@ \
	env.@LTO@ \
	error.@LTO@ \
	eval.@LTO@ \
	file.@LTO@ \
	fun.@LTO@ \
	hash.@LTO@ \
	image.@LTO@ \
	jit.@LTO@ \
	list.@LTO@ \
	module.@LTO@ \
	network.@LTO@ \
	numarith.@LTO@ \
	number.@LTO@ \
	numcomp.@LTO@ \
	numstr.@LTO@ \
	port.@LTO@ \
	portfun.@LTO@ \
	print.@LTO@ \
        rational.@LTO@ \
	read.@LTO@ \
	regexp.@LTO@ \
	sema.@LTO@ \
	setjmpup.@LTO@ \
	string.@LTO@ \
	struct.@LTO@ \
	stxobj.@LTO@ \
	symbol.@LTO@ \
	syntax.@LTO@ \
	thread.@LTO@ \
	type.@LTO@ \
	vector.@LTO@ \
	foreign.@LTO@ \
	gc2.@LTO@

XSRCS = $(XSRCDIR)/salloc.c \
	$(XSRCDIR)/bignum.c \
	$(XSRCDIR)/bool.c \
	$(XSRCDIR)/builtin.c \
	$(XSRCDIR)/char.c \
	$(XSRCDIR)/complex.c \
	$(XSRCDIR)/dynext.c \
	$(XSRCDIR)/env.c \
	$(XSRCDIR)/error.c \
	$(XSRCDIR)/eval.c \
	$(XSRCDIR)/file.c \
	$(XSRCDIR)/fun.c \
	$(XSRCDIR)/hash.c \
	$(XSRCDIR)/image.c \
	$(XSRCDIR)/jit.c \
	$(XSRCDIR)/list.c \
	$(XSRCDIR)/module.c \
	$(XSRCDIR)/network.c \
	$(XSRCDIR)/numarith.c \
	$(XSRCDIR)/numcomp.c \
	$(XSRCDIR)/number.c \
	$(XSRCDIR)/numstr.c \
	$(XSRCDIR)/port.c \
	$(XSRCDIR)/portfun.c \
	$(XSRCDIR)/print.c \
        $(XSRCDIR)/rational.c \
	$(XSRCDIR)/read.c \
	$(XSRCDIR)/regexp.c \
	$(XSRCDIR)/sema.c \
	$(XSRCDIR)/setjmpup.c \
	$(XSRCDIR)/string.c \
	$(XSRCDIR)/struct.c \
	$(XSRCDIR)/stxobj.c \
	$(XSRCDIR)/symbol.c \
	$(XSRCDIR)/syntax.c \
	$(XSRCDIR)/thread.c \
	$(XSRCDIR)/type.c \
	$(XSRCDIR)/vector.c \
	$(XSRCDIR)/foreign.c \
	$(XSRCDIR)/main.c

all: xsrc
	$(MAKE) xobjects

xsrcs: $(XSRCS)

xsrc:
	mkdir xsrc

xobjects: $(OBJS) main.@LTO@

XFORMDEP_NOPRECOMP = $(srcdir)/gc2.h $(srcdir)/xform.ss $(srcdir)/xform-mod.ss
XFORMDEP = $(XFORMDEP_NOPRECOMP) $(XSRCDIR)/precomp.h

$(XSRCDIR)/precomp.h : $(XFORMDEP_NOPRECOMP) $(srcdir)/precomp.c $(srcdir)/../src/schpriv.h $(srcdir)/../include/scheme.h \
                       $(srcdir)/../sconfig.h $(srcdir)/../uconfig.h $(srcdir)/../src/schvers.h
	env XFORM_PRECOMP=yes $(XFORM_NOPRECOMP) $(XSRCDIR)/precomp.h $(srcdir)/precomp.c

$(XSRCDIR)/salloc.c: ../src/salloc.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/salloc.c $(SRCDIR)/salloc.c
$(XSRCDIR)/bignum.c: ../src/bignum.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/bignum.c $(SRCDIR)/bignum.c
$(XSRCDIR)/bool.c: ../src/bool.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/bool.c $(SRCDIR)/bool.c
$(XSRCDIR)/builtin.c: ../src/builtin.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/builtin.c $(SRCDIR)/builtin.c
$(XSRCDIR)/char.c: ../src/char.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/char.c $(SRCDIR)/char.c
$(XSRCDIR)/complex.c: ../src/complex.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/complex.c $(SRCDIR)/complex.c
$(XSRCDIR)/dynext.c: ../src/dynext.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/dynext.c $(SRCDIR)/dynext.c
$(XSRCDIR)/env.c: ../src/env.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/env.c $(SRCDIR)/env.c
$(XSRCDIR)/error.c: ../src/error.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/error.c $(SRCDIR)/error.c
$(XSRCDIR)/eval.c: ../src/eval.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/eval.c $(SRCDIR)/eval.c
$(XSRCDIR)/file.c: ../src/file.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/file.c $(SRCDIR)/file.c
$(XSRCDIR)/fun.c: ../src/fun.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/fun.c $(SRCDIR)/fun.c
$(XSRCDIR)/hash.c: ../src/hash.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/hash.c $(SRCDIR)/hash.c
$(XSRCDIR)/image.c: ../src/image.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/image.c $(SRCDIR)/image.c
$(XSRCDIR)/jit.c: ../src/jit.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/jit.c $(SRCDIR)/jit.c
$(XSRCDIR)/module.c: ../src/module.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/module.c $(SRCDIR)/module.c
$(XSRCDIR)/list.c: ../src/list.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/list.c $(SRCDIR)/list.c
$(XSRCDIR)/network.c: ../src/network.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/network.c $(SRCDIR)/network.c
$(XSRCDIR)/numarith.c: ../src/numarith.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/numarith.c $(SRCDIR)/numarith.c
$(XSRCDIR)/number.c: ../src/number.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/number.c $(SRCDIR)/number.c
$(XSRCDIR)/numcomp.c: ../src/numcomp.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/numcomp.c $(SRCDIR)/numcomp.c
$(XSRCDIR)/numstr.c: ../src/numstr.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/numstr.c $(SRCDIR)/numstr.c
$(XSRCDIR)/port.c: ../src/port.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/port.c $(SRCDIR)/port.c
$(XSRCDIR)/portfun.c: ../src/portfun.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/portfun.c $(SRCDIR)/portfun.c
$(XSRCDIR)/print.c: ../src/print.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/print.c $(SRCDIR)/print.c
$(XSRCDIR)/rational.c: ../src/rational.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/rational.c $(SRCDIR)/rational.c
$(XSRCDIR)/read.c: ../src/read.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/read.c $(SRCDIR)/read.c
$(XSRCDIR)/regexp.c: ../src/regexp.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/regexp.c $(SRCDIR)/regexp.c
$(XSRCDIR)/sema.c: ../src/sema.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/sema.c $(SRCDIR)/sema.c
$(XSRCDIR)/setjmpup.c: ../src/setjmpup.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/setjmpup.c $(SRCDIR)/setjmpup.c
$(XSRCDIR)/string.c: ../src/string.@LTO@ $(XFORMDEP)
	$(XFORM_SETUP) --cpp "$(CPP) -I../src $(CPPFLAGS)" -o $(XSRCDIR)/string.c $(SRCDIR)/string.c
$(XSRCDIR)/struct.c: ../src/struct.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/struct.c $(SRCDIR)/struct.c
$(XSRCDIR)/stxobj.c: ../src/stxobj.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/stxobj.c $(SRCDIR)/stxobj.c
$(XSRCDIR)/symbol.c: ../src/symbol.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/symbol.c $(SRCDIR)/symbol.c
$(XSRCDIR)/syntax.c: ../src/syntax.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/syntax.c $(SRCDIR)/syntax.c
$(XSRCDIR)/thread.c: ../src/thread.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/thread.c $(SRCDIR)/thread.c
$(XSRCDIR)/type.c: ../src/type.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/type.c $(SRCDIR)/type.c
$(XSRCDIR)/vector.c: ../src/vector.@LTO@ $(XFORMDEP)
	$(XFORM) $(XSRCDIR)/vector.c $(SRCDIR)/vector.c
$(XSRCDIR)/foreign.c: ../../foreign/foreign.@LTO@ $(XFORMDEP)
	$(XFORM_SETUP) --cpp "$(CPP) $(CPPFLAGS) -I../../foreign/gcc/libffi/include -I${SRCDIR}/../../mzscheme/src" -o $(XSRCDIR)/foreign.c $(SRCDIR)/../../foreign/foreign.c
$(XSRCDIR)/main.c: ../main.@LTO@ $(XFORMDEP)
	$(XFORM_NOPRECOMP) $(XSRCDIR)/main.c $(DEF_COLLECTS_DIR) $(srcdir)/../main.c


salloc.@LTO@: $(XSRCDIR)/salloc.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/salloc.c -o salloc.@LTO@
bignum.@LTO@: $(XSRCDIR)/bignum.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/bignum.c -o bignum.@LTO@
bool.@LTO@: $(XSRCDIR)/bool.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/bool.c -o bool.@LTO@
builtin.@LTO@: $(XSRCDIR)/builtin.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/builtin.c -o builtin.@LTO@
char.@LTO@: $(XSRCDIR)/char.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/char.c -o char.@LTO@
complex.@LTO@: $(XSRCDIR)/complex.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/complex.c -o complex.@LTO@
dynext.@LTO@: $(XSRCDIR)/dynext.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/dynext.c -o dynext.@LTO@
env.@LTO@: $(XSRCDIR)/env.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/env.c -o env.@LTO@
error.@LTO@: $(XSRCDIR)/error.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/error.c -o error.@LTO@
eval.@LTO@: $(XSRCDIR)/eval.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/eval.c -o eval.@LTO@
file.@LTO@: $(XSRCDIR)/file.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/file.c -o file.@LTO@
fun.@LTO@: $(XSRCDIR)/fun.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/fun.c -o fun.@LTO@
hash.@LTO@: $(XSRCDIR)/hash.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/hash.c -o hash.@LTO@
image.@LTO@: $(XSRCDIR)/image.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/image.c -o image.@LTO@
jit.@LTO@: $(XSRCDIR)/jit.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/jit.c -o jit.@LTO@
list.@LTO@: $(XSRCDIR)/list.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/list.c -o list.@LTO@
module.@LTO@: $(XSRCDIR)/module.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/module.c -o module.@LTO@
network.@LTO@: $(XSRCDIR)/network.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/network.c -o network.@LTO@
numarith.@LTO@: $(XSRCDIR)/numarith.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/numarith.c -o numarith.@LTO@
number.@LTO@: $(XSRCDIR)/number.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/number.c -o number.@LTO@
numcomp.@LTO@: $(XSRCDIR)/numcomp.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/numcomp.c -o numcomp.@LTO@
numstr.@LTO@: $(XSRCDIR)/numstr.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/numstr.c -o numstr.@LTO@
port.@LTO@: $(XSRCDIR)/port.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/port.c -o port.@LTO@
portfun.@LTO@: $(XSRCDIR)/portfun.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/portfun.c -o portfun.@LTO@
print.@LTO@: $(XSRCDIR)/print.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/print.c -o print.@LTO@
rational.@LTO@: $(XSRCDIR)/rational.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/rational.c -o rational.@LTO@
read.@LTO@: $(XSRCDIR)/read.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/read.c -o read.@LTO@
regexp.@LTO@: $(XSRCDIR)/regexp.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/regexp.c -o regexp.@LTO@
sema.@LTO@: $(XSRCDIR)/sema.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/sema.c -o sema.@LTO@
setjmpup.@LTO@: $(XSRCDIR)/setjmpup.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/setjmpup.c -o setjmpup.@LTO@
string.@LTO@: $(XSRCDIR)/string.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/string.c -o string.@LTO@
struct.@LTO@: $(XSRCDIR)/struct.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/struct.c -o struct.@LTO@
stxobj.@LTO@: $(XSRCDIR)/stxobj.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/stxobj.c -o stxobj.@LTO@
symbol.@LTO@: $(XSRCDIR)/symbol.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/symbol.c -o symbol.@LTO@
syntax.@LTO@: $(XSRCDIR)/syntax.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/syntax.c -o syntax.@LTO@
thread.@LTO@: $(XSRCDIR)/thread.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/thread.c -o thread.@LTO@
type.@LTO@: $(XSRCDIR)/type.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/type.c -o type.@LTO@
vector.@LTO@: $(XSRCDIR)/vector.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/vector.c -o vector.@LTO@
foreign.@LTO@: $(XSRCDIR)/foreign.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/foreign.c -o foreign.@LTO@
main.@LTO@: $(XSRCDIR)/main.c
	$(CC) $(CFLAGS) -c $(XSRCDIR)/main.c -o main.@LTO@

gc2.@LTO@: $(srcdir)/gc2.c $(srcdir)/newgc.c $(srcdir)/compact.c $(srcdir)/newgc.c $(srcdir)/gc2.h \
       $(srcdir)/vm_osx.c $(srcdir)/vm_mmap.c $(srcdir)/vm_osk.c $(srcdir)/alloc_cache.c \
       $(srcdir)/page_range.c $(srcdir)/protect_range.c $(srcdir)/var_stack.c $(srcdir)/stack_comp.c \
       $(srcdir)/../utils/splay.c $(srcdir)/my_qsort.c \
       $(srcdir)/weak.c $(srcdir)/fnls.c $(srcdir)/../include/scheme.h $(srcdir)/../src/schpriv.h
	$(CC) $(CFLAGS) -c $(srcdir)/gc2.c -o gc2.@LTO@

FOREIGN_OBJS = ../../foreign/gcc/libffi/src/*.@LTO@ ../../foreign/gcc/libffi/src/*/*.@LTO@
FOREIGN_LIB = ../../foreign/gcc/libffi/libffi@FOREIGN_CONVENIENCE@.la
FOREIGN_OBJSLIB = @FOREIGN_OBJSLIB@

EXTRA_OBJS_T = ../src/gmp.@LTO@ @FOREIGN_LIB_IF_USED@
EXTRA_OBJS_L = ../src/gmp.@LTO@ @FOREIGN_OBJSLIB_IF_USED@

../libmzscheme3m.@LIBSFX@: $(OBJS) $(EXTRA_OBJS_T)
	$(AR) $(ARFLAGS) ../libmzscheme3m.@LIBSFX@ $(OBJS) $(EXTRA_OBJS_L)
	$(RANLIB) ../libmzscheme3m.@LIBSFX@

../mzscheme3m@NOT_OSX@: main.@LTO@ ../libmzscheme3m.@LIBSFX@
	cd ..; @MZLINKER@ -o mzscheme3m @PROFFLAGS@ gc2/main.@LTO@ libmzscheme3m.@LIBSFX@ @LDFLAGS@ $(LIBS)
# The above "cd .." prevents a problem with libtool's generated script in --enable-shared mode,
#  at least for Mac OS X. Beware of changing LIBS or LDFLAGS to inclucde something with a relative
#  path.

MZFWMMM = PLT_MzScheme.framework/Versions/$(FWVERSION)_3m/PLT_MzScheme

$(MZFWMMM): ../libmzscheme3m.@LIBSFX@
	mkdir -p "PLT_MzScheme.framework/Versions/$(FWVERSION)_3m"
	$(CC) -o $(MZFWMMM) -framework CoreFoundation -dynamiclib -all_load ../libmzscheme3m.@LIBSFX@ @LDFLAGS@ $(LIBS)
	rm -f PLT_MzScheme.framework/PLT_MzScheme
	ln -s Versions/$(FWVERSION)_3m/PLT_MzScheme PLT_MzScheme.framework/PLT_MzScheme	

../mzscheme3m@OSX@: $(MZFWMMM) main.@LTO@
	$(CC) -o ../mzscheme3m @PROFFLAGS@ main.@LTO@ -Wl,-headerpad_max_install_names -F. -framework PLT_MzScheme
	mkdir -p "../PLT_MzScheme.framework/Versions/$(FWVERSION)_3m"
	cp "PLT_MzScheme.framework/Versions/$(FWVERSION)_3m/PLT_MzScheme" "../PLT_MzScheme.framework/Versions/$(FWVERSION)_3m/PLT_MzScheme"
	/usr/bin/install_name_tool -change "PLT_MzScheme.framework/Versions/$(FWVERSION)_3m/PLT_MzScheme" "@executable_path/PLT_MzScheme.framework/Versions/$(FWVERSION)_3m/PLT_MzScheme" "../mzscheme3m"


clean:
	/bin/rm -f ../mzscheme3m *.@LTO@ $(XSRCDIR)/*
	/bin/rm -rf PLT_MzScheme.framework

#--------------------------------------------------

test.@LTO@: $(srcdir)/test.c
	$(CC) $(CFLAGS) -c $(srcdir)/test.c -o test.@LTO@

gct: test.@LTO@ gc2.@LTO@
	$(CC) -o gct test.@LTO@ gc2.@LTO@
