# compiler Makefile
#  - builds and manages all compiler components

OCAMLC = ocamlc
OCAMLLEX = ocamllex
OCAMLYACC = ocamlyacc
OBJS = ast.cmx codegen.cmx parser.cmx scanner.cmx pseudo.cmx
TESTOBJS = parser.cmo scanner.cmo

default: test

# pseudo: $(OBJS)
# 	$(OCAMLC) -g -o pseudo $(OBJS)

.PHONY: test
test: $(TESTOBJS)
	$(OCAMLC) -g -o pseudo $(TESTOBJS)

pseudo.native:
	make clean
	ocamlbuild -use-ocamlfind -pkgs llvm,llvm.analysis,str,llvm.bitreader -cflags -w,+a-4 \
		pseudo.native
	@mv pseudo.native pseudo

.PHONY: clean
clean:
	ocamlbuild -clean
	rm -rf testall.log *.diff scanner.ml parser.ml parser.mli pseudo
	rm -rf *.cmx *.cmi *.cmo *.cmx *.o
	rm -rf *.err *.out *.ll

scanner.ml: scanner.mll
	$(OCAMLLEX) scanner.mll

parser.ml parser.mli: parser.mly
	$(OCAMLYACC) parser.mly

%.cmo: %.ml
	$(OCAMLC) -c $<

%.cmi: %.mli
	$(OCAMLC) -c $<

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

# Generated by ocamldep *.ml *.mli
ast.cmo :
ast.cmx :
codegen.cmo : ast.cmo sast.cmi
codegen.cmx : ast.cmx sast.cmi
pseudo.cmo : scanner.cmo parser.cmi codegen.cmo ast.cmo printer.cmo infer.cmo
pseudo.cmx : scanner.cmx parser.cmx codegen.cmx ast.cmx printer.cmx infer.cmx
parser.cmo : ast.cmi parser.cmi
parser.cmx : ast.cmi parser.cmi
scanner.cmo : parser.cmi ast.cmi
scanner.cmx : parser.cmx ast.cmi
parser.cmi : ast.cmi
sast.cmi : ast.cmi
infer.cmo : sast.cmi ast.cmi
infer.cmx : sast.cmi ast.cmi
printer.cmo : sast.cmi
printer.cmx : sast.cmi
