Files
euzuandGitHub c592411409 Fix/provider priority (#856)
Bug Fixes

    Improved provider capacity management and reservation handling for shared connections.
    Added support for excluding providers during connection allocation.
    Improved grace-period expiration and concurrent access handling.
    Preserved reserved capacity during fallback and preemptive allocations.

Chores

    Improved unused-dependency checks and command configuration.
    Removed unused dependencies across multiple components.
    Added exceptions for dependencies used indirectly through macros or renamed packages.

Tests

    Added coverage for provider reservations, fallback allocation, grace-period expiry, and concurrent grace access.
2026-09-04 10:49:45 +02:00

216 lines
7.0 KiB
Makefile

# OS Detection
OS := $(shell uname -s)
ARCH := $(shell uname -m)
# Paths
CARGO_HOME ?= $(HOME)/.cargo
CARGO_BIN_DIR ?= $(CARGO_HOME)/bin
# Tool Commands
resolve_tool = $(or $(shell command -v $(1) 2>/dev/null),$(CARGO_BIN_DIR)/$(1))
RUSTUP ?= $(call resolve_tool,rustup)
CARGO ?= $(call resolve_tool,cargo)
CROSS ?= $(call resolve_tool,cross)
TRUNK ?= $(call resolve_tool,trunk)
WASM_BINDGEN ?= $(call resolve_tool,wasm-bindgen)
CARGO_SET_VERSION ?= $(call resolve_tool,cargo-set-version)
CARGO_MACHETE ?= $(call resolve_tool,cargo-machete)
MDBOOK ?= $(call resolve_tool,mdbook)
PINNED_NIGHTLY_TOOLCHAIN := nightly-2026-05-01
NIGHTLY_TOOLCHAIN ?= $(shell if $(RUSTUP) toolchain list 2>/dev/null | grep -q '^$(PINNED_NIGHTLY_TOOLCHAIN)'; then echo $(PINNED_NIGHTLY_TOOLCHAIN); else echo nightly; fi)
# Explicitly force stable/nightly to avoid system-wide overrides
CARGO_STABLE := $(CARGO) +stable
CARGO_NIGHTLY := $(CARGO) +$(NIGHTLY_TOOLCHAIN)
# Colors for terminal output
AQUA := \033[36m
RESET := \033[0m
BOLD := \033[1m
.DEFAULT_GOAL := help
# Number of CPUs (portable): try GNU `nproc`, then POSIX `getconf`, then macOS `sysctl`
CPU_COUNT := $(shell nproc 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
CARGO_BUILD_JOBS := $(CPU_COUNT)
.PHONY: help
help: ## Display this help
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make $(AQUA)<target>$(RESET)\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " $(AQUA)%-26s$(RESET) %s\n", $$1, $$2 } /^##@/ { printf "\n$(BOLD)%s$(RESET)\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
##@ Prerequisites:
.PHONY: install-tools
install-tools: rustup install-nightly-fmt cross trunk wasm-bindgen cargo-set-version cargo-machete mdbook markdownlint ## Install required development tools
.PHONY: install-nightly-fmt
install-nightly-fmt: ## Install nightly toolchain specifically for formatting
@echo "📦 Ensuring nightly rustfmt is available"
@$(RUSTUP) toolchain install $(NIGHTLY_TOOLCHAIN) --component rustfmt --profile minimal
@echo "✅ Nightly rustfmt ready"
.PHONY: rustup
rustup: $(RUSTUP) ## Install Rust toolchain and cargo
$(RUSTUP):
@echo "📦 Installing cargo"
@curl -sL https://sh.rustup.rs | sh -s -- -y
@echo "✅ Cargo installed"
.PHONY: cross
cross: $(CROSS) ## Install cross (multi-platform build tool)
$(CROSS):
@echo "📦 Installing cross"
@$(CARGO) install cross
@echo "✅ Cross installed"
.PHONY: trunk
trunk: $(TRUNK) ## Install trunk (frontend build tool)
$(TRUNK):
@echo "📦 Installing trunk"
@$(CARGO) install trunk
@echo "✅ Trunk installed"
.PHONY: wasm-bindgen
wasm-bindgen: $(WASM_BINDGEN) ## Install wasm-bindgen CLI (for frontend builds)
$(WASM_BINDGEN):
@echo "📦 Installing wasm-bindgen CLI"
@$(CARGO) install wasm-bindgen-cli
@echo "✅ wasm-bindgen CLI installed"
.PHONY: cargo-set-version
cargo-set-version: $(CARGO_SET_VERSION) ## Install cargo-set-version (for version management)
$(CARGO_SET_VERSION):
@echo "📦 Installing $@"
@$(CARGO) install cargo-edit
@echo "✅ $@ installed"
.PHONY: mdbook
mdbook: $(MDBOOK) ## Install mdBook (documentation generator)
$(MDBOOK):
@echo "📦 Installing mdBook"
@$(CARGO) install mdbook
@echo "✅ mdBook installed"
.PHONY: cargo-machete
cargo-machete: $(CARGO_MACHETE) ## Install cargo-machete (unused dependency detector)
$(CARGO_MACHETE):
@echo "📦 Installing $@"
@$(CARGO) install cargo-machete
@echo "✅ $@ installed"
.PHONY: markdownlint
markdownlint: ## Install markdownlint-cli2 (requires npm)
@echo "📦 Installing markdownlint-cli2"
@command -v npm >/dev/null 2>&1 || { \
echo "❌ npm not found. Please install Node.js and npm first."; \
exit 1; \
}
@npm install -g markdownlint-cli2
@echo "✅ markdownlint-cli2 installed"
##@ Development:
.PHONY: verify validate ci
verify: ## Run format, clippy, markdown lint, tests, and trunk build (stops on error)
@$(MAKE) fmt
@$(MAKE) lint
@$(MAKE) markdown-lint
@$(MAKE) test
@$(MAKE) trunk-build
@$(MAKE) cargo-machete-check
validate: verify ## Alias for verify
ci: verify ## Alias for verify
.PHONY: trunk-build
trunk-build: ## Build frontend with Trunk (WASM)
@echo "==> Building frontend (trunk)"
@cd frontend && NO_COLOR=true $(TRUNK) build
.PHONY: cargo-machete-check
cargo-machete-check: ## Detect unused dependencies across all crates (auto-installs cargo-machete if missing)
@echo "==> Detecting unused dependencies"
@command -v $(CARGO_MACHETE) >/dev/null 2>&1 || { \
echo "📦 cargo-machete not found, installing..."; \
$(CARGO) install cargo-machete; \
echo "✅ cargo-machete installed"; \
}
@$(CARGO_MACHETE)
.PHONY: test
test: ## Run all workspace tests (Stable) — use detected CPU count for parallelism
@echo "==> Running tests (stable) with $(CPU_COUNT) jobs/threads"
@TMPDIR="$${TMPDIR:-/tmp}" RUST_TEST_THREADS=$(CPU_COUNT) ./bin/test.sh -j$(CPU_COUNT) --workspace -- --test-threads=$(CPU_COUNT)
.PHONY: build
build: ## Build the entire workspace in parallel using detected CPU count
@echo "==> Building workspace with $(CARGO_BUILD_JOBS) jobs"
@TMPDIR="$${TMPDIR:-/tmp}" $(CARGO_STABLE) build -j$(CARGO_BUILD_JOBS) --workspace
.PHONY: architecture-check
architecture-check: ## Verify workspace dependency direction
@echo "==> Checking the architecture gate itself"
./bin/check-workspace-deps-test.sh
@echo "==> Checking workspace dependency direction"
./bin/check-workspace-deps.sh
.PHONY: lint
lint: ## Run clippy linter (Nightly)
@echo "==> Running clippy (nightly)"
$(CARGO_NIGHTLY) clippy --workspace -- -D warnings
.PHONY: lint-fix
lint-fix: ## Automatically fix clippy suggestions (Nightly)
@echo "==> Applying clippy auto-fixes"
$(CARGO_NIGHTLY) clippy --fix --workspace --allow-dirty --allow-staged -- -D clippy::uninlined_format_args
.PHONY: fmt
fmt: ## Format all code using nightly rules (Compact)
@echo "==> Formatting code (nightly)"
$(CARGO_NIGHTLY) fmt --all
.PHONY: fmt-check
fmt-check: ## Check if code follows formatting rules (Nightly)
@echo "==> Checking formatting (nightly)"
$(CARGO_NIGHTLY) fmt --all -- --check
.PHONY: markdown-lint
markdown-lint: ## Lint markdown files
@echo "==> Linting markdown files"
# @command -v markdownlint-cli2 >/dev/null 2>&1 || { \
# echo "❌ markdownlint-cli2 not found. Install with: npm install -g markdownlint-cli2"; \
# exit 1; \
# }
@npx markdownlint-cli2 "docs/src/**/*.md" "README.md" "CHANGELOG.md" "CONTRIBUTING.md"
@echo "✅ Markdown linting complete"
.PHONY: docs
docs: mdbook ## Build static documentation into frontend/build/docs
@echo "==> Building documentation"
@$(MDBOOK) build
@echo "✅ Documentation built at frontend/build/docs"
.PHONY: docs-serve
docs-serve: mdbook ## Serve documentation locally with mdBook
@echo "==> Serving documentation"
@$(MDBOOK) serve --open
.PHONY: docs-clean
docs-clean: ## Remove generated documentation output
@echo "==> Removing generated documentation"
@rm -rf frontend/build/docs
@echo "✅ Documentation output removed"
.PHONY: web-dist
web-dist: mdbook trunk ## Build static documentation and frontend assets
@echo "==> Building web assets"
@./bin/build_fe.sh release
@echo "✅ Web assets built"