SRC  = ast.ml parser.mly scanner.mll error.ml bytecode.ml symbol.ml ir.ml opt_ir.ml opt_jvm.ml jvm.ml rtl.ml 
OBJ  = $(addsuffix .cmo, $(basename $(SRC)))
 
RUNTIME_FILES=./runtime/Rtl.java ./runtime/RtlException.java ./runtime/RtlInFile.java ./runtime/RtlOutFile.java

#OCAML_OPTS += -g -w A
OCAML_OPTS += -g

rtl: $(OBJ) 
	ocamlfind ocamlc -package getopt -linkpkg $(OCAML_OPTS) -o rtl $(OBJ)
	cp rtl ../bin


.PHONY : test0 test1 test3 test testd
test0 : rtl 
	./rtl_check --filter 0_
test1 : rtl 
	./rtl_check --filter 1_ 
test2 : rtl 
	./rtl_check --filter 2_ 
test : rtl 
	./rtl_check 
test_ast : rtl
	./rtl_check --ast

lex scanner.ml : scanner.mll
	ocamllex scanner.mll

yacc parser.ml parser.mli : parser.mly
	ocamlyacc parser.mly

output : parser.mly
	ocamlyacc -v parser.mly

%.cmo : %.ml
	ocamlfind ocamlc -package getopt -linkpkg $(OCAML_OPTS) -c $<

%.cmi : %.mli
	ocamlfind ocamlc -package getopt -linkpkg $(OCAML_OPTS) -c $<

%.mli : %.ml
	ocamlfind ocamlc -package getopt -linkpkg $(OCAML_OPTS) -i $< > $@

.PHONY : tar
tar : 
	tar caf rtl.tgz ./runtime/* ./tests/* $(SRC) rtl_check rtl_check.py Makefile gen_ref.sh

.PHONY : clean
clean :
	rm -f parser.output parser.ml scanner.ml tests/*.output
	rm -f *.cm* tests/*.jar validation* *.log
	rm -f tests/*.j tests/*.jar


.PHONY : clobber
clobber : clean
	rm -f rtl

.PHONY : cleanlogs
cleanlogs:
	rm -f val*.log log/*.log

ast.cmo : ast.cmi
bytecode.cmo : ast.cmi symbol.cmi bytecode.cmi
error.cmo : error.cmi
interpret.cmo : ast.cmi
ir.cmo : ir.cmi symbol.cmi error.cmi bytecode.cmi ast.cmi
ir.cmi : symbol.cmi error.cmi bytecode.cmi ast.cmi
parser.cmo : ast.cmi parser.cmi
rtl.cmo : ir.cmi rtl.cmi scanner.cmo parser.cmi ir.cmo jvm.cmo bytecode.cmi ast.cmi
rtl.cmi : scanner.cmi parser.cmi ir.cmi jvm.cmi bytecode.cmi ast.cmi
scanner.cmo : parser.cmi
scanner.cmi : parser.cmi
symbol.cmo : ast.cmi symbol.cmi
bytecode.cmi : ast.cmi symbol.cmi
parser.cmi : ast.cmi
symbol.cmi : ast.cmi
opt_ir.cmo : ir.cmi opt_ir.cmi
opt_jvm.cmo : jvm.cmi opt_jvm.cmi 
jvm.cmo : jvm.cmi
error.cmo : ast.cmi error.cmi
error.cmi : ast.cmi
