OBJI = src/ast.cmi src/compile.cmi src/lexer.cmi src/mips.cmi src/typing.cmi \
src/parser.cmi src/defunct.cmi
OBJ = src/mips.cmo src/lexer.cmo src/parser.cmo src/typing.cmo src/compile.cmo \
src/defunct.cmo src/main.cmo
LEX = src/lexer.ml
PRS = src/parser.ml src/parser.mli
BIN = bin/mimo
DEMO = var/exec/mandelbrot.s var/exec/pascal.s

OCC = ocamlc -I src

.PHONY: all clean test demo demo-syntax demo-typing

all: $(BIN)

$(OBJ) $(OBJI):
	$(OCC) -c $<

$(BIN): $(OBJI) $(OBJ)
	$(OCC) $(OBJ) -o $@

src/ast.cmi: src/ast.mli
src/lexer.cmo: src/lexer.ml src/lexer.cmi src/parser.cmi
src/parser.cmi: src/parser.mli src/ast.cmi
src/parser.cmo: src/parser.ml src/parser.cmi
src/typing.cmi: src/typing.ml src/ast.cmi
src/typing.cmo: src/typing.ml src/ast.cmi
src/defunct.cmi: src/defunct.ml src/ast.cmi src/typing.cmi
src/defunct.cmo: src/defunct.ml src/ast.cmi  src/typing.cmi
src/compile.cmi: src/compile.ml src/mips.cmi src/defunct.cmi
src/compile.cmo: src/compile.ml src/compile.cmi src/defunct.cmi
src/mips.cmi src/mips.cmo: src/mips.ml
src/main.cmo: src/main.ml src/lexer.cmo

$(LEX): src/lexer.mll
	ocamllex $< -o $@

$(PRS): src/parser.mly src/ast.cmi
	gcc -E -x c $< | grep -v -E '^#' > src/parser_tmp.mly
	menhir -v --infer --ocamlc "ocamlc -I src" src/parser_tmp.mly
	mv src/parser_tmp.ml src/parser.ml
	mv src/parser_tmp.mli src/parser.mli

clean:
	rm -f src/parser_tmp.automaton src/parser_tmp.conflicts src/parser_tmp.mly
	rm -f *~ */*~ $(OBJ) $(OBJI) $(LEX) $(PRS) $(BIN) $(TST) src/main.cmi
	rm -f $(DEMO)

demo: all $(DEMO)

var/exec/mandelbrot.s: var/exec/mandelbrot.ml
var/exec/pascal.s: var/exec/pascal.ml

$(DEMO):
	$(BIN) $< && spim -file $@

demo-syntax: all
	@echo "> Testing bad syntax:"
	@for f in var/syntax/bad/*ml; do \
		echo $$f":"; $(BIN) -parse-only $$f; echo; done
	@echo; echo "> Testing good syntax:"
	@for f in var/syntax/good/*ml; do \
		echo $$f":"; $(BIN) -parse-only $$f; echo; done

demo-typing: all
	@echo "> Testing bad typing:"
	@for f in var/typing/bad/*ml; do \
		echo $$f":"; $(BIN) -type-only $$f; echo; done
	@echo; echo "> Testing good typing:"
	@for f in var/typing/good/*ml; do \
		echo $$f":"; $(BIN) -type-only $$f; echo; done
