summary refs log tree commit diff
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@gmail.com>2020-12-23 14:48:17 -0800
committerIrene Knapp <ireneista@gmail.com>2020-12-23 14:48:17 -0800
commitbf4ada00a845e08e552f0521d245c23f04c47b1f (patch)
tree6c7b977ad265ad3e50a159de97881db322c6248d
parentcfba0cdb161a790cff0e5663ae0a025999ee5bef (diff)
might want to run nightly rust
-rw-r--r--rust-nightly.nix106
-rw-r--r--shell.nix21
2 files changed, 125 insertions, 2 deletions
diff --git a/rust-nightly.nix b/rust-nightly.nix
new file mode 100644
index 0000000..3f1fbe4
--- /dev/null
+++ b/rust-nightly.nix
@@ -0,0 +1,106 @@
+{ stdenv, lib, buildEnv, makeWrapper, runCommand, fetchurl, zlib, rsync, curl }:
+
+# rustc and cargo nightly binaries
+
+let
+  convertPlatform = system:
+    if      system == "i686-linux"    then "i686-unknown-linux-gnu"
+    else if system == "x86_64-linux"  then "x86_64-unknown-linux-gnu"
+    else if system == "i686-darwin"   then "i686-apple-darwin"
+    else if system == "x86_64-darwin" then "x86_64-apple-darwin"
+    else abort "no snapshot to bootstrap for this platform (missing target triple)";
+
+  thisSys = convertPlatform stdenv.system;
+
+  defaultDateFile = builtins.fetchurl
+    "https://static.rust-lang.org/dist/channel-rust-nightly-date.txt";
+  defaultDate = lib.removeSuffix "\n" (builtins.readFile defaultDateFile);
+
+  mkUrl = { pname, archive, date, system }:
+    "${archive}/${date}/${pname}-nightly-${system}.tar.gz";
+
+  fetch = args: let
+      url = mkUrl { inherit (args) pname archive date system; };
+      download = builtins.fetchurl (url + ".sha256");
+      contents = builtins.readFile download;
+      sha256 = args.hash or (lib.head (lib.strings.splitString " " contents));
+    in fetchurl { inherit url sha256; };
+
+  generic = { pname, archive, exes }:
+      { date ? defaultDate, system ? thisSys, ... } @ args:
+      stdenv.mkDerivation rec {
+    name = "${pname}-${version}";
+    version = "nightly-${date}";
+    preferLocalBuild = true;
+    # TODO meta;
+    outputs = [ "out" "doc" ];
+    src = fetch (args // { inherit pname archive system date; });
+    nativeBuildInputs = [ rsync ];
+    dontStrip = true;
+    installPhase = ''
+      rsync --chmod=u+w -r ./*/ $out/
+    '';
+    preFixup = if stdenv.isLinux then let
+      # it's overkill, but fixup will prune
+      rpath = "$out/lib:" + lib.makeLibraryPath [ zlib stdenv.cc.cc.lib curl ];
+    in ''
+      for executable in ${lib.concatStringsSep " " exes}; do
+        patchelf \
+          --interpreter "$(< $NIX_CC/nix-support/dynamic-linker)" \
+          --set-rpath "${rpath}" \
+          "$out/bin/$executable"
+      done
+      for library in $out/lib/*.so; do
+        patchelf --set-rpath "${rpath}" "$library"
+      done
+    '' else "";
+  };
+
+in rec {
+  rustc = generic {
+    pname = "rustc";
+    archive = "https://static.rust-lang.org/dist";
+    exes = [ "rustc" "rustdoc" ];
+  };
+
+  rustcWithSysroots = { rustc, sysroots ? [] }: buildEnv {
+    name = "combined-sysroots";
+    paths = [ rustc ] ++ sysroots;
+    pathsToLink = [ "/lib" "/share" ];
+    #buildInputs = [ makeWrapper ];
+    # Can't use wrapper script because of https://github.com/rust-lang/rust/issues/31943
+    postBuild = ''
+      mkdir -p $out/bin/
+      cp ${rustc}/bin/* $out/bin/
+    '';
+  };
+
+  rust-std = { date ? defaultDate, system ? thisSys, ... } @ args:
+      stdenv.mkDerivation rec {
+    # Strip install.sh, etc
+    pname = "rust-std";
+    version = "nightly-${date}";
+    name = "${pname}-${version}-${system}";
+    src = fetch (args // {
+      inherit pname date system;
+      archive = "https://static.rust-lang.org/dist";
+    });
+    installPhase = ''
+      mkdir -p $out
+      mv ./*/* $out/
+      rm $out/manifest.in
+    '';
+  };
+
+  cargo = generic {
+    pname = "cargo";
+    archive = "https://static.rust-lang.org/dist";
+    exes = [ "cargo" ];
+  };
+
+  rust = generic {
+    pname = "rust";
+    archive = "https://static.rust-lang.org/dist";
+    exes = [ "rustc" "rustdoc" "cargo" ];
+  };
+}
diff --git a/shell.nix b/shell.nix
index 0860ad5..7cc2faf 100644
--- a/shell.nix
+++ b/shell.nix
@@ -7,14 +7,31 @@ let
     sha256 = "17mmf5sqn0fmpqrf52icq92nf1sy5yacwx9vafk43piaq433ba56";
   };
   crate2nix = pkgs.callPackage (import crate2nix-src) { };
+  #rustPackages = pkgs.callPackage ./rust-nightly.nix { };
 in
 pkgs.mkShell {
-  buildInputs = with pkgs; [
+  buildInputs = (with pkgs; [
     cargo
     cmake
     crate2nix
     go
     pkgconfig
     rustc
-  ];
+  ]);
+  /*
+  ++ (with rustPackages; [
+    (cargo {
+      date = "2020-12-20";
+      hash= "0rnbf2hb94yrs7xl567i35641z52by3jlijxwjn8m1slvnqvzshc";
+    })
+    (rustc {
+      date = "2020-12-20";
+      hash= "1asahv0lv78r2v0117hc56a62hkssnnsl6qyzyh43wrwv70jv6i7";
+    })
+    (rust-std {
+      date = "2020-12-20";
+      hash= "0x4qpwgqibljdsplrqap8r7n8kfc6lnys46c2czqva87w4fhzpwp";
+    })
+  ]);
+  */
 }