summary refs log tree commit diff
path: root/pkgs/build-support/rust/build-rust-crate/build-crate.nix
diff options
context:
space:
mode:
authorPierre-Etienne Meunier <pierre-etienne.meunier@inria.fr>2018-10-28 00:06:29 +0100
committerJoachim Schiele <js@lastlog.de>2018-10-28 00:06:29 +0100
commitae3b4655a4a7d8692dab3ba46a40b7daabcb1208 (patch)
treef807556917f136b3acda0003148bb513b88a5887 /pkgs/build-support/rust/build-rust-crate/build-crate.nix
parenta3e367ff4bbe479eb269b31f1eaf28fd4c1158c3 (diff)
downloadnixpkgs-ae3b4655a4a7d8692dab3ba46a40b7daabcb1208.tar
nixpkgs-ae3b4655a4a7d8692dab3ba46a40b7daabcb1208.tar.gz
nixpkgs-ae3b4655a4a7d8692dab3ba46a40b7daabcb1208.tar.bz2
nixpkgs-ae3b4655a4a7d8692dab3ba46a40b7daabcb1208.tar.lz
nixpkgs-ae3b4655a4a7d8692dab3ba46a40b7daabcb1208.tar.xz
nixpkgs-ae3b4655a4a7d8692dab3ba46a40b7daabcb1208.tar.zst
nixpkgs-ae3b4655a4a7d8692dab3ba46a40b7daabcb1208.zip
Carnix: 0.7.2 -> 0.8.10 (#40587)
Carnix: splits input into two parts: creates from creates.io and local ones
Diffstat (limited to 'pkgs/build-support/rust/build-rust-crate/build-crate.nix')
-rw-r--r--pkgs/build-support/rust/build-rust-crate/build-crate.nix29
1 files changed, 22 insertions, 7 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 f65118ba4a6..252a0ff521f 100644
--- a/pkgs/build-support/rust/build-rust-crate/build-crate.nix
+++ b/pkgs/build-support/rust/build-rust-crate/build-crate.nix
@@ -2,7 +2,7 @@
 { crateName,
   dependencies,
   crateFeatures, libName, release, libPath,
-  crateType, metadata, crateBin,
+  crateType, metadata, crateBin, hasCrateBin,
   extraRustcOpts, verbose, colors }:
 
   let
@@ -13,6 +13,17 @@
             (if release then "-C opt-level=3" else "-C debuginfo=2")
             (["-C codegen-units=1"] ++ extraRustcOpts);
         rustcMeta = "-C metadata=${metadata} -C extra-filename=-${metadata}";
+
+    # Some platforms have different names for rustc.
+    rustPlatform =
+      with stdenv.hostPlatform.parsed;
+      let cpu_ = if cpu.name == "armv7a" then "armv7"
+                 else cpu.name;
+          vendor_ = vendor.name;
+          kernel_ = kernel.name;
+          abi_ = abi.name;
+      in
+      "${cpu_}-${vendor_}-${kernel_}-${abi_}";
   in ''
     runHook preBuild
     norm=""
@@ -32,7 +43,8 @@
        lib_src=$1
        echo_build_heading $lib_src ${libName}
 
-       noisily rustc --crate-name $CRATE_NAME $lib_src --crate-type ${crateType} \
+       noisily rustc --crate-name $CRATE_NAME $lib_src \
+         ${lib.strings.concatStrings (map (x: " --crate-type ${x}") crateType)}  \
          ${rustcOpts} ${rustcMeta} ${crateFeatures} --out-dir target/lib \
          --emit=dep-info,link -L dependency=target/deps ${deps} --cap-lints allow \
          $BUILD_OUT_DIR $EXTRA_BUILD $EXTRA_FEATURES --color ${colors}
@@ -54,7 +66,8 @@
       noisily rustc --crate-name $crate_name_ $main_file --crate-type bin ${rustcOpts}\
         ${crateFeatures} --out-dir target/bin --emit=dep-info,link -L dependency=target/deps \
         $LINK ${deps}$EXTRA_LIB --cap-lints allow \
-        $BUILD_OUT_DIR $EXTRA_BUILD $EXTRA_FEATURES --color ${colors}
+        $BUILD_OUT_DIR $EXTRA_BUILD $EXTRA_FEATURES --color ${colors} \
+        ${if stdenv.hostPlatform != stdenv.buildPlatform then "--target ${rustPlatform} -C linker=${stdenv.hostPlatform.config}-gcc" else ""}
       if [ "$crate_name_" != "$crate_name" ]; then
         mv target/bin/$crate_name_ target/bin/$crate_name
       fi
@@ -103,9 +116,9 @@
        tr '\n' ' ' < target/link > target/link_
        LINK=$(cat target/link_)
     fi
-
-    mkdir -p target/bin
+    ${lib.optionalString (crateBin != "") ''
     printf "%s\n" "${crateBin}" | head -n1 | tr -s ',' '\n' | while read -r BIN_NAME BIN_PATH; do
+      mkdir -p target/bin
       # filter empty entries / empty "lines"
       if [[ -z "$BIN_NAME" ]]; then
            continue
@@ -141,13 +154,15 @@
       fi
       build_bin "$BIN_NAME" "$BIN_PATH"
     done
+    ''}
 
-
-    ${lib.optionalString (crateBin == "") ''
+    ${lib.optionalString (crateBin == "" && !hasCrateBin) ''
       if [[ -e src/main.rs ]]; then
+        mkdir -p target/bin
         build_bin ${crateName} src/main.rs
       fi
       for i in src/bin/*.rs; do #*/
+        mkdir -p target/bin
         build_bin "$(basename $i .rs)" "$i"
       done
     ''}