guix-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug#30831] [PATCH] gnu: rust: Update rust from 1.22.1 release to 1.24.1


From: Nikolai Merinov
Subject: [bug#30831] [PATCH] gnu: rust: Update rust from 1.22.1 release to 1.24.1
Date: Tue, 27 Mar 2018 17:56:50 +0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)

Hi Ludovic,

In attachement you can find updated patch with rust-bootstrap 1.22.1 and
rust packages of 1.23.0 and 1.24.1 releases. I made small changes like
replacement (zero? (system* ...)) with (invoke ...) and checked
reproducability.

Please find my comments below.

Regards,
Nikolai

address@hidden (Ludovic Courtès) writes:

> Hello Nikolai,
>
> Nikolai Merinov <address@hidden> skribis:
>
>> Ricardo Wurmus <address@hidden> writes:
>>
>>> Ludovic Courtès <address@hidden> writes:
>>>
>>>> Hello,
>>>>
>>>> Nikolai Merinov <address@hidden> skribis:
>>>>
>>>>> Actually there is two ways to achieve this:
>>>>> 1. Constantly update bootsrap binaries version.
>>>>> 2. For each new release create new package. As result we'll be able to
>>>>> use old rust release to build each new rust release. E.g. we can use
>>>>> 1.21.0 bootstrap binaries, then build 1.22.0 rust and use it to build
>>>>> 1.23.0 rust and then use it to build 1.24.1 rust.
>>>>>
>>>>> Which way is preferable? 
>>>>
>>>> Like I wrote, I would prefer option #2, so as to increase “binary
>>>> diversity” and not rely on builds made by upstream.
>>>>
>>>> This obviously relates to <http://bootstrappable.org/>.  Ricardo, what’s
>>>> your take on this?
>>>
>>> I agree.  In the long run, however, I’d prefer for Rust to be
>>> bootstrapped through one of the alternative implementations.  Then we
>>> don’t need to keep a long chain of older versions.
>>>
>>> Currently, however, I don’t see a way around it.
>>
>> Hi, I prepared proof-of-concept solution with rust-bootstrap frozed on
>> 1.22.1 release.
>
> Would it be an option to stick to 1.21?  Or is it already too difficult?
> (Apologies if this was already answered previously.)  I’m asking because
> I wonder how big the temptation will be to upgrade ‘rust-bootstrap’
> again next time.
>

It should be easy enough to stick with 1.21 bootstrap (still we already
have package for 1.22), but:
1. We still should change code for bootstrap package to match design
where "rustc" and "cargo" installed from one package.
2. Rust 1.23 and 1.24 can use same "config.toml", while rust 1.22 have
different "config.toml". I do not know how to make it to look pretty in
first time. For additional information look below about package code
design.
3. My machine is pretty slow and testing reproducablity for three
versions in a row will take two days :-)


>> Do you think suggested code with "split all code to small steps and
>> remove fixed issues in new releases" is correct way to provide series
>> of releases? Or it will be better to copy builder code to state it
>> directly that this specific modification is tested on each rust
>> release?
>
> I’m not sure what you mean.

I talking about how to write code for packages. e.g. if we have:

  (package
    (name "rust")
    (version "1.23.0")
    ...
    (arguments
      ...
       #:phases (modify-phases %standard-phases
                  ...
                  (add-after ... 'disable-test-1)
                  (add-after ... 'disable-test-2)
                  (add-after ... 'fix-source-bug-1)
                  (add-after ... 'fix-source-bug-2)
                  (add-after ... 'fix-source-bug-3)
                  (replace 'configure ...)
                  (replace 'check ...)
                  ...)))

Then how should look package for 1.24 release?

It can be inherited from previous one and replace some of old steps

  (let ((base-rust rust-1.23))
    (package
      (inherit base-rust)
      (version "1.24.1")
      ...
      (native-inputs
       (alist-replace "cargo-bootstrap" (list base-rust "cargo")
                      (alist-replace "rustc-bootstrap" (list base-rust)
                                     (package-native-inputs base-rust))))
      (arguments (substitute-keyword-arguments (package-arguments base-rust)
                   ((#:phases phases)
                    `(modify-phases ,phases
                       (delete 'fix-source-bug-1)
                       (add-after ... 'disable-test-3)
                       (replace 'fix-source-bug-2
                         (lambda* ....))))))))

Or we should copy all steps required for each new release:

  (package
    (name "rust")
    (version "1.24.0")
    ...
    (arguments
      ...
       #:phases (modify-phases %standard-phases
                  ...
                  (add-after ... 'disable-test-1)
                  (add-after ... 'disable-test-2)
                  (add-after ... 'disable-test-3)
                  (add-after ... 'fix-source-bug-1)
                  (add-after ... 'fix-source-bug-3)
                  (replace 'configure ...)
                  (replace 'check ...)
                  ...)))

Second solution looks too verbose for me, but with first solution on
long chain of versions it will be very hard to manage which changes we
have in newest package.

>
> Danny, you probably have more experience than I do with Rust.  :-)
> Thoughts?
>
> Thanks,
> Ludo’.

>From 7765a42a3696027692282d36b74b68a7bff5678e Mon Sep 17 00:00:00 2001
From: Nikolai Merinov <address@hidden>
Date: Wed, 14 Mar 2018 00:06:53 +0500
Subject: [PATCH] gnu: rust: Update rust to 1.24.1, froze bootstrap on 1.22.1
 release
To: address@hidden

* gnu/packages/rust.scm (rust-bootstrap): Froze bootstrap version on 1.22.1
rust release. Reorganize bootstrap binaries to match new "rust" package
structure with two ouputs "out" with rust compiler and "cargo" with cargo
package manager. Replace all "system*" with "invoke".
(rust-1.23): Rename "rustc" to "rust". Update sha256 for tarball. Add cargo
related dependencies. Install "cargo" as separate "rust" output. Remove
substitutes for parts that was fixed in "rustc" source code. Install
documentation to separate "doc" output. Update configuration according to
changes in "rustc" source code. Replace all "system*" with "invoke".
(rust): Create package for 1.24.1 rust release based on rust-1.23 release.
* guix/build-system/cargo.scm (default-rust): Replace "default-cargo" and
"default-rustc" functions with "default-rust" function.
(cargo-build-system): Take only one package as "rust" source. Use "rustc" from
default output of "rust" package, use "cargo" as "cargo" output of "rust"
package.

Cargo was moved from separate package to "rust" output because starting from
0.25.0 release cargo have no "Cargo.lock" anymore. According to
https://github.com/rust-lang/cargo/commit/5c9665f41c6b4d3b99d3b9f8b48a286f5f154692
commit message "cargo" used as "rust" dependency and stable version for
"cargo" provided through "Cargo.lock" file from "rust-lang/rust"
repository. As result only way to get stable version of cargo is build it from
"rust" sources.
---
 gnu/packages/rust.scm       | 1374 ++++---------------------------------------
 guix/build-system/cargo.scm |   21 +-
 2 files changed, 127 insertions(+), 1268 deletions(-)

diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index 7d0eb7087..70140579b 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2016 Eric Le Bihan <address@hidden>
 ;;; Copyright © 2016 Nils Gillmann <address@hidden>
 ;;; Copyright © 2017 Ben Woodcroft <address@hidden>
-;;; Copyright © 2017 Nikolai Merinov <address@hidden>
+;;; Copyright © 2017, 2018 Nikolai Merinov <address@hidden>
 ;;; Copyright © 2017 Efraim Flashner <address@hidden>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <address@hidden>
 ;;;
@@ -46,71 +46,48 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
   #:use-module (guix download)
-  #:use-module (guix base16)      ;for generated "cargo" native-inputs
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
+  #:use-module ((guix build utils) #:select (alist-replace))
+  #:use-module (guix utils)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-26))
 
-;; Should be one less than the current released version.
-(define %rust-bootstrap-binaries-version "1.21.0")
-
-(define %rust-bootstrap-binaries
-  (origin
-    (method url-fetch)
-    (uri (string-append
-          "https://static.rust-lang.org/dist/";
-          "rust-" %rust-bootstrap-binaries-version
-          "-" %host-type ".tar.gz"))
-    (sha256
-     (base32
-      (match %host-type
-        ("i686-unknown-linux-gnu"
-         "1vnvqwz30hvyjcfr1f602lg43v2vlqjr3yhb5vr8xnrcc07yvjmp")
-        ("x86_64-unknown-linux-gnu"
-         "1s0866qcy0645bqhsbs3pvk2hi52ps8jzs7x096w0as033h707ml")
-        ("armv7-unknown-linux-gnueabihf"
-         "1ml8fjq2b6j2vn1j314w93pf4wjl97n1mbz609h3i7md0zqscvs1")
-        ("aarch64-unknown-linux-gnu"
-         "1hv4m2m7xjcph39r6baryfg23hjcr4sbsrfnd1lh0wn67k2fc7j9")
-        ("mips64el-unknown-linux-gnuabi64"
-         "0p7fzkfcqg5yvj86v434z351dp7s7pgns8nzxj0fz3hmbfbvlvn9")
-        (_ "")))))) ; Catch-all for other systems.
-
 (define %cargo-reference-project-file "/dev/null")
 (define %cargo-reference-hash
   "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
 
-(define (increment-rust-version rust-version major patch)
-  (match (string-split rust-version #\.)
-    (("1" minor _)
-     (string-append (number->string major) "."
-                    (number->string (+ (string->number minor) 1)) "."
-                    (number->string patch)))))
-
-(define* (cargo-version rustc-version #:optional (patch 0))
-  ;; Computes the cargo version that matches the rustc version.
-  ;; This has so far continued to follow a predictable pattern:
-  ;; https://github.com/rust-lang/cargo/blob/50a46f47/README.md#releases
-  (increment-rust-version rustc-version 0 patch))
-
-(define* (rustc-version bootstrap-version #:optional (patch 0))
-  ;; Computes the rustc version that can be compiled from a given
-  ;; other rustc version. The patch argument is for selecting
-  ;; a stability or security fix. 1.11.0 -> 1.12.1 -> 1.13.0
-  (increment-rust-version bootstrap-version 1 patch))
-
-(define rustc-bootstrap
+(define rust-bootstrap
   (package
-    (name "rustc-bootstrap")
-    (version %rust-bootstrap-binaries-version)
-    (source %rust-bootstrap-binaries)
+    (name "rust-bootstrap")
+    (version "1.22.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://static.rust-lang.org/dist/";
+                    "rust-" version "-" %host-type ".tar.gz"))
+              (sha256
+               (base32
+                (match %host-type
+                  ("i686-unknown-linux-gnu"
+                   "15zqbx86nm13d5vq2gm69b7av4vg479f74b5by64hs3bcwwm08pr")
+                  ("x86_64-unknown-linux-gnu"
+                   "1yll78x6b3abnvgjf2b66gvp6mmcb9y9jdiqcwhmgc0z0i0fix4c")
+                  ("armv7-unknown-linux-gnueabihf"
+                   "138a8l528kzp5wyk1mgjaxs304ac5ms8vlpq0ggjaznm6bn2j7a5")
+                  ("aarch64-unknown-linux-gnu"
+                   "0z6m9m1rx4d96nvybbfmpscq4dv616m615ijy16d5wh2vx0p4na8")
+                  ("mips64el-unknown-linux-gnuabi64"
+                   "07k4pcv7jvfa48cscdj8752lby7m7xdl88v3a6na1vs675lhgja2")
+                  (_ ""))))))
     (build-system gnu-build-system)
     (native-inputs
      `(("patchelf" ,patchelf)))
     (inputs
-     `(("gcc:lib" ,(canonical-package gcc) "lib")
+     `(("gcc" ,(canonical-package gcc))
+       ("gcc:lib" ,(canonical-package gcc) "lib")
        ("zlib" ,zlib)))
+    (outputs '("out" "cargo"))
     (arguments
      `(#:tests? #f
        #:strip-binaries? #f
@@ -121,115 +98,63 @@
          (replace 'install
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
+                    (cargo-out (assoc-ref outputs "cargo"))
                     (gcc:lib (assoc-ref inputs "gcc:lib"))
                     (libc (assoc-ref inputs "libc"))
                     (zlib (assoc-ref inputs "zlib"))
                     (ld-so (string-append libc ,(glibc-dynamic-linker)))
                     (rpath (string-append out "/lib:" zlib "/lib:"
                                           libc "/lib:" gcc:lib "/lib"))
+                    (cargo-rpath (string-append cargo-out "/lib:" libc "/lib:"
+                                                gcc:lib "/lib"))
                     (rustc (string-append out "/bin/rustc"))
-                    (rustdoc (string-append out "/bin/rustdoc")))
-               (system* "bash" "install.sh"
+                    (rustdoc (string-append out "/bin/rustdoc"))
+                    (cargo (string-append cargo-out "/bin/cargo"))
+                    (gcc (assoc-ref inputs "gcc")))
+               ;; Install rustc/rustdoc
+               (invoke "bash" "install.sh"
                         (string-append "--prefix=" out)
                         (string-append "--components=rustc,"
                                        "rust-std-" %host-type))
+               ;; Instal cargo
+               (invoke "bash" "install.sh"
+                        (string-append "--prefix=" cargo-out)
+                        (string-append "--components=cargo"))
                (for-each (lambda (file)
-                           (system* "patchelf" "--set-rpath" rpath file))
+                           (invoke "patchelf" "--set-rpath" rpath file))
                          (cons* rustc rustdoc (find-files out "\\.so$")))
+               (invoke "patchelf" "--set-rpath" cargo-rpath cargo)
                (for-each (lambda (file)
-                           (system* "patchelf" "--set-interpreter" ld-so file))
-                         (list rustc rustdoc))))))))
-    (home-page "https://www.rust-lang.org";)
-    (synopsis "Prebuilt rust compiler")
-    (description "This package provides a pre-built @command{rustc} compiler,
-which can in turn be used to build the final Rust compiler.")
-    (license license:asl2.0)))
-
-(define cargo-bootstrap
-  (package
-    (name "cargo-bootstrap")
-    (version (cargo-version %rust-bootstrap-binaries-version 1))
-    (source %rust-bootstrap-binaries)
-    (build-system gnu-build-system)
-    (native-inputs
-     `(("patchelf" ,patchelf)))
-    (inputs
-     `(("gcc:lib" ,(canonical-package gcc) "lib")))
-    (arguments
-     `(#:tests? #f
-       #:strip-binaries? #f
-       #:phases
-       (modify-phases %standard-phases
-         (delete 'configure)
-         (delete 'build)
-         (replace 'install
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (gcc:lib (assoc-ref inputs "gcc:lib"))
-                    (libc (assoc-ref inputs "libc"))
-                    (ld-so (string-append libc ,(glibc-dynamic-linker)))
-                    (rpath (string-append out "/lib:" libc "/lib:"
-                                          gcc:lib "/lib"))
-                    (cargo (string-append out "/bin/cargo")))
-               (system* "bash" "install.sh"
-                        (string-append "--prefix=" out)
-                        "--components=cargo")
-               (system* "patchelf"
-                        "--set-interpreter" ld-so
-                        "--set-rpath" rpath
-                        cargo)))))))
+                           (invoke "patchelf" "--set-interpreter" ld-so file))
+                         (list rustc rustdoc cargo))
+               ;; Rust requires a C toolchain for linking. The prebuilt
+               ;; binaries expect a compiler called cc. Thus symlink gcc
+               ;; to cc.
+               (symlink (string-append gcc "/bin/gcc")
+                        (string-append out "/bin/cc"))
+               #t))))))
     (home-page "https://www.rust-lang.org";)
-    (synopsis "Prebuilt cargo package manager")
-    (description "This package provides a pre-built @command{cargo} package
-manager, which is required to build itself.")
+    (synopsis "Prebuilt rust compiler and cargo package manager")
+    (description "This package provides a pre-built @command{rustc} compiler
+and a pre-built @command{cargo} package manaer, which can
+in turn be used to build the final Rust.")
     (license license:asl2.0)))
 
-(define rust-bootstrap
-  (package
-    (name "rust-bootstrap")
-    (version %rust-bootstrap-binaries-version)
-    (source #f)
-    (build-system trivial-build-system)
-    (propagated-inputs
-     `(("rustc-bootstrap" ,rustc-bootstrap)
-       ("cargo-bootstrap" ,cargo-bootstrap)
-       ("gcc" ,(canonical-package gcc))))
-    (arguments
-     `(#:modules ((guix build utils))
-       #:builder
-       (begin
-         (use-modules (guix build utils))
-         (let ((out (assoc-ref %outputs "out"))
-               (gcc (assoc-ref %build-inputs "gcc")))
-           (mkdir-p (string-append out "/bin"))
-           ;; Rust requires a C toolchain for linking. The prebuilt
-           ;; binaries expect a compiler called cc. Thus symlink gcc
-           ;; to cc.
-           (symlink (string-append gcc "/bin/gcc")
-                    (string-append out "/bin/cc"))))))
-    (home-page "https://www.rust-lang.org";)
-    (synopsis "Rust bootstrapping meta package")
-    (description "Meta package for a rust environment. Provides pre-compiled
-rustc-bootstrap and cargo-bootstrap packages.")
-    (license license:asl2.0)))

-(define-public rustc
+(define (rust-source version hash)
+  (origin
+    (method url-fetch)
+    (uri (string-append "https://static.rust-lang.org/dist/";
+                        "rustc-" version "-src.tar.gz"))
+    (sha256 (base32 hash))
+    (modules '((guix build utils)))
+    (snippet '(begin (delete-file-recursively "src/llvm") #t))))
+
+(define-public rust-1.23
   (package
-    (name "rustc")
-    (version (rustc-version %rust-bootstrap-binaries-version 1))
-    (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://static.rust-lang.org/dist/";
-                    "rustc-" version "-src.tar.gz"))
-              (sha256
-               (base32
-                "1lrzzp0nh7s61wgfs2h6ilaqi6iq89f1pd1yaf65l87bssyl4ylb"))
-              (modules '((guix build utils)))
-              (snippet
-               `(begin
-                  (delete-file-recursively "src/llvm")
-                  #t))))
+    (name "rust")
+    (version "1.23.0")
+    (source (rust-source version 
"14fb8vhjzsxlbi6yrn1r6fl5dlbdd1m92dn5zj5gmzfwf4w9ar3l"))
     (build-system gnu-build-system)
     (native-inputs
      `(("bison" ,bison) ; For the tests
@@ -239,11 +164,16 @@ rustc-bootstrap and cargo-bootstrap packages.")
        ("git" ,git)
        ("procps" ,procps) ; For the tests
        ("python-2" ,python-2)
-       ("rust-bootstrap" ,rust-bootstrap)
+       ("rustc-bootstrap" ,rust-bootstrap)
+       ("cargo-bootstrap" ,rust-bootstrap "cargo")
+       ("pkg-config" ,pkg-config) ; For "cargo"
        ("which" ,which)))
     (inputs
      `(("jemalloc" ,jemalloc-4.5.0)
-       ("llvm" ,llvm-3.9.1)))
+       ("llvm" ,llvm-3.9.1)
+       ("openssl" ,openssl)
+       ("libcurl" ,curl))) ; For "cargo"
+    (outputs '("out" "doc" "cargo"))
     (arguments
      `(#:imported-modules ,%cargo-build-system-modules ;for 
`generate-checksums'
        #:phases
@@ -258,9 +188,6 @@ rustc-bootstrap and cargo-bootstrap packages.")
          (add-after 'unpack 'patch-tests
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((bash (assoc-ref inputs "bash")))
-               (substitute* "src/build_helper/lib.rs"
-                 ;; In same folder as gcc there is only "gcc-ar" utility
-                 (("file\\.push_str\\(\"ar\"\\);") 
"file.push_str(\"gcc-ar\");"))
                (substitute* "src/libstd/process.rs"
                  ;; The newline is intentional.
                  ;; There's a line length "tidy" check in Rust which would
@@ -276,15 +203,18 @@ rustc-bootstrap and cargo-bootstrap packages.")
                ;; Our ld-wrapper cannot process non-UTF8 bytes in LIBRARY_PATH.
                ;; 
<https://lists.gnu.org/archive/html/guix-devel/2017-06/msg00193.html>
                (delete-file-recursively 
"src/test/run-make/linker-output-non-utf8")
-               (substitute* "src/build_helper/lib.rs"
-                 ;; Bug in Rust code.
-                 ;; Current implementation assume that if dst not exist then 
it's mtime
-                 ;; is 0, but in same time "src" have 0 mtime in guix build!
-                 (("let threshold = mtime\\(dst\\);")
-                  "if !dst.exists() {\nreturn false\n}\n let threshold = 
mtime(dst);"))
                #t)))
+         (add-after 'patch-tests 'fix-mtime-bug
+           (lambda* _
+             (substitute* "src/build_helper/lib.rs"
+               ;; Bug in Rust code.
+               ;; Current implementation assume that if dst not exist then 
it's mtime
+               ;; is 0, but in same time "src" have 0 mtime in guix build!
+               (("let threshold = mtime\\(dst\\);")
+                "if !dst.exists() {\nreturn false\n}\n let threshold = 
mtime(dst);"))
+             #t))
          (add-after 'patch-source-shebangs 'patch-cargo-checksums
-           (lambda* (#:key inputs #:allow-other-keys)
+           (lambda* _
              (substitute* "src/Cargo.lock"
                (("(\"checksum .* = )\".*\"" all name)
                 (string-append name "\"" ,%cargo-reference-hash "\"")))
@@ -302,6 +232,7 @@ rustc-bootstrap and cargo-bootstrap packages.")
          (replace 'configure
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
+                    (doc (assoc-ref outputs "doc"))
                     (gcc (assoc-ref inputs "gcc"))
                     (gdb (assoc-ref inputs "gdb"))
                     (binutils (assoc-ref inputs "binutils"))
@@ -317,15 +248,18 @@ rustc-bootstrap and cargo-bootstrap packages.")
 [build]
 cargo = \"" cargo "/bin/cargo" "\"
 rustc = \"" rustc "/bin/rustc" "\"
+docs = true
 python = \"" python "/bin/python2" "\"
 gdb = \"" gdb "/bin/gdb" "\"
 vendor = true
 submodules = false
 [install]
 prefix = \"" out "\"
+docdir = \"" doc "/share/doc/rust" "\"
+sysconfdir = \"etc\"
+localstatedir = \"var/lib\"
 [rust]
 default-linker = \"" gcc "/bin/gcc" "\"
-default-ar = \"" binutils "/bin/ar" "\"
 channel = \"stable\"
 rpath = true
 # There is 2 failed codegen tests:
@@ -336,12 +270,13 @@ codegen-tests = false
 llvm-config = \"" llvm "/bin/llvm-config" "\"
 cc = \"" gcc "/bin/gcc" "\"
 cxx = \"" gcc "/bin/g++" "\"
+ar = \"" binutils "/bin/ar" "\"
 jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
 [dist]
 ") port)))
                #t)))
          (add-before 'build 'reset-timestamps-after-changes
-           (lambda* (#:key inputs outputs #:allow-other-keys)
+           (lambda* _
              (define ref (stat "README.md"))
              (for-each
               (lambda (filename)
@@ -349,14 +284,21 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
               (find-files "." #:directories? #t))
              #t))
          (replace 'build
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (zero? (system* "./x.py" "build"))))
+           (lambda* _
+             (invoke "./x.py" "build")
+             (invoke "./x.py" "build" "src/tools/cargo")))
          (replace 'check
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (zero? (system* "./x.py" "test"))))
+           (lambda* _
+             (invoke "./x.py" "test")))
          (replace 'install
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (zero? (system* "./x.py" "install"))))
+           (lambda* (#:key outputs #:allow-other-keys)
+             (invoke "./x.py" "install")
+             (substitute* "config.toml"
+               ;; replace prefix to specific output
+               (("prefix = \"[^\"]*\"")
+                (string-append "prefix = \"" (assoc-ref outputs "cargo") 
"\"")))
+             (invoke "./x.py" "install" "cargo")
+             #t))
          (add-after 'install 'wrap-rustc
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out"))
@@ -376,1095 +318,19 @@ safety and thread safety guarantees.")
     ;; Dual licensed.
     (license (list license:asl2.0 license:expat))))
 
-;; This tries very hard not to get into a cyclic dependency like this:
-;;   cargo <- cargo-build-system <- cargo.
-(define-public cargo
-  (package
-    (name "cargo")
-    (version (cargo-version (rustc-version %rust-bootstrap-binaries-version) 
0))
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "https://github.com/rust-lang/cargo/archive/";
-                                  version ".tar.gz"))
-              (file-name (string-append name "-" version ".tar.gz"))
-              (sha256
-               (base32
-                "0kr7rml7v2bm7zl8jcb3056h63zpyy9m08s212i8vfwxf6lf5fzl"))))
-    (build-system cargo-build-system)
-    (propagated-inputs
-     `(("cmake" ,cmake)
-       ("pkg-config" ,pkg-config)))
-    (inputs
-     `(("curl" ,curl)
-       ("libgit2" ,libgit2)
-       ("libssh2" ,libssh2)
-       ("openssl" ,openssl)
-       ("python-2" ,python-2)
-       ("zlib" ,zlib)))
-    (native-inputs
-     `(("git" ,git) ; required for tests
-       ;; Next dependencies generated with next command:
-       ;; cat Cargo.lock | awk '
-       ;;   /^"checksum/
-       ;;   { oname=name=$2; vers=$3; hash=$6;
-       ;;     if (ns[name] != 1) { ns[name]=1; } else { name = name "-" vers; }
-       ;;     print "       (\"rust-" name "\"";
-       ;;     print "        ,(origin";
-       ;;     print "           (method url-fetch)";
-       ;;     print "           (uri (crate-uri \"" oname "\" \"" vers "\"))";
-       ;;     print "           (file-name \"rust-" oname "\-\" vers "\")
-       ;;     print "           (sha256";
-       ;;     print "            (base16-string->bytevector";
-       ;;     print "             " hash "))))"
-       ;;   }'
-       ("rust-advapi32-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "advapi32-sys" "0.2.0"))
-           (file-name "rust-advapi32-sys-0.2.0")
-           (sha256
-            (base16-string->bytevector
-             
"e06588080cb19d0acb6739808aafa5f26bfb2ca015b2b6370028b44cf7cb8a9a"))))
-       ("rust-aho-corasick"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "aho-corasick" "0.5.3"))
-           (file-name "rust-aho-corasick-0.5.3")
-           (sha256
-            (base16-string->bytevector
-             
"ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"))))
-       ("rust-aho-corasick-0.6.3"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "aho-corasick" "0.6.3"))
-           (file-name "rust-aho-corasick-0.6.3")
-           (sha256
-            (base16-string->bytevector
-             
"500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"))))
-       ("rust-atty"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "atty" "0.2.3"))
-           (file-name "rust-atty-0.2.3")
-           (sha256
-            (base16-string->bytevector
-             
"21e50800ec991574876040fff8ee46b136a53e985286fbe6a3bdfe6421b78860"))))
-       ("rust-backtrace"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "backtrace" "0.3.3"))
-           (file-name "rust-backtrace-0.3.3")
-           (sha256
-            (base16-string->bytevector
-             
"99f2ce94e22b8e664d95c57fff45b98a966c2252b60691d0b7aeeccd88d70983"))))
-       ("rust-backtrace-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "backtrace-sys" "0.1.14"))
-           (file-name "rust-backtrace-sys-0.1.14")
-           (sha256
-            (base16-string->bytevector
-             
"c63ea141ef8fdb10409d0f5daf30ac51f84ef43bff66f16627773d2a292cd189"))))
-       ("rust-bitflags"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "bitflags" "0.7.0"))
-           (file-name "rust-bitflags-0.7.0")
-           (sha256
-            (base16-string->bytevector
-             
"aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"))))
-       ("rust-bitflags-0.9.1"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "bitflags" "0.9.1"))
-           (file-name "rust-bitflags-0.9.1")
-           (sha256
-            (base16-string->bytevector
-             
"4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"))))
-       ("rust-bufstream"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "bufstream" "0.1.3"))
-           (file-name "rust-bufstream-0.1.3")
-           (sha256
-            (base16-string->bytevector
-             
"f2f382711e76b9de6c744cc00d0497baba02fb00a787f088c879f01d09468e32"))))
-       ("rust-cc"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "cc" "1.0.0"))
-           (file-name "rust-cc-1.0.0")
-           (sha256
-            (base16-string->bytevector
-             
"7db2f146208d7e0fbee761b09cd65a7f51ccc38705d4e7262dad4d73b12a76b1"))))
-       ("rust-cfg-if"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "cfg-if" "0.1.2"))
-           (file-name "rust-cfg-if-0.1.2")
-           (sha256
-            (base16-string->bytevector
-             
"d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"))))
-       ("rust-cmake"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "cmake" "0.1.26"))
-           (file-name "rust-cmake-0.1.26")
-           (sha256
-            (base16-string->bytevector
-             
"357c07e7a1fc95732793c1edb5901e1a1f305cfcf63a90eb12dbd22bdb6b789d"))))
-       ("rust-commoncrypto"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "commoncrypto" "0.2.0"))
-           (file-name "rust-commoncrypto-0.2.0")
-           (sha256
-            (base16-string->bytevector
-             
"d056a8586ba25a1e4d61cb090900e495952c7886786fc55f909ab2f819b69007"))))
-       ("rust-commoncrypto-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "commoncrypto-sys" "0.2.0"))
-           (file-name "rust-commoncrypto-sys-0.2.0")
-           (sha256
-            (base16-string->bytevector
-             
"1fed34f46747aa73dfaa578069fd8279d2818ade2b55f38f22a9401c7f4083e2"))))
-       ("rust-conv"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "conv" "0.3.3"))
-           (file-name "rust-conv-0.3.3")
-           (sha256
-            (base16-string->bytevector
-             
"78ff10625fd0ac447827aa30ea8b861fead473bb60aeb73af6c1c58caf0d1299"))))
-       ("rust-core-foundation"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "core-foundation" "0.4.4"))
-           (file-name "rust-core-foundation-0.4.4")
-           (sha256
-            (base16-string->bytevector
-             
"5909502e547762013619f4c4e01cc7393c20fe2d52d7fa471c1210adb2320dc7"))))
-       ("rust-core-foundation-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "core-foundation-sys" "0.4.4"))
-           (file-name "rust-core-foundation-sys-0.4.4")
-           (sha256
-            (base16-string->bytevector
-             
"bc9fb3d6cb663e6fd7cf1c63f9b144ee2b1e4a78595a0451dd34bff85b9a3387"))))
-       ("rust-crossbeam"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "crossbeam" "0.2.10"))
-           (file-name "rust-crossbeam-0.2.10")
-           (sha256
-            (base16-string->bytevector
-             
"0c5ea215664ca264da8a9d9c3be80d2eaf30923c259d03e870388eb927508f97"))))
-       ("rust-crossbeam-0.3.0"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "crossbeam" "0.3.0"))
-           (file-name "rust-crossbeam-0.3.0")
-           (sha256
-            (base16-string->bytevector
-             
"8837ab96533202c5b610ed44bc7f4183e7957c1c8f56e8cc78bb098593c8ba0a"))))
-       ("rust-crypto-hash"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "crypto-hash" "0.3.0"))
-           (file-name "rust-crypto-hash-0.3.0")
-           (sha256
-            (base16-string->bytevector
-             
"34903878eec1694faf53cae8473a088df333181de421d4d3d48061d6559fe602"))))
-       ("rust-curl"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "curl" "0.4.8"))
-           (file-name "rust-curl-0.4.8")
-           (sha256
-            (base16-string->bytevector
-             
"7034c534a1d7d22f7971d6088aa9d281d219ef724026c3428092500f41ae9c2c"))))
-       ("rust-curl-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "curl-sys" "0.3.15"))
-           (file-name "rust-curl-sys-0.3.15")
-           (sha256
-            (base16-string->bytevector
-             
"4bee31aa3a079d5f3ff9579ea4dcfb1b1a17a40886f5f467436d383e78134b55"))))
-       ("rust-custom_derive"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "custom_derive" "0.1.7"))
-           (file-name "rust-custom_derive-0.1.7")
-           (sha256
-            (base16-string->bytevector
-             
"ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9"))))
-       ("rust-dbghelp-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "dbghelp-sys" "0.2.0"))
-           (file-name "rust-dbghelp-sys-0.2.0")
-           (sha256
-            (base16-string->bytevector
-             
"97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850"))))
-       ("rust-docopt"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "docopt" "0.8.1"))
-           (file-name "rust-docopt-0.8.1")
-           (sha256
-            (base16-string->bytevector
-             
"3b5b93718f8b3e5544fcc914c43de828ca6c6ace23e0332c6080a2977b49787a"))))
-       ("rust-dtoa"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "dtoa" "0.4.2"))
-           (file-name "rust-dtoa-0.4.2")
-           (sha256
-            (base16-string->bytevector
-             
"09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"))))
-       ("rust-env_logger"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "env_logger" "0.4.3"))
-           (file-name "rust-env_logger-0.4.3")
-           (sha256
-            (base16-string->bytevector
-             
"3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b"))))
-       ("rust-error-chain"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "error-chain" "0.11.0"))
-           (file-name "rust-error-chain-0.11.0")
-           (sha256
-            (base16-string->bytevector
-             
"ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3"))))
-       ("rust-filetime"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "filetime" "0.1.12"))
-           (file-name "rust-filetime-0.1.12")
-           (sha256
-            (base16-string->bytevector
-             
"6ab199bf38537c6f38792669e081e0bb278b9b7405bba2642e4e5d15bf732c0e"))))
-       ("rust-flate2"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "flate2" "0.2.20"))
-           (file-name "rust-flate2-0.2.20")
-           (sha256
-            (base16-string->bytevector
-             
"e6234dd4468ae5d1e2dbb06fe2b058696fdc50a339c68a393aefbf00bc81e423"))))
-       ("rust-fnv"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "fnv" "1.0.5"))
-           (file-name "rust-fnv-1.0.5")
-           (sha256
-            (base16-string->bytevector
-             
"6cc484842f1e2884faf56f529f960cc12ad8c71ce96cc7abba0a067c98fee344"))))
-       ("rust-foreign-types"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "foreign-types" "0.2.0"))
-           (file-name "rust-foreign-types-0.2.0")
-           (sha256
-            (base16-string->bytevector
-             
"3e4056b9bd47f8ac5ba12be771f77a0dae796d1bbaaf5fd0b9c2d38b69b8a29d"))))
-       ("rust-fs2"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "fs2" "0.4.2"))
-           (file-name "rust-fs2-0.4.2")
-           (sha256
-            (base16-string->bytevector
-             
"9ab76cfd2aaa59b7bf6688ad9ba15bbae64bff97f04ea02144cfd3443e5c2866"))))
-       ("rust-git2"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "git2" "0.6.8"))
-           (file-name "rust-git2-0.6.8")
-           (sha256
-            (base16-string->bytevector
-             
"0c1c0203d653f4140241da0c1375a404f0a397249ec818cd2076c6280c50f6fa"))))
-       ("rust-git2-curl"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "git2-curl" "0.7.0"))
-           (file-name "rust-git2-curl-0.7.0")
-           (sha256
-            (base16-string->bytevector
-             
"68676bc784bf0bef83278898929bf64a251e87c0340723d0b93fa096c9c5bf8e"))))
-       ("rust-glob"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "glob" "0.2.11"))
-           (file-name "rust-glob-0.2.11")
-           (sha256
-            (base16-string->bytevector
-             
"8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"))))
-       ("rust-globset"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "globset" "0.2.0"))
-           (file-name "rust-globset-0.2.0")
-           (sha256
-            (base16-string->bytevector
-             
"feeb1b6840809ef5efcf7a4a990bc4e1b7ee3df8cf9e2379a75aeb2ba42ac9c3"))))
-       ("rust-hamcrest"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "hamcrest" "0.1.1"))
-           (file-name "rust-hamcrest-0.1.1")
-           (sha256
-            (base16-string->bytevector
-             
"bf088f042a467089e9baa4972f57f9247e42a0cc549ba264c7a04fbb8ecb89d4"))))
-       ("rust-hex"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "hex" "0.2.0"))
-           (file-name "rust-hex-0.2.0")
-           (sha256
-            (base16-string->bytevector
-             
"d6a22814455d41612f41161581c2883c0c6a1c41852729b17d5ed88f01e153aa"))))
-       ("rust-home"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "home" "0.3.0"))
-           (file-name "rust-home-0.3.0")
-           (sha256
-            (base16-string->bytevector
-             
"9f25ae61099d8f3fee8b483df0bd4ecccf4b2731897aad40d50eca1b641fe6db"))))
-       ("rust-idna"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "idna" "0.1.4"))
-           (file-name "rust-idna-0.1.4")
-           (sha256
-            (base16-string->bytevector
-             
"014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"))))
-       ("rust-ignore"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "ignore" "0.2.2"))
-           (file-name "rust-ignore-0.2.2")
-           (sha256
-            (base16-string->bytevector
-             
"b3fcaf2365eb14b28ec7603c98c06cc531f19de9eb283d89a3dff8417c8c99f5"))))
-       ("rust-itoa"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "itoa" "0.3.4"))
-           (file-name "rust-itoa-0.3.4")
-           (sha256
-            (base16-string->bytevector
-             
"8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c"))))
-       ("rust-jobserver"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "jobserver" "0.1.6"))
-           (file-name "rust-jobserver-0.1.6")
-           (sha256
-            (base16-string->bytevector
-             
"443ae8bc0af6c106e6e8b77e04684faecc1a5ce94e058f4c2b0a037b0ea1b133"))))
-       ("rust-kernel32-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "kernel32-sys" "0.2.2"))
-           (file-name "rust-kernel32-sys-0.2.2")
-           (sha256
-            (base16-string->bytevector
-             
"7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"))))
-       ("rust-lazy_static"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "lazy_static" "0.2.9"))
-           (file-name "rust-lazy_static-0.2.9")
-           (sha256
-            (base16-string->bytevector
-             
"c9e5e58fa1a4c3b915a561a78a22ee0cac6ab97dca2504428bc1cb074375f8d5"))))
-       ("rust-libc"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "libc" "0.2.31"))
-           (file-name "rust-libc-0.2.31")
-           (sha256
-            (base16-string->bytevector
-             
"d1419b2939a0bc44b77feb34661583c7546b532b192feab36249ab584b86856c"))))
-       ("rust-libgit2-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "libgit2-sys" "0.6.16"))
-           (file-name "rust-libgit2-sys-0.6.16")
-           (sha256
-            (base16-string->bytevector
-             
"6f74b4959cef96898f5123148724fc7dee043b9a6b99f219d948851bfbe53cb2"))))
-       ("rust-libssh2-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "libssh2-sys" "0.2.6"))
-           (file-name "rust-libssh2-sys-0.2.6")
-           (sha256
-            (base16-string->bytevector
-             
"0db4ec23611747ef772db1c4d650f8bd762f07b461727ec998f953c614024b75"))))
-       ("rust-libz-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "libz-sys" "1.0.17"))
-           (file-name "rust-libz-sys-1.0.17")
-           (sha256
-            (base16-string->bytevector
-             
"44ebbc760fd2d2f4d93de09a0e13d97e057612052e871da9985cedcb451e6bd5"))))
-       ("rust-log"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "log" "0.3.8"))
-           (file-name "rust-log-0.3.8")
-           (sha256
-            (base16-string->bytevector
-             
"880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"))))
-       ("rust-magenta"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "magenta" "0.1.1"))
-           (file-name "rust-magenta-0.1.1")
-           (sha256
-            (base16-string->bytevector
-             
"4bf0336886480e671965f794bc9b6fce88503563013d1bfb7a502c81fe3ac527"))))
-       ("rust-magenta-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "magenta-sys" "0.1.1"))
-           (file-name "rust-magenta-sys-0.1.1")
-           (sha256
-            (base16-string->bytevector
-             
"40d014c7011ac470ae28e2f76a02bfea4a8480f73e701353b49ad7a8d75f4699"))))
-       ("rust-matches"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "matches" "0.1.6"))
-           (file-name "rust-matches-0.1.6")
-           (sha256
-            (base16-string->bytevector
-             
"100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376"))))
-       ("rust-memchr"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "memchr" "0.1.11"))
-           (file-name "rust-memchr-0.1.11")
-           (sha256
-            (base16-string->bytevector
-             
"d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"))))
-       ("rust-memchr-1.0.1"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "memchr" "1.0.1"))
-           (file-name "rust-memchr-1.0.1")
-           (sha256
-            (base16-string->bytevector
-             
"1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4"))))
-       ("rust-miniz-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "miniz-sys" "0.1.10"))
-           (file-name "rust-miniz-sys-0.1.10")
-           (sha256
-            (base16-string->bytevector
-             
"609ce024854aeb19a0ef7567d348aaa5a746b32fb72e336df7fcc16869d7e2b4"))))
-       ("rust-miow"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "miow" "0.2.1"))
-           (file-name "rust-miow-0.2.1")
-           (sha256
-            (base16-string->bytevector
-             
"8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"))))
-       ("rust-net2"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "net2" "0.2.31"))
-           (file-name "rust-net2-0.2.31")
-           (sha256
-            (base16-string->bytevector
-             
"3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09"))))
-       ("rust-num"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "num" "0.1.40"))
-           (file-name "rust-num-0.1.40")
-           (sha256
-            (base16-string->bytevector
-             
"a311b77ebdc5dd4cf6449d81e4135d9f0e3b153839ac90e648a8ef538f923525"))))
-       ("rust-num-bigint"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "num-bigint" "0.1.40"))
-           (file-name "rust-num-bigint-0.1.40")
-           (sha256
-            (base16-string->bytevector
-             
"8fd0f8dbb4c0960998958a796281d88c16fbe68d87b1baa6f31e2979e81fd0bd"))))
-       ("rust-num-complex"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "num-complex" "0.1.40"))
-           (file-name "rust-num-complex-0.1.40")
-           (sha256
-            (base16-string->bytevector
-             
"503e668405c5492d67cf662a81e05be40efe2e6bcf10f7794a07bd9865e704e6"))))
-       ("rust-num-integer"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "num-integer" "0.1.35"))
-           (file-name "rust-num-integer-0.1.35")
-           (sha256
-            (base16-string->bytevector
-             
"d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba"))))
-       ("rust-num-iter"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "num-iter" "0.1.34"))
-           (file-name "rust-num-iter-0.1.34")
-           (sha256
-            (base16-string->bytevector
-             
"7485fcc84f85b4ecd0ea527b14189281cf27d60e583ae65ebc9c088b13dffe01"))))
-       ("rust-num-rational"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "num-rational" "0.1.39"))
-           (file-name "rust-num-rational-0.1.39")
-           (sha256
-            (base16-string->bytevector
-             
"288629c76fac4b33556f4b7ab57ba21ae202da65ba8b77466e6d598e31990790"))))
-       ("rust-num-traits"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "num-traits" "0.1.40"))
-           (file-name "rust-num-traits-0.1.40")
-           (sha256
-            (base16-string->bytevector
-             
"99843c856d68d8b4313b03a17e33c4bb42ae8f6610ea81b28abe076ac721b9b0"))))
-       ("rust-num_cpus"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "num_cpus" "1.7.0"))
-           (file-name "rust-num_cpus-1.7.0")
-           (sha256
-            (base16-string->bytevector
-             
"514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"))))
-       ("rust-openssl"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "openssl" "0.9.19"))
-           (file-name "rust-openssl-0.9.19")
-           (sha256
-            (base16-string->bytevector
-             
"816914b22eb15671d62c73442a51978f311e911d6a6f6cbdafa6abce1b5038fc"))))
-       ("rust-openssl-probe"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "openssl-probe" "0.1.1"))
-           (file-name "rust-openssl-probe-0.1.1")
-           (sha256
-            (base16-string->bytevector
-             
"d98df0270d404ccd3c050a41d579c52d1db15375168bb3471e04ec0f5f378daf"))))
-       ("rust-openssl-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "openssl-sys" "0.9.19"))
-           (file-name "rust-openssl-sys-0.9.19")
-           (sha256
-            (base16-string->bytevector
-             
"1e4c63a7d559c1e5afa6d6a9e6fa34bbc5f800ffc9ae08b72c605420b0c4f5e8"))))
-       ("rust-percent-encoding"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "percent-encoding" "1.0.0"))
-           (file-name "rust-precent-encoding-1.0.0")
-           (sha256
-            (base16-string->bytevector
-             
"de154f638187706bde41d9b4738748933d64e6b37bdbffc0b47a97d16a6ae356"))))
-       ("rust-pkg-config"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "pkg-config" "0.3.9"))
-           (file-name "rust-pkg-config-0.3.9")
-           (sha256
-            (base16-string->bytevector
-             
"3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"))))
-       ("rust-psapi-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "psapi-sys" "0.1.0"))
-           (file-name "rust-psapi-sys-0.1.0")
-           (sha256
-            (base16-string->bytevector
-             
"abcd5d1a07d360e29727f757a9decb3ce8bc6e0efa8969cfaad669a8317a2478"))))
-       ("rust-quote"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "quote" "0.3.15"))
-           (file-name "rust-quote-0.3.15")
-           (sha256
-            (base16-string->bytevector
-             
"7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"))))
-       ("rust-rand"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "rand" "0.3.16"))
-           (file-name "rust-rand-0.3.16")
-           (sha256
-            (base16-string->bytevector
-             
"eb250fd207a4729c976794d03db689c9be1d634ab5a1c9da9492a13d8fecbcdf"))))
-       ("rust-redox_syscall"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "redox_syscall" "0.1.31"))
-           (file-name "rust-redox_syscall-0.1.31")
-           (sha256
-            (base16-string->bytevector
-             
"8dde11f18c108289bef24469638a04dce49da56084f2d50618b226e47eb04509"))))
-       ("rust-redox_termios"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "redox_termios" "0.1.1"))
-           (file-name "rust-redox_termios-0.1.1")
-           (sha256
-            (base16-string->bytevector
-             
"7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"))))
-       ("rust-regex"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "regex" "0.1.80"))
-           (file-name "rust-regex-0.1.80")
-           (sha256
-            (base16-string->bytevector
-             
"4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"))))
-       ("rust-regex-0.2.2"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "regex" "0.2.2"))
-           (file-name "rust-regex-0.2.2")
-           (sha256
-            (base16-string->bytevector
-             
"1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"))))
-       ("rust-regex-syntax"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "regex-syntax" "0.3.9"))
-           (file-name "rust-regex-syntax-0.3.9")
-           (sha256
-            (base16-string->bytevector
-             
"f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"))))
-       ("rust-regex-syntax-0.4.1"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "regex-syntax" "0.4.1"))
-           (file-name "rust-regex-syntax-0.4.1")
-           (sha256
-            (base16-string->bytevector
-             
"ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"))))
-       ("rust-rustc-demangle"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "rustc-demangle" "0.1.5"))
-           (file-name "rust-rustc-demangle-0.1.5")
-           (sha256
-            (base16-string->bytevector
-             
"aee45432acc62f7b9a108cc054142dac51f979e69e71ddce7d6fc7adf29e817e"))))
-       ("rust-rustc-serialize"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "rustc-serialize" "0.3.24"))
-           (file-name "rust-rustc-serialize-0.3.24")
-           (sha256
-            (base16-string->bytevector
-             
"dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"))))
-       ("rust-same-file"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "same-file" "0.1.3"))
-           (file-name "rust-same-file-0.1.3")
-           (sha256
-            (base16-string->bytevector
-             
"d931a44fdaa43b8637009e7632a02adc4f2b2e0733c08caa4cf00e8da4a117a7"))))
-       ("rust-scoped-tls"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "scoped-tls" "0.1.0"))
-           (file-name "rust-scoped-tls-0.1.0")
-           (sha256
-            (base16-string->bytevector
-             
"f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d"))))
-       ("rust-scopeguard"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "scopeguard" "0.1.2"))
-           (file-name "rust-scopeguard-0.1.2")
-           (sha256
-            (base16-string->bytevector
-             
"59a076157c1e2dc561d8de585151ee6965d910dd4dcb5dabb7ae3e83981a6c57"))))
-       ("rust-semver"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "semver" "0.8.0"))
-           (file-name "rust-semver-0.8.0")
-           (sha256
-            (base16-string->bytevector
-             
"bee2bc909ab2d8d60dab26e8cad85b25d795b14603a0dcb627b78b9d30b6454b"))))
-       ("rust-semver-parser"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "semver-parser" "0.7.0"))
-           (file-name "rust-semver-parser-0.7.0")
-           (sha256
-            (base16-string->bytevector
-             
"388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"))))
-       ("rust-serde"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "serde" "1.0.15"))
-           (file-name "rust-serde-1.0.15")
-           (sha256
-            (base16-string->bytevector
-             
"6a7046c9d4c6c522d10b2d098f9bebe2bef227e0e74044d8c1bfcf6b476af799"))))
-       ("rust-serde_derive"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "serde_derive" "1.0.15"))
-           (file-name "rust-serde_derive-1.0.15")
-           (sha256
-            (base16-string->bytevector
-             
"1afcaae083fd1c46952a315062326bc9957f182358eb7da03b57ef1c688f7aa9"))))
-       ("rust-serde_derive_internals"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "serde_derive_internals" "0.16.0"))
-           (file-name "rust-serde_derive_internals-0.16.0")
-           (sha256
-            (base16-string->bytevector
-             
"bd381f6d01a6616cdba8530492d453b7761b456ba974e98768a18cad2cd76f58"))))
-       ("rust-serde_ignored"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "serde_ignored" "0.0.4"))
-           (file-name "rust-serde_ignored-0.0.4")
-           (sha256
-            (base16-string->bytevector
-             
"190e9765dcedb56be63b6e0993a006c7e3b071a016a304736e4a315dc01fb142"))))
-       ("rust-serde_json"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "serde_json" "1.0.3"))
-           (file-name "rust-serde_json-1.0.3")
-           (sha256
-            (base16-string->bytevector
-             
"d243424e06f9f9c39e3cd36147470fd340db785825e367625f79298a6ac6b7ac"))))
-       ("rust-shell-escape"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "shell-escape" "0.1.3"))
-           (file-name "rust-shell-escape-0.1.3")
-           (sha256
-            (base16-string->bytevector
-             
"dd5cc96481d54583947bfe88bf30c23d53f883c6cd0145368b69989d97b84ef8"))))
-       ("rust-socket2"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "socket2" "0.2.3"))
-           (file-name "rust-socket2-0.2.3")
-           (sha256
-            (base16-string->bytevector
-             
"9e76b159741052c7deaa9fd0b5ca6b5f79cecf525ed665abfe5002086c6b2791"))))
-       ("rust-strsim"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "strsim" "0.6.0"))
-           (file-name "rust-strsim-0.6.0")
-           (sha256
-            (base16-string->bytevector
-             
"b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"))))
-       ("rust-syn"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "syn" "0.11.11"))
-           (file-name "rust-syn-0.11.11")
-           (sha256
-            (base16-string->bytevector
-             
"d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"))))
-       ("rust-synom"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "synom" "0.11.3"))
-           (file-name "rust-synom-0.11.3")
-           (sha256
-            (base16-string->bytevector
-             
"a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"))))
-       ("rust-tar"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "tar" "0.4.13"))
-           (file-name "rust-tar-0.4.13")
-           (sha256
-            (base16-string->bytevector
-             
"281285b717926caa919ad905ef89c63d75805c7d89437fb873100925a53f2b1b"))))
-       ("rust-tempdir"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "tempdir" "0.3.5"))
-           (file-name "rust-tempdir-0.3.5")
-           (sha256
-            (base16-string->bytevector
-             
"87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6"))))
-       ("rust-termcolor"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "termcolor" "0.3.3"))
-           (file-name "rust-termcolor-0.3.3")
-           (sha256
-            (base16-string->bytevector
-             
"9065bced9c3e43453aa3d56f1e98590b8455b341d2fa191a1090c0dd0b242c75"))))
-       ("rust-termion"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "termion" "1.5.1"))
-           (file-name "rust-termion-1.5.1")
-           (sha256
-            (base16-string->bytevector
-             
"689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"))))
-       ("rust-thread-id"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "thread-id" "2.0.0"))
-           (file-name "rust-thread-id-2.0.0")
-           (sha256
-            (base16-string->bytevector
-             
"a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"))))
-       ("rust-thread_local"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "thread_local" "0.2.7"))
-           (file-name "rust-thread_local-0.2.7")
-           (sha256
-            (base16-string->bytevector
-             
"8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"))))
-       ("rust-thread_local-0.3.4"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "thread_local" "0.3.4"))
-           (file-name "rust-thread_local-0.3.4")
-           (sha256
-            (base16-string->bytevector
-             
"1697c4b57aeeb7a536b647165a2825faddffb1d3bad386d507709bd51a90bb14"))))
-       ("rust-toml"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "toml" "0.4.5"))
-           (file-name "rust-toml-0.4.5")
-           (sha256
-            (base16-string->bytevector
-             
"a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"))))
-       ("rust-unicode-bidi"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "unicode-bidi" "0.3.4"))
-           (file-name "rust-unicode-bidi-0.3.4")
-           (sha256
-            (base16-string->bytevector
-             
"49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"))))
-       ("rust-unicode-normalization"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "unicode-normalization" "0.1.5"))
-           (file-name "rust-unicode-normalization-0.1.5")
-           (sha256
-            (base16-string->bytevector
-             
"51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f"))))
-       ("rust-unicode-xid"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "unicode-xid" "0.0.4"))
-           (file-name "rust-unicode-xid-0.0.4")
-           (sha256
-            (base16-string->bytevector
-             
"8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"))))
-       ("rust-unreachable"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "unreachable" "1.0.0"))
-           (file-name "rust-unreachable-1.0.0")
-           (sha256
-            (base16-string->bytevector
-             
"382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"))))
-       ("rust-url"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "url" "1.5.1"))
-           (file-name "rust-url-1.5.1")
-           (sha256
-            (base16-string->bytevector
-             
"eeb819346883532a271eb626deb43c4a1bb4c4dd47c519bd78137c3e72a4fe27"))))
-       ("rust-userenv-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "userenv-sys" "0.2.0"))
-           (file-name "rust-userenv-sys-0.2.0")
-           (sha256
-            (base16-string->bytevector
-             
"71d28ea36bbd9192d75bd9fa9b39f96ddb986eaee824adae5d53b6e51919b2f3"))))
-       ("rust-utf8-ranges"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "utf8-ranges" "0.1.3"))
-           (file-name "rust-utf8-ranges-0.1.3")
-           (sha256
-            (base16-string->bytevector
-             
"a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"))))
-       ("rust-utf8-ranges-1.0.0"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "utf8-ranges" "1.0.0"))
-           (file-name "rust-utf8-ranges-1.0.0")
-           (sha256
-            (base16-string->bytevector
-             
"662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"))))
-       ("rust-vcpkg"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "vcpkg" "0.2.2"))
-           (file-name "rust-vcpkg-0.2.2")
-           (sha256
-            (base16-string->bytevector
-             
"9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b"))))
-       ("rust-void"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "void" "1.0.2"))
-           (file-name "rust-void-1.0.2")
-           (sha256
-            (base16-string->bytevector
-             
"6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"))))
-       ("rust-walkdir"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "walkdir" "1.0.7"))
-           (file-name "rust-walkdir-1.0.7")
-           (sha256
-            (base16-string->bytevector
-             
"bb08f9e670fab86099470b97cd2b252d6527f0b3cc1401acdb595ffc9dd288ff"))))
-       ("rust-winapi"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "winapi" "0.2.8"))
-           (file-name "rust-winapi-0.2.8")
-           (sha256
-            (base16-string->bytevector
-             
"167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"))))
-       ("rust-winapi-build"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "winapi-build" "0.1.1"))
-           (file-name "rust-winapi-build-0.1.1")
-           (sha256
-            (base16-string->bytevector
-             
"2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"))))
-       ("rust-wincolor"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "wincolor" "0.1.4"))
-           (file-name "rust-wincolor-0.1.4")
-           (sha256
-            (base16-string->bytevector
-             
"a39ee4464208f6430992ff20154216ab2357772ac871d994c51628d60e58b8b0"))))
-       ("rust-ws2_32-sys"
-        ,(origin
-           (method url-fetch)
-           (uri (crate-uri "ws2_32-sys" "0.2.1"))
-           (file-name "rust-ws2_32-sys-0.2.1")
-           (sha256
-            (base16-string->bytevector
-             
"d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"))))))
-    (arguments
-     `(#:cargo ,cargo-bootstrap
-       #:rustc ,rustc ; Force to use rustc from current file
-       #:modules
-       ((ice-9 match)
-        (srfi srfi-1) ; 'every
-        (guix build utils)
-        (guix build cargo-build-system))
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'unpack-dependencies
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (define (unpack source target)
-               (mkdir-p target)
-               (with-directory-excursion target
-                 (zero? (system* "tar" "xf"
-                                 source
-                                 "--strip-components=1"))))
-             (define (touch file-name)
-               (call-with-output-file file-name (const #t)))
-             (define (install-rust-library entry)
-               (match entry
-                 ((name . src)
-                  (if (string-prefix? "rust-" name)
-                      (let* ((rust-length (string-length "rust-"))
-                             (rust-name (string-drop name rust-length))
-                             (rsrc (string-append "vendor/" rust-name))
-                             (unpack-status (unpack src rsrc)))
-                        (touch (string-append rsrc "/.cargo-ok"))
-                        (generate-checksums rsrc src)
-                        unpack-status)))
-                 (_ #t)))
-             (mkdir "vendor")
-             (every install-rust-library inputs)))
-         (add-after 'patch-generated-file-shebangs 'patch-cargo-checksums
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "Cargo.lock"
-               (("(\"checksum .* = )\".*\"" all name)
-                (string-append name "\"" ,%cargo-reference-hash "\"")))
-             (for-each
-              (lambda (filename)
-                (use-modules (guix build cargo-build-system))
-                (delete-file filename)
-                (let* ((dir (dirname filename)))
-                  (display (string-append
-                            "patch-cargo-checksums: generate-checksums for "
-                            dir "\n"))
-                  (generate-checksums dir ,%cargo-reference-project-file)))
-              (find-files "vendor" ".cargo-checksum.json"))
-             #t))
-         (replace 'configure
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (substitute* "tests/build.rs"
-               (("/usr/bin/env") (which "env"))
-               ;; Guix llvm compiled without asmjs-unknown-emscripten at all
-               (("fn wasm32_final_outputs") "#[ignore]\nfn 
wasm32_final_outputs"))
-             (substitute* "tests/death.rs"
-               ;; Stuck when built in container
-               (("fn ctrl_c_kills_everyone") "#[ignore]\nfn 
ctrl_c_kills_everyone"))
-             (mkdir ".cargo")
-             (call-with-output-file ".cargo/config"
-               (lambda (port)
-                 (display "
-[source.crates-io]
-registry = 'https://github.com/rust-lang/crates.io-index'
-replace-with = 'vendored-sources'
-
-[source.vendored-sources]
-directory = 'vendor'
-" port)))
-             ;; Disable test for cross compilation support
-             (setenv "CFG_DISABLE_CROSS_TESTS" "1")
-             (setenv "SHELL" (which "sh"))
-             (setenv "CONFIG_SHELL" (which "sh"))
-             (setenv "CC" (string-append (assoc-ref inputs "gcc") "/bin/gcc"))
-             #t)))))
-    (home-page "https://github.com/rust-lang/cargo";)
-    (synopsis "Build tool and package manager for Rust")
-    (description "Cargo is a tool that allows Rust projects to declare their
-dependencies and ensures a reproducible build.")
-    ;; Cargo is dual licensed Apache and MIT. Also contains
-    ;; code from openssl which is GPL2 with linking exception.
-    (license (list license:asl2.0 license:expat license:gpl2))))
+(define-public rust
+  (let ((base-rust rust-1.23))
+    (package
+      (inherit base-rust)
+      (version "1.24.1")
+      (source
+       (rust-source version
+                    "1vv10x2h9kq7fxh2v01damdq8pvlp5acyh1kzcda9sfjx12kv99y"))
+      (native-inputs
+       (alist-replace "cargo-bootstrap" (list base-rust "cargo")
+                      (alist-replace "rustc-bootstrap" (list base-rust)
+                                     (package-native-inputs base-rust))))
+      (arguments
+       (substitute-keyword-arguments (package-arguments base-rust)
+         ((#:phases phases) `(modify-phases ,phases
+                               (delete 'fix-mtime-bug))))))))
diff --git a/guix/build-system/cargo.scm b/guix/build-system/cargo.scm
index c637fbb16..4a1eb0cfa 100644
--- a/guix/build-system/cargo.scm
+++ b/guix/build-system/cargo.scm
@@ -43,17 +43,11 @@
 to NAME and VERSION."
   (string-append crate-url name "/" version "/download"))
 
-(define (default-cargo)
-  "Return the default Cargo package."
+(define (default-rust)
+  "Return the default Rust package."
   ;; Lazily resolve the binding to avoid a circular dependency.
   (let ((rust (resolve-interface '(gnu packages rust))))
-    (module-ref rust 'cargo)))
-
-(define (default-rustc)
-  "Return the default Rustc package."
-  ;; Lazily resolve the binding to avoid a circular dependency.
-  (let ((rust (resolve-interface '(gnu packages rust))))
-    (module-ref rust 'rustc)))
+    (module-ref rust 'rust)))
 
 (define %cargo-build-system-modules
   ;; Build-side modules imported by default.
@@ -115,14 +109,13 @@ to NAME and VERSION."
 
 (define* (lower name
                 #:key source inputs native-inputs outputs system target
-                (cargo (default-cargo))
-                (rustc (default-rustc))
+                (rust (default-rust))
                 #:allow-other-keys
                 #:rest arguments)
   "Return a bag for NAME."
 
   (define private-keywords
-    '(#:source #:target #:cargo #:rustc #:inputs #:native-inputs #:outputs))
+    '(#:source #:target #:rust #:inputs #:native-inputs #:outputs))
 
   (and (not target) ;; TODO: support cross-compilation
        (bag
@@ -136,8 +129,8 @@ to NAME and VERSION."
 
                         ;; Keep the standard inputs of 'gnu-build-system'
                         ,@(standard-packages)))
-         (build-inputs `(("cargo" ,cargo)
-                         ("rustc" ,rustc)
+         (build-inputs `(("cargo" ,rust "cargo")
+                         ("rustc" ,rust)
                          ,@native-inputs))
          (outputs outputs)
          (build cargo-build)
-- 
2.16.2


reply via email to

[Prev in Thread] Current Thread [Next in Thread]