ifeq ($(OS),Windows_NT)

OBJS=  compile.obj env.obj interpret.obj objenv.obj print.obj table.obj tree.obj \
       types.obj stack.obj utils.obj valuelist.obj parser.obj lexer.obj alloc.obj global.obj \
       mudlle.obj ports.obj ins.obj error.obj mcompile.obj \
       module.obj call.obj context.obj \
       calloc-malloc.obj
#       calloc-heap.obj
#       calloc.obj

mudlle: $(OBJS) runlib
	$(CC) $(CFLAGS) -o mudlle runtime/librun.lib $(OBJS)

CC=cl
CFLAGS=/DNDEBUG /Ox /G7 /MD /Dalloca=_alloca /DUSE_REAP=1

.SUFFIXES: .c .obj .lib .l .y

.c.obj:
	$(CC) $(CFLAGS) -c $<
else

TARGET = mudlle

SRCS = compile.c env.c interpret.c objenv.c print.c table.c tree.c \
       types.c stack.c utils.c valuelist.c parser.c lexer.c alloc.c global.c \
       calloc-malloc.c mudlle.c ports.c ins.c error.c mcompile.c \
       module.c call.c context.c

.SUFFIXES:
.SUFFIXES: .c .o .obj .s

OBJS = $(SRCS:.c=.o)

# Note from Emery Berger: I've hard-coded calloc-malloc.o above,
# rather than relying on symlinks (see below). A more efficient implementation
# of mudlle's regions is in calloc-heap.c. I presented a more general
# variant of heaps + regions called 'reaps' which provides about the same
# performance. See "Reconsidering Custom Memory Allocation", OOPSLA 2002.

CC=gcc -DNDEBUG -O3 -mcpu=ultrasparc -U__sparc_v9__ 
AS=gas -P
CFLAGS= -I. -D__SVR4 $(EXTRACFLAGS)

%.o:	%.c
	$(CC) $(CFLAGS) -c $< -o $@

$(TARGET): $(OBJS) runlib
	$(CC) -o $@ $(OBJS) runtime/librun.a -lm $(EXTRALIBS)

include make.depend

endif

puremud: $(OBJS) runlib
	purify -cache-dir=/tmp $(CC) -o puremud $(OBJS) runtime/librun.a -lm

runlib: 
		(cd runtime; $(MAKE) -f mkf "CC=$(CC) -I.. $(CFLAGS)")

clean:
	rm -f *.o *.obj
	(cd runtime; make -f mkf clean)

cleantarget:
	rm mudlle

malloc:
	rm calloc.c
	ln -s calloc-malloc.c calloc.c

bwgc:
	rm calloc.c
	ln -s calloc-bwgc.c calloc.c


mytar:
	tar cvf - *.[chylsa] *.mud smakefile.base Makefile.base mkf SCOPTIONS runtime/*.[ch] runtime/smakefile runtime/SCOPTIONS runtime/Makefile.base runtime/mkf doc/*.doc | gzip >mudlle.tar.gz

tar:
	tar cvf mudlle.tar mkf *.[chylsa] *.mud smakefile.base SCOPTIONS \
runtime/mkf runtime/arith.[ch] runtime/basic.[ch] runtime/bool.[ch] \
runtime/list.[ch] runtime/runtime.[ch] runtime/SCOPTIONS compile \
runtime/smakefile runtime/string.c runtime/stringops.h runtime/files.[ch] \
runtime/symbol.[ch] runtime/symbol.h runtime/vector.[ch] doc/mudlle-ref.doc \
doc/mudlle-intro.doc runtime/support.[ch] runtime/bitset.[ch] runtime/io.[ch] \
runtime/debug.[ch]


#lexer.c: lexer.l
#	flex -F lexer.l
#	mv lex.yy.c lexer.c

tokens.h parser.c: parser.y
	bison -dt parser.y
	mv parser.tab.h tokens.h
	mv parser.tab.c parser.c

builtins.o: builtins.s
	$(AS) builtins.s

depend:
	makedepend -f .depend $(CFLAGS) *.c 2>/dev/null
	(cd runtime; make -f mkf depend)

compiler:
	/bin/sh install-compiler

include make.depend
