#
# Makefile for kalypso
#
# targets:
#	kalypso		- the executable with startup preloaded
#	kalypsobase	- the raw executable
#	clean		- get rid of non source files
#	install		- install executable in place
#	install-lib	- install lib files
#	install-man	- install on-line manual
#	kalypso.tar	- distribution file
#	kalypso.tar.Z	- compressed distribution file
#
#
# the "root" of this filesystem
#
DESTDIR=
#
# the binary for kalypso lives here
#
BINDIR=$(DESTDIR)/usr/local/bin
#
# this is a directory for kalypso stuff - the
# files in lib are saved here.  The atom 'kalypso-lib'
# is also bound as a string to this directory.
#
LIBDIR=$(DESTDIR)/usr/local/lib/kalypso
#
# the online manual files live here; this is usually
# a sub-directory of LIBDIR
#
MANDIR=$(LIBDIR)/man
#
# the manual page lives here; usually /usr/man/manl or
# /usr/local/man/man1.  Define section appropriately
#
UNIXMANDIR=$(DESTDIR)/usr/local/man/man1
UNIXMANSECT=1
#
# choose the appropriate command to install files
#
INSTALL=install -c
#INSTALL=cp
#
# sun 3.4 C compiler has bugs in it
# (double) itemtonum (numtoitem (-1)) == (2^32 - 1)
# use gcc instead.  If you don't have gcc, you can use
# cc in its place, just beware of the conversion problem
# indicated above.
#
#CC=gcc
#CFLAGS=-O -fstrength-reduce -fomit-frame-pointer -finline-functions
CFLAGS=-O
SHELL=/bin/sh
#
# various libraries to link it
#
LIBS=	-lm -lcurses -ltermlib
#
#
# the symbol 'kalypso-version' is bound to this value
#
VERSION=1.0
#
# pass these arguments to sub-makes
#
MFLAGS=INSTALL="$(INSTALL)" CFLAGS="$(CFLAGS)" BINDIR=$(BINDIR) LIBDIR=$(LIBDIR) MANDIR=$(MANDIR)

OFILES =bdata.o async.o avl.o block.o catch.o control.o curses.o dictionary.o\
	dump.o error.o eval.o file.o float.o format.o init.o\
	lex.o link.o list.o main.o math.o mem.o network.o number.o\
 	object.o print.o profile.o read.o\
	services.o signal.o string.o symbol.o system.o vector.o

CFILES =bdata.c async.c avl.c block.c catch.c control.c curses.c dictionary.c\
	dump.c error.c eval.c file.c float.c format.c init.c\
	lex.c link.c list.c main.c math.c mem.c network.c number.c\
 	object.c print.c profile.c read.c\
	services.c signal.c string.c symbol.c system.c vector.c

HFILES=kalypso.h mem.h lex.h avl.h

#
# order is significant in KFILES
#

KFILES= prim.k syntax.k closure.k\
	random.k string.k unix.k\
	map.k tag.k prog.k\
	breakpoint.k toplevel.k error.k main.k\
 	io.k man.k pp.k\
	dumpit.k

SOURCE=	local.proto options.proto $(KFILES) $(HFILES) $(CFILES)

DOC=	Copyright README TO_DO kalypso.1

RCSFILES=	$(SOURCE) $(DOC) Makefile target.k

DISTRIB_DIRS=	lib examples man

DISTRIB_FILES=	$(RCSFILES) options.sysV options.43bsd\
		options.42bsd options.sun3 options.mips options.hpux

DISTRIB=	$(DISTRIB_FILES) $(DISTRIB_DIRS)

kalypso: kalypsobase startup.k .target
	make $(MFLAGS) `cat .target`
	
.target: kalypsobase target.k
	./kalypsobase -raw-lisp < target.k

#
# use this target for MYDUMP or unexec images
#
kalypso-realdump: kalypsobase startup.k
	kalypsobase < startup.k

#
# use this target for FAKEDUMP images
#
kalypso-fakedump: $(LIBDIR)/kalypsoimage
	cp kalypsobase kalypso

kalypsobase: $(OFILES)
	$(CC) $(CFLAGS) -o $@ $(OFILES) $(LIBS)

kalypsoimage: kalypsobase startup.k
	kalypsobase -raw-lisp < startup.k

startup.k: $(KFILES)
	cat $(KFILES) > $@

lib: always
	cd lib; make $(MFLAGS)

man: always
	cd man; make $(MFLAGS)

tags: $(SOURCE)
	ctags $(SOURCE)

clean:
	rm -f $(OFILES) startup.k kalypso kalypsobase\
 		local.h .local.h errs make.log MakeOut kalypsoimage
	cd lib; make $(MFLAGS) clean
	cd man/reference; make $(MFLAGS) clean

install: $(BINDIR)/kalypso $(UNIXMANDIR)/kalypso.$(UNIXMANSECT)\
	install-lib install-man

install-lib:
	cd lib; make $(MFLAGS) install

install-man:
	cd man/reference; make $(MFLAGS) install

$(BINDIR)/kalypso: kalypso
	$(INSTALL) kalypso $@

$(LIBDIR)/kalypsoimage: $(LIBDIR) kalypsoimage
	$(INSTALL) kalypsoimage $@

$(UNIXMANDIR)/kalypso.$(UNIXMANSECT): kalypso.1
	$(INSTALL) kalypso.1 $@

kalypso.tar: always
	tar cf - $(DISTRIB) > $@

kalypso.tar.Z: always
	tar cf - $(DISTRIB) | compress > $@

print: $(DISTRIB_FILES)
	lpr -p $(DISTRIB_FILES)

ci: always
	ci -u $(RCSFILES)

co: always
	co $(RCSFILES)

echo: always
	@echo $(RCSFILES)

lockall: always
	co -l $(RCSFILES)

rcsin: always
	if rcsin $(RCSFILES); then\
		rm -f $(RCSFILES);\
	fi

lint: $(CFILES)
	lint -bx $(CFILES) $(LIBS) > lint

options.h:
	@echo "Please create options.h from options.proto"; exit 1

$(LIBDIR):
	-mkdir $@

#
# a bit of makefile magic to recreate local.h
# only when necessary.  If this fails to work
# correctly, replace these two targets with:
#
#local.h: Makefile local.proto
#	sed -e 's;KALYPSOIMAGENAME;"$(BINDIR)/kalypso";' \
#	    -e 's;KALYPSOFAKEIMAGE;"$(LIBDIR)/kalypsoimage";' \
#	    -e 's;KALYPSOLIBNAME;"$(LIBDIR)";' \
#	    -e 's;KALYPSOMANUALNAME;"$(MANDIR)";' \
#	    -e 's;KALYPSOVERSIONNAME;"$(VERSION)";' \
#	 	local.proto > local.h
#
#

local.h: .local.h

.local.h: Makefile local.proto
	sed -e 's;KALYPSOIMAGENAME;"$(BINDIR)/kalypso";' \
	    -e 's;KALYPSOFAKEIMAGE;"$(LIBDIR)/kalypsoimage";' \
	    -e 's;KALYPSOLIBNAME;"$(LIBDIR)";' \
	    -e 's;KALYPSOMANUALNAME;"$(MANDIR)";' \
	    -e 's;KALYPSOVERSIONNAME;"$(VERSION)";' \
	 	local.proto > .local.h
	-if cmp -s .local.h local.h; then\
 		:;\
 	else\
 		cp .local.h local.h;\
 	fi

always:

# header file dependencies.

async.o:	kalypso.h options.h
avl.o:		options.h avl.h
bdata.o:	options.h
catch.o:	kalypso.h
control.o:	kalypso.h
curses.o:	kalypso.h options.h
dictionary.o:	kalypso.h mem.h
dump.o:		kalypso.h options.h
error.o:	kalypso.h options.h
eval.o:		kalypso.h options.h
file.o:		kalypso.h options.h
float.o:	kalypso.h mem.h
init.o:		kalypso.h options.h local.h
lex.o:		kalypso.h lex.h
link.o:		kalypso.h options.h
list.o:		kalypso.h mem.h
main.o:		kalypso.h options.h
math.o:		kalypso.h options.h
mem.o:		kalypso.h options.h mem.h avl.h
number.o:	kalypso.h
object.o:	kalypso.h
print.o:	kalypso.h options.h lex.h
profile.o:	kalypso.h options.h
prog.o:		kalypso.h
read.o:		kalypso.h options.h lex.h
signal.o:	kalypso.h options.h
string.o:	kalypso.h mem.h
symbol.o:	kalypso.h mem.h
system.o:	kalypso.h options.h
vector.o:	kalypso.h mem.h
