buildRustCrate: add devDependencies parameter for buildTests (#521995)

This commit is contained in:
Ilan Joselevich
2026-06-16 16:12:27 +00:00
committed by GitHub
2 changed files with 35 additions and 1 deletions
@@ -222,6 +222,13 @@ lib.makeOverridable
# Rust build dependencies, i.e. other libraries that were built
# with buildRustCrate and are used by a build script.
buildDependencies,
# Rust dev-dependencies, i.e. other libraries that were built
# with buildRustCrate and are linked only when `buildTests = true`.
# Mirrors Cargo's `[dev-dependencies]`: ignored for the regular
# lib/bin build, appended to `dependencies` for the test build.
#
# Default: []
devDependencies,
# Specify the "extern" name of a library if it differs from the library target.
# See above for an extended explanation.
#
@@ -353,6 +360,7 @@ lib.makeOverridable
crate = crate_ // (lib.attrByPath [ crate_.crateName ] (attr: { }) crateOverrides crate_);
dependencies_ = dependencies;
buildDependencies_ = buildDependencies;
devDependencies_ = devDependencies;
processedAttrs = [
"src"
"propagatedBuildInputs"
@@ -364,6 +372,7 @@ lib.makeOverridable
"libPath"
"buildDependencies"
"dependencies"
"devDependencies"
"features"
"crateRenames"
"crateName"
@@ -466,7 +475,10 @@ lib.makeOverridable
++ (crate.buildInputs or [ ])
++ buildInputs_
++ completePropagatedBuildInputs;
dependencies = map lib.getLib dependencies_;
# Dev-dependencies are only linked when building tests, mirroring
# Cargo. When buildTests is false this is a no-op, so the metadata
# hash and store path of normal lib/bin builds are unchanged.
dependencies = map lib.getLib (dependencies_ ++ lib.optionals buildTests_ devDependencies_);
buildDependencies = map lib.getLib buildDependencies_;
completeDeps = lib.unique (dependencies ++ lib.concatMap (dep: dep.completeDeps) dependencies);
@@ -667,6 +679,7 @@ lib.makeOverridable
postInstall = crate_.postInstall or "";
dependencies = crate_.dependencies or [ ];
buildDependencies = crate_.buildDependencies or [ ];
devDependencies = crate_.devDependencies or [ ];
crateRenames = crate_.crateRenames or { };
buildTests = crate_.buildTests or false;
}
@@ -404,6 +404,27 @@ rec {
"test something ... ok"
];
};
rustLibTestsWithDevDependency =
let
devDep = mkHostCrate {
crateName = "dev-dep";
src = mkLib "src/lib.rs";
};
in
{
src = mkFile "src/lib.rs" ''
#[cfg(test)]
mod tests {
#[test]
fn uses_dev_dep() {
assert_eq!(dev_dep::test(), 23);
}
}
'';
devDependencies = [ devDep ];
buildTests = true;
expectedTestOutputs = [ "test tests::uses_dev_dep ... ok" ];
};
rustBinTestsCombined = {
src = symlinkJoin {
name = "rust-bin-tests-combined";