66# Use bash with strict error handling for all recipes
77set shell := [" bash" , " -euo" , " pipefail" , " -c" ]
88
9+ cargo_llvm_cov_version := " 0.8.5"
10+
911# Internal helpers: ensure external tooling is installed
1012_ ensure-actionlint :
1113 #!/usr/bin/env bash
1214 set -euo pipefail
1315 command -v actionlint >/ dev/ null || { echo " ❌ 'actionlint' not found. See 'just setup' or https://github.com/rhysd/actionlint" ; exit 1 ; }
1416
17+ _ ensure-cargo-llvm-cov :
18+ #!/usr/bin/env bash
19+ set -euo pipefail
20+ if ! command -v cargo-llvm-cov >/ dev/ null; then
21+ echo " ❌ 'cargo-llvm-cov' not found. See 'just setup-tools' or install:"
22+ echo " cargo install --locked cargo-llvm-cov --version {{ cargo_llvm_cov_version}} "
23+ exit 1
24+ fi
25+
1526_ ensure-git-cliff :
1627 #!/usr/bin/env bash
1728 set -euo pipefail
@@ -172,7 +183,7 @@ ci: check bench-compile test-all examples
172183# Clean build artifacts
173184clean :
174185 cargo clean
175- rm -rf target/ tarpaulin
186+ rm -rf target/ llvm-cov
176187 rm -rf coverage
177188
178189# Code quality and formatting
@@ -183,41 +194,29 @@ clippy:
183194clippy-exact :
184195 cargo clippy --features exact --all-targets -- -D warnings -W clippy::pedantic
185196
186- # Coverage (cargo-tarpaulin )
197+ # Coverage (cargo-llvm-cov )
187198#
188- # Common tarpaulin arguments for all coverage runs
189- # Note: -t 300 sets per-test timeout to 5 minutes (needed for slow CI environments)
190- _coverage_base_args := ''' --exclude-files 'benches/*' --exclude-files 'examples/*' \
191- --features exact \
199+ # Common cargo-llvm-cov arguments for all coverage runs.
200+ _coverage_base_args := ''' --features exact \
192201 --workspace --lib --tests \
193- -t 300 -- verbose --implicit-test-threads '''
202+ -- verbose'''
194203
195204# Coverage analysis for local development (HTML output)
196- coverage :
205+ coverage : _ensure-cargo-llvm-cov
197206 #!/usr/bin/env bash
198207 set -euo pipefail
199208
200- if ! command -v cargo-tarpaulin >/ dev/ null 2 >&1 ; then
201- echo " cargo-tarpaulin not found. Install with: cargo install cargo-tarpaulin"
202- exit 1
203- fi
204-
205- mkdir -p target/ tarpaulin
206- cargo tarpaulin {{ _coverage_base_args}} --out Html --output-dir target/ tarpaulin
207- echo " Coverage report generated: target/tarpaulin/tarpaulin-report.html"
209+ mkdir -p target/ llvm-cov
210+ cargo llvm-cov {{ _coverage_base_args}} --open --output-dir target/ llvm-cov
211+ echo " Coverage report generated: target/llvm-cov/html/index.html"
208212
209213# Coverage analysis for CI (XML output for codecov/codacy)
210- coverage-ci :
214+ coverage-ci : _ensure-cargo-llvm-cov
211215 #!/usr/bin/env bash
212216 set -euo pipefail
213217
214- if ! command -v cargo-tarpaulin >/ dev/ null 2 >&1 ; then
215- echo " cargo-tarpaulin not found. Install with: cargo install cargo-tarpaulin"
216- exit 1
217- fi
218-
219218 mkdir -p coverage
220- cargo tarpaulin {{ _coverage_base_args}} --out Xml --output-dir coverage
219+ cargo llvm-cov {{ _coverage_base_args}} --cobertura --output-path coverage/ cobertura.xml
221220
222221# Default recipe shows available commands
223222default :
@@ -429,7 +428,7 @@ setup-tools:
429428 echo " ❌ 'rustup' not found. Install Rust via https://rustup.rs and re-run: just setup-tools"
430429 exit 1
431430 fi
432- rustup component add clippy rustfmt rust-docs rust-src
431+ rustup component add clippy rustfmt rust-docs rust-src llvm-tools-preview
433432 echo " "
434433
435434 echo " Ensuring cargo tools..."
@@ -454,21 +453,17 @@ setup-tools:
454453 echo " ✓ typos"
455454 fi
456455
457- if ! have cargo-tarpaulin; then
458- if [[ " $os" == " Linux" ]]; then
459- echo " ⏳ Installing cargo-tarpaulin (cargo)..."
460- cargo install --locked cargo-tarpaulin
461- else
462- echo " ⚠️ Skipping cargo-tarpaulin install on $os (coverage is typically Linux-only)"
463- fi
456+ if ! have cargo-llvm-cov; then
457+ echo " ⏳ Installing cargo-llvm-cov {{ cargo_llvm_cov_version}} (cargo)..."
458+ cargo install --locked cargo-llvm-cov --version {{ cargo_llvm_cov_version}}
464459 else
465- echo " ✓ cargo-tarpaulin "
460+ echo " ✓ cargo-llvm-cov "
466461 fi
467462
468463 echo " "
469464 echo " Verifying required commands are available..."
470465 missing=0
471- for cmd in uv jq taplo yamllint shfmt shellcheck actionlint node npx typos git-cliff; do
466+ for cmd in uv jq taplo yamllint shfmt shellcheck actionlint node npx typos git-cliff cargo-llvm-cov ; do
472467 if have " $cmd" ; then
473468 echo " ✓ $cmd"
474469 else
0 commit comments