#----------------------------------------------------------
#                        Copyright (C) 1999
#               Hiroshi Nakashima, Kazuhiko Ohno
#              Namiyo Sugiyama, Kiyokazu Yokoishi
#        and Department of Information and Computer Sciences 
#                 Toyohashi University of Technology
#----------------------------------------------------------- 

# ----------------------------------------------------------
#                        Copyright (C) 1998
#        Hiroshi Nakashima, Kazuhiko Ohno, Namiyo Sugiyama,
#        and Department of Information and Computer Sciences 
#                 Toyohashi University of Technology
# -----------------------------------------------------------  

# ----------------------------------------------------------
#   (C) 1994, 1995 Institute for New Generation Computer Technology
#       (Read COPYRIGHT for detailed information.)
#   (C)1996, 1997 Japan Information Processing Development Center
#       (Read COPYRIGHT-JIPDEC for detailed information.)
# ----------------------------------------------------------

.SUFFIXES: $(SUFFIXES) .kl1 .ext

PARALLEL = 0

PROGRAMS = bb gb normalize normalize-t version \
	generate generate-t obj obj-t write write-t\
	insert macro extern kl1cmp kl1cmp-t1 kl1cmp-t2 kl1cmp-t3 \
	main main1 main2 main3\
	util    \
    analyzer

KL1SRC = bb.kl1 gb.kl1 normalize.kl1 version.kl1 \
	generate.kl1 obj.kl1 write.kl1 \
	insert.kl1 macro.kl1 extern.kl1 kl1cmp.kl1 main.kl1 \
	util.kl1 msg.kl1 cmacro.kl1

KL1SRC_T1 = bb.kl1 gb.kl1 normalize-t.kl1 version.kl1 \
	generate-t.kl1 obj-t.kl1 write-t.kl1 \
	insert.kl1 macro.kl1 extern.kl1 kl1cmp1.kl1 main1.kl1 \
	util.kl1 msg.kl1 cmacro.kl1 \
    analyzer.kl1 converter.kl1 builtin.kl1 builtin_deps.kl1\
    loop.kl1 builtin_type.kl1 analyze_type.kl1 dependency.kl1  \
    vt.kl1 hb.kl1 lt.kl1 dt.kl1 ea.kl1 adg.kl1 vdg.kl1 makepb.kl1 \
    typeset.kl1 typeset_ex.kl1 depset.kl1 \
    file_op.kl1 schedule.kl1 direct_call.kl1 gen_code.kl1 \
    native_goal.kl1  analyze_type_ex.kl1 global_op.kl1 \
    print.kl1 uty.kl1 list.kl1 functor.kl1 parse_uty.kl1

KL1SRC_TG = maing.kl1 ganalyzer.kl1 typeset.kl1 vt.kl1 hb.kl1 depset.kl1\
    file_op.kl1 msg.kl1 obj-t.kl1 util.kl1 write-t.kl1 extern.kl1\
    print.kl1 uty.kl1 list.kl1 functor.kl1 parse_uty.kl1 global_op.kl1

KL1SRC_T2 = bb.kl1 gb.kl1 normalize-t.kl1 version.kl1 \
	generate-t.kl1 obj-t.kl1 write-t.kl1 \
	insert.kl1 macro.kl1 extern.kl1 main2.kl1 \
	util.kl1 msg.kl1 cmacro.kl1 \
    analyzer.kl1 converter.kl1 builtin.kl1 builtin_deps.kl1\
    loop.kl1 builtin_type.kl1 analyze_type.kl1 dependency.kl1  \
    vt.kl1 hb.kl1 lt.kl1 dt.kl1 ea.kl1 adg.kl1\
    typeset.kl1 typeset_ex.kl1 depset.kl1 global_op.kl1\
    file_op.kl1 schedule.kl1 direct_call.kl1 gen_code.kl1 \
    native_goal.kl1 vdg.kl1 makepb.kl1 analyze_type_ex.kl1\
    print.kl1 uty.kl1 list.kl1 functor.kl1 parse_uty.kl1

KL1SRC_T3 = bb.kl1 gb.kl1 normalize-t.kl1 version.kl1 \
	generate-t.kl1 obj-t.kl1 write-t.kl1 \
	insert.kl1 macro.kl1 extern.kl1 kl1cmp3.kl1 main3.kl1 \
	util.kl1 msg.kl1 cmacro.kl1 \
    analyzer.kl1 converter.kl1 builtin.kl1 builtin_deps.kl1\
    loop.kl1 builtin_type.kl1 analyze_type.kl1 dependency.kl1  \
    vt.kl1 hb.kl1 lt.kl1 dt.kl1 ea.kl1 adg.kl1\
    typeset.kl1 typeset_ex.kl1 depset.kl1 global_op.kl1\
    file_op.kl1 schedule.kl1 direct_call.kl1 gen_code.kl1 \
    native_goal.kl1 vdg.kl1 makepb.kl1 analyze_type_ex.kl1 \
    print.kl1 uty.kl1 list.kl1 functor.kl1 parse_uty.kl1

KL1PPSRC = kl1pp.kl1 cmacro.kl1 macropp.kl1 \
	msg.kl1 macro.kl1 extern.kl1 obj.kl1 util.kl1 write.kl1

CSRC = 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 msg.c cmacro.c

CSRC_T1 = bb.c gb.c normalize-t.c version.c \
	generate-t.c obj-t.c write-t.c \
	insert.c macro.c extern.c kl1cmp1.c main1.c \
	util.c msg.c cmacro.c   \
    analyzer.c converter.c builtin.c builtin_deps.c\
    loop.c builtin_type.c analyze_type.c dependency.c  \
    vt.c hb.c lt.c dt.c ea.c adg.c \
    typeset.c typeset_ex.c depset.c global_op.c \
    file_op.c schedule.c direct_call.c gen_code.c \
    native_goal.c vdg.c makepb.c analyze_type_ex.c \
    print.c uty.c list.c functor.c parse_uty.c

CSRC_TG = maing.c ganalyzer.c typeset.c vt.c hb.c depset.c\
    file_op.c msg.c obj-t.c util.c write-t.c extern.c\
    print.c uty.c list.c functor.c parse_uty.c global_op.c 

CSRC_T2 = bb.c gb.c normalize-t.c version.c \
	generate-t.c obj-t.c write-t.c \
	insert.c macro.c extern.c main2.c \
	util.c msg.c cmacro.c   \
    analyzer.c converter.c builtin.c builtin_deps.c\
    loop.c builtin_type.c analyze_type.c dependency.c  \
    vt.c hb.c lt.c dt.c ea.c adg.c \
    typeset.c typeset_ex.c depset.c global_op.c \
    file_op.c schedule.c direct_call.c gen_code.c \
    native_goal.c vdg.c makepb.c analyze_type_ex.c \
    print.c uty.c list.c functor.c parse_uty.c

CSRC_T3 = bb.c gb.c normalize-t.c version.c \
	generate-t.c obj-t.c write-t.c \
	insert.c macro.c extern.c kl1cmp3.c main3.c \
	util.c msg.c cmacro.c   \
    analyzer.c converter.c builtin.c builtin_deps.c\
    loop.c builtin_type.c analyze_type.c dependency.c  \
    vt.c hb.c lt.c dt.c ea.c adg.c\
    typeset.c typeset_ex.c depset.c global_op.c \
    file_op.c schedule.c direct_call.c gen_code.c \
    native_goal.c vdg.c makepb.c analyze_type_ex.c \
    print.c uty.c list.c functor.c parse_uty.c

KL1PPCSRC = kl1pp.c cmacro.c macropp.c \
	msg.c macro.c extern.c obj.c util.c write.c

EXT = bb.ext gb.ext normalize.ext normalize-t.ext version.ext \
	generate.ext generate-t.ext obj.ext obj-t.ext write.ext write-t.ext\
	insert.ext macro.ext extern.ext kl1cmp.ext kl1cmp1.ext main.ext \
	util.ext msg.ext cmacro.ext \
    analyzer.ext converter.ext builtin.ext builtin_deps.ext \
    loop.ext builtin_type.ext analyze_type.ext   \
    vt.ext hb.ext lt.ext dt.ext ea.ext adg.ext\
    typeset.ext typeset_ex.ext depset.ext global_op.ext\
    dependency.ext schedule.ext direct_call.ext gen_code.ext\
    native_goal.ext file_op.ext kl1cmp3.ext main1.ext maing.ext \
	main2.kl1 main3.ext vdg.ext makepb.ext analyze_type_ex.ext\
    print.ext uty.ext list.ext functor.ext parse_uty.ext

KL1PPEXT = kl1pp.ext cmacro.ext macropp.ext \
	msg.ext macro.ext extern.ext obj.ext util.ext write.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 msg.o cmacro.o atom.o funct.o predicates.o

OBJECTS_T1 = bb.o gb.o normalize-t.o version.o \
	generate-t.o obj-t.o write-t.o \
	insert.o macro.o extern.o kl1cmp1.o main1.o \
	util.o msg.o cmacro.o   \
    analyzer.o converter.o builtin.o builtin_deps.o\
    loop.o builtin_type.o analyze_type.o dependency.o  \
    vt.o hb.o lt.o dt.o ea.o adg.o \
    typeset.o typeset_ex.o depset.o global_op.o \
    file_op.o schedule.o direct_call.o gen_code.o \
    native_goal.o vdg.o makepb.o analyze_type_ex.o \
    print.o uty.o list.o functor.o parse_uty.o

OBJECTS_TG = maing.o ganalyzer.o typeset.o vt.o hb.o depset.o\
    file_op.o msg.o obj-t.o util.o write-t.o extern.o\
    print.o uty.o list.o functor.o parse_uty.o global_op.o 

OBJECTS_T2 = bb.o gb.o normalize-t.o version.o \
	generate-t.o obj-t.o write-t.o \
	insert.o macro.o extern.o main2.o \
	util.o msg.o cmacro.o   \
    analyzer.o converter.o builtin.o builtin_deps.o\
    loop.o builtin_type.o analyze_type.o dependency.o  \
    vt.o hb.o lt.o dt.o ea.o adg.o \
    typeset.o typeset_ex.o depset.o global_op.o \
    file_op.o schedule.o direct_call.o gen_code.o \
    native_goal.o vdg.o makepb.o analyze_type_ex.o \
    print.o uty.o list.o functor.o parse_uty.o

OBJECTS_T3 = bb.o gb.o normalize-t.o version.o \
	generate-t.o obj-t.o write-t.o \
	insert.o macro.o extern.o kl1cmp3.o main3.o \
	util.o msg.o cmacro.o   \
    analyzer.o converter.o builtin.o builtin_deps.o\
    loop.o builtin_type.o analyze_type.o dependency.o  \
    vt.o hb.o lt.o dt.o ea.o adg.o \
    typeset.o typeset_ex.o depset.o global_op.o \
    file_op.o schedule.o direct_call.o gen_code.o \
    native_goal.o vdg.o makepb.o analyze_type_ex.o \
    print.o uty.o list.o functor.o parse_uty.o

KL1PPOBJS = kl1pp.o cmacro.o macropp.o \
	msg.o macro.o extern.o obj.o util.o write.o

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

all: klicdb klic analyzer_src $(KL1SELFCOMP) ganalyzer kl1cmp-t1 kl1cmp-t2 kl1cmp-t3

analyzer_src:
	cd analyzer; make; cd ..

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

dist: klic klicdb klicdb.init $(CSRC) $(CSRC_T1) $(CSRC_TG) $(CSRC_T2) $(CSRC_T3) $(KL1PPCSRC) 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

klicdb: klicdb.c klic.h
	$(CC) -I../include $(CFLAGS) \
	-o klicdb klicdb.c options.c $(LDFLAGS)
#klic:	klic.c options.c klic.h version.h
#	$(CC) -DPVMINC=\"$(PVMINC)\" -DPVMLIBDIR=\"$(PVMLIBDIR)\" \
#	-DPVMLIB=\"$(PVMLIB)\" -I../include $(CFLAGS) \
#	-o klic klic.c options.c $(LDFLAGS)

klic:	klic.c options.c klic.h version.h
	$(CC) -I../include $(CFLAGS) \
	-o klic klic.c options.c $(LDFLAGS)

kl1pp: $(KL1PPSRC) ../runtime/libklict.a
	./klic -P$(PARALLEL) -K $(KL1CMP) -D./klicdb -v \
		-X. -I../include -L../runtime \
		$(KLICOPT) -o kl1pp $(KL1PPSRC)

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

.kl1.ext:
	./klic -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)

analyzer.kl1: analyzer/analyzer.kl1
	ln -s analyzer/analyzer.kl1 ./analyzer.kl1
ganalyzer.kl1: analyzer/ganalyzer.kl1
	ln -s analyzer/ganalyzer.kl1 ./ganalyzer.kl1
converter.kl1: analyzer/converter.kl1
	ln -s analyzer/converter.kl1 ./converter.kl1
loop.kl1: analyzer/loop.kl1
	ln -s analyzer/loop.kl1 ./loop.kl1
builtin.kl1: analyzer/builtin.kl1
	ln -s analyzer/builtin.kl1 ./builtin.kl1
builtin_type.kl1: analyzer/builtin_type.kl1
	ln -s analyzer/builtin_type.kl1 ./builtin_type.kl1
builtin_deps.kl1: analyzer/builtin_deps.kl1
	ln -s analyzer/builtin_deps.kl1 ./builtin_deps.kl1
analyze_type.kl1: analyzer/analyze_type.kl1
	ln -s analyzer/analyze_type.kl1 ./analyze_type.kl1
analyze_type_ex.kl1: analyzer/analyze_type_ex.kl1
	ln -s analyzer/analyze_type_ex.kl1 ./analyze_type_ex.kl1
vt.kl1: analyzer/vt.kl1
	ln -s analyzer/vt.kl1 ./vt.kl1
hb.kl1: analyzer/hb.kl1
	ln -s analyzer/hb.kl1 ./hb.kl1
lt.kl1: analyzer/lt.kl1
	ln -s analyzer/lt.kl1 ./lt.kl1
dt.kl1: analyzer/dt.kl1
	ln -s analyzer/dt.kl1 ./dt.kl1
ea.kl1: analyzer/ea.kl1
	ln -s analyzer/ea.kl1 ./ea.kl1
adg.kl1: analyzer/adg.kl1
	ln -s analyzer/adg.kl1 ./adg.kl1
vdg.kl1: analyzer/vdg.kl1
	ln -s analyzer/vdg.kl1 ./vdg.kl1
makepb.kl1: analyzer/makepb.kl1
	ln -s analyzer/makepb.kl1 ./makepb.kl1
dependency.kl1: analyzer/dependency.kl1
	ln -s analyzer/dependency.kl1 ./dependency.kl1
schedule.kl1: analyzer/schedule.kl1
	ln -s analyzer/schedule.kl1 ./schedule.kl1
direct_call.kl1: analyzer/direct_call.kl1
	ln -s analyzer/direct_call.kl1 ./direct_call.kl1
gen_code.kl1: analyzer/gen_code.kl1
	ln -s analyzer/gen_code.kl1 ./gen_code.kl1
typeset.kl1: analyzer/typeset.kl1
	ln -s analyzer/typeset.kl1 ./typeset.kl1
depset.kl1: analyzer/depset.kl1
	ln -s analyzer/depset.kl1 ./depset.kl1
typeset_ex.kl1: analyzer/typeset_ex.kl1
	ln -s analyzer/typeset_ex.kl1 ./typeset_ex.kl1
native_goal.kl1: analyzer/native_goal.kl1
	ln -s analyzer/native_goal.kl1 ./native_goal.kl1
file_op.kl1: analyzer/file_op.kl1
	ln -s analyzer/file_op.kl1 ./file_op.kl1
global_op.kl1: analyzer/global_op.kl1
	ln -s analyzer/global_op.kl1 ./global_op.kl1
parse_uty.kl1: analyzer/parse_uty.kl1
	ln -s analyzer/parse_uty.kl1 ./parse_uty.kl1
print.kl1: analyzer/print.kl1
	ln -s analyzer/print.kl1 ./print.kl1
uty.kl1: analyzer/uty.kl1
	ln -s analyzer/uty.kl1 ./uty.kl1
list.kl1: analyzer/list.kl1
	ln -s analyzer/list.kl1 ./list.kl1
functor.kl1: analyzer/functor.kl1
	ln -s analyzer/functor.kl1 ./functor.kl1

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

ganalyzer: klic klicdb klicdb.init libklic.db $(KL1SRC_TG) ../runtime/libklict.a
	./klic -P$(PARALLEL) -K $(KL1CMP) -D./klicdb -v \
		-X. -I../include -L../runtime \
		$(KLICOPT) -o ganalyzer $(KL1SRC_TG)

kl1cmp-t1: klic klicdb klicdb.init libklic.db $(KL1SRC_T1) ../runtime/libklict.a
	./klic -P$(PARALLEL) -K $(KL1CMP) -D./klicdb -v \
		-X. -I../include -L../runtime \
		$(KLICOPT) -o kl1cmp-t1 $(KL1SRC_T1)

kl1cmp-t2: klic klicdb klicdb.init libklic.db $(KL1SRC_T2) ../runtime/libklict.a
	./klic -P$(PARALLEL) -K $(KL1CMP) -D./klicdb -v \
		-X. -I../include -L../runtime \
		$(KLICOPT) -o kl1cmp-t2 $(KL1SRC_T2)

kl1cmp-t3: klic klicdb klicdb.init libklic.db $(KL1SRC_T3) ../runtime/libklict.a
	./klic -P$(PARALLEL) -K $(KL1CMP) -D./klicdb -v \
		-X. -I../include -L../runtime \
		$(KLICOPT) -o kl1cmp-t3 $(KL1SRC_T3)

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 klic kl1pp klicdb libklic.db klic.db klicdb.init \
			kl1cmp-t1 kl1cmp-t2 kl1cmp-t3 ganalyzer

distclean: clean

realclean: distclean
	/bin/rm -f $(CSRC) $(KL1PPCSRC) *.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
normalize-t.o: ../include/klic/config.h
version.o: ../include/klic/config.h
generate.o: ../include/klic/config.h
generate-t.o: ../include/klic/config.h
obj.o: ../include/klic/config.h
obj-t.o: ../include/klic/config.h
write.o: ../include/klic/config.h
write-t.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
kl1cmp1.o: ../include/klic/config.h
kl1cmp3.o: ../include/klic/config.h
main.o: ../include/klic/config.h
main1.o: ../include/klic/config.h
maing.o: ../include/klic/config.h
main2.o: ../include/klic/config.h
main3.o: ../include/klic/config.h
util.o: ../include/klic/config.h
