#
# Marlais Makefile
#

#
# initialization file (change this to suite your installation)
#
INIT_FILE=`pwd`/init.dyl
INIT_FILE_FLAG = -DINIT_FILE=\"$(INIT_FILE)\"

#
# use compact object representation (you might want
# to comment this out and completely remake when
# debugging)
#
SMALL_OBJECTS_FLAG= -DSMALL_OBJECTS

#
# Use following if your c library does not include strcasecmp
#
# STRCASECMP = -DNO_STRCASECMP
STRCASECMP_FLAG =

VERSION = 0.4
PREVIOUS_VERSION = 0.3
PREVIOUS_VERSION_DIR = $(PROGRAM)-$(PREVIOUS_VERSION)
PATCHFILE = $(PROGRAM)-$(PREVIOUS_VERSION)-$(VERSION).diff
INCDIRS = gc 

CC=gcc
CFLAGS= -g $(INIT_FILE_FLAG) $(SMALL_OBJECTS_FLAG) $(STRCASECMP_FLAG) \
	$(MISC_FLAGS) -DVERSION=\"$(VERSION)\" -I$(INCDIRS)
LIBS=-lm


DISTSUBDIRS = gc

DISTDIR = /tmp/marlais-$(VERSION)

OBJS = 	alloc.o apply.o array.o boolean.o character.o class.o \
	classprec.o deque.o error.o env.o eval.o file.o function.o \
	keyword.o list.o main.o misc.o number.o object.o prim.o \
	print.o read.o slot.o stream.o string.o symbol.o syntax.o \
	sys.o table.o values.o vector.o

GCOBJS = gc/gc.a

CSRCS = alloc.c apply.c array.c boolean.c character.c class.c \
	classprec.c deque.c error.c env.c eval.c file.c function.c \
	keyword.c list.c main.c misc.c number.c object.c prim.c \
	print.c read.c slot.c stream.c string.c symbol.c syntax.c \
	sys.c table.c values.c vector.c

SRCS = 	$(CSRCS) alloc.h apply.h array.h boolean.h character.h class.h \
	classprec.h deque.h error.h env.h eval.h file.h function.h \
	keyword.h list.h  misc.h number.h object.h prim.h \
	print.h read.h slot.h stream.h string.h symbol.h syntax.h \
	sys.h table.h values.h vector.h \
	globaldefs.h globals.h

OTHER_FILES = ADDED BUGS COPYRIGHT DIFFERENCES HACKING INSTALL \
	MACHINES KNOWN-BUGS PORTING README ChangeLog Makefile init.dyl \
	foreign.c foreign.h foreign.dyl macintosh.c macintosh.h \
	ACKNOWLEDGMENTS

PROGRAM = marlais

marlais: $(OBJS) $(GCOBJS)
	$(CC) $(CFLAGS) -o $(PROGRAM) $ $(OBJS) $(GCOBJS) $(LIBS)

gc/gc.a:
	cd gc; $(MAKE)

clean:
	rm -rf $(OBJS)

real_clean:
	rm -rf $(OBJS)
	cd gc; $(MAKE) clean


depend:
	awk '/^# dependencies/ {exit 0;} {print $0;} END{print "# dependencies";}' <Makefile >Makefile.new
	gcc -I$(INCDIRS) -MM *.c >> Makefile.new
	mv Makefile Makefile.bak
	mv Makefile.new Makefile

dist:	$(SRCS) $(OTHER_FILES) $(DISTSUBDIRS)
	mkdir -p $(DISTDIR)
	cp -r $(SRCS) $(OTHER_FILES) $(DISTDIR)
	for x in $(DISTSUBDIRS); do (cd $$x ; mkdir -p $(DISTDIR)/$$x ; make DISTDIR=$(DISTDIR)/$$x dist); done

ftp:	$(DISTDIR)
	(cd $(DISTDIR)/.. ; \
	tar -cvf $(FTPDIR)/$(PROGRAM)-$(VERSION).tar $(PROGRAM)-$(VERSION) ; \
	gzip <$(FTPDIR)/$(PROGRAM)-$(VERSION).tar >$(FTPDIR)/$(PROGRAM)-$(VERSION).tar.gz ; \
	compress <$(FTPDIR)/$(PROGRAM)-$(VERSION).tar >$(FTPDIR)/$(PROGRAM)-$(VERSION).tar.Z ; \
	shar  $(DISTDIR) > $(FTPDIR)/$(PROGRAM)-$(VERSION).shar ; \
	)

patch:
	(cd $(DISTDIR)/.. ; diff -rc $(PREVIOUS_VERSION_DIR) $(DISTDIR) >$(PATCHFILE))

checkin:
	ci -l $(SRCS) $(OTHER_FILES)

# dependencies
alloc.o : alloc.c alloc.h object.h env.h symbol.h gc/gc.h error.h 
apply.o : apply.c apply.h object.h eval.h env.h list.h print.h prim.h class.h \
  symbol.h function.h keyword.h values.h error.h 
array.o : array.c array.h object.h error.h prim.h number.h symbol.h 
boolean.o : boolean.c boolean.h object.h prim.h 
character.o : character.c character.h object.h number.h 
class.o : class.c class.h symbol.h object.h classprec.h list.h keyword.h slot.h \
  apply.h function.h eval.h env.h vector.h string.h boolean.h table.h deque.h \
  array.h error.h globaldefs.h values.h 
classprec.o : classprec.c classprec.h object.h class.h symbol.h error.h list.h 
deque.o : deque.c deque.h object.h list.h prim.h symbol.h error.h 
env.o : env.c env.h object.h error.h eval.h alloc.h class.h symbol.h 
error.o : error.c class.h symbol.h object.h env.h error.h print.h string.h list.h 
eval.o : eval.c eval.h object.h env.h syntax.h apply.h list.h error.h 
file.o : file.c file.h object.h read.h eval.h env.h error.h 
foreign.o : foreign.c foreign.h object.h prim.h 
function.o : function.c function.h object.h apply.h symbol.h env.h list.h number.h \
  values.h keyword.h class.h eval.h vector.h error.h 
keyword.o : keyword.c keyword.h object.h symbol.h list.h prim.h string.h 
list.o : list.c list.h object.h prim.h apply.h number.h symbol.h boolean.h error.h 
main.o : main.c object.h alloc.h env.h read.h eval.h print.h boolean.h symbol.h \
  list.h class.h slot.h file.h function.h values.h number.h apply.h string.h keyword.h \
  vector.h error.h syntax.h stream.h table.h deque.h array.h misc.h globals.h \
  globaldefs.h 
misc.o : misc.c misc.h object.h prim.h 
number.o : number.c number.h object.h prim.h 
object.o : object.c object.h 
prim.o : prim.c prim.h object.h symbol.h string.h alloc.h env.h error.h 
print.o : print.c print.h object.h list.h eval.h env.h error.h slot.h 
read.o : read.c read.h object.h symbol.h list.h string.h vector.h number.h character.h \
  error.h 
slot.o : slot.c list.h object.h eval.h env.h apply.h class.h symbol.h slot.h \
  keyword.h error.h globaldefs.h vector.h 
stream.o : stream.c stream.h object.h prim.h error.h 
string.o : string.c string.h object.h symbol.h character.h number.h alloc.h \
  env.h error.h 
symbol.o : symbol.c symbol.h object.h alloc.h env.h string.h 
syntax.o : syntax.c syntax.h object.h eval.h env.h list.h class.h symbol.h function.h \
  values.h apply.h boolean.h number.h misc.h error.h string.h 
sys.o : sys.c prim.h object.h number.h string.h sys.h values.h 
table.o : table.c table.h object.h alloc.h env.h number.h apply.h list.h symbol.h \
  error.h 
values.o : values.c values.h object.h prim.h list.h 
vector.o : vector.c vector.h object.h list.h symbol.h number.h prim.h error.h 
