-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathjustfile
More file actions
executable file
·225 lines (189 loc) · 8.92 KB
/
Copy pathjustfile
File metadata and controls
executable file
·225 lines (189 loc) · 8.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#!/usr/bin/env just --justfile
main_crate := 'fastpfor'
# How to call the current just executable. Note that just_executable() may have `\` in Windows paths, so we need to quote it.
just := quote(just_executable())
# cargo-binstall needs a workaround due to caching when used in CI
binstall_args := if env('CI', '') != '' {'--no-confirm --no-track --disable-telemetry'} else {''}
# location of the coverage output, used by CI
coverage_lcov := 'target/llvm-cov/lcov.info'
# if running in CI, treat warnings as errors by setting CARGO_BUILD_WARNINGS to 'deny' unless it is already set
# Use `CI=true just ci-test` to run the same tests as in GitHub CI.
# Use `just env-info` to see the current value of CARGO_BUILD_WARNINGS
ci_mode := if env('CI', '') != '' {'1'} else {''}
export CARGO_BUILD_WARNINGS := env('CARGO_BUILD_WARNINGS', if ci_mode == '1' {'deny'} else {'warn'})
export RUST_BACKTRACE := env('RUST_BACKTRACE', if ci_mode == '1' {'1'} else {'0'})
mod bench 'benches/justfile'
mod fuzz 'fuzz/justfile'
@_default:
{{just}} --list
# Run integration tests and save its output as the new expected output
bless *args: (cargo-install 'cargo-insta')
cargo insta test --accept --unreferenced=delete --features _all_compatible {{args}}
# Build the project
build:
cargo build --workspace --all-targets --features _all_compatible
# Quick compile without building a binary
check:
cargo check --workspace --all-targets --features _all_compatible
cargo check --workspace --all-targets --no-default-features --features cpp
cargo check --workspace --all-targets --no-default-features --features rust
cargo check --workspace --all-targets --manifest-path fuzz/Cargo.toml
# Generate LCOV coverage report for CI to upload to codecov.io
ci-coverage: env-info && \
(_coverage '--lcov' '--output-path' quote(coverage_lcov))
rm -rf {{quote(parent_directory(coverage_lcov))}}
mkdir -p {{quote(parent_directory(coverage_lcov))}}
# Run all tests as expected by CI
ci-test: env-info test-fmt check build clippy test test-doc fuzz::ci-test && assert-git-is-clean
# Compile default features with minimal dependencies on the configured MSRV
ci-test-msrv:
{{just}} ci_mode=0 env-info _check-msrv-default
{{just}} test
{{just}} assert-git-is-clean
# Set toolchain and run ci-test-msrv
ci-test-msrv-with-toolchain:
RUSTUP_TOOLCHAIN="$({{just}} get-msrv)" {{just}} ci-test-msrv
# Clean all build artifacts
clean:
cargo clean
rm -f Cargo.lock
cd fuzz && cargo clean && rm -f Cargo.lock
# Run cargo clippy to lint the code
clippy *args:
cargo clippy --workspace --all-targets --features _all_compatible {{args}}
cargo clippy --workspace --all-targets --manifest-path fuzz/Cargo.toml {{args}}
# Generate and open the HTML coverage report
coverage: (_coverage '--open')
# Clean, collect, and aggregate coverage using the requested report arguments
_coverage *report_args: (cargo-install 'cargo-llvm-cov')
cargo llvm-cov clean --workspace
cargo llvm-cov --no-report --workspace --all-targets --features _all_compatible
cargo llvm-cov report --include-build-script {{report_args}}
# Build and open code documentation
docs *args='--features _all_compatible --open':
DOCS_RS=1 cargo doc --no-deps {{args}} --workspace
# Print environment info
env-info:
@echo "Running for '{{main_crate}}' crate {{if ci_mode == '1' {'in CI mode'} else {'in dev mode'} }} on {{os()}} / {{arch()}}"
@echo "PWD {{justfile_directory()}}"
{{just}} --version
rustc --version
cargo --version
rustup --version
@echo "CARGO_BUILD_WARNINGS='$CARGO_BUILD_WARNINGS'"
@echo "RUST_BACKTRACE='$RUST_BACKTRACE'"
# Reformat all code `cargo fmt`. If nightly is available, use it for better results
fmt:
#!/usr/bin/env bash
set -euo pipefail
for dir in "./" "fuzz"; do
pushd "$dir"
if (rustup toolchain list | grep nightly && rustup component list --toolchain nightly | grep rustfmt) &> /dev/null; then
echo "Reformatting Rust code using nightly Rust fmt to sort imports in $dir"
cargo +nightly fmt --all -- --config imports_granularity=Module,group_imports=StdExternalCrate
else
echo "Reformatting Rust with the stable cargo fmt in $dir. Install nightly with \`rustup install nightly\` for better results"
cargo fmt --all
fi
popd
done
# Reformat all Cargo.toml files using cargo-sort
fmt-toml *args: (cargo-install 'cargo-sort')
cargo sort --workspace --grouped {{args}}
# Get a package field from the metadata
get-crate-field field package=main_crate: (assert-cmd 'jq')
@cargo metadata --no-deps --format-version 1 | jq -e -r '.packages | map(select(.name == "{{package}}")) | first | .{{field}} // error("Field \"{{field}}\" is missing in Cargo.toml for package {{package}}")'
# Get the minimum supported Rust version (MSRV) for the crate
get-msrv package=main_crate: (get-crate-field 'rust_version' package)
# Find the minimum supported Rust version (MSRV), update Cargo.toml, and test minimal dependencies
msrv: (cargo-install 'cargo-msrv')
cargo msrv find --write-msrv --features _all_compatible --ignore-lockfile -- {{just}} _check-msrv-default
# Compile the crate's default features using a dynamically generated minimal Cargo.lock
_check-msrv-default: (cargo-install 'cargo-minimal-versions') (cargo-install 'cargo-hack')
#!/usr/bin/env bash
set -euo pipefail
# cargo-msrv probes with rustup, but nested cargo subcommands may otherwise
# fall back to the default Cargo and emit flags unsupported by the candidate rustc.
toolchain="$(rustc --version | cut -d' ' -f2)"
export RUSTUP_TOOLCHAIN="$toolchain"
export CARGO="$(rustup which --toolchain "$toolchain" cargo)"
cargo minimal-versions check --direct --package {{main_crate}}
# Run cargo-release
release *args='': (cargo-install 'release-plz')
release-plz {{args}}
# Check semver compatibility with prior published version. Install it with `cargo install cargo-semver-checks`
semver *args: (cargo-install 'cargo-semver-checks')
cargo semver-checks --features _all_compatible {{args}}
# Run all tests
test:
cargo test --workspace --all-targets --features _all_compatible
cargo test --doc --workspace --features _all_compatible
# Test with a specific SIMD mode (portable, native)
test-simd mode='portable':
cargo test --workspace --all-targets --features cpp_{{mode}}
# Test all SIMD modes
test-all-simd-modes:
cargo clean -p fastpfor
{{just}} test-simd portable
cargo clean -p fastpfor
{{just}} test-simd native
# Test documentation generation
test-doc: (docs '') (docs '--features _all_compatible')
# Test code formatting
test-fmt: && (fmt-toml '--check' '--check-format')
cargo fmt --all -- --check
# Use the experimental workspace publishing with --dry-run. Requires nightly Rust.
test-publish:
cargo +nightly -Z package-workspace publish --dry-run
# Find unused dependencies. Uses `cargo-udeps`
udeps: (cargo-install 'cargo-udeps')
cargo +nightly udeps --workspace --all-targets --features _all_compatible
# Update all dependencies, including breaking changes. Requires nightly toolchain (install with `rustup install nightly`)
update:
cargo +nightly -Z unstable-options update --breaking
cargo update
# Ensure that a certain command is available
[private]
assert-cmd command:
@if ! type {{command}} > /dev/null; then \
echo "Command '{{command}}' could not be found. Please make sure it has been installed on your computer." ;\
exit 1 ;\
fi
# Make sure the git repo has no uncommitted changes. Fails if CI envvar is set.
[private]
assert-git-is-clean:
#!/usr/bin/env bash
set -euo pipefail
if [ -n "$(git status --porcelain --untracked-files=all)" ]; then
>&2 echo "::error::git repo is not clean. Make sure compilation and tests artifacts are in the .gitignore, and no repo files are modified."
if [[ "{{ci_mode}}" == "1" ]]; then
>&2 echo "::group::git status"
git status
>&2 echo "::endgroup::"
>&2 echo "::group::git diff (tracked changes)"
git add . --intent-to-add
git --no-pager diff
>&2 echo "::endgroup::"
exit 1
else
>&2 echo "git repo is not clean, but not failing because CI mode is not enabled."
fi
fi
# Check if a certain Cargo command is installed, and install it if needed
[private]
cargo-install $COMMAND $INSTALL_CMD='' *args='':
#!/usr/bin/env bash
set -euo pipefail
unset CARGO_BUILD_WARNINGS
if ! command -v $COMMAND > /dev/null; then
echo "$COMMAND could not be found. Installing..."
if ! command -v cargo-binstall > /dev/null; then
set -x
cargo install ${INSTALL_CMD:-$COMMAND} --locked {{args}}
{ set +x; } 2>/dev/null
else
set -x
cargo binstall ${INSTALL_CMD:-$COMMAND} {{binstall_args}} --locked
{ set +x; } 2>/dev/null
fi
fi