.DEFAULT_GOAL := help PREFIX_ARG := $(if $(PREFIX),--prefix $(PREFIX),) LIBDIR_ARG := $(if $(LIBDIR),--libdir $(LIBDIR),) DESTDIR_ARG := $(if $(DESTDIR),--destdir $(DESTDIR),) INSTALL_ARGS := $(PREFIX_ARG) $(LIBDIR_ARG) $(DESTDIR_ARG) BIN := ./_boot/dune.exe # Dependencies recommended for developing dune locally, # but not wanted in CI DEV_DEPS := \ core_bench \ patdiff TEST_OCAMLVERSION := 5.3.0 # When updating this version, don't forget to also bump the number in the docs. -include Makefile.dev .PHONY: help help: @cat doc/make-help.txt .PHONY: bootstrap bootstrap: $(MAKE) -B $(BIN) .PHONY: test-bootstrap test-bootstrap: @ocaml boot/bootstrap.ml --boot-dir _test_boot .PHONY: release release: $(BIN) @$(BIN) build @install -p dune --profile dune-bootstrap $(BIN): @ocaml boot/bootstrap.ml dev: $(BIN) $(BIN) build @install watch: $(BIN) $(BIN) build @install --watch all: $(BIN) $(BIN) build .PHONY: install install: $(BIN) install $(INSTALL_ARGS) dune .PHONY: uninstall uninstall: $(BIN) uninstall $(INSTALL_ARGS) dune .PHONY: reinstall reinstall: uninstall install .PHONY: install-ocamlformat install-ocamlformat: opam install -y ocamlformat.$$(awk -F = '$$1 == "version" {print $$2}' .ocamlformat) .PHONY: dev-deps dev-deps: opam install -y . --deps-only --with-dev-setup .PHONY: dev-deps-sans-melange dev-deps-sans-melange: dev-deps .PHONY: dev-switch dev-switch: opam update # Ensuring that either a dev switch already exists or a new one is created if test -d _opam ; then \ opam install -y --update-invariant ocaml.$(TEST_OCAMLVERSION); \ else \ opam switch create -y . $(TEST_OCAMLVERSION) --no-install ; \ fi opam pin add -y . -n --with-version=dev opam install -y . --deps-only --with-test --with-dev-setup $(MAKE) install-ocamlformat opam install -y $(DEV_DEPS) .PHONY: test test: $(BIN) $(BIN) runtest test-windows: $(BIN) $(BIN) build @runtest-windows test-js: $(BIN) $(BIN) build @runtest-js test-wasm: $(BIN) DUNE_WASM_TEST=enable $(BIN) build @runtest-wasm test-coq: $(BIN) DUNE_COQ_TEST=enable $(BIN) build @runtest-coq test-melange: $(BIN) $(BIN) build @runtest-melange test-all: $(BIN) $(BIN) build @runtest @runtest-js @runtest-coq @runtest-melange test-all-sans-melange: $(BIN) $(BIN) build @runtest @runtest-js @runtest-coq .PHONY: check check: $(BIN) @$(BIN) build @check .PHONY: fmt fmt: $(BIN) @$(BIN) fmt .PHONY: promote promote: $(BIN) @$(BIN) promote .PHONY: accept-corrections accept-corrections: promote .PHONY: clean clean: rm -rf _boot _build distclean: clean rm -f src/dune_rules/setup.ml .PHONY: doc doc: sphinx-build -W doc doc/_build # livedoc-deps: you may need to [pip3 install sphinx-autobuild] and [pip3 install -r doc/requirements.txt] livedoc: cd doc && sphinx-autobuild . _build --port 8888 -q --re-ignore '\.#.*' update-jbuilds: $(BIN) $(BIN) build @doc/runtest --auto-promote # If the first argument is "run"... ifeq (dune,$(firstword $(MAKECMDGOALS))) # use the rest as arguments for "run" RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) # ...and turn them into do-nothing targets $(eval $(RUN_ARGS):;@:) endif .PHONY: bench bench: $(BIN) @$(BIN) exec -- ./bench/bench.exe $(BIN) .PHONY: dune dune: $(BIN) $(BIN) $(RUN_ARGS) # Use this target to make sure that we always run the in source dune when making # the release .PHONY: opam-release opam-release: dev $(BIN) exec -- $(MAKE) dune-release dune-release: dune-release tag dune-release distrib --skip-build --skip-lint --skip-tests # See https://github.com/ocamllabs/dune-release/issues/206 DUNE_RELEASE_DELEGATE=github-dune-release-delegate dune-release publish --verbose dune-release opam pkg dune-release opam submit .PHONY: docker-build-image docker-build-image: docker build -f docker/dev.Dockerfile -t dune . .PHONY: docker-compose docker-compose: docker compose -f docker/dev.yml run dune bash