| # Configuration | |
| NAME = spectec | |
| EXT = $(NAME) | |
| LOG = _log | |
| # Main targets | |
| .PHONY: default all ci | |
| default: exe | |
| all: exe latex test | |
| ci: all | |
| # Executable | |
| EXE = exe-$(NAME)/main.exe | |
| SRCDIR = src | |
| OUTDIR = _build/default/src | |
| ROOTDIR = .. | |
| INTERPRETERDIR = $(ROOTDIR)/interpreter | |
| CLONEDIR = src/backend-interpreter/reference-interpreter | |
| CLONERM = dune-project jslib | |
| OPAMPACKAGES = zarith menhir mdx | |
| .PHONY: exe | |
| packages: | |
| opam install $(OPAMPACKAGES) | |
| exe: $(CLONEDIR) packages | |
| rm -f ./$(NAME) | |
| dune build $(SRCDIR)/$(EXE) | |
| ln -f $(OUTDIR)/$(EXE) ./$(NAME) | |
| $(CLONEDIR): $(shell find $(INTERPRETERDIR) -type f) | |
| rm -rf $(CLONEDIR) | |
| cp -R $(INTERPRETERDIR) $(CLONEDIR) | |
| rm -r $(CLONERM:%=$@/%) | |
| cp $@/../dune-ref-interp $@/dune | |
| # Latex | |
| .PHONY: latex | |
| latex: exe | |
| (cd test-latex && make all) | |
| # Test | |
| TESTDIRS = $(shell ls -d test-*) | |
| .PHONY: test testpromote $(TESTDIRS) doc/example | |
| test: exe $(TESTDIRS) doc/example | |
| dunetest: | |
| @echo "#### Running (dune runtest)" | |
| @dune runtest && echo OK || (echo "####>" Failure running dune test. && echo "####>" Run \`make testpromote\` to accept changes in test expectations. && false) | |
| testpromote: | |
| dune promote | |
| $(TESTDIRS): test-%: exe | |
| @echo "#### Running (cd $@; make test)" | |
| @(cd $@ && ((make test >$(LOG) 2>&1 && (grep warning $(LOG) || true)) || (cat $(LOG) && echo "####>" Failure running $@. See log above. && false))) | |
| @echo "#### Running (cd $@; dune runtest)" | |
| @(cd $@ && dune runtest) | |
| doc/example: exe | |
| @echo "#### Running (cd $@; make all)" | |
| @(cd $@ && make out clean >$(LOG) 2>&1 && rm -f $(LOG)) | |
| # Specification (copy to local workspace to make dune deps for tests happy) | |
| SPECIFICATIONDIR = $(ROOTDIR)/specification | |
| SPECCLONEDIR = _specification | |
| $(SPECCLONEDIR): $(shell find $(SPECIFICATIONDIR) -type f) | |
| rm -rf $(SPECCLONEDIR) | |
| cp -R $(SPECIFICATIONDIR) $(SPECCLONEDIR) | |
| # Spec document | |
| .PHONY: spec spec-pdf | |
| spec: | |
| (cd ../document/core && make main) | |
| spec-pdf: | |
| (cd ../document/core && make pdf) | |
| spec-html: | |
| (cd ../document/core && make html) | |
| spec-clean: | |
| (cd ../document/core && make clean) | |
| # Specification checks | |
| check%: | |
| (cd ../specification && make $@) | |
| sync%: | |
| (cd ../specification && make $@) | |
| # Semantics checks | |
| sem: | |
| (cd doc/semantics/il && make check) | |
| # Cleanup | |
| .PHONY: clean distclean | |
| clean: | |
| dune clean | |
| rm -f src/frontend/parser.{automaton,conflicts} | |
| for dir in $(TESTDIRS); do (cd $$dir && make clean); done | |
| distclean: clean spec-clean | |
| rm -f ./$(NAME) | |
| rm -rf $(CLONEDIR) | |
| for dir in $(TESTDIRS); do (cd $$dir && make distclean); done |