summary refs log tree commit diff
path: root/pkgs/build-support/rust/build-rust-crate
diff options
context:
space:
mode:
authorAndreas Rammhold <andreas@rammhold.de>2020-03-28 16:02:51 +0100
committerGitHub <noreply@github.com>2020-03-28 16:02:51 +0100
commitd86bfec309585d91615e518f4a289a8a65c4cee3 (patch)
tree8607448c8eeec7b04a6fdc8d41e01d8d02188709 /pkgs/build-support/rust/build-rust-crate
parentce1695ace7787af537189384acd025cf160e2832 (diff)
parent2f7fb1c49732105c8937b66b7d92402c04546073 (diff)
downloadnixpkgs-d86bfec309585d91615e518f4a289a8a65c4cee3.tar
nixpkgs-d86bfec309585d91615e518f4a289a8a65c4cee3.tar.gz
nixpkgs-d86bfec309585d91615e518f4a289a8a65c4cee3.tar.bz2
nixpkgs-d86bfec309585d91615e518f4a289a8a65c4cee3.tar.lz
nixpkgs-d86bfec309585d91615e518f4a289a8a65c4cee3.tar.xz
nixpkgs-d86bfec309585d91615e518f4a289a8a65c4cee3.tar.zst
nixpkgs-d86bfec309585d91615e518f4a289a8a65c4cee3.zip
Merge pull request #83379 from symphorien/rust-link
buildRustCrate: don't sort link flags
Diffstat (limited to 'pkgs/build-support/rust/build-rust-crate')
-rw-r--r--pkgs/build-support/rust/build-rust-crate/configure-crate.nix2
-rw-r--r--pkgs/build-support/rust/build-rust-crate/lib.sh5
-rw-r--r--pkgs/build-support/rust/build-rust-crate/test/default.nix54
3 files changed, 54 insertions, 7 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 61c39c6b21c..ed810053709 100644
--- a/pkgs/build-support/rust/build-rust-crate/configure-crate.nix
+++ b/pkgs/build-support/rust/build-rust-crate/configure-crate.nix
@@ -172,7 +172,7 @@ in ''
      set +e
      EXTRA_BUILD=$(sed -n "s/^cargo:rustc-flags=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u)
      EXTRA_FEATURES=$(sed -n "s/^cargo:rustc-cfg=\(.*\)/--cfg \1/p" target/build/${crateName}.opt | tr '\n' ' ')
-     EXTRA_LINK=$(sed -n "s/^cargo:rustc-link-lib=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u)
+     EXTRA_LINK=$(sed -n "s/^cargo:rustc-link-lib=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ')
      EXTRA_LINK_SEARCH=$(sed -n "s/^cargo:rustc-link-search=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u)
 
      for env in $(sed -n "s/^cargo:rustc-env=\(.*\)/\1/p" target/build/${crateName}.opt); do
diff --git a/pkgs/build-support/rust/build-rust-crate/lib.sh b/pkgs/build-support/rust/build-rust-crate/lib.sh
index 5843ee98b0d..6cf3481754b 100644
--- a/pkgs/build-support/rust/build-rust-crate/lib.sh
+++ b/pkgs/build-support/rust/build-rust-crate/lib.sh
@@ -105,11 +105,6 @@ setup_link_paths() {
   done
 
   if [[ -e target/link ]]; then
-     sort -u target/link.final > target/link.final.sorted
-     mv target/link.final.sorted target/link.final
-     sort -u target/link > target/link.sorted
-     mv target/link.sorted target/link
-
      tr '\n' ' ' < target/link > target/link_
      LINK=$(cat target/link_)
   fi
diff --git a/pkgs/build-support/rust/build-rust-crate/test/default.nix b/pkgs/build-support/rust/build-rust-crate/test/default.nix
index f24583c41fc..2251a1b40f2 100644
--- a/pkgs/build-support/rust/build-rust-crate/test/default.nix
+++ b/pkgs/build-support/rust/build-rust-crate/test/default.nix
@@ -1,4 +1,4 @@
-{ lib, buildRustCrate, runCommand, writeTextFile, symlinkJoin, callPackage, releaseTools }:
+{ lib, buildRustCrate, runCommand, runCommandCC, writeTextFile, symlinkJoin, callPackage, releaseTools }:
 let
   mkCrate = args: let
     p = {
@@ -258,6 +258,58 @@ let
           ];
         };
       };
+      # Regression test for https://github.com/NixOS/nixpkgs/pull/83379
+      # link flag order should be preserved
+      linkOrder = {
+        src = symlinkJoin {
+          name = "buildrs-out-dir-overlay";
+          paths = [
+            (mkFile "build.rs" ''
+              fn main() {
+                // in the other order, linkage will fail
+                println!("cargo:rustc-link-lib=b");
+                println!("cargo:rustc-link-lib=a");
+              }
+            '')
+            (mkFile "src/main.rs" ''
+              extern "C" {
+                fn hello_world();
+              }
+              fn main() {
+                unsafe {
+                  hello_world();
+                }
+              }
+            '')
+          ];
+        };
+        buildInputs = let
+          compile = name: text: runCommandCC name {} ''
+            mkdir -p $out/lib
+            $CC -shared -o $out/lib/${name}.so ${writeTextFile {
+              name = "${name}-src.c";
+              inherit text;
+            }}
+          '';
+          b = compile "libb" ''
+            #include <stdio.h>
+
+            void hello();
+
+            void hello_world() {
+              hello();
+              printf(" world!\n");
+            }
+          '';
+          a = compile "liba" ''
+            #include <stdio.h>
+
+            void hello() {
+              printf("hello");
+            }
+          '';
+        in [ a b ];
+      };
       rustCargoTomlInSubDir = {
         # The "workspace_member" can be set to the sub directory with the crate to build.
         # By default ".", meaning the top level directory is assumed.