#-----------------------------------------------------------
#	 Copyright (C) 1996-1997 Kazuhiko Ohno, Masahiko Ikawa,
#	 and Computer Architecture Laboratory, Depertment of
#	 Information Science, Kyoto University.
#-----------------------------------------------------------

# ----------------------------------------------------------
#   (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)

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

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
PKL1SRC = bb.kl1 gb.kl1 normalize-p.kl1 version.kl1 \
	generate-p.kl1 obj-p.kl1 write-p.kl1 \
	insert.kl1 macro.kl1 extern.kl1 kl1cmp-p.kl1 main.kl1 \
	util-p.kl1 mode_check.kl1
NPKL1SRC = bb.kl1 gb.kl1 normalize-p.kl1 version.kl1 \
	generate-p.kl1 obj-s.kl1 write-p.kl1 \
	insert.kl1 macro.kl1 extern.kl1 kl1cmp-p.kl1 main.kl1 \
	util-p.kl1 mode_check.kl1
RKL1SRC = bb.kl1 gb.kl1 normalize-p.kl1 version.kl1 \
	generate-p.kl1 obj-s.kl1 write-p.kl1 \
	insert.kl1 macro.kl1 extern.kl1 kl1cmp-runtime.kl1 main.kl1 \
	util-p.kl1 mode_check.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  \
    normalize-p.c generate-p.c obj-p.c obj-s.c write-p.c    \
    kl1cmp-p.c kl1cmp-runtime\
    util-p.c mode_check.c \
    kl1cmp-test.c.o 

ANALYZERSRC     = analyzer.kl1 converter.kl1    \
          loop.kl1    \
          unify_head_body.kl1  \
          determine_type.kl1 type_init.kl1 \
          analyze_type.kl1   \
          dependency.kl1  schedule.kl1\
          direct_call.kl1 \
          type.kl1 builtin_type.kl1 \
          mode.kl1    \
          parse_uty.kl1  \
          print.kl1 uty.kl1 list.kl1 functor.kl1

ANALYZERCSRC     = analyzer.c converter.c    \
          loop.c    \
          unify_head_body.c  \
          determine_type.c type_init.c \
          analyze_type.c   \
          dependency.c  schedule.c\
          direct_call.c \
          type.c builtin_type.c \
          mode.c    \
          parse_uty.c  \
          print.c uty.c list.c functor.c

ANALYZEROBJ     = analyzer.o converter.o    \
          loop.o    \
          unify_head_body.o  \
          determine_type.o type_init.o \
          analyze_type.o   \
          dependency.o  schedule.o\
          direct_call.o \
          type.o builtin_type.o \
          mode.o    \
          parse_uty.o  \
          print.o uty.o list.o functor.o

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    \
    normalize-p.ext generate-p.ext obj-p.ext obj-s.ext write-p.ext    \
    kl1cmp-p.ext \
    util-p.ext mode_check.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 -P$(PARALLEL) $(KLICOPT) \
	-R -I../include -X. -D../compiler/klicdb -v 

all: klicdb klic kl1cmp kl1cmp-runtime kl1cmp-p

analyzer:
	cd analyzer;make src


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

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)

.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)


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)
kl1cmp-runtime: klic klicdb klicdb.init libklic.db $(RKL1SRC) ../runtime/libklict.a
	./klic -P$(PARALLEL) -K $(KL1CMP) -D./klicdb -v \
		-X. -I../include -L../runtime \
		$(KLICOPT) -o kl1cmp-runtime $(RKL1SRC)
#kl1cmp-s: klic klicdb klicdb.init libklic.db $(NPKL1SRC)  $(ANALYZERSRC) ../runtime/libklict.a
#	./klic -P$(PARALLEL) -K $(KL1CMP) -D./klicdb -v \
#		-X. -I../include -L../runtime \
#		$(KLICOPT) -o kl1cmp-s $(NPKL1SRC) $(ANALYZERSRC)

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

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 kl1cmp-p kl1cmp-runtime kl1cmp-s klic klicdb libklic.db klic.db klicdb.init

distclean: clean

realclean: distclean
	/bin/rm -f $(CSRC) $(ANALYZERCSRC) *.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

#--------------------------------------------------------------------

HOSTKLICDIR = /project/KL1/klic-solaris

HOSTKLIC = $(HOSTKLICDIR)/compiler/klic -v -K$(HOSTKLICDIR)/compiler/kl1cmp \
    -D$(HOSTKLICDIR)/compiler/klicdb \
    -X. -I$(HOSTKLICDIR)/include -L$(HOSTKLICDIR)/runtime -g

generate_c_ext : analyzer $(KL1SRC) $(PKL1SRC) $(NPKL1SRC) $(RKL1SRC) $(ANALYZERSRC)
	$(HOSTKLIC) -C -v $(KL1SRC) $(PKL1SRC) $(NPKL1SRC) $(RKL1SRC)  \
                      $(ANALYZERSRC)

genclean :
	$(RM) $(CSRC) $(EXT) atom.* funct.* predicates.c






