.DEFAULT_GOAL := help
CXX_GLOB := find src include -name '*.cpp' -o -name '*.h'
DOCKER_IMAGE := udpipe-rs-dev
DOCKER_RUN := docker run --rm -v $(CURDIR):/workspace -w /workspace $(DOCKER_IMAGE)
.PHONY: help
help:
@echo "Usage: make [target]"
@awk 'BEGIN {FS = ":.*##"} /^### / {printf "\n\033[1m%s\033[0m\n", substr($$0, 5)} /^[a-zA-Z_-]+:.*##/ {printf " %-18s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
.PHONY: docker
docker:
@docker image inspect $(DOCKER_IMAGE) >/dev/null 2>&1 || docker build -t $(DOCKER_IMAGE) .
.PHONY: docker-rebuild
docker-rebuild:
docker build -t $(DOCKER_IMAGE) .
.PHONY: shell
shell: docker
docker run --rm -it -v $(CURDIR):/workspace -w /workspace $(DOCKER_IMAGE) bash
.PHONY: build
build: docker
$(DOCKER_RUN) cargo build
.PHONY: docs
docs: docker
$(DOCKER_RUN) cargo doc --no-deps
open target/doc/udpipe_rs/index.html || xdg-open target/doc/udpipe_rs/index.html
.PHONY: lint
lint: docker
-$(DOCKER_RUN) sh -c 'cargo clippy --fix --allow-dirty --allow-staged && $(CXX_GLOB) | xargs clang-tidy-18 --fix'
.PHONY: fmt
fmt: docker
$(DOCKER_RUN) sh -c 'cargo fmt && $(CXX_GLOB) | xargs clang-format-18 -i'
.PHONY: fix
fix: lint fmt
.PHONY: lint-check
lint-check: docker
$(DOCKER_RUN) sh -c 'cargo clippy --all-targets --all-features -- -D warnings && $(CXX_GLOB) | xargs clang-tidy-18'
.PHONY: fmt-check
fmt-check: docker
$(DOCKER_RUN) sh -c 'cargo fmt -- --check && $(CXX_GLOB) | xargs clang-format-18 --dry-run --Werror'
.PHONY: docs-check
docs-check: docker
$(DOCKER_RUN) sh -c 'RUSTDOCFLAGS="-D warnings" cargo doc --no-deps'
.PHONY: audit
audit: docker
$(DOCKER_RUN) cargo audit
.PHONY: deny
deny: docker
$(DOCKER_RUN) cargo deny check
.PHONY: lockfile
lockfile: docker
$(DOCKER_RUN) cargo update --locked --workspace
.PHONY: unused-deps
unused-deps: docker
$(DOCKER_RUN) cargo udeps --all-targets
.PHONY: outdated-deps
outdated-deps: docker
$(DOCKER_RUN) cargo outdated --exit-code 1
.PHONY: compat
compat: docker
$(DOCKER_RUN) cargo msrv verify
.PHONY: test
test: docker
$(DOCKER_RUN) cargo test
.PHONY: hack
hack: docker
$(DOCKER_RUN) cargo hack test --feature-powerset --all-targets --workspace
.PHONY: bench
bench: docker
$(DOCKER_RUN) cargo bench
.PHONY: coverage
coverage: docker
$(DOCKER_RUN) cargo llvm-cov
.PHONY: coverage-lcov
coverage-lcov: coverage
$(DOCKER_RUN) cargo llvm-cov report --lcov --output-path lcov.info
.PHONY: coverage-html
coverage-html: coverage
$(DOCKER_RUN) cargo llvm-cov report --html
open target/llvm-cov/html/index.html || xdg-open target/llvm-cov/html/index.html
.PHONY: asan
asan: docker
$(DOCKER_RUN) sh -c 'cargo clean && RUSTFLAGS="-Z sanitizer=address" cargo test --lib --tests --target $$(rustc -vV | grep host | cut -d" " -f2) && cargo clean'
.PHONY: tsan
tsan: docker
$(DOCKER_RUN) sh -c 'cargo clean && RUSTFLAGS="-Z sanitizer=thread" cargo test -Zbuild-std --lib --tests --target $$(rustc -vV | grep host | cut -d" " -f2) && cargo clean'
.PHONY: sanitize
sanitize: asan tsan
.PHONY: check
check: lint-check fmt-check docs-check audit deny lockfile unused-deps outdated-deps compat hack bench coverage sanitize
.PHONY: update
update: docker
$(DOCKER_RUN) cargo update
.PHONY: clean
clean:
rm -rf target
.PHONY: all
all: fix check