about summary refs log tree commit diff
path: root/pkgs/build-support
diff options
context:
space:
mode:
authorYureka <yuka@yuka.dev>2024-01-05 00:47:52 +0100
committerAlyssa Ross <hi@alyssa.is>2024-01-15 22:34:02 +0100
commit48a6213611bb3b12bb19e0b72abcf03908eabea0 (patch)
treef43a233f7279607e7ed8b977394760fb6c07c720 /pkgs/build-support
parentb8076b893eacf2e6bec67453fbf4d421ee28ff03 (diff)
downloadnixlib-48a6213611bb3b12bb19e0b72abcf03908eabea0.tar
nixlib-48a6213611bb3b12bb19e0b72abcf03908eabea0.tar.gz
nixlib-48a6213611bb3b12bb19e0b72abcf03908eabea0.tar.bz2
nixlib-48a6213611bb3b12bb19e0b72abcf03908eabea0.tar.lz
nixlib-48a6213611bb3b12bb19e0b72abcf03908eabea0.tar.xz
nixlib-48a6213611bb3b12bb19e0b72abcf03908eabea0.tar.zst
nixlib-48a6213611bb3b12bb19e0b72abcf03908eabea0.zip
rust: use lld on pkgsStatic aarch64
Diffstat (limited to 'pkgs/build-support')
-rw-r--r--pkgs/build-support/rust/lib/default.nix14
1 files changed, 12 insertions, 2 deletions
diff --git a/pkgs/build-support/rust/lib/default.nix b/pkgs/build-support/rust/lib/default.nix
index 6645715eb2c8..e70b8229d356 100644
--- a/pkgs/build-support/rust/lib/default.nix
+++ b/pkgs/build-support/rust/lib/default.nix
@@ -12,13 +12,20 @@ rec {
   # hostPlatform-targeted compiler -- for example, `-m64` being
   # passed on a build=x86_64/host=aarch64 compilation.
   envVars = let
+
+    # As a workaround for https://github.com/rust-lang/rust/issues/89626 use lld on pkgsStatic aarch64
+    shouldUseLLD = platform: platform.isAarch64 && platform.isStatic && !stdenv.isDarwin;
+
     ccForBuild = "${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}cc";
     cxxForBuild = "${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}c++";
     linkerForBuild = ccForBuild;
 
     ccForHost = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc";
     cxxForHost = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++";
-    linkerForHost = ccForHost;
+    linkerForHost = if shouldUseLLD stdenv.targetPlatform
+      && !stdenv.cc.bintools.isLLVM
+      then "${buildPackages.lld}/bin/ld.lld"
+      else ccForHost;
 
     # Unfortunately we must use the dangerous `targetPackages` here
     # because hooks are artificially phase-shifted one slot earlier
@@ -26,7 +33,10 @@ rec {
     # a targetPlatform to them).
     ccForTarget = "${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}cc";
     cxxForTarget = "${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}c++";
-    linkerForTarget = ccForTarget;
+    linkerForTarget = if shouldUseLLD targetPackages.stdenv.targetPlatform
+      && !targetPackages.stdenv.cc.bintools.isLLVM # whether stdenv's linker is lld already
+      then "${buildPackages.lld}/bin/ld.lld"
+      else ccForTarget;
 
     rustBuildPlatform = stdenv.buildPlatform.rust.rustcTarget;
     rustBuildPlatformSpec = stdenv.buildPlatform.rust.rustcTargetSpec;