.PHONY: all
all : clean scolang.native scolang_stdlib.o 

.PHONY: scolang.native
scolang.native :
	 eval `opam config env`; ocamlbuild -use-ocamlfind -pkgs llvm,llvm.analysis -cflags -w,+a-4 \
		scolang.native

# "make clean" removes all generated files
.PHONY : clean
clean :
	ocamlbuild -clean
	rm -rf testall.log *.diff scolang scanner.ml parser.ml parser.mli
	rm -rf webhook
	rm -rf *.cmx *.cmi *.cmo *.cmx *.o *.s *.ll *.out *.exe

# More detailed: build using ocamlc/ocamlopt + ocamlfind to locate LLVM
OBJS = ast.cmx codegen.cmx parser.cmx scanner.cmx semant.cmx sast.cmx scolang.cmx

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

scolang_stdlib.o : stdlib/scolang_stdlib.c
	gcc -c -g -o stdlib/scolang_stdlib.o stdlib/scolang_stdlib.c 

scanner.ml : scanner.mll
	ocamllex scanner.mll

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

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

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

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

ast.cmo :
ast.cmx :
codegen.cmo : ast.cmo sast.cmo
codegen.cmx : ast.cmx sast.cmx
parser.cmo : ast.cmo parser.cmi
parser.cmx : ast.cmx parser.cmi
parser.cmi : ast.cmo
sast.cmo :
sast.cmx :
scanner.cmo : parser.cmi
scanner.cmx : parser.cmx
scolang.cmo : semant.cmo scanner.cmo parser.cmi codegen.cmo ast.cmo sast.cmo
scolang.cmx : semant.cmx scanner.cmx parser.cmx codegen.cmx ast.cmx sast.cmx
semant.cmo : sast.cmo ast.cmo
semant.cmx : sast.cmx ast.cmx
test.cmo : scanner.cmo parser.cmi ast.cmo
test.cmx : scanner.cmx parser.cmx ast.cmx
