From 4337a821b846f06a3ccd6dc1ff92daf4567f970e Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 30 Jun 2021 15:49:15 +0000 Subject: [PATCH 1/3] buildRustCrate: Fix extra cross args Do proper list separation, use ld not cc because rustc doesn't `-Wl,`. --- pkgs/build-support/rust/build-rust-crate/build-crate.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 df3129d536d..9a50633a58e 100644 --- a/pkgs/build-support/rust/build-rust-crate/build-crate.nix +++ b/pkgs/build-support/rust/build-rust-crate/build-crate.nix @@ -16,8 +16,10 @@ "--remap-path-prefix=$NIX_BUILD_TOP=/" (mkRustcDepArgs dependencies crateRenames) (mkRustcFeatureArgs crateFeatures) + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "--target" (rust.toRustTargetSpec stdenv.hostPlatform) + "-C" "linker=${stdenv.hostPlatform.config}-ld" ] ++ extraRustcOpts - ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) "--target ${rust.toRustTargetSpec stdenv.hostPlatform} -C linker=${stdenv.hostPlatform.config}-gcc" # 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 ++ lib.optional (lib.elem "proc-macro" crateType) "--extern proc_macro" From 680ff1bb8129198248d669fbd3cd90fa0f624b3c Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 30 Jun 2021 15:50:45 +0000 Subject: [PATCH 2/3] buildRustCrate: Add `extraRustcOptsForBuildRs` `extraRustcOpts` should not be used for build.rs, lest it contain host-platform-specific options during cross builds. --- .../rust/build-rust-crate/configure-crate.nix | 4 ++-- .../rust/build-rust-crate/default.nix | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/pkgs/build-support/rust/build-rust-crate/configure-crate.nix b/pkgs/build-support/rust/build-rust-crate/configure-crate.nix index 3eaba1736fc..010b0ec6003 100644 --- a/pkgs/build-support/rust/build-rust-crate/configure-crate.nix +++ b/pkgs/build-support/rust/build-rust-crate/configure-crate.nix @@ -13,7 +13,7 @@ , crateRenames , crateVersion , extraLinkFlags -, extraRustcOpts +, extraRustcOptsForBuildRs , libName , libPath , release @@ -24,7 +24,7 @@ let version_ = lib.splitString "-" crateVersion; version = lib.splitVersion (lib.head version_); rustcOpts = lib.foldl' (opts: opt: opts + " " + opt) (if release then "-C opt-level=3" else "-C debuginfo=2") - (["-C codegen-units=$NIX_BUILD_CORES -C incremental=no"] ++ extraRustcOpts); + (["-C codegen-units=$NIX_BUILD_CORES -C incremental=no"] ++ extraRustcOptsForBuildRs); buildDeps = mkRustcDepArgs buildDependencies crateRenames; authors = lib.concatStringsSep ":" crateAuthors; optLevel = if release then 3 else 0; diff --git a/pkgs/build-support/rust/build-rust-crate/default.nix b/pkgs/build-support/rust/build-rust-crate/default.nix index e605c9550e5..9d5151f6e43 100644 --- a/pkgs/build-support/rust/build-rust-crate/default.nix +++ b/pkgs/build-support/rust/build-rust-crate/default.nix @@ -157,6 +157,11 @@ in # Example: [ "-Z debuginfo=2" ] # Default: [] , extraRustcOpts + # A list of extra options to pass to rustc when building a build.rs. + # + # Example: [ "-Z debuginfo=2" ] + # Default: [] + , extraRustcOptsForBuildRs # Whether to enable building tests. # Use true to enable. # Default: false @@ -198,6 +203,7 @@ let crate = crate_ // (lib.attrByPath [ crate_.crateName ] (attr: {}) crateOverr nativeBuildInputs_ = nativeBuildInputs; buildInputs_ = buildInputs; extraRustcOpts_ = extraRustcOpts; + extraRustcOptsForBuildRs_ = extraRustcOptsForBuildRs; buildTests_ = buildTests; # crate2nix has a hack for the old bash based build script that did split @@ -276,12 +282,16 @@ stdenv.mkDerivation (rec { lib.optionals (crate ? extraRustcOpts) crate.extraRustcOpts ++ extraRustcOpts_ ++ (lib.optional (edition != null) "--edition ${edition}"); + extraRustcOptsForBuildRs = + lib.optionals (crate ? extraRustcOptsForBuildRs) crate.extraRustcOptsForBuildRs + ++ extraRustcOptsForBuildRs_ + ++ (lib.optional (edition != null) "--edition ${edition}"); configurePhase = configureCrate { inherit crateName buildDependencies completeDeps completeBuildDeps crateDescription crateFeatures crateRenames libName build workspace_member release libPath crateVersion - extraLinkFlags extraRustcOpts + extraLinkFlags extraRustcOptsForBuildRs crateAuthors crateHomepage verbose colors; }; buildPhase = buildCrate { @@ -302,8 +312,9 @@ stdenv.mkDerivation (rec { rust = rustc; release = crate_.release or true; verbose = crate_.verbose or true; - extraRustcOpts = []; features = []; + extraRustcOpts = []; + extraRustcOptsForBuildRs = []; nativeBuildInputs = []; buildInputs = []; crateOverrides = defaultCrateOverrides; From da95ae8e3da4d59e3275db2cff6d8fc49a68e669 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Thu, 1 Jul 2021 04:06:55 +0000 Subject: [PATCH 3/3] buildRustCrate: Don't override the linker during cross lld is sometimes need. The caller can do that instead. --- pkgs/build-support/rust/build-rust-crate/build-crate.nix | 1 - 1 file changed, 1 deletion(-) 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 9a50633a58e..257dd0219ab 100644 --- a/pkgs/build-support/rust/build-rust-crate/build-crate.nix +++ b/pkgs/build-support/rust/build-rust-crate/build-crate.nix @@ -18,7 +18,6 @@ (mkRustcFeatureArgs crateFeatures) ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ "--target" (rust.toRustTargetSpec stdenv.hostPlatform) - "-C" "linker=${stdenv.hostPlatform.config}-ld" ] ++ 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