From e0b978cbb187ecf66df8018e374d342ed7f7a5ed Mon Sep 17 00:00:00 2001 From: Carl Michael Skog Date: Tue, 21 Apr 2020 11:45:54 +0200 Subject: [PATCH 1/3] Fix for an edge case regarding dependencies When a crate depends on a crate that has the same dependency, the symlinking in copy_or_link function will fail. Tweak copy_or_link function accordingly. --- .gitignore | 2 +- examples/dependencyedgecasetests/default.nix | 59 ++++++++++++++++++++ mkRustCrate/lib/mkRustCrate/util.sh | 4 +- 3 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 examples/dependencyedgecasetests/default.nix diff --git a/.gitignore b/.gitignore index 5aa0728..ffa1575 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -examples/ +/examples/*/result* target/ diff --git a/examples/dependencyedgecasetests/default.nix b/examples/dependencyedgecasetests/default.nix new file mode 100644 index 0000000..ee0f2d0 --- /dev/null +++ b/examples/dependencyedgecasetests/default.nix @@ -0,0 +1,59 @@ +let + pkgs = import { }; +in + pkgs.callPackage ({ callPackage, rustChannelOf }: + let + rustChannel = rustChannelOf { + date = "2020-03-31"; + channel = "nightly"; + }; + mkRustCrate = callPackage ../../mkRustCrate/lib/mkRustCrate { + inherit (rustChannel) cargo rust; + }; + fetchFromCratesIo = callPackage ../../mkRustCrate/lib/fetchFromCratesIo { }; + in + rec { + + quote = mkRustCrate rec { + name = "quote"; + version = "1.0.3"; + src = fetchFromCratesIo { + inherit name version; + sha256 = "093chkpg7dc8f86kz0hlxzyfxvbix3xpkmlbhilf0wji228ad35c"; + }; + dependencies = [ proc-macro2 ]; + features = [ "proc-macro" ]; + }; + + proc-macro2 = mkRustCrate rec { + name = "proc-macro2"; + version = "1.0.10"; + src = fetchFromCratesIo { + inherit name version; + sha256 = "1sb317587iwq1554s0ksap6718w2l73qa07h2amg3716h8llg6zv"; + }; + dependencies = [ unicode-xid ]; + features = [ "proc-macro" ]; + }; + + unicode-xid = mkRustCrate rec { + name = "unicode-xid"; + version = "0.2.0"; + src = fetchFromCratesIo { + inherit name version; + sha256 = "1c85gb3p3qhbjvfyjb31m06la4f024jx319k10ig7n47dz2fk8v7"; + }; + }; + + syn = mkRustCrate rec { + name = "syn"; + version = "1.0.17"; + src = fetchFromCratesIo { + inherit name version; + sha256 = "1vd0ixzqffdr6cb49fvwcrhrbd5a9zlrzkifp166fz0ci940ga6h"; + }; + dependencies = [ proc-macro2 unicode-xid quote ]; + features = [ "clone-impls" "derive" "parsing" "printing" "proc-macro" "visit" ]; + }; + + }) {} diff --git a/mkRustCrate/lib/mkRustCrate/util.sh b/mkRustCrate/lib/mkRustCrate/util.sh index d8d0376..9a143f2 100644 --- a/mkRustCrate/lib/mkRustCrate/util.sh +++ b/mkRustCrate/lib/mkRustCrate/util.sh @@ -38,7 +38,7 @@ function copy_or_link { local dest="$1"; shift [ -L "$src" ] \ && cp -dn "$src" "$dest" \ - || ln -s "$src" "$dest" + || ln -s "$src" "$dest" &> /dev/null || true } function parse_depinfo { @@ -48,7 +48,7 @@ function parse_depinfo { [[ "x$line" =~ xcargo:([^=]+)=(.*) ]] || continue local key="${BASH_REMATCH[1]}" local val="${BASH_REMATCH[2]}" - + case $key in rustc-link-lib) ;& rustc-flags) ;& From 1b2201075e1190ad555d71c1ab8d1bfc6774f1e8 Mon Sep 17 00:00:00 2001 From: Carl Michael Skog Date: Tue, 21 Apr 2020 12:08:05 +0200 Subject: [PATCH 2/3] Dependencies need not be exclusively rlib's Dependencies can also be .so's, like for the serde_derive crate. --- examples/dependencyedgecasetests/default.nix | 10 ++++++++++ mkRustCrate/lib/mkRustCrate/build.sh | 13 +++++++------ mkRustCrate/lib/mkRustCrate/install.sh | 12 ++++++------ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/examples/dependencyedgecasetests/default.nix b/examples/dependencyedgecasetests/default.nix index ee0f2d0..0ae16c6 100644 --- a/examples/dependencyedgecasetests/default.nix +++ b/examples/dependencyedgecasetests/default.nix @@ -14,6 +14,16 @@ in in rec { + serde_derive = mkRustCrate rec { + name = "serde_derive"; + version = "1.0.106"; + src = fetchFromCratesIo { + inherit name version; + sha256 = "03wq260g5prkgxgfq4yhbmznqm2rr3qmhqah6mh6ddvpmq6axz3p"; + }; + dependencies = [ proc-macro2 quote syn ]; + }; + quote = mkRustCrate rec { name = "quote"; version = "1.0.3"; diff --git a/mkRustCrate/lib/mkRustCrate/build.sh b/mkRustCrate/lib/mkRustCrate/build.sh index a8a7fe9..49dbf9f 100755 --- a/mkRustCrate/lib/mkRustCrate/build.sh +++ b/mkRustCrate/lib/mkRustCrate/build.sh @@ -30,10 +30,6 @@ function add_deps { local dep_flags=$1; shift for dep in ${!dep_type} do - printf -v$dep_flags "%s --extern %s=%s" \ - "${!dep_flags}" \ - "$(crate_name $dep)" \ - "$dep/lib/lib$(crate_name $dep).rlib" stat $dep/lib/deps/* &>/dev/null \ && cp -dn $dep/lib/deps/* deps \ || : @@ -41,9 +37,14 @@ function add_deps { do source $depinfo done - for lib in $dep/lib/*.rlib + for lib in $dep/lib/*.{rlib,so} do - local dest=$(basename $lib .rlib)-$(crate_hash $dep).rlib + local ext=$(filext $lib) + printf -v$dep_flags "%s --extern %s=%s" \ + "${!dep_flags}" \ + "$(crate_name $dep)" \ + "$dep/lib/lib$(crate_name $dep).$ext" + local dest=$(basename $lib .$ext)-$(crate_hash $dep).$ext copy_or_link "$lib" "$dep_dir/$dest" done done diff --git a/mkRustCrate/lib/mkRustCrate/install.sh b/mkRustCrate/lib/mkRustCrate/install.sh index 9899226..0eedd9a 100755 --- a/mkRustCrate/lib/mkRustCrate/install.sh +++ b/mkRustCrate/lib/mkRustCrate/install.sh @@ -12,12 +12,6 @@ needs_deps= for f in * do ext=$(filext $f) - if [ -x "$f" ] && ! [ -d "$f" ] - then - mkdir -p $out/bin - cp $f $out/bin - continue - fi case $(filext $f) in rlib) @@ -37,7 +31,13 @@ do cp $f $out/lib ;; *) + if [ -x "$f" ] && ! [ -d "$f" ] + then + mkdir -p $out/bin + cp $f $out/bin + fi continue + ;; esac done From 10eafd0eb32d75061d454d0b3d2a8ddd5614d8dd Mon Sep 17 00:00:00 2001 From: Carl Michael Skog Date: Tue, 28 Jul 2020 15:03:00 +0200 Subject: [PATCH 3/3] Weird indentation Only whitespace change. --- mkRustCrate/lib/mkRustCrate/install.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mkRustCrate/lib/mkRustCrate/install.sh b/mkRustCrate/lib/mkRustCrate/install.sh index 0eedd9a..53dd21f 100755 --- a/mkRustCrate/lib/mkRustCrate/install.sh +++ b/mkRustCrate/lib/mkRustCrate/install.sh @@ -31,13 +31,13 @@ do cp $f $out/lib ;; *) - if [ -x "$f" ] && ! [ -d "$f" ] - then - mkdir -p $out/bin - cp $f $out/bin - fi + if [ -x "$f" ] && ! [ -d "$f" ] + then + mkdir -p $out/bin + cp $f $out/bin + fi continue - ;; + ;; esac done