# ----------------------------------------------------------
#   (C) 1994, 1995 Institute for New Generation Computer Technology
#       (Read COPYRIGHT for detailed information.)
# ----------------------------------------------------------

.SUFFIXES: $(SUFFIXES) .kl1 .ext

PARALLEL = 0
PVM_ROOT = /usr/local/pvm3
PVM_ARCH = SUN4SOL2
PVMLIB   = pvm3
PVMINC = $(PVM_ROOT)/include
PVMLIBDIR = $(PVM_ROOT)/lib/$(PVM_ARCH)
KL1CMP = ../org-comp/kl1cmp


PROGRAMS = bb gb normalize version \
	generate obj write \
	insert macro extern kl1cmp main \
	util

ORGKL1SRC = bb.kl1 gb.kl1 normalize.kl1 version.kl1 \
	generate.kl1 obj.kl1 write.kl1 \
	insert.kl1 macro.kl1 extern.kl1 main.kl1 \
	util.kl1

ONLYORGKSRC = kl1cmp.kl1
ONLYRUNKSRC = kl1cmp-2.kl1

ANALYZEDKL1SRC = \
          analyzer.kl1 converter.kl1 unify_head_body.kl1    \
          determine_type.kl1 type_init.kl1 type.kl1  \
          dependency.kl1 schedule.kl1 \
          print.kl1 uty.kl1 list.kl1 parse_uty.kl1

ORGCSRC = bb.c gb.c normalize.c version.c \
	generate.c obj.c write.c \
	insert.c macro.c extern.c kl1cmp.c main.c \
	util.c

ANALYZEDCSRC = \
          analyzer.c converter.c unify_head_body.c    \
          determine_type.c type_init.c type.c  \
          dependency.c schedule.c \
          print.c uty.c list.c parse_uty.c

KL1SRC = $(ORGKL1SRC) $(ONLYORGKSRC) $(ANALYZEDKL1SRC)
KL1SRC_FOR_RUNTIME = $(ORGKL1SRC) $(ONLYRUNKSRC) 
CSRC = $(ORGCSRC) $(ANALYZEDCSRC)

ANALYZEFILE = $(ANALYZEDKL1SRC) $(ANALYZEDCSRC) 

EXT = bb.ext gb.ext normalize.ext version.ext \
	generate.ext obj.ext write.ext \
	insert.ext macro.ext extern.ext kl1cmp.ext main.ext \
	util.ext \
          analyzer.ext converter.ext unify_head_body.ext    \
          determine_type.ext type_init.ext type.ext  \
          dependency.ext schedule.ext \
          print.ext uty.ext list.ext parse_uty.ext


OBJECTS = bb.o gb.o normalize.o version.o \
	generate.o obj.o write.o \
	insert.o macro.o extern.o kl1cmp.o main.o \
	util.o atom.o funct.o predicates.o

KLIC = ../compiler/klic-org -P$(PARALLEL) $(KLICOPT) \
	-R -I../include -X. -D../compiler/klicdb -v 

all: kl1cmp-s kl1cmp-runtime klic-s

install: all
	- $(INSTDIR) $(KLICBIN)
	- $(INSTDIR) $(KLICLIB)/klic
	if (test `pwd` != $(KLICBIN)) then ($(INSTALL) klic $(KLICBIN)) fi
	if (test `pwd` != $(KLICLIB)/klic) then \
		($(INSTALL) kl1cmp klicdb $(KLICLIB)/klic) fi

dist: klic klicdb klicdb.init $(CSRC) klicdb.c klic.c options.c klic.h \
	version.c \
	atom.h funct.h atom.c funct.c predicates.c

version.kl1: ../version.sed version.kl1.tmplt
	sed -f ../version.sed <version.kl1.tmplt >version.kl1
version.h: ../version.sed version.h.tmplt
	sed -f ../version.sed <version.h.tmplt >version.h

../version.sed:
	cd ..; make version.sed


##### Make Analyzed KL1 file
LN = ln -s

analyzer.kl1:analyzer/analyzer.kl1
	rm -f $@; $(LN) $? $@
converter.kl1:analyzer/converter.kl1
	rm -f $@; $(LN) $? $@
unify_head_body.kl1:analyzer/unify_head_body.kl1
	rm -f $@; $(LN) $? $@
determine_type.kl1:analyzer/determine_type.kl1
	rm -f $@; $(LN) $? $@
type_init.kl1:analyzer/type_init.kl1
	rm -f $@; $(LN) $? $@
type.kl1:analyzer/type.kl1
	rm -f $@; $(LN) $? $@
dependency.kl1:analyzer/dependency.kl1
	rm -f $@; $(LN) $? $@
schedule.kl1:analyzer/schedule.kl1
	rm -f $@; $(LN) $? $@
print.kl1:analyzer/print.kl1
	rm -f $@; $(LN) $? $@
uty.kl1:analyzer/uty.kl1
	rm -f $@; $(LN) $? $@
list.kl1:analyzer/list.kl1
	rm -f $@; $(LN) $? $@
parse_uty.kl1:analyzer/parse_uty.kl1
	rm -f $@; $(LN) $? $@


klicdb: klicdb.c klic.h
	$(CC) -I../include $(CFLAGS) \
	-o klicdb klicdb.c options.c $(LDFLAGS)
klic-s:	klic.c options.c klic.h version.h
	$(CC) -DPVMINC=\"$(PVMINC)\" -DPVMLIBDIR=\"$(PVMLIBDIR)\" \
	-DPVMLIB=\"$(PVMLIB)\" -DSCHED -I../include $(CFLAGS) \
	-o $@ klic.c options.c $(LDFLAGS)
klic-org:../org-comp/klic
	rm -f klic-org;ln -s ../org-comp/klic klic-org;

.kl1.c:
	./klic-org -K $(KL1CMP) -D./klicdb -X. -C -v $<

.kl1.ext:
	./klic-org -K $(KL1CMP) -D./klicdb -C -v $<

atom.h: klicdb $(EXT) klicdb.init libklic.db
	./klicdb -X. $(EXT)
funct.h: klicdb $(EXT) klicdb.init libklic.db
	./klicdb -X. $(EXT)
atom.c: klicdb $(EXT) klicdb.init libklic.db
	./klicdb -X. $(EXT)
funct.c: klicdb $(EXT) klicdb.init libklic.db
	./klicdb -X. $(EXT)
predicates.c: klicdb $(EXT) libklic.db
	./klicdb -X. $(EXT)

kl1cmp-s: $(KL1SRC) ../runtime/libklict.a
	./klic-org -P$(PARALLEL) -K $(KL1CMP) -D./klicdb -v \
		-X. -I../include -L../runtime \
		$(KLICOPT) -o $@ $(KL1SRC)

kl1cmp-runtime: $(KL1SRC) ../runtime/libklict.a
	./klic-org -P$(PARALLEL) -K $(KL1CMP) -D./klicdb -v \
		-X. -I../include -L../runtime \
		$(KLICOPT) -o $@ $(KL1SRC_FOR_RUNTIME)

klicdb.init: ../runtime/klic.db
	( test -f klicdb.init && cmp -s klicdb.init ../runtime/klic.db ) || \
	/bin/cp -p ../runtime/klic.db klicdb.init
libklic.db: ../runtime/libklic.db
	cmp -s libklic.db ../runtime/libklic.db || \
	/bin/cp -p ../runtime/libklic.db libklic.db

# ========================================
# Verifying a newly built compiler
# ========================================

verifydir:
	- mkdir verifydir
	- for file in $(KL1SRC); do \
		ln -s ../$$file verifydir; \
	  done

verify: verifydir kl1cmp $(CSRC)
	$(KLIC) -C -K ../compiler/kl1cmp verifydir/*.kl1
	- for file in $(PROGRAMS); do \
	  echo $$file; \
	  tail +2 $$file.c >/tmp/$$file.old; \
	  tail +2 verifydir/$$file.c >/tmp/$$file.new; \
	  diff /tmp/$$file.old /tmp/$$file.new; \
	  /bin/rm -f /tmp/$$file.old /tmp/$$file.new; \
	done
	
depend:

clean:
	/bin/rm -f -r verifydir *.o *~ \#*\# core
	/bin/rm -f kl1cmp-s kl1cmp-runtime klic-s klic-org
	/bin/rm -f $(ANALYZEFILE)
distclean: clean

realclean: distclean
	/bin/rm -f $(CSRC) *.ext atom.h funct.h \
		version.h version.kl1 version.sed \
		atom.c funct.c predicates.c

klicdb.o: klic.h ../include/klic/config.h
klic.o: klic.h ../include/klic/config.h

bb.o: ../include/klic/config.h
gb.o: ../include/klic/config.h
normalize.o: ../include/klic/config.h
version.o: ../include/klic/config.h
generate.o: ../include/klic/config.h
obj.o: ../include/klic/config.h
write.o: ../include/klic/config.h
insert.o: ../include/klic/config.h
macro.o: ../include/klic/config.h
extern.o: ../include/klic/config.h
kl1cmp.o: ../include/klic/config.h
main.o: ../include/klic/config.h
util.o: ../include/klic/config.h
