From c19d19615c20844835b8729e21e038bc01f959c9 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 12 Jan 2022 08:48:49 +0000 Subject: [PATCH] buildRustCrate: Add support for standard library deps We are replicating one mechanism behind `-Z build-std`. There isn't yet crate2nix support for this, but one can (and I do) add the missing stdlib deps (for this feature to pick up) with overrides. (cherry picked from commit cc29693a0979c3b81da6942c214841ef11de95b5) (cherry picked from commit 5aef865cefc2a906296b9a256bf597f70e4ee243) --- .../rust/build-rust-crate/build-crate.nix | 8 ++++++- .../rust/build-rust-crate/default.nix | 21 ++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/pkgs/build-support/rust/build-rust-crate/build-crate.nix b/pkgs/build-support/rust/build-rust-crate/build-crate.nix index 42c5f6ab3c0f3..ddff0c13cb3ac 100644 --- a/pkgs/build-support/rust/build-rust-crate/build-crate.nix +++ b/pkgs/build-support/rust/build-rust-crate/build-crate.nix @@ -1,4 +1,8 @@ -{ lib, stdenv, mkRustcDepArgs, mkRustcFeatureArgs, rust }: +{ lib, stdenv +, mkRustcDepArgs, mkRustcFeatureArgs, needUnstableCLI +, rust +}: + { crateName, dependencies, crateFeatures, crateRenames, libName, release, libPath, @@ -17,6 +21,8 @@ (mkRustcFeatureArgs crateFeatures) ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ "--target" (rust.toRustTargetSpec stdenv.hostPlatform) + ] ++ lib.optionals (needUnstableCLI dependencies) [ + "-Z" "unstable-options" ] ++ extraRustcOpts # since rustc 1.42 the "proc_macro" crate is part of the default crate prelude # https://github.com/rust-lang/cargo/commit/4d64eb99a4#diff-7f98585dbf9d30aa100c8318e2c77e79R1021-R1022 diff --git a/pkgs/build-support/rust/build-rust-crate/default.nix b/pkgs/build-support/rust/build-rust-crate/default.nix index 20b93b1921f84..68c52efc53f1d 100644 --- a/pkgs/build-support/rust/build-rust-crate/default.nix +++ b/pkgs/build-support/rust/build-rust-crate/default.nix @@ -46,17 +46,28 @@ let ) else extern; + opts = lib.optionalString (dep.stdlib or false) "noprelude:"; + filename = + if lib.any (x: x == "lib" || x == "rlib") dep.crateType + then "${dep.metadata}.rlib" + else "${dep.metadata}${stdenv.hostPlatform.extensions.sharedLibrary}"; in - (if lib.any (x: x == "lib" || x == "rlib") dep.crateType then - " --extern ${name}=${dep.lib}/lib/lib${extern}-${dep.metadata}.rlib" - else - " --extern ${name}=${dep.lib}/lib/lib${extern}-${dep.metadata}${stdenv.hostPlatform.extensions.sharedLibrary}") + " --extern ${opts}${name}=${dep.lib}/lib/lib${extern}-${filename}" ) dependencies; # Create feature arguments for rustc. mkRustcFeatureArgs = lib.concatMapStringsSep " " (f: ''--cfg feature=\"${f}\"''); + # Whether we need to use unstable command line flags + # + # Currently just needed for standard library dependencies, which have a + # special "noprelude:" modifier. If in later versions of Rust this is + # stabilized we can account for that here, too, so we don't opt into + # instability unnecessarily. + needUnstableCLI = dependencies: + lib.any (dep: dep.stdlib or false) dependencies; + inherit (import ./log.nix { inherit lib; }) noisily echo_colored; configureCrate = import ./configure-crate.nix { @@ -64,7 +75,7 @@ let }; buildCrate = import ./build-crate.nix { - inherit lib stdenv mkRustcDepArgs mkRustcFeatureArgs rust; + inherit lib stdenv mkRustcDepArgs mkRustcFeatureArgs needUnstableCLI rust; }; installCrate = import ./install-crate.nix { inherit stdenv; };