Merge pull request #203520 from figsoda/nextest

rustPlatform.buildRustPackage: add cargo-nextest support
This commit is contained in:
figsoda 2022-12-03 19:03:34 -05:00 committed by GitHub
commit 75c01e730d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 87 additions and 4 deletions

View file

@ -331,6 +331,20 @@ rustPlatform.buildRustPackage {
} }
``` ```
#### Using `cargo-nextest` {#using-cargo-nextest}
Tests can be run with [cargo-nextest](https://github.com/nextest-rs/nextest)
by setting `useNextest = true`. The same options still apply, but nextest
accepts a different set of arguments and the settings might need to be
adapted to be compatible with cargo-nextest.
```nix
rustPlatform.buildRustPackage {
/* ... */
useNextest = true;
}
```
#### Setting `test-threads` {#setting-test-threads} #### Setting `test-threads` {#setting-test-threads}
`buildRustPackage` will use parallel test threads by default, `buildRustPackage` will use parallel test threads by default,
@ -474,6 +488,9 @@ you of the correct hash.
flags can be passed to the tests using `checkFlags` and flags can be passed to the tests using `checkFlags` and
`checkFlagsArray`. By default, tests are run in parallel. This can `checkFlagsArray`. By default, tests are run in parallel. This can
be disabled by setting `dontUseCargoParallelTests`. be disabled by setting `dontUseCargoParallelTests`.
* `cargoNextestHook`: run tests using
[cargo-nextest](https://github.com/nextest-rs/nextest). The same
options for `cargoCheckHook` also applies to `cargoNextestHook`.
* `cargoInstallHook`: install binaries and static/shared libraries * `cargoInstallHook`: install binaries and static/shared libraries
that were built using `cargoBuildHook`. that were built using `cargoBuildHook`.
* `bindgenHook`: for crates which use `bindgen` as a build dependency, lets * `bindgenHook`: for crates which use `bindgen` as a build dependency, lets

View file

@ -9,6 +9,7 @@
, cargoBuildHook , cargoBuildHook
, cargoCheckHook , cargoCheckHook
, cargoInstallHook , cargoInstallHook
, cargoNextestHook
, cargoSetupHook , cargoSetupHook
, rustc , rustc
, libiconv , libiconv
@ -40,6 +41,7 @@
, checkNoDefaultFeatures ? buildNoDefaultFeatures , checkNoDefaultFeatures ? buildNoDefaultFeatures
, buildFeatures ? [ ] , buildFeatures ? [ ]
, checkFeatures ? buildFeatures , checkFeatures ? buildFeatures
, useNextest ? false
, depsExtraArgs ? {} , depsExtraArgs ? {}
# Toggles whether a custom sysroot is created when the target is a .json file. # Toggles whether a custom sysroot is created when the target is a .json file.
@ -117,7 +119,7 @@ stdenv.mkDerivation ((removeAttrs args [ "depsExtraArgs" "cargoUpdateHook" "carg
cacert cacert
git git
cargoBuildHook cargoBuildHook
cargoCheckHook (if useNextest then cargoNextestHook else cargoCheckHook)
cargoInstallHook cargoInstallHook
cargoSetupHook cargoSetupHook
rustc rustc

View file

@ -0,0 +1,54 @@
declare -a checkFlags
declare -a cargoTestFlags
cargoNextestHook() {
echo "Executing cargoNextestHook"
runHook preCheck
if [[ -n "${buildAndTestSubdir-}" ]]; then
pushd "${buildAndTestSubdir}"
fi
if [[ -z ${dontUseCargoParallelTests-} ]]; then
threads=$NIX_BUILD_CORES
else
threads=1
fi
if [ "${cargoCheckType}" != "debug" ]; then
cargoCheckProfileFlag="--${cargoCheckType}"
fi
if [ -n "${cargoCheckNoDefaultFeatures-}" ]; then
cargoCheckNoDefaultFeaturesFlag=--no-default-features
fi
if [ -n "${cargoCheckFeatures-}" ]; then
cargoCheckFeaturesFlag="--features=${cargoCheckFeatures// /,}"
fi
argstr="${cargoCheckProfileFlag} ${cargoCheckNoDefaultFeaturesFlag} ${cargoCheckFeaturesFlag}
--target @rustTargetPlatformSpec@ --frozen ${cargoTestFlags}"
(
set -x
cargo nextest run \
-j ${threads} \
${argstr} -- \
${checkFlags} \
${checkFlagsArray+"${checkFlagsArray[@]}"}
)
if [[ -n "${buildAndTestSubdir-}" ]]; then
popd
fi
echo "Finished cargoNextestHook"
runHook postCheck
}
if [ -z "${dontCargoCheck-}" ] && [ -z "${checkPhase-}" ]; then
checkPhase=cargoNextestHook
fi

View file

@ -1,6 +1,7 @@
{ buildPackages { buildPackages
, callPackage , callPackage
, cargo , cargo
, cargo-nextest
, clang , clang
, lib , lib
, makeSetupHook , makeSetupHook
@ -55,6 +56,15 @@ in {
}; };
} ./cargo-install-hook.sh) {}; } ./cargo-install-hook.sh) {};
cargoNextestHook = callPackage ({ }:
makeSetupHook {
name = "cargo-nextest-hook.sh";
deps = [ cargo cargo-nextest ];
substitutions = {
inherit rustTargetPlatformSpec;
};
} ./cargo-nextest-hook.sh) {};
cargoSetupHook = callPackage ({ }: cargoSetupHook = callPackage ({ }:
makeSetupHook { makeSetupHook {
name = "cargo-setup-hook.sh"; name = "cargo-setup-hook.sh";

View file

@ -14,7 +14,7 @@ rec {
buildRustPackage = callPackage ../../../build-support/rust/build-rust-package { buildRustPackage = callPackage ../../../build-support/rust/build-rust-package {
git = buildPackages.gitMinimal; git = buildPackages.gitMinimal;
inherit stdenv cargoBuildHook cargoCheckHook cargoInstallHook cargoSetupHook inherit stdenv cargoBuildHook cargoCheckHook cargoInstallHook cargoNextestHook cargoSetupHook
fetchCargoTarball importCargoLock rustc; fetchCargoTarball importCargoLock rustc;
}; };
@ -31,5 +31,5 @@ rec {
# Hooks # Hooks
inherit (callPackage ../../../build-support/rust/hooks { inherit (callPackage ../../../build-support/rust/hooks {
inherit stdenv cargo rustc; inherit stdenv cargo rustc;
}) cargoBuildHook cargoCheckHook cargoInstallHook cargoSetupHook maturinBuildHook bindgenHook; }) cargoBuildHook cargoCheckHook cargoInstallHook cargoNextestHook cargoSetupHook maturinBuildHook bindgenHook;
} }

View file

@ -15,7 +15,7 @@ rustPlatform.buildRustPackage rec {
checkInputs = [ python3 ]; checkInputs = [ python3 ];
dontUseCargoParallelTests = true; useNextest = true;
meta = with lib; { meta = with lib; {
description = "An implementation of the `py` command for Unix-based platforms"; description = "An implementation of the `py` command for Unix-based platforms";