# This code was original from MicroC and modified by:
# Keir Lauritzen, Leon Song and Guy Yardeni

#OBJS = ast.cmx codegen.cmx parser.cmx scanner.cmx carl.cmx turn_to_c.cmx
#OBJS = ast.cmx sast.cmx parser.cmx scanner.cmx semant.cmx carl.cmx
OBJS = ast.cmx sast.cmx parser.cmx scanner.cmx semant.cmx codegen.cmx check.cmx carl.cmx

carlc : $(OBJS)
	ocamlfind ocamlopt -linkpkg -package llvm -package llvm.analysis $(OBJS) -o carlc

scanner.ml : scanner.mll
	ocamllex scanner.mll

parser.ml parser.mli : parser.mly
	ocamlyacc -v parser.mly

%.cmo : %.ml
	ocamlc -c $<

%.cmi : %.mli
	ocamlc -c $<

%.cmx : %.ml
	ocamlfind ocamlopt -c -package llvm $<

.PHONY : clean
clean :
	ocamlbuild -clean
	rm -rf scanner.ml parser.ml parser.mli carlc
	rm -rf *.cmx *.cmi *.cmo *.o *~ *.s *.output *.ll

engine : carl_engine.cpp
	g++ -std=c++11 -g -c carl_engine.cpp

ast.cmo :
ast.cmx :
sast.cmo : ast.cmo
sast.cmx : ast.cmx
codegen.cmo : sast.cmo
codegen.cmx : sast.cmx
carl.cmo : scanner.cmo parser.cmi sast.cmo codegen.cmo ast.cmo check.cmo semant.cmo
carl.cmx : scanner.cmx parser.cmx sast.cmx codegen.cmx ast.cmx check.cmx semant.cmx
#carl.cmo : scanner.cmo parser.cmi ast.cmo sast.cmo
#carl.cmx : scanner.cmx parser.cmx ast.cmx sast.cmx
parser.cmo : ast.cmo parser.cmi
parser.cmx : ast.cmx parser.cmi
scanner.cmo : parser.cmi
scanner.cmx : parser.cmx
parser.ci : ast.cmo
check.cmo : sast.cmo parser.cmi
check.cmx : sast.cmx parser.cmi 
semant.cmo : sast.cmo parser.cmi
semant.cmx : sast.cmx parser.cmi 
