# Makefile for Haskell implementation of MiniJS

# List of goals not corresponding to file names.

.PHONY : all clean distclean www index.html

# Default goal.

all : mini test

test : mini
	./mini ../test/pi.js
#	./mini ../test/ex1.js
#	./mini ../test/arith.js
#	./mini ../test/unbound.js


# Create directory listing

www : index.html

index.html :
	tree -H '.' -L 2 --noreport --charset utf-8 > $@

# MiniJS implementation

mini : Main.hs Interpreter.hs Types.hs TypeChecker.hs Ann.hs AnnTypeChecker.hs JVM.hs Compiler.hs \
  MiniJS/Abs.hs MiniJS/Lex.x MiniJS/Print.hs MiniJS/Par.y \
  Code/Abs.hs Code/Print.hs \
  Runtime.class
	ghc --make -o $@ $<

%.class : %.java
	javac $<

# Rules for building the parser.

MiniJS/ErrM.hs MiniJS/Lex.x MiniJS/Print.hs MiniJS/Par.y MiniJS/Test.hs : MiniJS.cf
	bnfc --haskell -d MiniJS.cf

%.hs : %.y
	happy --ghc --coerce --array --info $<

%.hs : %.x
	alex --ghc $<

MiniJS/Test : MiniJS/Test.hs MiniJS/ErrM.hs MiniJS/Lex.hs MiniJS/Par.hs MiniJS/Print.hs
	ghc --make $< -o $@

# Rules for building the parser.

Code/ErrM.hs Code/Lex.x Code/Print.hs Code/Par.y Code/Test.hs : ../Code.cf
	bnfc --haskell -d $<

Code/Test : Code/Test.hs Code/ErrM.hs Code/Lex.hs Code/Par.hs Code/Print.hs
	ghc --make $< -o $@

# Rules for cleaning generated files.

clean :
	-rm -f MiniJS/*.hi MiniJS/*.o MiniJS/*.log MiniJS/*.aux MiniJS/*.dvi
	-rm -f Code/*.hi Code/*.o Code/*.log Code/*.aux Code/*.dvi

distclean : clean
	-rm -f MiniJS/Abs.hs MiniJS/Abs.hs.bak MiniJS/ComposOp.hs MiniJS/ComposOp.hs.bak MiniJS/Doc.txt MiniJS/Doc.txt.bak MiniJS/ErrM.hs MiniJS/ErrM.hs.bak MiniJS/Layout.hs MiniJS/Layout.hs.bak MiniJS/Lex.x MiniJS/Lex.x.bak MiniJS/Par.y MiniJS/Par.y.bak MiniJS/Print.hs MiniJS/Print.hs.bak MiniJS/SharedString.hs MiniJS/SharedString.hs.bak MiniJS/Skel.hs MiniJS/Skel.hs.bak MiniJS/Test.hs MiniJS/Test.hs.bak MiniJS/XML.hs MiniJS/XML.hs.bak MiniJS/AST.agda MiniJS/AST.agda.bak MiniJS/Parser.agda MiniJS/Parser.agda.bak MiniJS/IOLib.agda MiniJS/IOLib.agda.bak MiniJS/Main.agda MiniJS/Main.agda.bak MiniJS/MiniJS.dtd MiniJS/MiniJS.dtd.bak MiniJS/Test MiniJS/Lex.hs MiniJS/Par.hs MiniJS/Par.info MiniJS/ParData.hs
	-rmdir -p MiniJS/
	-rm -rf Code/

# EOF