| # This Makefile uses dune but does not rely on ocamlfind or the Opam | |
| # package manager to build. However, Opam package management is available | |
| # optionally through the install target. | |
| # | |
| # The $(JSLIB).js target requires Js_of_ocaml (using ocamlfind). | |
| # | |
| # See README.me for instructions. | |
| # Configuration | |
| NAME = wasm | |
| LIB = $(NAME) | |
| JSLIB = wast.js | |
| ZIP = $(NAME).zip | |
| DEPS = dune menhir | |
| JSDEPS = ocamlfind js_of_ocaml js_of_ocaml-ppx | |
| BUILDDIR = _build/default | |
| JS = # set to JS shell command to run JS tests, empty to skip | |
| # Main targets | |
| .PHONY: default all ci jslib zip | |
| default: $(NAME) | |
| all: default alltest | |
| alltest: unittest partest custompartest | |
| alldeps: $(NAME)-deps $(JSLIB)-deps | |
| ci: all jslib zip | |
| jslib: $(JSLIB) | |
| zip: $(ZIP) | |
| # Building | |
| .PHONY: $(NAME) $(JSLIB) | |
| deps: | |
| opam install --yes $(DEPS) | |
| $(NAME): | |
| rm -f $@ | |
| dune build $@.exe | |
| ln $(BUILDDIR)/$@.exe $@ | |
| jsdeps: deps | |
| opam install --yes $(JSDEPS) | |
| $(JSLIB): | |
| rm -f $@ | |
| dune build $(@:%.js=%.bc.js) | |
| ln $(BUILDDIR)/$(@:%.js=%.bc.js) $@ | |
| # Unit tests | |
| UNITTESTDIR = unittest | |
| UNITTESTFILES = $(shell cd $(UNITTESTDIR) > /dev/null; ls *.ml) | |
| UNITTESTS = $(UNITTESTFILES:%.ml=%) | |
| .PHONY: unittest | |
| unittest: $(UNITTESTS:%=unittest/%) | |
| unittest/%: | |
| dune build $(@F).exe | |
| dune exec ./$(@F).exe | |
| @echo All unit tests passed. | |
| # Core test suite | |
| TESTDIR = ../test/core | |
| TESTFILES = $(shell cd $(TESTDIR) > /dev/null; ls *.wast; ls [a-z]*/*.wast) | |
| TESTS = $(TESTFILES:%.wast=%) | |
| .PHONY: test partest quiettest | |
| test: $(NAME) | |
| $(TESTDIR)/run.py --wasm `pwd`/$(NAME) $(if $(JS),--js '$(JS)',) | |
| test/%: $(NAME) | |
| $(TESTDIR)/run.py --wasm `pwd`/$(NAME) $(if $(JS),--js '$(JS)',) $(TESTDIR)/$*.wast | |
| run/%: $(NAME) | |
| ./$(NAME) $(TESTDIR)/$*.wast | |
| partest: $(NAME) | |
| make -j10 quiettest | |
| quiettest: $(TESTS:%=quiettest/%) | |
| @echo All tests passed. | |
| quiettest/%: $(NAME) | |
| @ ( \ | |
| $(TESTDIR)/run.py 2>$(@F).out --wasm `pwd`/$(NAME) $(if $(JS),--js '$(JS)',) $(TESTDIR)/$*.wast && \ | |
| rm $(@F).out \ | |
| ) || \ | |
| (cat $(@F).out && rm $(@F).out && exit 1) | |
| # Custom test suite | |
| CUSTOMTESTDIR = ../test/custom | |
| CUSTOMTESTDIRS = $(shell cd $(CUSTOMTESTDIR); ls -d [a-z]*) | |
| CUSTOMTESTFILES = $(shell cd $(CUSTOMTESTDIR); ls [a-z]*/*.wast) | |
| CUSTOMTESTS = $(CUSTOMTESTFILES:%.wast=%) | |
| CUSTOMOPTS = -c custom $(CUSTOMTESTDIRS:%=-c %) | |
| .PHONY: customtest custompartest customquiettest | |
| customtest: $(NAME) | |
| $(TESTDIR)/run.py --wasm `pwd`/$(NAME) --opts '$(CUSTOMOPTS)' $(if $(JS),--js '$(JS)',) $(CUSTOMTESTFILES:%=$(CUSTOMTESTDIR)/%) | |
| customtest/%: $(NAME) | |
| $(TESTDIR)/run.py --wasm `pwd`/$(NAME) --opts '$(CUSTOMOPTS) ' $(if $(JS),--js '$(JS)',) $(CUSTOMTESTDIR)/$*.wast | |
| customrun/%: $(NAME) | |
| ./$(NAME) $(CUSTOMOPTS) $(CUSTOMTESTDIR)/$*.wast | |
| custompartest: $(CUSTOMTESTS:%=customquiettest/%) | |
| @echo All custom tests passed. | |
| customquiettest/%: $(NAME) | |
| @ ( \ | |
| $(TESTDIR)/run.py 2>$(@F).out --wasm `pwd`/$(NAME) --opts '$(CUSTOMOPTS)' $(if $(JS),--js '$(JS)',) $(CUSTOMTESTDIR)/$*.wast && \ | |
| rm $(@F).out \ | |
| ) || \ | |
| cat $(@F).out || rm $(@F).out || exit 1 | |
| # Packaging | |
| .PHONY: install | |
| install: | |
| rm -f $(NAME).exe | |
| dune build -p $(NAME) @install | |
| dune install | |
| opam-release/%: | |
| #git tag -f opam-$* | |
| #git push -f --tags | |
| rm -f opam-$*.zip | |
| #wget https://github.com/WebAssembly/spec/archive/opam-$*.zip | |
| wget 'https://download-directory.github.io?url=https://github.com/WebAssembly/spec/tree/opam-$*/interpreter&filename=opam-$*.zip' | |
| cp wasm.opam opam | |
| echo "url {" >> opam | |
| #echo " src: \"https://github.com/WebAssembly/spec/archive/opam-$*.zip\"" >> opam | |
| echo " src: \"https://download-directory.github.io?url=https://github.com/WebAssembly/spec/tree/opam-$*/interpreter&filename=opam-$*.zip\"" >> opam | |
| echo " checksum: [" >> opam | |
| echo " \"md5=`md5 -q opam-$*.zip`\"" >> opam | |
| echo " \"sha256=`sha256 -q opam-$*.zip`\"" >> opam | |
| echo " ]" >> opam | |
| echo "}" >> opam | |
| rm opam-$*.zip | |
| @echo Created file ./opam, submit to github opam-repository/packages/wasm/wasm.$*/opam | |
| $(ZIP): | |
| git archive --format=zip --prefix=$(NAME)/ -o $@ HEAD | |
| # Cleanup | |
| .PHONY: clean distclean | |
| clean: | |
| dune clean | |
| distclean: clean | |
| rm -f $(NAME) $(JSLIB) $(ZIP) |