| SHELL=/bin/bash |
| |
| # ================================ Cargo ====================================== |
| |
| |
| RUST_CHANNEL ?= stable |
| CARGO_FLAGS = |
| RUSTUP_INSTALLED = $(shell command -v rustup 2> /dev/null) |
| TEST_FILTER ?= |
| |
| ifndef RUSTUP_INSTALLED |
| CARGO = cargo |
| else |
| ifdef CI |
| CARGO = cargo |
| else |
| CARGO = rustup run $(RUST_CHANNEL) cargo |
| endif |
| endif |
| |
| |
| # ================================ Help ======================================= |
| |
| .PHONY: help |
| help: ## Print all the available commands |
| @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \ |
| awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' |
| |
| |
| # =============================== Build ======================================= |
| |
| .PHONY: check |
| check: ## Validate the project code |
| $(CARGO) check |
| |
| .PHONY: build |
| build: ## Build the project in debug mode |
| $(CARGO) build $(CARGO_FLAGS) |
| |
| .PHONY: release |
| release: CARGO_FLAGS += --release |
| release: build ## Build the project in release mode |
| |
| |
| # ================================ Lint ======================================= |
| |
| .PHONY: lint |
| lint: fmt clippy ## Lint project files |
| |
| .PHONY: fmt |
| fmt: ## Check the format of the source code |
| cargo fmt --all -- --check |
| |
| .PHONY: clippy |
| clippy: ## Check the style of the source code and catch common errors |
| $(CARGO) clippy --all-targets --all-features -- -D warnings |
| |
| |
| # ================================ Test ======================================= |
| |
| .PHONY: test |
| test: ## Run the tests |
| $(CARGO) test --all-features $(TEST_FILTER) |
| |
| # =============================== Examples ==================================== |
| |
| .PHONY: build-examples |
| build-examples: ## Build all examples |
| @$(CARGO) build --release --examples --all-features |
| |
| .PHONY: run-examples |
| run-examples: build-examples ## Run all examples |
| @for file in examples/*.rs; do \ |
| name=$$(basename $${file/.rs/}); \ |
| $(CARGO) run --all-features --release --example $$name; \ |
| done; |
| |
| # ================================ Doc ======================================== |
| |
| |
| .PHONY: doc |
| doc: RUST_CHANNEL = nightly |
| doc: ## Build the documentation (available at ./target/doc) |
| $(CARGO) doc |
| |
| |
| # ================================= Watch ===================================== |
| |
| # Requires watchman and watchman-make (https://facebook.github.io/watchman/docs/install.html) |
| |
| .PHONY: watch |
| watch: ## Watch file changes and build the project if any |
| watchman-make -p 'src/**/*.rs' -t check build |
| |
| .PHONY: watch-test |
| watch-test: ## Watch files changes and run the tests if any |
| watchman-make -p 'src/**/*.rs' 'tests/**/*.rs' 'examples/**/*.rs' -t test |
| |
| .PHONY: watch-doc |
| watch-doc: RUST_CHANNEL = nightly |
| watch-doc: ## Watch file changes and rebuild the documentation if any |
| $(CARGO) watch -x doc -x 'test --doc' |
| |
| # ================================= Pipelines ================================= |
| |
| .PHONY: stable |
| stable: RUST_CHANNEL = stable |
| stable: build lint test ## Run build and tests for stable |
| |
| .PHONY: beta |
| beta: RUST_CHANNEL = beta |
| beta: build lint test ## Run build and tests for beta |
| |
| .PHONY: nightly |
| nightly: RUST_CHANNEL = nightly |
| nightly: build lint test ## Run build, lint and tests for nightly |