summary refs log tree commit diff
path: root/pkgs/build-support/rust
diff options
context:
space:
mode:
authorJörg Thalheim <joerg@thalheim.io>2018-11-21 01:47:45 +0000
committerJohn Ericson <git@JohnEricson.me>2019-03-29 11:11:00 -0400
commit912dca193aee9da77a4d429285db53729d81aa3d (patch)
tree62ba862644c2c9c6c9f5da481e9ebb9f9ab75117 /pkgs/build-support/rust
parent3c930188c8dff22327c1c12bb8b3baa49a011dda (diff)
downloadnixpkgs-912dca193aee9da77a4d429285db53729d81aa3d.tar
nixpkgs-912dca193aee9da77a4d429285db53729d81aa3d.tar.gz
nixpkgs-912dca193aee9da77a4d429285db53729d81aa3d.tar.bz2
nixpkgs-912dca193aee9da77a4d429285db53729d81aa3d.tar.lz
nixpkgs-912dca193aee9da77a4d429285db53729d81aa3d.tar.xz
nixpkgs-912dca193aee9da77a4d429285db53729d81aa3d.tar.zst
nixpkgs-912dca193aee9da77a4d429285db53729d81aa3d.zip
rust: fix cross-compilation
Diffstat (limited to 'pkgs/build-support/rust')
-rw-r--r--pkgs/build-support/rust/default.nix61
-rw-r--r--pkgs/build-support/rust/make-rust-platform.nix18
2 files changed, 48 insertions, 31 deletions
diff --git a/pkgs/build-support/rust/default.nix b/pkgs/build-support/rust/default.nix
index c69832a89b9..7130dde388b 100644
--- a/pkgs/build-support/rust/default.nix
+++ b/pkgs/build-support/rust/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, cacert, git, cargo, rustc, cargo-vendor, fetchcargo, python3 }:
+{ stdenv, cacert, git, cargo, rustc, cargo-vendor, fetchcargo, python3, buildPackages }:
 
 { name ? "${args.pname}-${args.version}"
 , cargoSha256 ? "unset"
@@ -9,6 +9,7 @@
 , sourceRoot ? null
 , logLevel ? ""
 , buildInputs ? []
+, nativeBuildInputs ? []
 , cargoUpdateHook ? ""
 , cargoDepsHook ? ""
 , cargoBuildFlags ? []
@@ -37,21 +38,22 @@ let
       cargoDepsCopy="$sourceRoot/${cargoVendorDir}"
     '';
 
+  ccForBuild="${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}cc";
+  cxxForBuild="${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}c++";
+  ccForHost="${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc";
+  cxxForHost="${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++";
+  releaseDir = "target/${stdenv.hostPlatform.config}/release";
+
 in stdenv.mkDerivation (args // {
   inherit cargoDeps;
 
   patchRegistryDeps = ./patch-registry-deps;
 
-  buildInputs = [ cacert git cargo rustc ] ++ buildInputs;
+  nativeBuildInputs = [ cargo rustc git cacert ] ++ nativeBuildInputs;
+  inherit buildInputs;
 
   patches = cargoPatches ++ patches;
 
-  configurePhase = args.configurePhase or ''
-    runHook preConfigure
-    # noop
-    runHook postConfigure
-  '';
-
   postUnpack = ''
     eval "$cargoDepsHook"
 
@@ -63,17 +65,40 @@ in stdenv.mkDerivation (args // {
       config=${./fetchcargo-default-config.toml};
     fi;
     substitute $config .cargo/config \
-    --subst-var-by vendor "$(pwd)/$cargoDepsCopy"
+      --subst-var-by vendor "$(pwd)/$cargoDepsCopy"
 
     unset cargoDepsCopy
 
     export RUST_LOG=${logLevel}
   '' + (args.postUnpack or "");
 
+  configurePhase = args.configurePhase or ''
+    runHook preConfigure
+    mkdir -p .cargo
+    cat >> .cargo/config <<'EOF'
+    [target."${stdenv.buildPlatform.config}"]
+    "linker" = "${ccForBuild}"
+    ${stdenv.lib.optionalString (stdenv.buildPlatform.config != stdenv.hostPlatform.config) ''
+    [target."${stdenv.hostPlatform.config}"]
+    "linker" = "${ccForHost}"
+    ''}
+    EOF
+    cat .cargo/config
+    runHook postConfigure
+  '';
+
   buildPhase = with builtins; args.buildPhase or ''
     runHook preBuild
-    echo "Running cargo build --release ${concatStringsSep " " cargoBuildFlags}"
-    cargo build --release --frozen ${concatStringsSep " " cargoBuildFlags}
+    echo "Running cargo build --target ${stdenv.hostPlatform.config} --release ${concatStringsSep " " cargoBuildFlags}"
+    env \
+      "CC_${stdenv.buildPlatform.config}"="${ccForBuild}" \
+      "CXX_${stdenv.buildPlatform.config}"="${cxxForBuild}" \
+      "CC_${stdenv.hostPlatform.config}"="${ccForHost}" \
+      "CXX_${stdenv.hostPlatform.config}"="${cxxForHost}" \
+      cargo build \
+        --release \
+        --target ${stdenv.hostPlatform.config} \
+        --frozen ${concatStringsSep " " cargoBuildFlags}
     runHook postBuild
   '';
 
@@ -86,11 +111,21 @@ in stdenv.mkDerivation (args // {
 
   doCheck = args.doCheck or true;
 
+  inherit releaseDir;
+
   installPhase = args.installPhase or ''
     runHook preInstall
     mkdir -p $out/bin $out/lib
-    find target/release -maxdepth 1 -type f -executable ! \( -regex ".*\.\(so.[0-9.]+\|so\|a\|dylib\)" \) -print0 | xargs -r -0 cp -t $out/bin
-    find target/release -maxdepth 1 -regex ".*\.\(so.[0-9.]+\|so\|a\|dylib\)" -print0 | xargs -r -0 cp -t $out/lib
+
+    find $releaseDir \
+      -maxdepth 1 \
+      -type f \
+      -executable ! \( -regex ".*\.\(so.[0-9.]+\|so\|a\|dylib\)" \) \
+      -print0 | xargs -r -0 cp -t $out/bin
+    find $releaseDir \
+      -maxdepth 1 \
+      -regex ".*\.\(so.[0-9.]+\|so\|a\|dylib\)" \
+      -print0 | xargs -r -0 cp -t $out/lib
     rmdir --ignore-fail-on-non-empty $out/lib $out/bin
     runHook postInstall
   '';
diff --git a/pkgs/build-support/rust/make-rust-platform.nix b/pkgs/build-support/rust/make-rust-platform.nix
deleted file mode 100644
index afbc56865ff..00000000000
--- a/pkgs/build-support/rust/make-rust-platform.nix
+++ /dev/null
@@ -1,18 +0,0 @@
-{ callPackage }:
-{ rustc, cargo, ... }: {
-  rust = {
-    inherit rustc cargo;
-  };
-
-  buildRustPackage = callPackage ./default.nix {
-    inherit rustc cargo;
-
-    fetchcargo = callPackage ./fetchcargo.nix {
-      inherit cargo;
-    };
-  };
-
-  rustcSrc = callPackage ../../development/compilers/rust/rust-src.nix {
-    inherit rustc;
-  };
-}