# Config for OCamlMakefile
BIN_DIR := bin
RESULT := $(BIN_DIR)/civcc
GLOBALS := types globals stringify util
PHASES := load parse print context desug typecheck dimreduce boolop constprop \
	unroll index assemble peephole output
SOURCES := $(addsuffix .mli,$(GLOBALS)) $(addsuffix .ml,$(GLOBALS)) \
	lexer.mll parser.mly main.mli \
	$(patsubst %,phases/%.mli,$(PHASES)) $(patsubst %,phases/%.ml,$(PHASES)) \
	main.ml
PRE_TARGETS := types.ml $(addsuffix .cmi,$(GLOBALS))
LIBS := str unix

# Other config
CIVAS := $(BIN_DIR)/civas
CIVVM := $(BIN_DIR)/civvm
CIVCC_LINK := civcc

DIST_TGT := civicaml.tar.gz
DIST_FILES := $(BIN_DIR) $(SOURCES) Makefile OCamlMakefile README.md test \
	.gitignore

TESTSUITE_TGT := testsuite.tar.gz
TOOLCHAIN_TGT := toolchain.tar.gz

# Set debugging flag to enable exception backtraces for OCAMLRUNPARAM=b
OCAMLFLAGS := -g

OCAMLYACC := menhir
YFLAGS := --infer --explain

.PHONY: all check dist testsuite myclean cleaner toolchain

all: $(RESULT) $(CIVCC_LINK)

$(RESULT): native-code

$(CIVCC_LINK):
	ln -sf $(RESULT) $@

# The Types module needs an implementation file to stop ocamlc from complaining
types.ml: types.mli
	cp $< $@

check: all $(CIVAS) $(CIVVM)
	@cd test; \
		CIVAS=../$(CIVAS) \
		CIVVM=../$(CIVVM) \
		CIVCC=../$(RESULT) \
		CFLAGS="-v 1" \
		RUN_FUNCTIONAL=1 \
		bash run.bash basic preprocess nested_funs arrays

dist: $(DIST_TGT)

$(DIST_TGT): $(DIST_FILES)
	tar -czf $@ $^ --exclude=types.ml

testsuite: $(TESTSUITE_TGT)

$(TESTSUITE_TGT): TESTSUITE_README public_tests.txt
	for f in `cat public_tests.txt`; do \
		mkdir -p _tmp/test/`dirname $$f`; \
		cp test/$$f _tmp/test/$$f; \
	done
	cp $< _tmp
	cd _tmp && tar -czf ../$@ *
	rm -rf _tmp

clean:: myclean

myclean:
	rm -f a.out $(DIST_TGT) $(TESTSUITE_TGT) $(TOOLCHAIN_TGT)

cleaner: clean
	rm -rf doc/$(RESULT) $(CIVAS) $(CIVVM) $(CIVCC_LINK)

toolchain: $(TOOLCHAIN_TGT)

$(TOOLCHAIN_TGT): all $(CIVAS) $(CIVVM)
	tar -czf $@ $(BIN_DIR)

$(CIVAS): civic/as/civas
	cp $< $@

$(CIVVM): civic/vm/civvm
	cp $< $@

civic/as/civas civic/vm/civvm:
	make -C $(@D)

doc/assembler.pdf: civic/docs/manual.pdf
	make -C $(<D)
	cp $< $@

include OCamlMakefile
