blob: ba992afe1013488bd6534042c057bbd02d288ce0 [file] [log] [blame] [edit]
# 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)
# 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