# Makefile for Camelot compiler

# Some of the files required are symlimks to files in ../../Grail/gdf/src.
# This means that you may run into problems because cvs update (in this 
# directory) won't update the gdf files (solution:  go to the gdf directory 
# and update it).

include ../../Makefile.setup

GDFDIR=../../Grail/gdf/src
SMLJVMDIR=../../sml-jvm

ifeq ($(OSTYPE),NetBSD)
MOSMLTOOLS=camlrunm /usr/pkg/libexec/moscow_ml/
else
MOSMLHOME ?= $(mosmldir)
$(warning "MOSMLHOME has been set to $(MOSMLHOME)")
# this may be wrong 
MOSMLTOOLS=camlrunm $(MOSMLHOME)/tools
endif
MOSMLL=mosmlc -I $(SMLJVMDIR) -I asdl
MOSMLC=$(MOSMLL) -c
MOSMLLEX=mosmllex
MOSMLYACC=mosmlyac

%.ui: %.sig
	$(MOSMLC) -liberal $<
# -liberal to suppress compliance warning for Parser.sig

%.uo: %.sml
	$(MOSMLC) $<

%.sml: %.lex
	$(MOSMLLEX) $<


#UNITS = -toplevel GrailAbsyn Lexer Parser Absyn Asyntfn Syncheck\
#      Phi Normalise Camelot Diamond Type\
#      Mono Compile Optimise Util Perv Dataflow Linearity\
#      Lib ProofHints  MainParser



# Source files from gdf directory
gdfsrcs = GrailUtils.sml Compile.sml FlowGraph.sml CertGenP.sml GrailAbsyn.sml\
	  ToyClassTable.sml ToyGrailAbsyn.sml Stardate.sml Metadata.sml


# Source files from gdf directory
gdfsrcs=CertGenP.sml GrailUtils.sml Metadata.sml Stardate.sml Compile.sml FlowGraph.sml GrailAbsyn.sml ToyClassTable.sml ToyGrailAbsyn.sml

gdfuos  = $(gdfsrcs:%.sml%.uo)

uos = Lexer.uo Parser.uo Absyn.uo Absyn_ASDL.uo\
      AsdlUtil.uo Asyntfn.uo Syncheck.uo\
      MainParser.uo Phi.uo Normalise.uo Camelot.uo Diamond.uo Type.uo\
      Mono.uo MonoUtil.uo Optimise.uo Util.uo Perv.uo Dataflow.uo Linearity.uo\
      Lib.uo DataOpt.uo ClassPath.uo ProofHints.uo Loc.uo\
      Normsyn.uo NAsyntfn.uo\
      GrailUtils.uo FlowGraph.uo CertGenP.uo Compile.uo FlowGraph.uo ToyGrailAbsyn.uo\
      ToyClassTable.uo Normsyn.uo NAsyntfn.uo\
      $(gdfuos)

all: smljvm do-asdl $(uos) camelot Camelotlib.class 

camelot: smljvm $(uos)
	 $(MOSMLL) -o camelot Camelot.sml

standalone: smljvm do-asdl $(uos) lib
	 $(MOSMLL) -standalone -o camelot Camelot.sml

smljvm:
	cd $(SMLJVMDIR); $(MAKE) all

do-asdl:
	cd asdl; $(MAKE) all

lib: Camelotlib.class

Camelotlib.class: Camelotlib.java
	javac Camelotlib.java

Parser.sml Parser.sig: Parser.grm Lexer.sml
	$(MOSMLYACC) Parser.grm

$(gdfsrcs): %: $(GDFDIR)/%
	ln -s $< $@


# ---------------- Maintenance ---------------- #

depend: Lexer.sml Parser.sml $(gdfsrcs)
	rm -f Makefile.bak
	mv Makefile Makefile.bak
	$(MOSMLTOOLS)/cutdeps < Makefile.bak > Makefile
	$(MOSMLTOOLS)/mosmldep >> Makefile

clean:
	rm -f Parser.sig Parser.sml Lexer.sml
	rm -f *.ui *.uo
	rm -f $(gdfsrcs)
	rm -f *~
#	rm -f *.class
	rm -f Makefile.bak
	rm -f camelot



AsdlUtil.uo: Absyn_ASDL.uo asdl/Camelot_absyn_ASDL.uo 

### DO NOT DELETE THIS LINE
Lambda.uo: Asyntfn.uo Absyn.uo Util.uo 
Env.uo: Normsyn.uo NAsyntfn.uo Util.uo 
Defunc.uo: Normsyn.uo Perv.uo MonoUtil.uo NAsyntfn.uo Normalise.uo Util.uo \
    Env.uo 
ToyGrailAbsyn.uo: Stardate.uo GrailAbsyn.uo ToyClassTable.uo GrailUtils.uo 
FlowGraph.uo: GrailAbsyn.uo 
Compile.uo: GrailAbsyn.uo CertGenP.uo ToyGrailAbsyn.uo FlowGraph.uo \
    Metadata.uo GrailUtils.uo 
CertGenP.uo: GrailAbsyn.uo FlowGraph.uo GrailUtils.uo ToyGrailAbsyn.uo
Parser.ui: Absyn.uo 
Parser.uo: Parser.ui Loc.uo Perv.uo Asyntfn.uo Absyn.uo Util.uo 
Lexer.uo: Parser.ui 
Util.uo: Loc.uo Normsyn.uo Absyn.uo 
Type.uo: Loc.uo Normsyn.uo Perv.uo Absyn.uo NAsyntfn.uo ClassPath.uo \
    Util.uo Env.uo 
Syncheck.uo: Perv.uo Asyntfn.uo Absyn.uo Util.uo 
Predicate.uo: Normsyn.uo Absyn_ASDL.uo Util.uo GrailUtils.uo ToyGrailAbsyn.uo
Phi.uo: Loc.uo Normsyn.uo GrailAbsyn.uo Perv.uo Asyntfn.uo Absyn.uo \
    Diamond.uo Type.uo Mono.uo ClassPath.uo NAsyntfn.uo Normalise.uo \
    Util.uo Env.uo 
Perv.uo: GrailAbsyn.uo Absyn.uo Diamond.uo Util.uo 
Optimise.uo: Loc.uo Normsyn.uo GrailAbsyn.uo Normalise.uo Util.uo 
Normsyn.uo: Absyn.uo 
Normalise.uo: Normsyn.uo Asyntfn.uo Absyn.uo NAsyntfn.uo Util.uo Lambda.uo 
NAsyntfn.uo: Normsyn.uo Asyntfn.uo Util.uo 
MonoUtil.uo: Normsyn.uo Util.uo 
Mono.uo: Loc.uo Normsyn.uo Perv.uo Absyn.uo Type.uo MonoUtil.uo NAsyntfn.uo \
    Util.uo Env.uo 
MainParser.uo: Parser.ui Loc.uo Lexer.uo Absyn.uo Util.uo 
Linearity.uo: Normsyn.uo Asyntfn.uo NAsyntfn.uo Util.uo Env.uo 
Lib.uo: Perv.uo Absyn.uo 
Diamond.uo: Normsyn.uo GrailAbsyn.uo NAsyntfn.uo Util.uo 
Dataflow.uo: GrailAbsyn.uo Util.uo 
DataOpt.uo: Loc.uo Normsyn.uo Util.uo 
ClassPath.uo: Normsyn.uo GrailAbsyn.uo Absyn.uo Util.uo 
Camelot.uo: Optimise.uo Lib.uo DataOpt.uo Loc.uo Normsyn.uo GrailAbsyn.uo \
    CertGenP.uo ProofHints.uo ToyGrailAbsyn.uo Asyntfn.uo Syncheck.uo \
    AsdlUtil.uo Absyn.uo Diamond.uo Type.uo Linearity.uo Mono.uo \
    MainParser.uo Compile.uo Dataflow.uo NAsyntfn.uo ClassPath.uo \
    Normalise.uo Util.uo Phi.uo Defunc.uo Env.uo Predicate.uo 
Asyntfn.uo: Absyn.uo Util.uo 
AsdlUtil.uo: Loc.uo Normsyn.uo Absyn_ASDL.uo Absyn.uo Util.uo 
Absyn.uo: Loc.uo 
