unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#38110] [PATCH 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9.
@ 2019-11-07 22:27 Danny Milosavljevic
  2019-11-07 22:29 ` [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
  2020-03-15 19:23 ` [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
  0 siblings, 2 replies; 24+ messages in thread
From: Danny Milosavljevic @ 2019-11-07 22:27 UTC (permalink / raw)
  To: 38110; +Cc: Danny Milosavljevic

Danny Milosavljevic (2):
  gnu: mrustc: Update to 0.9.
  gnu: rust: Bootstrap rust@1.29.0 from mrustc.

 gnu/local.mk                                  |   1 -
 ...ix-variable-length-integer-receiving.patch |  15 -
 gnu/packages/rust.scm                         | 494 ++++--------------
 3 files changed, 105 insertions(+), 405 deletions(-)
 delete mode 100644 gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9.
  2019-11-07 22:27 [bug#38110] [PATCH 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
@ 2019-11-07 22:29 ` Danny Milosavljevic
  2019-11-07 22:30   ` [bug#38110] [PATCH 2/2] gnu: rust: Bootstrap rust@1.29.0 from mrustc Danny Milosavljevic
                     ` (2 more replies)
  2020-03-15 19:23 ` [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
  1 sibling, 3 replies; 24+ messages in thread
From: Danny Milosavljevic @ 2019-11-07 22:29 UTC (permalink / raw)
  To: 38110; +Cc: Danny Milosavljevic

* gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch: Delete file.
* gnu/local.mk (dist_patch_DATA): Remove it.
* gnu/packages/rust.scm: Update to 0.9.
[source](patches): Remove it.
---
 gnu/local.mk                                   |  1 -
 ...fix-variable-length-integer-receiving.patch | 15 ---------------
 gnu/packages/rust.scm                          | 18 ++++++++----------
 3 files changed, 8 insertions(+), 26 deletions(-)
 delete mode 100644 gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 2513b4003c..5f52372875 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1140,7 +1140,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/mozjs38-tracelogger.patch		\
   %D%/packages/patches/mozjs38-version-detection.patch		\
   %D%/packages/patches/mrrescue-support-love-11.patch		\
-  %D%/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch \
   %D%/packages/patches/mtools-mformat-uninitialized.patch	\
   %D%/packages/patches/mumble-1.2.19-abs.patch			\
   %D%/packages/patches/mumps-build-parallelism.patch		\
diff --git a/gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch b/gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch
deleted file mode 100644
index 9e76653a07..0000000000
--- a/gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-https://github.com/thepowersgang/mrustc/issues/109
-From: Danny Milosavljevic <dannym@scratchpost.org>
-Date: Fri, 3 Jan 2019 13:00:00 +0100
-
---- mrustc/src/expand/proc_macro.cpp.orig	2019-02-01 14:16:54.208486062 +0100
-+++ mrustc/src/expand/proc_macro.cpp	2019-02-01 14:17:14.350925705 +0100
-@@ -977,7 +977,7 @@
-     for(;;)
-     {
-         auto b = recv_u8();
--        v |= static_cast<uint64_t>(b) << ofs;
-+        v |= static_cast<uint64_t>(b & 0x7F) << ofs;
-         if( (b & 0x80) == 0 )
-             break;
-         ofs += 7;
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index f3fee4c126..a752f9ece4 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -88,10 +88,10 @@
                                    (package-native-inputs base-rust))))))
 
 (define-public mrustc
-  (let ((rustc-version "1.19.0"))
+  (let ((rustc-version "1.29.0"))
     (package
       (name "mrustc")
-      (version "0.8.0")
+      (version "0.9")
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -100,9 +100,7 @@
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "0a7v8ccyzp1sdkwni8h1698hxpfz2sxhcpx42n6l2pbm0rbjp08i"))
-                (patches
-                 (search-patches "mrustc-0.8.0-fix-variable-length-integer-receiving.patch"))))
+                  "194ny7vsks5ygiw7d8yxjmp1qwigd71ilchis6xjl6bb2sj97rd2"))))
       (outputs '("out" "cargo"))
       (build-system gnu-build-system)
       (inputs
@@ -111,7 +109,7 @@
        `(("bison" ,bison)
          ("flex" ,flex)
          ;; Required for the libstd sources.
-         ("rustc" ,(package-source rust-1.19))))
+         ("rustc" ,(package-source rust-1.29))))
       (arguments
        `(#:test-target "local_tests"
          #:make-flags (list (string-append "LLVM_CONFIG="
@@ -135,8 +133,8 @@
                                  ,(or (%current-target-system)
                                       (nix-system->gnu-triplet-for-rust)))))
                (invoke "tar" "xf" (assoc-ref inputs "rustc"))
-               (chdir "rustc-1.19.0-src")
-               (invoke "patch" "-p0" "../rust_src.patch")
+               (chdir "rustc-1.29.0-src")
+               (invoke "patch" "-p0" "../rustc-1.29.0-src.patch")
                (chdir "..")
                #t))
            (replace 'configure
@@ -147,8 +145,8 @@
              (lambda _
                (for-each (lambda (target)
                            (invoke "make" "-f" "minicargo.mk" target))
-                         '("output/libstd.hir" "output/libpanic_unwind.hir"
-                           "output/libproc_macro.hir" "output/libtest.hir"))
+                         '("output/libstd.rlib" "output/libpanic_unwind.rlib"
+                           "output/libproc_macro.rlib" "output/libtest.rlib"))
                ;; Technically the above already does it - but we want to be clear.
                (invoke "make" "-C" "tools/minicargo")))
            (replace 'install

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH 2/2] gnu: rust: Bootstrap rust@1.29.0 from mrustc.
  2019-11-07 22:29 ` [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
@ 2019-11-07 22:30   ` Danny Milosavljevic
  2019-11-07 23:18     ` Danny Milosavljevic
  2019-11-07 23:17   ` [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
  2019-11-08  2:46   ` [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
  2 siblings, 1 reply; 24+ messages in thread
From: Danny Milosavljevic @ 2019-11-07 22:30 UTC (permalink / raw)
  To: 38110; +Cc: Danny Milosavljevic

* gnu/packages/rust.scm (rust-1.19): Delete variable.
(rust-1.20): Delete variable.
(rust-1.21): Delete variable.
(rust-1.22): Delete variable.
(rust-1.23): Delete variable.
(rust-1.24): Delete variable.
(rust-1.25): Delete variable.
(rust-1.26): Delete variable.
(rust-1.27): Delete variable.
(rust-1.28): Delete variable.
(rust-1.29): Bootstrap from mrustc.
(rust-1.30)[inputs]: Remove llvm 3.  Add llvm 6.
---
 gnu/packages/rust.scm | 476 +++++++++---------------------------------
 1 file changed, 97 insertions(+), 379 deletions(-)

diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index a752f9ece4..0102a97a80 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -178,18 +178,19 @@ safety and thread safety guarantees.")
       ;; Dual licensed.
       (license (list license:asl2.0 license:expat)))))
 
-(define rust-1.19
+(define rust-1.29
   (package
     (name "rust")
-    (version "1.19.0")
+    (version "1.29.0")
     (source
       (origin
         (method url-fetch)
-        (uri (rust-uri "1.19.0"))
-        (sha256 (base32 "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm"))
+        (uri (rust-uri "1.29.0"))
+        (sha256 (base32 "1sb15znckj8pc8q3g7cq03pijnida6cg64yqmgiayxkzskzk9sx4"))
         (modules '((guix build utils)))
         (snippet '(begin (delete-file-recursively "src/llvm") #t))
-        (patches (map search-patch '("rust-1.19-mrustc.patch")))))
+        (patches (map search-patch '("rust-1.25-accept-more-detailed-gdb-lines.patch"
+                                     "rust-reproducible-builds.patch")))))
     (outputs '("out" "cargo"))
     (properties '((timeout . 72000)               ;20 hours
                   (max-silent-time . 18000)))     ;5 hours (for armel)
@@ -201,6 +202,7 @@ safety and thread safety guarantees.")
          (add-after 'unpack 'set-env
            (lambda* (#:key inputs #:allow-other-keys)
              ;; Disable test for cross compilation support.
+;(write "X")
              (setenv "CFG_DISABLE_CROSS_TESTS" "1")
              (setenv "SHELL" (which "sh"))
              (setenv "CONFIG_SHELL" (which "sh"))
@@ -208,24 +210,6 @@ safety and thread safety guarantees.")
              ;; guix llvm-3.9.1 package installs only shared libraries
              (setenv "LLVM_LINK_SHARED" "1")
              #t))
-         (add-after 'unpack 'patch-cargo-tomls
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (substitute* "src/librustc_errors/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-term = \"0.4.4\"
-"))
-             (substitute* "src/librustc/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-getopts = { path = \"../libgetopts\" }
-"))
-             (substitute* "src/librustdoc/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-test = { path = \"../libtest\" }
-"))
-             #t))
          (add-after 'unpack 'patch-tests
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((bash (assoc-ref inputs "bash")))
@@ -244,27 +228,29 @@ test = { path = \"../libtest\" }
     #[ignore]
     fn test_process_mask"))
                #t)))
+         (add-after 'patch-tests 'patch-cargo-index-update
+           (lambda* _
+             (substitute* "src/tools/cargo/tests/testsuite/generate_lockfile.rs"
+               ;; This test wants to update the crate index.
+               (("fn no_index_update") "#[ignore]\nfn no_index_update"))
+             #t))
          (add-after 'patch-tests 'patch-aarch64-test
            (lambda* _
-             (substitute* "src/librustc_back/dynamic_lib.rs"
+             (substitute* "src/librustc_metadata/dynamic_lib.rs"
                ;; This test is known to fail on aarch64 and powerpc64le:
                ;; https://github.com/rust-lang/rust/issues/45410
                (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-             #t))
-         (add-after 'patch-tests 'use-readelf-for-tests
-           (lambda* _
-             ;; nm doesn't recognize the file format because of the
-             ;; nonstandard sections used by the Rust compiler, but readelf
-             ;; ignores them.
-             (substitute* "src/test/run-make/atomic-lock-free/Makefile"
-               (("\tnm ")
-                "\treadelf -c "))
+             ;; This test fails on aarch64 with llvm@6.0:
+             ;; https://github.com/rust-lang/rust/issues/49807
+             ;; other possible solution:
+             ;; https://github.com/rust-lang/rust/pull/47688
+             (delete-file "src/test/debuginfo/by-value-self-argument-in-trait-impl.rs")
              #t))
          (add-after 'patch-tests 'remove-unsupported-tests
            (lambda* _
              ;; 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")
+             (delete-file-recursively "src/test/run-make-fulldeps/linker-output-non-utf8")
              #t))
          (add-after 'patch-source-shebangs 'patch-cargo-checksums
            (lambda* _
@@ -289,14 +275,20 @@ test = { path = \"../libtest\" }
          (replace 'build
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let ((rustc-bootstrap (assoc-ref inputs "rustc-bootstrap")))
+;(invoke "ls" "src/vendor/getopts")
+;(newline)
                (setenv "CFG_COMPILER_HOST_TRIPLE"
                 ,(nix-system->gnu-triplet (%current-system)))
                (setenv "CFG_RELEASE" "")
                (setenv "CFG_RELEASE_CHANNEL" "stable")
                (setenv "CFG_LIBDIR_RELATIVE" "lib")
-               (setenv "CFG_VERSION" "1.19.0-stable-mrustc")
+               (setenv "CFG_VERSION" "1.29.0-stable-mrustc")
                ; bad: (setenv "CFG_PREFIX" "mrustc") ; FIXME output path.
-               (mkdir-p "output")
+               ;; Crate::load_extern_crate ignores the search path, so make
+               ;; the situation easier for it.
+               (copy-recursively (string-append rustc-bootstrap "/lib/mrust")
+                                 "output")
+               ;(mkdir-p "output")
                (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
                        "src/rustc" "--vendor-dir" "src/vendor"
                        "--output-dir" "output/rustc-build"
@@ -311,7 +303,7 @@ test = { path = \"../libtest\" }
                (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
                        "src/tools/cargo" "--vendor-dir" "src/vendor"
                        "--output-dir" "output/cargo-build"
-                       "-L" "output/"
+                       ;"-L" "output/"
                        "-L" (string-append rustc-bootstrap "/lib/mrust")
                        "-j" "1")
                ;; Now use the newly-built rustc to build the libraries.
@@ -419,10 +411,10 @@ safety and thread safety guarantees.")
     ;; Dual licensed.
     (license (list license:asl2.0 license:expat))))
 
-(define-public rust-1.20
+(define-public rust-1.30
   (let ((base-rust
-         (rust-bootstrapped-package rust-1.19 "1.20.0"
-          "0542y4rnzlsrricai130mqyxl8r6rd991frb4qsnwb27yigqg91a")))
+         (rust-bootstrapped-package rust-1.29 "1.30.1"
+          "0aavdc1lqv0cjzbqwl5n59yd0bqdlhn0zas61ljf38yrvc18k8rn")))
     (package
       (inherit base-rust)
       (source
@@ -431,20 +423,45 @@ safety and thread safety guarantees.")
           (snippet '(begin
                       (delete-file-recursively "src/jemalloc")
                       (delete-file-recursively "src/llvm")
+                      (delete-file-recursively "src/llvm-emscripten")
+                      (delete-file-recursively "src/tools/clang")
+                      (delete-file-recursively "src/tools/lldb")
                       #t))
           (patches '())))
       (outputs '("out" "doc" "cargo"))
-      ;; Since rust-1.19 is local, it's quite probable that Hydra
-      ;; will build rust-1.19 only as a dependency of rust-1.20.
+      ;; Since rust-2.19 is local, it's quite probable that Hydra
+      ;; will build rust-1.29 only as a dependency of rust-1.20.
       ;; But then Hydra will use the wrong properties, the ones here,
-      ;; for rust-1.19.  Therefore, we copied the properties of
-      ;; rust-1.19 here.
+      ;; for rust-1.29.  Therefore, we copied the properties of
+      ;; rust-1.29 here.
       (properties '((timeout . 72000)               ;20 hours
                     (max-silent-time . 18000)))     ;5 hours (for armel)
+      (inputs
+       ;; Use LLVM 6.0
+       (alist-replace "llvm" (list llvm-6)
+                      (package-inputs base-rust)))
       (arguments
-       (substitute-keyword-arguments (package-arguments rust-1.19)
+       (substitute-keyword-arguments (package-arguments rust-1.29)
          ((#:phases phases)
           `(modify-phases ,phases
+             (add-after 'unpack 'remove-flaky-test
+               (lambda _
+                 ;; See <https://github.com/rust-lang/rust/issues/43402>.
+                 (when (file-exists? "src/test/run-make/issue-26092")
+                   (delete-file-recursively "src/test/run-make/issue-26092"))
+                 #t))
+             (add-after 'configure 'enable-codegen-tests
+               ;; Codegen tests should pass with llvm 6, so enable them.
+               (lambda* _
+                 (substitute* "config.toml"
+                   (("codegen-tests = false") ""))
+                 #t))
+              ;; The test has been moved elsewhere.
+              (add-after 'patch-tests 'disable-amd64-avx-test
+                (lambda _
+                  (substitute* "src/test/ui/issues/issue-44056.rs"
+                   (("only-x86_64") "ignore-test"))
+                  #t))
              (add-after 'patch-tests 'patch-cargo-tests
                (lambda _
                  (substitute* "src/tools/cargo/tests/build.rs"
@@ -466,12 +483,29 @@ safety and thread safety guarantees.")
                    (("fn finds_author_git") "#[ignore]\nfn finds_author_git")
                    (("fn finds_local_author_git") "#[ignore]\nfn finds_local_author_git"))
                  #t))
-             (add-after 'patch-cargo-tests 'ignore-glibc-2.27-incompatible-test
-               ;; https://github.com/rust-lang/rust/issues/47863
-               (lambda _
-                 (substitute* "src/test/run-pass/out-of-stack.rs"
-                   (("// ignore-android") "// ignore-test\n// ignore-android"))
-                 #t))
+             (add-after 'patch-cargo-tests 'patch-cargo-env-shebang
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (let ((coreutils (assoc-ref inputs "coreutils")))
+                   (substitute* "src/tools/cargo/tests/testsuite/fix.rs"
+                     ;; Cargo has a test which explicitly sets a
+                     ;; RUSTC_WRAPPER environment variable which points
+                     ;; to /usr/bin/env. Since it's not a shebang, it
+                     ;; needs to be manually patched
+                     (("\"/usr/bin/env\"")
+                      (string-append "\"" coreutils "/bin/env\"")))
+                   #t)))
+             (add-after 'patch-cargo-env-shebang 'ignore-cargo-package-tests
+               (lambda* _
+                 (substitute* "src/tools/cargo/tests/testsuite/package.rs"
+                   ;; These tests largely check that cargo outputs warning/error
+                   ;; messages as expected. It seems that cargo outputs an
+                   ;; absolute path to something in the store instead of the
+                   ;; expected relative path (e.g. `[..]`) so we'll ignore
+                   ;; these for now
+                   (("fn include") "#[ignore]\nfn include")
+                   (("fn exclude") "#[ignore]\nfn exclude"))
+                   #t))
+
              (replace 'configure
                (lambda* (#:key inputs outputs #:allow-other-keys)
                  (let* ((out (assoc-ref outputs "out"))
@@ -523,16 +557,6 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                           "/tmp/cc")
                  (setenv "PATH" (string-append "/tmp:" (getenv "PATH")))
                  #t))
-             (add-after 'provide-cc 'configure-archiver
-               (lambda* (#:key inputs #:allow-other-keys)
-                 (substitute* "src/build_helper/lib.rs"
-                  ;; Make sure "ar" is always used as the archiver.
-                  (("\"musl\"") "\"\"")
-                  ;; Then substitute "ar" by our name.
-                  (("\"ar\"") (string-append "\""
-                               (assoc-ref inputs "binutils")
-                               "/bin/ar\"")))
-                 #t))
              (delete 'patch-cargo-tomls)
              (add-before 'build 'reset-timestamps-after-changes
                (lambda* _
@@ -549,11 +573,14 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                  (invoke "./x.py" "build" "src/tools/cargo")))
              (replace 'check
                (lambda* _
-                 ;; Disable parallel execution to prevent EAGAIN errors when
-                 ;; running tests.
-                 (invoke "./x.py" "-j1" "test" "-vv")
-                 (invoke "./x.py" "-j1" "test" "src/tools/cargo")
-                 #t))
+                 ;; Enable parallel execution.
+                 (let ((parallel-job-spec
+                        (string-append "-j" (number->string
+                                             (min 4
+                                                  (parallel-job-count))))))
+                   (invoke "./x.py" parallel-job-spec "test" "-vv")
+                   (invoke "./x.py" parallel-job-spec "test"
+                           "src/tools/cargo"))))
              (replace 'install
                (lambda* (#:key outputs #:allow-other-keys)
                  (invoke "./x.py" "install")
@@ -591,315 +618,6 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                      `("LIBRARY_PATH" ":" suffix (,(string-append libc "/lib"))))
                    #t))))))))))
 
-(define-public rust-1.21
-  (let ((base-rust (rust-bootstrapped-package rust-1.20 "1.21.0"
-                    "1yj8lnxybjrybp00fqhxw8fpr641dh8wcn9mk44xjnsb4i1c21qp")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'configure 'remove-ar
-               (lambda* (#:key inputs #:allow-other-keys)
-                 ;; Remove because toml complains about "unknown field".
-                 (substitute* "config.toml"
-                  (("^ar =.*") "\n"))
-                 #t)))))))))
-
-(define-public rust-1.22
-  (let ((base-rust (rust-bootstrapped-package rust-1.21 "1.22.1"
-                    "1lrzzp0nh7s61wgfs2h6ilaqi6iq89f1pd1yaf65l87bssyl4ylb")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'unpack 'remove-flaky-test
-               (lambda _
-                 ;; See <https://github.com/rust-lang/rust/issues/43402>.
-                 (when (file-exists? "src/test/run-make/issue-26092")
-                   (delete-file-recursively "src/test/run-make/issue-26092"))
-                 #t)))))))))
-
-(define-public rust-1.23
-  (let ((base-rust (rust-bootstrapped-package rust-1.22 "1.23.0"
-                    "14fb8vhjzsxlbi6yrn1r6fl5dlbdd1m92dn5zj5gmzfwf4w9ar3l")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'configure-archiver)
-             (delete 'remove-ar)
-             (add-after 'unpack 'dont-build-native
-               (lambda _
-                 ;; XXX: Revisit this when we use gcc 6.
-                 (substitute* "src/binaryen/CMakeLists.txt"
-                  (("ADD_COMPILE_FLAG\\(\\\"-march=native\\\"\\)") ""))
-                 #t)))))))))
-
-(define-public rust-1.24
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.23 "1.24.1"
-          "1vv10x2h9kq7fxh2v01damdq8pvlp5acyh1kzcda9sfjx12kv99y")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'use-readelf-for-tests)
-             (replace 'patch-aarch64-test
-               (lambda* _
-                 (substitute* "src/librustc_metadata/dynamic_lib.rs"
-                   ;; This test is known to fail on aarch64 and powerpc64le:
-                   ;; https://github.com/rust-lang/rust/issues/45410
-                   (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-                 #t)))))))))
-
-;;; Rust 1.25 release support work with llvm 6--but build with llvm 6 is
-;;; not determenistic due to <https://github.com/rust-lang/rust/issues/50556>.
-;;; Keep using llvm 3.9.1 until builds become determenistic
-(define-public rust-1.25
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.24 "1.25.0"
-          "0baxjr99311lvwdq0s38bipbnj72pn6fgbk6lcq7j555xq53mxpf")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (snippet '(begin
-                      (delete-file-recursively "src/jemalloc")
-                      (delete-file-recursively "src/llvm")
-                      (delete-file-recursively "src/llvm-emscripten")
-                      #t))
-          (patches (map search-patch
-                        '("rust-1.25-accept-more-detailed-gdb-lines.patch")))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'patch-cargo-tests 'patch-cargo-index-update
-               (lambda _
-                 (substitute* "src/tools/cargo/tests/generate-lockfile.rs"
-                   ;; This test wants to update the crate index.
-                   (("fn no_index_update") "#[ignore]\nfn no_index_update"))
-                 #t))
-             (replace 'patch-aarch64-test
-               (lambda _
-                 (substitute* "src/librustc_metadata/dynamic_lib.rs"
-                   ;; This test is known to fail on aarch64 and powerpc64le:
-                   ;; https://github.com/rust-lang/rust/issues/45410
-                   (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-                 ;; This test fails on aarch64 with llvm@6.0:
-                 ;; https://github.com/rust-lang/rust/issues/49807
-                 ;; other possible solution:
-                 ;; https://github.com/rust-lang/rust/pull/47688
-                 (delete-file "src/test/debuginfo/by-value-self-argument-in-trait-impl.rs")
-                 #t))
-             (delete 'ignore-glibc-2.27-incompatible-test))))))))
-
-(define-public rust-1.26
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.25 "1.26.2"
-          "0047ais0fvmqvngqkdsxgrzhb0kljg8wy85b01kbbjc88hqcz7pv")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch
-                        '("rust-coresimd-doctest.patch"
-                          "rust-1.25-accept-more-detailed-gdb-lines.patch")))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             ;; binaryen was replaced with LLD project from LLVM
-             (delete 'dont-build-native)
-             (replace 'check
-               (lambda* _
-                 ;; Enable parallel execution.
-                 (let ((parallel-job-spec
-                        (string-append "-j" (number->string
-                                             (min 4
-                                                  (parallel-job-count))))))
-                   (invoke "./x.py" parallel-job-spec "test" "-vv")
-                   (invoke "./x.py" parallel-job-spec "test"
-                           "src/tools/cargo"))))
-             (replace 'remove-unsupported-tests
-               (lambda* _
-                 ;; 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-fulldeps/linker-output-non-utf8")
-                 #t))
-             (replace 'patch-cargo-tests
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/build.rs"
-                   (("/usr/bin/env") (which "env"))
-                   ;; Guix llvm is compiled without asmjs-unknown-emscripten.
-                   (("fn wasm32_final_outputs") "#[ignore]\nfn wasm32_final_outputs"))
-                 (substitute* "src/tools/cargo/tests/testsuite/death.rs"
-                   ;; This is stuck when built in container.
-                   (("fn ctrl_c_kills_everyone") "#[ignore]\nfn ctrl_c_kills_everyone"))
-                 ;; Prints test output in the wrong order when built on
-                 ;; i686-linux.
-                 (substitute* "src/tools/cargo/tests/testsuite/test.rs"
-                   (("fn cargo_test_env") "#[ignore]\nfn cargo_test_env"))
-
-                 ;; Avoid dependency on "git".
-                 (substitute* "src/tools/cargo/tests/testsuite/new.rs"
-                   (("fn author_prefers_cargo") "#[ignore]\nfn author_prefers_cargo")
-                   (("fn finds_author_git") "#[ignore]\nfn finds_author_git")
-                   (("fn finds_local_author_git") "#[ignore]\nfn finds_local_author_git"))
-                 #t))
-             (add-after 'patch-cargo-tests 'disable-cargo-test-for-nightly-channel
-               (lambda* _
-                 ;; This test failed to work on "nightly" channel builds
-                 ;; https://github.com/rust-lang/cargo/issues/5648
-                 (substitute* "src/tools/cargo/tests/testsuite/resolve.rs"
-                   (("fn test_resolving_minimum_version_with_transitive_deps")
-                    "#[ignore]\nfn test_resolving_minimum_version_with_transitive_deps"))
-                 #t))
-             (replace 'patch-cargo-index-update
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/generate_lockfile.rs"
-                   ;; This test wants to update the crate index.
-                   (("fn no_index_update") "#[ignore]\nfn no_index_update"))
-                 #t)))))))))
-
-(define-public rust-1.27
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.26 "1.27.2"
-          "0pg1s37bhx9zqbynxyydq5j6q7kij9vxkcv8maz0m25prm88r0cs")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch '("rust-coresimd-doctest.patch"
-                                       "rust-bootstrap-stage0-test.patch"
-                                       "rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                       "rust-reproducible-builds.patch")))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-before 'install 'mkdir-prefix-paths
-               (lambda* (#:key outputs #:allow-other-keys)
-                 ;; As result of https://github.com/rust-lang/rust/issues/36989
-                 ;; `prefix' directory should exist before `install' call
-                 (mkdir-p (assoc-ref outputs "out"))
-                 (mkdir-p (assoc-ref outputs "cargo"))
-                 #t))
-             (add-after 'patch-cargo-tests 'disable-thinlto-test
-               (lambda* _
-                 ;; thinlto required llvm 6.0 for work
-                 (substitute* "src/tools/cargo/tests/testsuite/path.rs"
-                   (("fn thin_lto_works") "#[ignore]\nfn thin_lto_works"))
-                 #t)))))))))
-
-(define-public rust-1.28
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.27 "1.28.0"
-          "11k4rn77bca2rikykkk9fmprrgjswd4x4kaq7fia08vgkir82nhx")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch '("rust-coresimd-doctest.patch"
-                                       "rust-bootstrap-stage0-test.patch"
-                                       "rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                       "rust-reproducible-builds.patch")))))
-      (inputs
-       ;; Use LLVM 6.0
-       (alist-replace "llvm" (list llvm-6)
-                      (package-inputs base-rust)))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'configure 'enable-codegen-tests
-               ;; Codegen tests should pass with llvm 6, so enable them.
-               (lambda* _
-                 (substitute* "config.toml"
-                   (("codegen-tests = false") ""))
-                 #t))
-             (add-after 'patch-tests 'disable-amd64-avx-test
-               ;; That test would fail on x86_64 machines without avx.
-               (lambda* _
-                 (substitute* "src/test/run-pass/issue-44056.rs"
-                   (("only-x86_64") "ignore-test"))
-                 #t))
-             ;; The thinlto test should pass with llvm 6.
-             (delete 'disable-thinlto-test))))))))
-
-(define-public rust-1.29
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.28 "1.29.2"
-          "1jb787080z754caa2w3w1amsygs4qlzj9rs1vy64firfmabfg22h")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch '("rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                       "rust-reproducible-builds.patch"))))))))
-
-(define-public rust-1.30
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.29 "1.30.1"
-          "0aavdc1lqv0cjzbqwl5n59yd0bqdlhn0zas61ljf38yrvc18k8rn")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (snippet '(begin
-                      (delete-file-recursively "src/jemalloc")
-                      (delete-file-recursively "src/llvm")
-                      (delete-file-recursively "src/llvm-emscripten")
-                      (delete-file-recursively "src/tools/clang")
-                      (delete-file-recursively "src/tools/lldb")
-                      #t))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'patch-cargo-tests 'patch-cargo-env-shebang
-               (lambda* (#:key inputs #:allow-other-keys)
-                 (let ((coreutils (assoc-ref inputs "coreutils")))
-                   (substitute* "src/tools/cargo/tests/testsuite/fix.rs"
-                     ;; Cargo has a test which explicitly sets a
-                     ;; RUSTC_WRAPPER environment variable which points
-                     ;; to /usr/bin/env. Since it's not a shebang, it
-                     ;; needs to be manually patched
-                     (("\"/usr/bin/env\"")
-                      (string-append "\"" coreutils "/bin/env\"")))
-                   #t)))
-             (add-after 'patch-cargo-env-shebang 'ignore-cargo-package-tests
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/package.rs"
-                   ;; These tests largely check that cargo outputs warning/error
-                   ;; messages as expected. It seems that cargo outputs an
-                   ;; absolute path to something in the store instead of the
-                   ;; expected relative path (e.g. `[..]`) so we'll ignore
-                   ;; these for now
-                   (("fn include") "#[ignore]\nfn include")
-                   (("fn exclude") "#[ignore]\nfn exclude"))
-                   #t))
-             ;; The test has been moved elsewhere.
-             (replace 'disable-amd64-avx-test
-               (lambda _
-                 (substitute* "src/test/ui/run-pass/issues/issue-44056.rs"
-	          (("only-x86_64") "ignore-test"))
-                  #t)))))))))
-
 (define-public rust-1.31
   (let ((base-rust
          (rust-bootstrapped-package rust-1.30 "1.31.1"

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9.
  2019-11-07 22:29 ` [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
  2019-11-07 22:30   ` [bug#38110] [PATCH 2/2] gnu: rust: Bootstrap rust@1.29.0 from mrustc Danny Milosavljevic
@ 2019-11-07 23:17   ` Danny Milosavljevic
  2019-11-08  2:46   ` [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
  2 siblings, 0 replies; 24+ messages in thread
From: Danny Milosavljevic @ 2019-11-07 23:17 UTC (permalink / raw)
  To: 38110

[-- Attachment #1: Type: text/plain, Size: 97 bytes --]

(It might make sense to only update mrustc and not update the rust it bootstraps in this patch)

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH 2/2] gnu: rust: Bootstrap rust@1.29.0 from mrustc.
  2019-11-07 22:30   ` [bug#38110] [PATCH 2/2] gnu: rust: Bootstrap rust@1.29.0 from mrustc Danny Milosavljevic
@ 2019-11-07 23:18     ` Danny Milosavljevic
  0 siblings, 0 replies; 24+ messages in thread
From: Danny Milosavljevic @ 2019-11-07 23:18 UTC (permalink / raw)
  To: 38110

[-- Attachment #1: Type: text/plain, Size: 91 bytes --]

(It might make sense to make it target 1.29.2--although mrustc upstream doesn't
do that)

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9.
  2019-11-07 22:29 ` [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
  2019-11-07 22:30   ` [bug#38110] [PATCH 2/2] gnu: rust: Bootstrap rust@1.29.0 from mrustc Danny Milosavljevic
  2019-11-07 23:17   ` [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
@ 2019-11-08  2:46   ` Danny Milosavljevic
  2019-11-08  2:46     ` [bug#38110] [PATCH v2 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
                       ` (2 more replies)
  2 siblings, 3 replies; 24+ messages in thread
From: Danny Milosavljevic @ 2019-11-08  2:46 UTC (permalink / raw)
  To: 38110; +Cc: Danny Milosavljevic

Danny Milosavljevic (2):
  gnu: mrustc: Update to 0.9.
  gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.

 gnu/local.mk                                  |   1 -
 ...ix-variable-length-integer-receiving.patch |  15 -
 gnu/packages/rust.scm                         | 495 ++++--------------
 3 files changed, 106 insertions(+), 405 deletions(-)
 delete mode 100644 gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH v2 1/2] gnu: mrustc: Update to 0.9.
  2019-11-08  2:46   ` [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
@ 2019-11-08  2:46     ` Danny Milosavljevic
  2019-11-08 22:47       ` Ludovic Courtès
  2019-11-08  2:46     ` [bug#38110] [PATCH v2 2/2] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
  2020-01-19 22:19     ` [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
  2 siblings, 1 reply; 24+ messages in thread
From: Danny Milosavljevic @ 2019-11-08  2:46 UTC (permalink / raw)
  To: 38110; +Cc: Danny Milosavljevic

* gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch: Delete file.
* gnu/local.mk (dist_patch_DATA): Remove it.
* gnu/packages/rust.scm (mrustc): Update to 0.9.
[source](patches): Remove it.
[arguments]<#:phases>[build-minicargo]: Modify.
---
 gnu/local.mk                                      |  1 -
 ....0-fix-variable-length-integer-receiving.patch | 15 ---------------
 gnu/packages/rust.scm                             | 12 +++++-------
 3 files changed, 5 insertions(+), 23 deletions(-)
 delete mode 100644 gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 2513b4003c..5f52372875 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1140,7 +1140,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/mozjs38-tracelogger.patch		\
   %D%/packages/patches/mozjs38-version-detection.patch		\
   %D%/packages/patches/mrrescue-support-love-11.patch		\
-  %D%/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch \
   %D%/packages/patches/mtools-mformat-uninitialized.patch	\
   %D%/packages/patches/mumble-1.2.19-abs.patch			\
   %D%/packages/patches/mumps-build-parallelism.patch		\
diff --git a/gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch b/gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch
deleted file mode 100644
index 9e76653a07..0000000000
--- a/gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-https://github.com/thepowersgang/mrustc/issues/109
-From: Danny Milosavljevic <dannym@scratchpost.org>
-Date: Fri, 3 Jan 2019 13:00:00 +0100
-
---- mrustc/src/expand/proc_macro.cpp.orig	2019-02-01 14:16:54.208486062 +0100
-+++ mrustc/src/expand/proc_macro.cpp	2019-02-01 14:17:14.350925705 +0100
-@@ -977,7 +977,7 @@
-     for(;;)
-     {
-         auto b = recv_u8();
--        v |= static_cast<uint64_t>(b) << ofs;
-+        v |= static_cast<uint64_t>(b & 0x7F) << ofs;
-         if( (b & 0x80) == 0 )
-             break;
-         ofs += 7;
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index f3fee4c126..76b1466284 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -91,7 +91,7 @@
   (let ((rustc-version "1.19.0"))
     (package
       (name "mrustc")
-      (version "0.8.0")
+      (version "0.9")
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -100,9 +100,7 @@
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "0a7v8ccyzp1sdkwni8h1698hxpfz2sxhcpx42n6l2pbm0rbjp08i"))
-                (patches
-                 (search-patches "mrustc-0.8.0-fix-variable-length-integer-receiving.patch"))))
+                  "194ny7vsks5ygiw7d8yxjmp1qwigd71ilchis6xjl6bb2sj97rd2"))))
       (outputs '("out" "cargo"))
       (build-system gnu-build-system)
       (inputs
@@ -136,7 +134,7 @@
                                       (nix-system->gnu-triplet-for-rust)))))
                (invoke "tar" "xf" (assoc-ref inputs "rustc"))
                (chdir "rustc-1.19.0-src")
-               (invoke "patch" "-p0" "../rust_src.patch")
+               (invoke "patch" "-p0" "../rustc-1.19.0-src.patch")
                (chdir "..")
                #t))
            (replace 'configure
@@ -147,8 +145,8 @@
              (lambda _
                (for-each (lambda (target)
                            (invoke "make" "-f" "minicargo.mk" target))
-                         '("output/libstd.hir" "output/libpanic_unwind.hir"
-                           "output/libproc_macro.hir" "output/libtest.hir"))
+                         '("output/libstd.rlib" "output/libpanic_unwind.rlib"
+                           "output/libproc_macro.rlib" "output/libtest.rlib"))
                ;; Technically the above already does it - but we want to be clear.
                (invoke "make" "-C" "tools/minicargo")))
            (replace 'install

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH v2 2/2] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2019-11-08  2:46   ` [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
  2019-11-08  2:46     ` [bug#38110] [PATCH v2 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
@ 2019-11-08  2:46     ` Danny Milosavljevic
  2019-11-08 22:50       ` Ludovic Courtès
  2020-03-15 14:20       ` Marius Bakke
  2020-01-19 22:19     ` [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
  2 siblings, 2 replies; 24+ messages in thread
From: Danny Milosavljevic @ 2019-11-08  2:46 UTC (permalink / raw)
  To: 38110; +Cc: Danny Milosavljevic

* gnu/packages/patches/rustc-1.29.0-src.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/rust.scm (rust-1.19): Delete variable.
(rust-1.20): Delete variable.
(rust-1.21): Delete variable.
(rust-1.22): Delete variable.
(rust-1.23): Delete variable.
(rust-1.24): Delete variable.
(rust-1.25): Delete variable.
(rust-1.26): Delete variable.
(rust-1.27): Delete variable.
(rust-1.28): Delete variable.
(rust-1.29): Bootstrap from mrustc.
[source]: Add patch.
(rust-1.30)[inputs]: Remove llvm 3.  Add llvm 6.
(mrustc): Update rustc-version to 1.29.0.
---
 gnu/local.mk                                |   1 +
 gnu/packages/patches/rustc-1.29.0-src.patch |  86 ++++
 gnu/packages/rust.scm                       | 494 +++++---------------
 3 files changed, 195 insertions(+), 386 deletions(-)
 create mode 100644 gnu/packages/patches/rustc-1.29.0-src.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 5f52372875..2c8db401f3 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1320,6 +1320,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/rust-1.19-mrustc.patch			\
   %D%/packages/patches/rust-1.25-accept-more-detailed-gdb-lines.patch \
   %D%/packages/patches/rust-bootstrap-stage0-test.patch		\
+  %D%/packages/patches/rustc-1.29.0-src.patch			\
   %D%/packages/patches/rust-coresimd-doctest.patch		\
   %D%/packages/patches/rust-reproducible-builds.patch		 \
   %D%/packages/patches/rxvt-unicode-escape-sequences.patch	\
diff --git a/gnu/packages/patches/rustc-1.29.0-src.patch b/gnu/packages/patches/rustc-1.29.0-src.patch
new file mode 100644
index 0000000000..feeb7e71cf
--- /dev/null
+++ b/gnu/packages/patches/rustc-1.29.0-src.patch
@@ -0,0 +1,86 @@
+From mrustc 0.9.
+# Add mrustc slice length intrinsics
+--- rustc-1.29.0-src/src/libcore/intrinsics.rs
++++ rustc-1.29.0-src/src/libcore/intrinsics.rs
+@@ -678,5 +678,9 @@
+     pub fn min_align_of_val<T: ?Sized>(_: &T) -> usize;
+ 
++    /// Obtain the length of a slice pointer
++    #[cfg(rust_compiler="mrustc")]
++    pub fn mrustc_slice_len<T>(pointer: *const [T]) -> usize;
++
+     /// Gets a static string slice containing the name of a type.
+     pub fn type_name<T: ?Sized>() -> &'static str;
+
+--- rustc-1.29.0-src/src/libcore/slice/mod.rs
++++ rustc-1.29.0-src/src/libcore/slice/mod.rs
+@@ -413,5 +413,7 @@
+     pub const fn len(&self) -> usize {
+-        unsafe {
+-            Repr { rust: self }.raw.len
+-        }
++        #[cfg(not(rust_compiler="mrustc"))]
++        const fn len_inner<T>(s: &[T]) -> usize { unsafe { Repr { rust: s }.raw.len } };
++        #[cfg(rust_compiler="mrustc")]
++        const fn len_inner<T>(s: &[T]) -> usize { unsafe { ::intrinsics::mrustc_slice_len(s) } }
++        len_inner(self)
+     }
+# Static-link rustc_codegen_llvm because mrustc doesn't have dylib support
+--- rustc-1.29.0-src/src/librustc_driver/Cargo.toml
++++ rustc-1.29.0-src/src/librustc_driver/Cargo.toml
+@@ -39,1 +39,2 @@
+ syntax_pos = { path = "../libsyntax_pos" }
++rustc_codegen_llvm = { path = "../librustc_codegen_llvm" }
+--- rustc-1.29.0-src/src/librustc_driver/lib.rs
++++ rustc-1.29.0-src/src/librustc_driver/lib.rs
+@@ -63,2 +63,3 @@
+ extern crate syntax_pos;
++extern crate rustc_codegen_llvm;
+ 
+@@ -296,3 +296,7 @@
+     }
+ 
++    if backend_name == "llvm" {
++        return rustc_codegen_llvm::__rustc_codegen_backend;
++    }
++
+     let target = session::config::host_triple();
+# No workspace support in minicargo, patch cargo's Cargo.toml
+--- rustc-1.29.0-src/src/tools/cargo/Cargo.toml
++++ rustc-1.29.0-src/src/tools/cargo/Cargo.toml
+@@ -60,5 +60,5 @@
+ # A noop dependency that changes in the Rust repository, it's a bit of a hack.
+ # See the `src/tools/rustc-workspace-hack/README.md` file in `rust-lang/rust`
+ # for more information.
+-rustc-workspace-hack = "1.0.0"
++rustc-workspace-hack = { path = "../rustc-workspace-hack" }
+ 
+# mrustc can't represent a 24 byte version of this enum (no way of storing the
+# tag in padding)
+--- rustc-1.29.0-src/src/librustc/ty/context.rs
++++ rustc-1.29.0-src/src/librustc/ty/context.rs
+@@ -805,5 +805,5 @@
+         // Ensure our type representation does not grow
+-        #[cfg(target_pointer_width = "64")]
+-        assert!(mem::size_of::<ty::TypeVariants>() <= 24);
+-        #[cfg(target_pointer_width = "64")]
+-        assert!(mem::size_of::<ty::TyS>() <= 32);
++        //#[cfg(target_pointer_width = "64")]
++        //assert!(mem::size_of::<ty::TypeVariants>() <= 24);
++        //#[cfg(target_pointer_width = "64")]
++        //assert!(mem::size_of::<ty::TyS>() <= 32);
+
+--- rustc-1.29.0-src/src/stdsimd/stdsimd/arch/detect/os/x86.rs
++++ rustc-1.29.0-src/src/stdsimd/stdsimd/arch/detect/os/x86.rs
+@@ -14,5 +14,11 @@
+ /// Performs run-time feature detection.
+ #[inline]
++#[cfg(not(rust_compiler="mrustc"))]
+ pub fn check_for(x: Feature) -> bool {
+     cache::test(x as u32, detect_features)
+ }
++#[inline]
++#[cfg(rust_compiler="mrustc")]
++pub fn check_for(x: Feature) -> bool {
++    false
++}
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index 76b1466284..75dc694f24 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -88,7 +88,7 @@
                                    (package-native-inputs base-rust))))))
 
 (define-public mrustc
-  (let ((rustc-version "1.19.0"))
+  (let ((rustc-version "1.29.0"))
     (package
       (name "mrustc")
       (version "0.9")
@@ -109,7 +109,7 @@
        `(("bison" ,bison)
          ("flex" ,flex)
          ;; Required for the libstd sources.
-         ("rustc" ,(package-source rust-1.19))))
+         ("rustc" ,(package-source rust-1.29))))
       (arguments
        `(#:test-target "local_tests"
          #:make-flags (list (string-append "LLVM_CONFIG="
@@ -133,8 +133,8 @@
                                  ,(or (%current-target-system)
                                       (nix-system->gnu-triplet-for-rust)))))
                (invoke "tar" "xf" (assoc-ref inputs "rustc"))
-               (chdir "rustc-1.19.0-src")
-               (invoke "patch" "-p0" "../rustc-1.19.0-src.patch")
+               (chdir "rustc-1.29.0-src")
+               (invoke "patch" "-p0" "../rustc-1.29.0-src.patch")
                (chdir "..")
                #t))
            (replace 'configure
@@ -178,19 +178,21 @@ safety and thread safety guarantees.")
       ;; Dual licensed.
       (license (list license:asl2.0 license:expat)))))
 
-(define rust-1.19
+(define rust-1.29
   (package
     (name "rust")
-    (version "1.19.0")
+    (version "1.29.0")
     (source
       (origin
         (method url-fetch)
-        (uri (rust-uri "1.19.0"))
-        (sha256 (base32 "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm"))
+        (uri (rust-uri "1.29.0"))
+        (sha256 (base32 "1sb15znckj8pc8q3g7cq03pijnida6cg64yqmgiayxkzskzk9sx4"))
         (modules '((guix build utils)))
         (snippet '(begin (delete-file-recursively "src/llvm") #t))
-        (patches (map search-patch '("rust-1.19-mrustc.patch")))))
-    (outputs '("out" "cargo"))
+        (patches (map search-patch '("rust-1.25-accept-more-detailed-gdb-lines.patch"
+                                     "rust-reproducible-builds.patch"
+                                     "rustc-1.29.0-src.patch")))))
+    (outputs '("out" "cargo" "doc"))
     (properties '((timeout . 72000)               ;20 hours
                   (max-silent-time . 18000)))     ;5 hours (for armel)
     (arguments
@@ -201,6 +203,7 @@ safety and thread safety guarantees.")
          (add-after 'unpack 'set-env
            (lambda* (#:key inputs #:allow-other-keys)
              ;; Disable test for cross compilation support.
+(write "X")
              (setenv "CFG_DISABLE_CROSS_TESTS" "1")
              (setenv "SHELL" (which "sh"))
              (setenv "CONFIG_SHELL" (which "sh"))
@@ -208,24 +211,6 @@ safety and thread safety guarantees.")
              ;; guix llvm-3.9.1 package installs only shared libraries
              (setenv "LLVM_LINK_SHARED" "1")
              #t))
-         (add-after 'unpack 'patch-cargo-tomls
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (substitute* "src/librustc_errors/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-term = \"0.4.4\"
-"))
-             (substitute* "src/librustc/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-getopts = { path = \"../libgetopts\" }
-"))
-             (substitute* "src/librustdoc/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-test = { path = \"../libtest\" }
-"))
-             #t))
          (add-after 'unpack 'patch-tests
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((bash (assoc-ref inputs "bash")))
@@ -244,27 +229,29 @@ test = { path = \"../libtest\" }
     #[ignore]
     fn test_process_mask"))
                #t)))
+         (add-after 'patch-tests 'patch-cargo-index-update
+           (lambda* _
+             (substitute* "src/tools/cargo/tests/testsuite/generate_lockfile.rs"
+               ;; This test wants to update the crate index.
+               (("fn no_index_update") "#[ignore]\nfn no_index_update"))
+             #t))
          (add-after 'patch-tests 'patch-aarch64-test
            (lambda* _
-             (substitute* "src/librustc_back/dynamic_lib.rs"
+             (substitute* "src/librustc_metadata/dynamic_lib.rs"
                ;; This test is known to fail on aarch64 and powerpc64le:
                ;; https://github.com/rust-lang/rust/issues/45410
                (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-             #t))
-         (add-after 'patch-tests 'use-readelf-for-tests
-           (lambda* _
-             ;; nm doesn't recognize the file format because of the
-             ;; nonstandard sections used by the Rust compiler, but readelf
-             ;; ignores them.
-             (substitute* "src/test/run-make/atomic-lock-free/Makefile"
-               (("\tnm ")
-                "\treadelf -c "))
+             ;; This test fails on aarch64 with llvm@6.0:
+             ;; https://github.com/rust-lang/rust/issues/49807
+             ;; other possible solution:
+             ;; https://github.com/rust-lang/rust/pull/47688
+             (delete-file "src/test/debuginfo/by-value-self-argument-in-trait-impl.rs")
              #t))
          (add-after 'patch-tests 'remove-unsupported-tests
            (lambda* _
              ;; 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")
+             (delete-file-recursively "src/test/run-make-fulldeps/linker-output-non-utf8")
              #t))
          (add-after 'patch-source-shebangs 'patch-cargo-checksums
            (lambda* _
@@ -284,19 +271,28 @@ test = { path = \"../libtest\" }
              #t))
          ;; This phase is overridden by newer versions.
          (replace 'configure
-           (const #t))
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (setenv "CXX" "g++")
+             (setenv "HOST_CXX" "g++")
+             #t))
          ;; This phase is overridden by newer versions.
          (replace 'build
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let ((rustc-bootstrap (assoc-ref inputs "rustc-bootstrap")))
+;(invoke "ls" "src/vendor/getopts")
+;(newline)
                (setenv "CFG_COMPILER_HOST_TRIPLE"
                 ,(nix-system->gnu-triplet (%current-system)))
                (setenv "CFG_RELEASE" "")
                (setenv "CFG_RELEASE_CHANNEL" "stable")
                (setenv "CFG_LIBDIR_RELATIVE" "lib")
-               (setenv "CFG_VERSION" "1.19.0-stable-mrustc")
+               (setenv "CFG_VERSION" "1.29.0-stable-mrustc")
                ; bad: (setenv "CFG_PREFIX" "mrustc") ; FIXME output path.
-               (mkdir-p "output")
+               ;; Crate::load_extern_crate ignores the search path, so make
+               ;; the situation easier for it.
+               (copy-recursively (string-append rustc-bootstrap "/lib/mrust")
+                                 "output")
+               ;(mkdir-p "output")
                (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
                        "src/rustc" "--vendor-dir" "src/vendor"
                        "--output-dir" "output/rustc-build"
@@ -311,7 +307,7 @@ test = { path = \"../libtest\" }
                (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
                        "src/tools/cargo" "--vendor-dir" "src/vendor"
                        "--output-dir" "output/cargo-build"
-                       "-L" "output/"
+                       ;"-L" "output/"
                        "-L" (string-append rustc-bootstrap "/lib/mrust")
                        "-j" "1")
                ;; Now use the newly-built rustc to build the libraries.
@@ -396,7 +392,7 @@ test = { path = \"../libtest\" }
        ("which" ,which)))
     (inputs
      `(("jemalloc" ,jemalloc-4.5.0)
-       ("llvm" ,llvm-3.9.1)
+       ("llvm" ,llvm-6)
        ("openssl" ,openssl-1.0)
        ("libssh2" ,libssh2) ; For "cargo"
        ("libcurl" ,curl)))  ; For "cargo"
@@ -419,10 +415,10 @@ safety and thread safety guarantees.")
     ;; Dual licensed.
     (license (list license:asl2.0 license:expat))))
 
-(define-public rust-1.20
+(define-public rust-1.30
   (let ((base-rust
-         (rust-bootstrapped-package rust-1.19 "1.20.0"
-          "0542y4rnzlsrricai130mqyxl8r6rd991frb4qsnwb27yigqg91a")))
+         (rust-bootstrapped-package rust-1.29 "1.30.1"
+          "0aavdc1lqv0cjzbqwl5n59yd0bqdlhn0zas61ljf38yrvc18k8rn")))
     (package
       (inherit base-rust)
       (source
@@ -431,20 +427,45 @@ safety and thread safety guarantees.")
           (snippet '(begin
                       (delete-file-recursively "src/jemalloc")
                       (delete-file-recursively "src/llvm")
+                      (delete-file-recursively "src/llvm-emscripten")
+                      (delete-file-recursively "src/tools/clang")
+                      (delete-file-recursively "src/tools/lldb")
                       #t))
           (patches '())))
       (outputs '("out" "doc" "cargo"))
-      ;; Since rust-1.19 is local, it's quite probable that Hydra
-      ;; will build rust-1.19 only as a dependency of rust-1.20.
+      ;; Since rust-2.19 is local, it's quite probable that Hydra
+      ;; will build rust-1.29 only as a dependency of rust-1.20.
       ;; But then Hydra will use the wrong properties, the ones here,
-      ;; for rust-1.19.  Therefore, we copied the properties of
-      ;; rust-1.19 here.
+      ;; for rust-1.29.  Therefore, we copied the properties of
+      ;; rust-1.29 here.
       (properties '((timeout . 72000)               ;20 hours
                     (max-silent-time . 18000)))     ;5 hours (for armel)
+      (inputs
+       ;; Use LLVM 6.0
+       (alist-replace "llvm" (list llvm-6)
+                      (package-inputs base-rust)))
       (arguments
-       (substitute-keyword-arguments (package-arguments rust-1.19)
+       (substitute-keyword-arguments (package-arguments rust-1.29)
          ((#:phases phases)
           `(modify-phases ,phases
+             (add-after 'unpack 'remove-flaky-test
+               (lambda _
+                 ;; See <https://github.com/rust-lang/rust/issues/43402>.
+                 (when (file-exists? "src/test/run-make/issue-26092")
+                   (delete-file-recursively "src/test/run-make/issue-26092"))
+                 #t))
+             (add-after 'configure 'enable-codegen-tests
+               ;; Codegen tests should pass with llvm 6, so enable them.
+               (lambda* _
+                 (substitute* "config.toml"
+                   (("codegen-tests = false") ""))
+                 #t))
+              ;; The test has been moved elsewhere.
+              (add-after 'patch-tests 'disable-amd64-avx-test
+                (lambda _
+                  (substitute* "src/test/ui/issues/issue-44056.rs"
+                   (("only-x86_64") "ignore-test"))
+                  #t))
              (add-after 'patch-tests 'patch-cargo-tests
                (lambda _
                  (substitute* "src/tools/cargo/tests/build.rs"
@@ -466,12 +487,29 @@ safety and thread safety guarantees.")
                    (("fn finds_author_git") "#[ignore]\nfn finds_author_git")
                    (("fn finds_local_author_git") "#[ignore]\nfn finds_local_author_git"))
                  #t))
-             (add-after 'patch-cargo-tests 'ignore-glibc-2.27-incompatible-test
-               ;; https://github.com/rust-lang/rust/issues/47863
-               (lambda _
-                 (substitute* "src/test/run-pass/out-of-stack.rs"
-                   (("// ignore-android") "// ignore-test\n// ignore-android"))
-                 #t))
+             (add-after 'patch-cargo-tests 'patch-cargo-env-shebang
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (let ((coreutils (assoc-ref inputs "coreutils")))
+                   (substitute* "src/tools/cargo/tests/testsuite/fix.rs"
+                     ;; Cargo has a test which explicitly sets a
+                     ;; RUSTC_WRAPPER environment variable which points
+                     ;; to /usr/bin/env. Since it's not a shebang, it
+                     ;; needs to be manually patched
+                     (("\"/usr/bin/env\"")
+                      (string-append "\"" coreutils "/bin/env\"")))
+                   #t)))
+             (add-after 'patch-cargo-env-shebang 'ignore-cargo-package-tests
+               (lambda* _
+                 (substitute* "src/tools/cargo/tests/testsuite/package.rs"
+                   ;; These tests largely check that cargo outputs warning/error
+                   ;; messages as expected. It seems that cargo outputs an
+                   ;; absolute path to something in the store instead of the
+                   ;; expected relative path (e.g. `[..]`) so we'll ignore
+                   ;; these for now
+                   (("fn include") "#[ignore]\nfn include")
+                   (("fn exclude") "#[ignore]\nfn exclude"))
+                   #t))
+
              (replace 'configure
                (lambda* (#:key inputs outputs #:allow-other-keys)
                  (let* ((out (assoc-ref outputs "out"))
@@ -523,16 +561,6 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                           "/tmp/cc")
                  (setenv "PATH" (string-append "/tmp:" (getenv "PATH")))
                  #t))
-             (add-after 'provide-cc 'configure-archiver
-               (lambda* (#:key inputs #:allow-other-keys)
-                 (substitute* "src/build_helper/lib.rs"
-                  ;; Make sure "ar" is always used as the archiver.
-                  (("\"musl\"") "\"\"")
-                  ;; Then substitute "ar" by our name.
-                  (("\"ar\"") (string-append "\""
-                               (assoc-ref inputs "binutils")
-                               "/bin/ar\"")))
-                 #t))
              (delete 'patch-cargo-tomls)
              (add-before 'build 'reset-timestamps-after-changes
                (lambda* _
@@ -549,11 +577,14 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                  (invoke "./x.py" "build" "src/tools/cargo")))
              (replace 'check
                (lambda* _
-                 ;; Disable parallel execution to prevent EAGAIN errors when
-                 ;; running tests.
-                 (invoke "./x.py" "-j1" "test" "-vv")
-                 (invoke "./x.py" "-j1" "test" "src/tools/cargo")
-                 #t))
+                 ;; Enable parallel execution.
+                 (let ((parallel-job-spec
+                        (string-append "-j" (number->string
+                                             (min 4
+                                                  (parallel-job-count))))))
+                   (invoke "./x.py" parallel-job-spec "test" "-vv")
+                   (invoke "./x.py" parallel-job-spec "test"
+                           "src/tools/cargo"))))
              (replace 'install
                (lambda* (#:key outputs #:allow-other-keys)
                  (invoke "./x.py" "install")
@@ -591,315 +622,6 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                      `("LIBRARY_PATH" ":" suffix (,(string-append libc "/lib"))))
                    #t))))))))))
 
-(define-public rust-1.21
-  (let ((base-rust (rust-bootstrapped-package rust-1.20 "1.21.0"
-                    "1yj8lnxybjrybp00fqhxw8fpr641dh8wcn9mk44xjnsb4i1c21qp")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'configure 'remove-ar
-               (lambda* (#:key inputs #:allow-other-keys)
-                 ;; Remove because toml complains about "unknown field".
-                 (substitute* "config.toml"
-                  (("^ar =.*") "\n"))
-                 #t)))))))))
-
-(define-public rust-1.22
-  (let ((base-rust (rust-bootstrapped-package rust-1.21 "1.22.1"
-                    "1lrzzp0nh7s61wgfs2h6ilaqi6iq89f1pd1yaf65l87bssyl4ylb")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'unpack 'remove-flaky-test
-               (lambda _
-                 ;; See <https://github.com/rust-lang/rust/issues/43402>.
-                 (when (file-exists? "src/test/run-make/issue-26092")
-                   (delete-file-recursively "src/test/run-make/issue-26092"))
-                 #t)))))))))
-
-(define-public rust-1.23
-  (let ((base-rust (rust-bootstrapped-package rust-1.22 "1.23.0"
-                    "14fb8vhjzsxlbi6yrn1r6fl5dlbdd1m92dn5zj5gmzfwf4w9ar3l")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'configure-archiver)
-             (delete 'remove-ar)
-             (add-after 'unpack 'dont-build-native
-               (lambda _
-                 ;; XXX: Revisit this when we use gcc 6.
-                 (substitute* "src/binaryen/CMakeLists.txt"
-                  (("ADD_COMPILE_FLAG\\(\\\"-march=native\\\"\\)") ""))
-                 #t)))))))))
-
-(define-public rust-1.24
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.23 "1.24.1"
-          "1vv10x2h9kq7fxh2v01damdq8pvlp5acyh1kzcda9sfjx12kv99y")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'use-readelf-for-tests)
-             (replace 'patch-aarch64-test
-               (lambda* _
-                 (substitute* "src/librustc_metadata/dynamic_lib.rs"
-                   ;; This test is known to fail on aarch64 and powerpc64le:
-                   ;; https://github.com/rust-lang/rust/issues/45410
-                   (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-                 #t)))))))))
-
-;;; Rust 1.25 release support work with llvm 6--but build with llvm 6 is
-;;; not determenistic due to <https://github.com/rust-lang/rust/issues/50556>.
-;;; Keep using llvm 3.9.1 until builds become determenistic
-(define-public rust-1.25
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.24 "1.25.0"
-          "0baxjr99311lvwdq0s38bipbnj72pn6fgbk6lcq7j555xq53mxpf")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (snippet '(begin
-                      (delete-file-recursively "src/jemalloc")
-                      (delete-file-recursively "src/llvm")
-                      (delete-file-recursively "src/llvm-emscripten")
-                      #t))
-          (patches (map search-patch
-                        '("rust-1.25-accept-more-detailed-gdb-lines.patch")))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'patch-cargo-tests 'patch-cargo-index-update
-               (lambda _
-                 (substitute* "src/tools/cargo/tests/generate-lockfile.rs"
-                   ;; This test wants to update the crate index.
-                   (("fn no_index_update") "#[ignore]\nfn no_index_update"))
-                 #t))
-             (replace 'patch-aarch64-test
-               (lambda _
-                 (substitute* "src/librustc_metadata/dynamic_lib.rs"
-                   ;; This test is known to fail on aarch64 and powerpc64le:
-                   ;; https://github.com/rust-lang/rust/issues/45410
-                   (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-                 ;; This test fails on aarch64 with llvm@6.0:
-                 ;; https://github.com/rust-lang/rust/issues/49807
-                 ;; other possible solution:
-                 ;; https://github.com/rust-lang/rust/pull/47688
-                 (delete-file "src/test/debuginfo/by-value-self-argument-in-trait-impl.rs")
-                 #t))
-             (delete 'ignore-glibc-2.27-incompatible-test))))))))
-
-(define-public rust-1.26
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.25 "1.26.2"
-          "0047ais0fvmqvngqkdsxgrzhb0kljg8wy85b01kbbjc88hqcz7pv")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch
-                        '("rust-coresimd-doctest.patch"
-                          "rust-1.25-accept-more-detailed-gdb-lines.patch")))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             ;; binaryen was replaced with LLD project from LLVM
-             (delete 'dont-build-native)
-             (replace 'check
-               (lambda* _
-                 ;; Enable parallel execution.
-                 (let ((parallel-job-spec
-                        (string-append "-j" (number->string
-                                             (min 4
-                                                  (parallel-job-count))))))
-                   (invoke "./x.py" parallel-job-spec "test" "-vv")
-                   (invoke "./x.py" parallel-job-spec "test"
-                           "src/tools/cargo"))))
-             (replace 'remove-unsupported-tests
-               (lambda* _
-                 ;; 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-fulldeps/linker-output-non-utf8")
-                 #t))
-             (replace 'patch-cargo-tests
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/build.rs"
-                   (("/usr/bin/env") (which "env"))
-                   ;; Guix llvm is compiled without asmjs-unknown-emscripten.
-                   (("fn wasm32_final_outputs") "#[ignore]\nfn wasm32_final_outputs"))
-                 (substitute* "src/tools/cargo/tests/testsuite/death.rs"
-                   ;; This is stuck when built in container.
-                   (("fn ctrl_c_kills_everyone") "#[ignore]\nfn ctrl_c_kills_everyone"))
-                 ;; Prints test output in the wrong order when built on
-                 ;; i686-linux.
-                 (substitute* "src/tools/cargo/tests/testsuite/test.rs"
-                   (("fn cargo_test_env") "#[ignore]\nfn cargo_test_env"))
-
-                 ;; Avoid dependency on "git".
-                 (substitute* "src/tools/cargo/tests/testsuite/new.rs"
-                   (("fn author_prefers_cargo") "#[ignore]\nfn author_prefers_cargo")
-                   (("fn finds_author_git") "#[ignore]\nfn finds_author_git")
-                   (("fn finds_local_author_git") "#[ignore]\nfn finds_local_author_git"))
-                 #t))
-             (add-after 'patch-cargo-tests 'disable-cargo-test-for-nightly-channel
-               (lambda* _
-                 ;; This test failed to work on "nightly" channel builds
-                 ;; https://github.com/rust-lang/cargo/issues/5648
-                 (substitute* "src/tools/cargo/tests/testsuite/resolve.rs"
-                   (("fn test_resolving_minimum_version_with_transitive_deps")
-                    "#[ignore]\nfn test_resolving_minimum_version_with_transitive_deps"))
-                 #t))
-             (replace 'patch-cargo-index-update
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/generate_lockfile.rs"
-                   ;; This test wants to update the crate index.
-                   (("fn no_index_update") "#[ignore]\nfn no_index_update"))
-                 #t)))))))))
-
-(define-public rust-1.27
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.26 "1.27.2"
-          "0pg1s37bhx9zqbynxyydq5j6q7kij9vxkcv8maz0m25prm88r0cs")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch '("rust-coresimd-doctest.patch"
-                                       "rust-bootstrap-stage0-test.patch"
-                                       "rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                       "rust-reproducible-builds.patch")))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-before 'install 'mkdir-prefix-paths
-               (lambda* (#:key outputs #:allow-other-keys)
-                 ;; As result of https://github.com/rust-lang/rust/issues/36989
-                 ;; `prefix' directory should exist before `install' call
-                 (mkdir-p (assoc-ref outputs "out"))
-                 (mkdir-p (assoc-ref outputs "cargo"))
-                 #t))
-             (add-after 'patch-cargo-tests 'disable-thinlto-test
-               (lambda* _
-                 ;; thinlto required llvm 6.0 for work
-                 (substitute* "src/tools/cargo/tests/testsuite/path.rs"
-                   (("fn thin_lto_works") "#[ignore]\nfn thin_lto_works"))
-                 #t)))))))))
-
-(define-public rust-1.28
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.27 "1.28.0"
-          "11k4rn77bca2rikykkk9fmprrgjswd4x4kaq7fia08vgkir82nhx")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch '("rust-coresimd-doctest.patch"
-                                       "rust-bootstrap-stage0-test.patch"
-                                       "rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                       "rust-reproducible-builds.patch")))))
-      (inputs
-       ;; Use LLVM 6.0
-       (alist-replace "llvm" (list llvm-6)
-                      (package-inputs base-rust)))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'configure 'enable-codegen-tests
-               ;; Codegen tests should pass with llvm 6, so enable them.
-               (lambda* _
-                 (substitute* "config.toml"
-                   (("codegen-tests = false") ""))
-                 #t))
-             (add-after 'patch-tests 'disable-amd64-avx-test
-               ;; That test would fail on x86_64 machines without avx.
-               (lambda* _
-                 (substitute* "src/test/run-pass/issue-44056.rs"
-                   (("only-x86_64") "ignore-test"))
-                 #t))
-             ;; The thinlto test should pass with llvm 6.
-             (delete 'disable-thinlto-test))))))))
-
-(define-public rust-1.29
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.28 "1.29.2"
-          "1jb787080z754caa2w3w1amsygs4qlzj9rs1vy64firfmabfg22h")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch '("rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                       "rust-reproducible-builds.patch"))))))))
-
-(define-public rust-1.30
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.29 "1.30.1"
-          "0aavdc1lqv0cjzbqwl5n59yd0bqdlhn0zas61ljf38yrvc18k8rn")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (snippet '(begin
-                      (delete-file-recursively "src/jemalloc")
-                      (delete-file-recursively "src/llvm")
-                      (delete-file-recursively "src/llvm-emscripten")
-                      (delete-file-recursively "src/tools/clang")
-                      (delete-file-recursively "src/tools/lldb")
-                      #t))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'patch-cargo-tests 'patch-cargo-env-shebang
-               (lambda* (#:key inputs #:allow-other-keys)
-                 (let ((coreutils (assoc-ref inputs "coreutils")))
-                   (substitute* "src/tools/cargo/tests/testsuite/fix.rs"
-                     ;; Cargo has a test which explicitly sets a
-                     ;; RUSTC_WRAPPER environment variable which points
-                     ;; to /usr/bin/env. Since it's not a shebang, it
-                     ;; needs to be manually patched
-                     (("\"/usr/bin/env\"")
-                      (string-append "\"" coreutils "/bin/env\"")))
-                   #t)))
-             (add-after 'patch-cargo-env-shebang 'ignore-cargo-package-tests
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/package.rs"
-                   ;; These tests largely check that cargo outputs warning/error
-                   ;; messages as expected. It seems that cargo outputs an
-                   ;; absolute path to something in the store instead of the
-                   ;; expected relative path (e.g. `[..]`) so we'll ignore
-                   ;; these for now
-                   (("fn include") "#[ignore]\nfn include")
-                   (("fn exclude") "#[ignore]\nfn exclude"))
-                   #t))
-             ;; The test has been moved elsewhere.
-             (replace 'disable-amd64-avx-test
-               (lambda _
-                 (substitute* "src/test/ui/run-pass/issues/issue-44056.rs"
-	          (("only-x86_64") "ignore-test"))
-                  #t)))))))))
-
 (define-public rust-1.31
   (let ((base-rust
          (rust-bootstrapped-package rust-1.30 "1.31.1"
@@ -925,10 +647,10 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                      ((" Command::new\\(\"echo\"\\)")
                       (string-append "\nCommand::new(\"" coreutils "/bin/echo\")\n")))
                    #t)))
-	      ;; The test has been moved elsewhere.
-	      (replace 'disable-amd64-avx-test
-	        (lambda _
-	          (substitute* "src/test/ui/issues/issue-44056.rs"
+	     ;; The test has been moved elsewhere.
+             (replace 'disable-amd64-avx-test
+               (lambda _
+                 (substitute* "src/test/ui/issues/issue-44056.rs"
                    (("only-x86_64") "ignore-test"))
                   #t))
              (add-after 'patch-tests 'patch-process-docs-rev-cmd

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH v2 1/2] gnu: mrustc: Update to 0.9.
  2019-11-08  2:46     ` [bug#38110] [PATCH v2 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
@ 2019-11-08 22:47       ` Ludovic Courtès
  0 siblings, 0 replies; 24+ messages in thread
From: Ludovic Courtès @ 2019-11-08 22:47 UTC (permalink / raw)
  To: Danny Milosavljevic; +Cc: 38110

Hi!

Danny Milosavljevic <dannym@scratchpost.org> skribis:

> * gnu/packages/patches/mrustc-0.8.0-fix-variable-length-integer-receiving.patch: Delete file.
> * gnu/local.mk (dist_patch_DATA): Remove it.
> * gnu/packages/rust.scm (mrustc): Update to 0.9.
> [source](patches): Remove it.
> [arguments]<#:phases>[build-minicargo]: Modify.

LGTM!  But note that this cannot go to ‘master’ yet because IceCat
depends on it.  So I think we should discuss on guix-devel when and
where to land these patches; perhaps the next ‘staging’ branch?

Thanks,
Ludo’.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH v2 2/2] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2019-11-08  2:46     ` [bug#38110] [PATCH v2 2/2] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
@ 2019-11-08 22:50       ` Ludovic Courtès
  2020-03-15 14:20       ` Marius Bakke
  1 sibling, 0 replies; 24+ messages in thread
From: Ludovic Courtès @ 2019-11-08 22:50 UTC (permalink / raw)
  To: Danny Milosavljevic; +Cc: 38110

Hi,

Danny Milosavljevic <dannym@scratchpost.org> skribis:

> * gnu/packages/patches/rustc-1.29.0-src.patch: New file.
> * gnu/local.mk (dist_patch_DATA): Add it.
> * gnu/packages/rust.scm (rust-1.19): Delete variable.
> (rust-1.20): Delete variable.
> (rust-1.21): Delete variable.
> (rust-1.22): Delete variable.
> (rust-1.23): Delete variable.
> (rust-1.24): Delete variable.
> (rust-1.25): Delete variable.
> (rust-1.26): Delete variable.
> (rust-1.27): Delete variable.
> (rust-1.28): Delete variable.
> (rust-1.29): Bootstrap from mrustc.
> [source]: Add patch.
> (rust-1.30)[inputs]: Remove llvm 3.  Add llvm 6.
> (mrustc): Update rustc-version to 1.29.0.

This is really, really cool!  I stumbled upon
<https://lobste.rs/s/utgedg/mrustc_0_9_now_with_rust_1_29_0_support>
recently and felt a relief.  :-)

I wonder if there’d be any value in keeping a couple of old versions of
Rust.  Is that something useful to Rust developers?  If not, I’m happy
to see them go!

> --- /dev/null
> +++ b/gnu/packages/patches/rustc-1.29.0-src.patch
> @@ -0,0 +1,86 @@
> +From mrustc 0.9.
> +# Add mrustc slice length intrinsics

Could you use a more meaningful name (why “-src”?) and add a link to the
upstream commit or upstream issue discussing this change?

Apart from that it looks great!

Thanks,
Ludo’.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9.
  2019-11-08  2:46   ` [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
  2019-11-08  2:46     ` [bug#38110] [PATCH v2 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
  2019-11-08  2:46     ` [bug#38110] [PATCH v2 2/2] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
@ 2020-01-19 22:19     ` Danny Milosavljevic
  2020-01-21  0:15       ` Danny Milosavljevic
  2 siblings, 1 reply; 24+ messages in thread
From: Danny Milosavljevic @ 2020-01-19 22:19 UTC (permalink / raw)
  To: 38110

[-- Attachment #1: Type: text/plain, Size: 29 bytes --]

This version has a problem.

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9.
  2020-01-19 22:19     ` [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
@ 2020-01-21  0:15       ` Danny Milosavljevic
  0 siblings, 0 replies; 24+ messages in thread
From: Danny Milosavljevic @ 2020-01-21  0:15 UTC (permalink / raw)
  To: 38110

[-- Attachment #1: Type: text/plain, Size: 52 bytes --]

https://github.com/thepowersgang/mrustc/issues/140

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH v2 2/2] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2019-11-08  2:46     ` [bug#38110] [PATCH v2 2/2] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
  2019-11-08 22:50       ` Ludovic Courtès
@ 2020-03-15 14:20       ` Marius Bakke
  2020-03-15 19:23         ` Danny Milosavljevic
  1 sibling, 1 reply; 24+ messages in thread
From: Marius Bakke @ 2020-03-15 14:20 UTC (permalink / raw)
  To: Danny Milosavljevic, 38110

[-- Attachment #1: Type: text/plain, Size: 893 bytes --]

Hello Danny,

Danny Milosavljevic <dannym@scratchpost.org> writes:

> * gnu/packages/patches/rustc-1.29.0-src.patch: New file.
> * gnu/local.mk (dist_patch_DATA): Add it.
> * gnu/packages/rust.scm (rust-1.19): Delete variable.
> (rust-1.20): Delete variable.
> (rust-1.21): Delete variable.
> (rust-1.22): Delete variable.
> (rust-1.23): Delete variable.
> (rust-1.24): Delete variable.
> (rust-1.25): Delete variable.
> (rust-1.26): Delete variable.
> (rust-1.27): Delete variable.
> (rust-1.28): Delete variable.
> (rust-1.29): Bootstrap from mrustc.
> [source]: Add patch.
> (rust-1.30)[inputs]: Remove llvm 3.  Add llvm 6.
> (mrustc): Update rustc-version to 1.29.0.

I know there was a problem with this patch, but can you rebase it on the
current 'core-updates' branch?

I'd rather try to fix this than
<https://issues.guix.gnu.org/issue/39949>, but the patch does not apply
any longer.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2019-11-07 22:27 [bug#38110] [PATCH 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
  2019-11-07 22:29 ` [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
@ 2020-03-15 19:23 ` Danny Milosavljevic
  2020-03-19 23:58   ` Jakub Kądziołka
                     ` (2 more replies)
  1 sibling, 3 replies; 24+ messages in thread
From: Danny Milosavljevic @ 2020-03-15 19:23 UTC (permalink / raw)
  To: 38110; +Cc: Danny Milosavljevic

* gnu/packages/patches/rustc-1.29.0-src.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/rust.scm (rust-1.19): Delete variable.
(rust-1.20): Delete variable.
(rust-1.21): Delete variable.
(rust-1.22): Delete variable.
(rust-1.23): Delete variable.
(rust-1.24): Delete variable.
(rust-1.25): Delete variable.
(rust-1.26): Delete variable.
(rust-1.27): Delete variable.
(rust-1.28): Delete variable.
(rust-1.29): Bootstrap from mrustc.
[source]: Add patch.
(rust-1.30)[inputs]: Remove llvm 3.  Add llvm 6.
(mrustc): Update rustc-version to 1.29.0.
---
 gnu/local.mk                                |   1 +
 gnu/packages/patches/rustc-1.29.0-src.patch |  86 ++++
 gnu/packages/rust.scm                       | 494 +++++---------------
 3 files changed, 192 insertions(+), 389 deletions(-)
 create mode 100644 gnu/packages/patches/rustc-1.29.0-src.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 21a149c469..e39974b0a0 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1392,6 +1392,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/rust-1.19-mrustc.patch			\
   %D%/packages/patches/rust-1.25-accept-more-detailed-gdb-lines.patch \
   %D%/packages/patches/rust-bootstrap-stage0-test.patch		\
+  %D%/packages/patches/rustc-1.29.0-src.patch			\
   %D%/packages/patches/rust-coresimd-doctest.patch		\
   %D%/packages/patches/rust-reproducible-builds.patch		 \
   %D%/packages/patches/rust-openssl-sys-no-vendor.patch	\
diff --git a/gnu/packages/patches/rustc-1.29.0-src.patch b/gnu/packages/patches/rustc-1.29.0-src.patch
new file mode 100644
index 0000000000..feeb7e71cf
--- /dev/null
+++ b/gnu/packages/patches/rustc-1.29.0-src.patch
@@ -0,0 +1,86 @@
+From mrustc 0.9.
+# Add mrustc slice length intrinsics
+--- rustc-1.29.0-src/src/libcore/intrinsics.rs
++++ rustc-1.29.0-src/src/libcore/intrinsics.rs
+@@ -678,5 +678,9 @@
+     pub fn min_align_of_val<T: ?Sized>(_: &T) -> usize;
+ 
++    /// Obtain the length of a slice pointer
++    #[cfg(rust_compiler="mrustc")]
++    pub fn mrustc_slice_len<T>(pointer: *const [T]) -> usize;
++
+     /// Gets a static string slice containing the name of a type.
+     pub fn type_name<T: ?Sized>() -> &'static str;
+
+--- rustc-1.29.0-src/src/libcore/slice/mod.rs
++++ rustc-1.29.0-src/src/libcore/slice/mod.rs
+@@ -413,5 +413,7 @@
+     pub const fn len(&self) -> usize {
+-        unsafe {
+-            Repr { rust: self }.raw.len
+-        }
++        #[cfg(not(rust_compiler="mrustc"))]
++        const fn len_inner<T>(s: &[T]) -> usize { unsafe { Repr { rust: s }.raw.len } };
++        #[cfg(rust_compiler="mrustc")]
++        const fn len_inner<T>(s: &[T]) -> usize { unsafe { ::intrinsics::mrustc_slice_len(s) } }
++        len_inner(self)
+     }
+# Static-link rustc_codegen_llvm because mrustc doesn't have dylib support
+--- rustc-1.29.0-src/src/librustc_driver/Cargo.toml
++++ rustc-1.29.0-src/src/librustc_driver/Cargo.toml
+@@ -39,1 +39,2 @@
+ syntax_pos = { path = "../libsyntax_pos" }
++rustc_codegen_llvm = { path = "../librustc_codegen_llvm" }
+--- rustc-1.29.0-src/src/librustc_driver/lib.rs
++++ rustc-1.29.0-src/src/librustc_driver/lib.rs
+@@ -63,2 +63,3 @@
+ extern crate syntax_pos;
++extern crate rustc_codegen_llvm;
+ 
+@@ -296,3 +296,7 @@
+     }
+ 
++    if backend_name == "llvm" {
++        return rustc_codegen_llvm::__rustc_codegen_backend;
++    }
++
+     let target = session::config::host_triple();
+# No workspace support in minicargo, patch cargo's Cargo.toml
+--- rustc-1.29.0-src/src/tools/cargo/Cargo.toml
++++ rustc-1.29.0-src/src/tools/cargo/Cargo.toml
+@@ -60,5 +60,5 @@
+ # A noop dependency that changes in the Rust repository, it's a bit of a hack.
+ # See the `src/tools/rustc-workspace-hack/README.md` file in `rust-lang/rust`
+ # for more information.
+-rustc-workspace-hack = "1.0.0"
++rustc-workspace-hack = { path = "../rustc-workspace-hack" }
+ 
+# mrustc can't represent a 24 byte version of this enum (no way of storing the
+# tag in padding)
+--- rustc-1.29.0-src/src/librustc/ty/context.rs
++++ rustc-1.29.0-src/src/librustc/ty/context.rs
+@@ -805,5 +805,5 @@
+         // Ensure our type representation does not grow
+-        #[cfg(target_pointer_width = "64")]
+-        assert!(mem::size_of::<ty::TypeVariants>() <= 24);
+-        #[cfg(target_pointer_width = "64")]
+-        assert!(mem::size_of::<ty::TyS>() <= 32);
++        //#[cfg(target_pointer_width = "64")]
++        //assert!(mem::size_of::<ty::TypeVariants>() <= 24);
++        //#[cfg(target_pointer_width = "64")]
++        //assert!(mem::size_of::<ty::TyS>() <= 32);
+
+--- rustc-1.29.0-src/src/stdsimd/stdsimd/arch/detect/os/x86.rs
++++ rustc-1.29.0-src/src/stdsimd/stdsimd/arch/detect/os/x86.rs
+@@ -14,5 +14,11 @@
+ /// Performs run-time feature detection.
+ #[inline]
++#[cfg(not(rust_compiler="mrustc"))]
+ pub fn check_for(x: Feature) -> bool {
+     cache::test(x as u32, detect_features)
+ }
++#[inline]
++#[cfg(rust_compiler="mrustc")]
++pub fn check_for(x: Feature) -> bool {
++    false
++}
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index 76afdefabe..f949d0e254 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -88,7 +88,7 @@
                                    (package-native-inputs base-rust))))))
 
 (define-public mrustc
-  (let ((rustc-version "1.19.0"))
+  (let ((rustc-version "1.29.0"))
     (package
       (name "mrustc")
       (version "0.9")
@@ -109,7 +109,7 @@
        `(("bison" ,bison)
          ("flex" ,flex)
          ;; Required for the libstd sources.
-         ("rustc" ,(package-source rust-1.19))))
+         ("rustc" ,(package-source rust-1.29))))
       (arguments
        `(#:test-target "test"
          #:make-flags
@@ -189,19 +189,21 @@ safety and thread safety guarantees.")
       ;; Dual licensed.
       (license (list license:asl2.0 license:expat)))))
 
-(define rust-1.19
+(define rust-1.29
   (package
     (name "rust")
-    (version "1.19.0")
+    (version "1.29.0")
     (source
       (origin
         (method url-fetch)
-        (uri (rust-uri "1.19.0"))
-        (sha256 (base32 "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm"))
+        (uri (rust-uri "1.29.0"))
+        (sha256 (base32 "1sb15znckj8pc8q3g7cq03pijnida6cg64yqmgiayxkzskzk9sx4"))
         (modules '((guix build utils)))
         (snippet '(begin (delete-file-recursively "src/llvm") #t))
-        (patches (map search-patch '("rust-1.19-mrustc.patch")))))
-    (outputs '("out" "cargo"))
+        (patches (map search-patch '("rust-1.25-accept-more-detailed-gdb-lines.patch"
+                                     "rust-reproducible-builds.patch"
+                                     "rustc-1.29.0-src.patch")))))
+    (outputs '("out" "cargo" "doc"))
     (properties '((timeout . 72000)               ;20 hours
                   (max-silent-time . 18000)))     ;5 hours (for armel)
     (arguments
@@ -212,6 +214,7 @@ safety and thread safety guarantees.")
          (add-after 'unpack 'set-env
            (lambda* (#:key inputs #:allow-other-keys)
              ;; Disable test for cross compilation support.
+(write "X")
              (setenv "CFG_DISABLE_CROSS_TESTS" "1")
              (setenv "SHELL" (which "sh"))
              (setenv "CONFIG_SHELL" (which "sh"))
@@ -219,24 +222,6 @@ safety and thread safety guarantees.")
              ;; guix llvm-3.9.1 package installs only shared libraries
              (setenv "LLVM_LINK_SHARED" "1")
              #t))
-         (add-after 'unpack 'patch-cargo-tomls
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (substitute* "src/librustc_errors/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-term = \"0.4.4\"
-"))
-             (substitute* "src/librustc/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-getopts = { path = \"../libgetopts\" }
-"))
-             (substitute* "src/librustdoc/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-test = { path = \"../libtest\" }
-"))
-             #t))
          (add-after 'unpack 'patch-tests
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((bash (assoc-ref inputs "bash")))
@@ -255,27 +240,29 @@ test = { path = \"../libtest\" }
     #[ignore]
     fn test_process_mask"))
                #t)))
+         (add-after 'patch-tests 'patch-cargo-index-update
+           (lambda* _
+             (substitute* "src/tools/cargo/tests/testsuite/generate_lockfile.rs"
+               ;; This test wants to update the crate index.
+               (("fn no_index_update") "#[ignore]\nfn no_index_update"))
+             #t))
          (add-after 'patch-tests 'patch-aarch64-test
            (lambda* _
-             (substitute* "src/librustc_back/dynamic_lib.rs"
+             (substitute* "src/librustc_metadata/dynamic_lib.rs"
                ;; This test is known to fail on aarch64 and powerpc64le:
                ;; https://github.com/rust-lang/rust/issues/45410
                (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-             #t))
-         (add-after 'patch-tests 'use-readelf-for-tests
-           (lambda* _
-             ;; nm doesn't recognize the file format because of the
-             ;; nonstandard sections used by the Rust compiler, but readelf
-             ;; ignores them.
-             (substitute* "src/test/run-make/atomic-lock-free/Makefile"
-               (("\tnm ")
-                "\treadelf -c "))
+             ;; This test fails on aarch64 with llvm@6.0:
+             ;; https://github.com/rust-lang/rust/issues/49807
+             ;; other possible solution:
+             ;; https://github.com/rust-lang/rust/pull/47688
+             (delete-file "src/test/debuginfo/by-value-self-argument-in-trait-impl.rs")
              #t))
          (add-after 'patch-tests 'remove-unsupported-tests
            (lambda* _
              ;; 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")
+             (delete-file-recursively "src/test/run-make-fulldeps/linker-output-non-utf8")
              #t))
          (add-after 'patch-source-shebangs 'patch-cargo-checksums
            (lambda* _
@@ -287,7 +274,10 @@ test = { path = \"../libtest\" }
              #t))
          ;; This phase is overridden by newer versions.
          (replace 'configure
-           (const #t))
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (setenv "CXX" "g++")
+             (setenv "HOST_CXX" "g++")
+             #t))
          ;; This phase is overridden by newer versions.
          (replace 'build
            (lambda* (#:key inputs outputs #:allow-other-keys)
@@ -297,10 +287,15 @@ test = { path = \"../libtest\" }
                (setenv "CFG_RELEASE" "")
                (setenv "CFG_RELEASE_CHANNEL" "stable")
                (setenv "CFG_LIBDIR_RELATIVE" "lib")
-               (setenv "CFG_VERSION" "1.19.0-stable-mrustc")
+               (setenv "CFG_VERSION" "1.29.0-stable-mrustc")
                (setenv "MRUSTC_TARGET_VER" ,(version-major+minor version))
                ; bad: (setenv "CFG_PREFIX" "mrustc") ; FIXME output path.
-               (mkdir-p "output")
+               ;; Crate::load_extern_crate ignores the search path, so make
+               ;; the situation easier for it.
+               (copy-recursively (string-append rustc-bootstrap "/lib/mrust")
+                                 "output")
+               ;(mkdir-p "output")
+
                ;; mrustc 0.9 doesn't check the search paths for crates anymore.
                (copy-recursively (string-append rustc-bootstrap "/lib/mrust")
                                  "output")
@@ -318,7 +313,7 @@ test = { path = \"../libtest\" }
                (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
                        "src/tools/cargo" "--vendor-dir" "src/vendor"
                        "--output-dir" "output/cargo-build"
-                       "-L" "output/"
+                       ;"-L" "output/"
                        "-L" (string-append rustc-bootstrap "/lib/mrust")
                        "-j" "1")
                ;; Now use the newly-built rustc to build the libraries.
@@ -403,7 +398,7 @@ test = { path = \"../libtest\" }
        ("which" ,which)))
     (inputs
      `(("jemalloc" ,jemalloc-4.5.0)
-       ("llvm" ,llvm-3.9.1)
+       ("llvm" ,llvm-6)
        ("openssl" ,openssl-1.0)
        ("libssh2" ,libssh2) ; For "cargo"
        ("libcurl" ,curl)))  ; For "cargo"
@@ -429,10 +424,10 @@ safety and thread safety guarantees.")
     ;; Dual licensed.
     (license (list license:asl2.0 license:expat))))
 
-(define-public rust-1.20
+(define-public rust-1.30
   (let ((base-rust
-         (rust-bootstrapped-package rust-1.19 "1.20.0"
-          "0542y4rnzlsrricai130mqyxl8r6rd991frb4qsnwb27yigqg91a")))
+         (rust-bootstrapped-package rust-1.29 "1.30.1"
+          "0aavdc1lqv0cjzbqwl5n59yd0bqdlhn0zas61ljf38yrvc18k8rn")))
     (package
       (inherit base-rust)
       (source
@@ -441,20 +436,45 @@ safety and thread safety guarantees.")
           (snippet '(begin
                       (delete-file-recursively "src/jemalloc")
                       (delete-file-recursively "src/llvm")
+                      (delete-file-recursively "src/llvm-emscripten")
+                      (delete-file-recursively "src/tools/clang")
+                      (delete-file-recursively "src/tools/lldb")
                       #t))
           (patches '())))
       (outputs '("out" "doc" "cargo"))
-      ;; Since rust-1.19 is local, it's quite probable that Hydra
-      ;; will build rust-1.19 only as a dependency of rust-1.20.
+      ;; Since rust-2.19 is local, it's quite probable that Hydra
+      ;; will build rust-1.29 only as a dependency of rust-1.20.
       ;; But then Hydra will use the wrong properties, the ones here,
-      ;; for rust-1.19.  Therefore, we copied the properties of
-      ;; rust-1.19 here.
+      ;; for rust-1.29.  Therefore, we copied the properties of
+      ;; rust-1.29 here.
       (properties '((timeout . 72000)               ;20 hours
                     (max-silent-time . 18000)))     ;5 hours (for armel)
+      (inputs
+       ;; Use LLVM 6.0
+       (alist-replace "llvm" (list llvm-6)
+                      (package-inputs base-rust)))
       (arguments
-       (substitute-keyword-arguments (package-arguments rust-1.19)
+       (substitute-keyword-arguments (package-arguments rust-1.29)
          ((#:phases phases)
           `(modify-phases ,phases
+             (add-after 'unpack 'remove-flaky-test
+               (lambda _
+                 ;; See <https://github.com/rust-lang/rust/issues/43402>.
+                 (when (file-exists? "src/test/run-make/issue-26092")
+                   (delete-file-recursively "src/test/run-make/issue-26092"))
+                 #t))
+             (add-after 'configure 'enable-codegen-tests
+               ;; Codegen tests should pass with llvm 6, so enable them.
+               (lambda* _
+                 (substitute* "config.toml"
+                   (("codegen-tests = false") ""))
+                 #t))
+              ;; The test has been moved elsewhere.
+              (add-after 'patch-tests 'disable-amd64-avx-test
+                (lambda _
+                  (substitute* "src/test/ui/issues/issue-44056.rs"
+                   (("only-x86_64") "ignore-test"))
+                  #t))
              (add-after 'patch-tests 'patch-cargo-tests
                (lambda _
                  (substitute* "src/tools/cargo/tests/build.rs"
@@ -476,12 +496,29 @@ safety and thread safety guarantees.")
                    (("fn finds_author_git") "#[ignore]\nfn finds_author_git")
                    (("fn finds_local_author_git") "#[ignore]\nfn finds_local_author_git"))
                  #t))
-             (add-after 'patch-cargo-tests 'ignore-glibc-2.27-incompatible-test
-               ;; https://github.com/rust-lang/rust/issues/47863
-               (lambda _
-                 (substitute* "src/test/run-pass/out-of-stack.rs"
-                   (("// ignore-android") "// ignore-test\n// ignore-android"))
-                 #t))
+             (add-after 'patch-cargo-tests 'patch-cargo-env-shebang
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (let ((coreutils (assoc-ref inputs "coreutils")))
+                   (substitute* "src/tools/cargo/tests/testsuite/fix.rs"
+                     ;; Cargo has a test which explicitly sets a
+                     ;; RUSTC_WRAPPER environment variable which points
+                     ;; to /usr/bin/env. Since it's not a shebang, it
+                     ;; needs to be manually patched
+                     (("\"/usr/bin/env\"")
+                      (string-append "\"" coreutils "/bin/env\"")))
+                   #t)))
+             (add-after 'patch-cargo-env-shebang 'ignore-cargo-package-tests
+               (lambda* _
+                 (substitute* "src/tools/cargo/tests/testsuite/package.rs"
+                   ;; These tests largely check that cargo outputs warning/error
+                   ;; messages as expected. It seems that cargo outputs an
+                   ;; absolute path to something in the store instead of the
+                   ;; expected relative path (e.g. `[..]`) so we'll ignore
+                   ;; these for now
+                   (("fn include") "#[ignore]\nfn include")
+                   (("fn exclude") "#[ignore]\nfn exclude"))
+                   #t))
+
              (replace 'configure
                (lambda* (#:key inputs outputs #:allow-other-keys)
                  (let* ((out (assoc-ref outputs "out"))
@@ -533,16 +570,6 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                           "/tmp/cc")
                  (setenv "PATH" (string-append "/tmp:" (getenv "PATH")))
                  #t))
-             (add-after 'provide-cc 'configure-archiver
-               (lambda* (#:key inputs #:allow-other-keys)
-                 (substitute* "src/build_helper/lib.rs"
-                  ;; Make sure "ar" is always used as the archiver.
-                  (("\"musl\"") "\"\"")
-                  ;; Then substitute "ar" by our name.
-                  (("\"ar\"") (string-append "\""
-                               (assoc-ref inputs "binutils")
-                               "/bin/ar\"")))
-                 #t))
              (delete 'patch-cargo-tomls)
              (add-before 'build 'reset-timestamps-after-changes
                (lambda* _
@@ -559,11 +586,14 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                  (invoke "./x.py" "build" "src/tools/cargo")))
              (replace 'check
                (lambda* _
-                 ;; Disable parallel execution to prevent EAGAIN errors when
-                 ;; running tests.
-                 (invoke "./x.py" "-j1" "test" "-vv")
-                 (invoke "./x.py" "-j1" "test" "src/tools/cargo")
-                 #t))
+                 ;; Enable parallel execution.
+                 (let ((parallel-job-spec
+                        (string-append "-j" (number->string
+                                             (min 4
+                                                  (parallel-job-count))))))
+                   (invoke "./x.py" parallel-job-spec "test" "-vv")
+                   (invoke "./x.py" parallel-job-spec "test"
+                           "src/tools/cargo"))))
              (replace 'install
                (lambda* (#:key outputs #:allow-other-keys)
                  (invoke "./x.py" "install")
@@ -601,320 +631,6 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                      `("LIBRARY_PATH" ":" suffix (,(string-append libc "/lib"))))
                    #t))))))))))
 
-(define-public rust-1.21
-  (let ((base-rust (rust-bootstrapped-package rust-1.20 "1.21.0"
-                    "1yj8lnxybjrybp00fqhxw8fpr641dh8wcn9mk44xjnsb4i1c21qp")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'configure 'remove-ar
-               (lambda* (#:key inputs #:allow-other-keys)
-                 ;; Remove because toml complains about "unknown field".
-                 (substitute* "config.toml"
-                  (("^ar =.*") "\n"))
-                 #t)))))))))
-
-(define-public rust-1.22
-  (let ((base-rust (rust-bootstrapped-package rust-1.21 "1.22.1"
-                    "1lrzzp0nh7s61wgfs2h6ilaqi6iq89f1pd1yaf65l87bssyl4ylb")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'unpack 'remove-flaky-test
-               (lambda _
-                 ;; See <https://github.com/rust-lang/rust/issues/43402>.
-                 (when (file-exists? "src/test/run-make/issue-26092")
-                   (delete-file-recursively "src/test/run-make/issue-26092"))
-                 #t)))))))))
-
-(define-public rust-1.23
-  (let ((base-rust (rust-bootstrapped-package rust-1.22 "1.23.0"
-                    "14fb8vhjzsxlbi6yrn1r6fl5dlbdd1m92dn5zj5gmzfwf4w9ar3l")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'configure-archiver)
-             (delete 'remove-ar)
-             (add-after 'unpack 'dont-build-native
-               (lambda _
-                 ;; XXX: Revisit this when we use gcc 6.
-                 (substitute* "src/binaryen/CMakeLists.txt"
-                  (("ADD_COMPILE_FLAG\\(\\\"-march=native\\\"\\)") ""))
-                 #t)))))))))
-
-(define-public rust-1.24
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.23 "1.24.1"
-          "1vv10x2h9kq7fxh2v01damdq8pvlp5acyh1kzcda9sfjx12kv99y")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'use-readelf-for-tests)
-             (replace 'patch-aarch64-test
-               (lambda* _
-                 (substitute* "src/librustc_metadata/dynamic_lib.rs"
-                   ;; This test is known to fail on aarch64 and powerpc64le:
-                   ;; https://github.com/rust-lang/rust/issues/45410
-                   (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-                 #t)))))))))
-
-;;; Rust 1.25 release support work with llvm 6--but build with llvm 6 is
-;;; not determenistic due to <https://github.com/rust-lang/rust/issues/50556>.
-;;; Keep using llvm 3.9.1 until builds become determenistic
-(define-public rust-1.25
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.24 "1.25.0"
-          "0baxjr99311lvwdq0s38bipbnj72pn6fgbk6lcq7j555xq53mxpf")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (snippet '(begin
-                      (delete-file-recursively "src/jemalloc")
-                      (delete-file-recursively "src/llvm")
-                      (delete-file-recursively "src/llvm-emscripten")
-                      #t))
-          (patches (map search-patch
-                        '("rust-1.25-accept-more-detailed-gdb-lines.patch")))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'patch-cargo-tests 'patch-cargo-index-update
-               (lambda _
-                 (substitute* "src/tools/cargo/tests/generate-lockfile.rs"
-                   ;; This test wants to update the crate index.
-                   (("fn no_index_update") "#[ignore]\nfn no_index_update"))
-                 #t))
-             (replace 'patch-aarch64-test
-               (lambda _
-                 (substitute* "src/librustc_metadata/dynamic_lib.rs"
-                   ;; This test is known to fail on aarch64 and powerpc64le:
-                   ;; https://github.com/rust-lang/rust/issues/45410
-                   (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-                 ;; This test fails on aarch64 with llvm@6.0:
-                 ;; https://github.com/rust-lang/rust/issues/49807
-                 ;; other possible solution:
-                 ;; https://github.com/rust-lang/rust/pull/47688
-                 (delete-file "src/test/debuginfo/by-value-self-argument-in-trait-impl.rs")
-                 #t))
-             (delete 'ignore-glibc-2.27-incompatible-test))))))))
-
-(define-public rust-1.26
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.25 "1.26.2"
-          "0047ais0fvmqvngqkdsxgrzhb0kljg8wy85b01kbbjc88hqcz7pv")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch
-                        '("rust-coresimd-doctest.patch"
-                          "rust-1.25-accept-more-detailed-gdb-lines.patch")))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             ;; binaryen was replaced with LLD project from LLVM
-             (delete 'dont-build-native)
-             (replace 'check
-               (lambda* _
-                 ;; Enable parallel execution.
-                 (let ((parallel-job-spec
-                        (string-append "-j" (number->string
-                                             (min 4
-                                                  (parallel-job-count))))))
-                   (invoke "./x.py" parallel-job-spec "test" "-vv")
-                   (invoke "./x.py" parallel-job-spec "test"
-                           "src/tools/cargo"))))
-             (replace 'remove-unsupported-tests
-               (lambda* _
-                 ;; 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-fulldeps/linker-output-non-utf8")
-                 #t))
-             (replace 'patch-cargo-tests
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/build.rs"
-                   (("/usr/bin/env") (which "env"))
-                   ;; Guix llvm is compiled without asmjs-unknown-emscripten.
-                   (("fn wasm32_final_outputs") "#[ignore]\nfn wasm32_final_outputs"))
-                 (substitute* "src/tools/cargo/tests/testsuite/death.rs"
-                   ;; This is stuck when built in container.
-                   (("fn ctrl_c_kills_everyone") "#[ignore]\nfn ctrl_c_kills_everyone"))
-                 ;; Prints test output in the wrong order when built on
-                 ;; i686-linux.
-                 (substitute* "src/tools/cargo/tests/testsuite/test.rs"
-                   (("fn cargo_test_env") "#[ignore]\nfn cargo_test_env"))
-
-                 ;; Avoid dependency on "git".
-                 (substitute* "src/tools/cargo/tests/testsuite/new.rs"
-                   (("fn author_prefers_cargo") "#[ignore]\nfn author_prefers_cargo")
-                   (("fn finds_author_git") "#[ignore]\nfn finds_author_git")
-                   (("fn finds_local_author_git") "#[ignore]\nfn finds_local_author_git"))
-                 #t))
-             (add-after 'patch-cargo-tests 'disable-cargo-test-for-nightly-channel
-               (lambda* _
-                 ;; This test failed to work on "nightly" channel builds
-                 ;; https://github.com/rust-lang/cargo/issues/5648
-                 (substitute* "src/tools/cargo/tests/testsuite/resolve.rs"
-                   (("fn test_resolving_minimum_version_with_transitive_deps")
-                    "#[ignore]\nfn test_resolving_minimum_version_with_transitive_deps"))
-                 #t))
-             (replace 'patch-cargo-index-update
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/generate_lockfile.rs"
-                   ;; This test wants to update the crate index.
-                   (("fn no_index_update") "#[ignore]\nfn no_index_update"))
-                 #t)))))))))
-
-(define-public rust-1.27
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.26 "1.27.2"
-          "0pg1s37bhx9zqbynxyydq5j6q7kij9vxkcv8maz0m25prm88r0cs")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch '("rust-coresimd-doctest.patch"
-                                       "rust-bootstrap-stage0-test.patch"
-                                       "rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                       "rust-reproducible-builds.patch")))))
-      (native-inputs
-       ;; FIXME: Rust 1.27 and some later versions require GDB 8.2 specifically.
-       ;; See <https://bugs.gnu.org/37810>.
-       (alist-replace "gdb" (list gdb-8.2)
-                      (package-native-inputs base-rust)))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-before 'install 'mkdir-prefix-paths
-               (lambda* (#:key outputs #:allow-other-keys)
-                 ;; As result of https://github.com/rust-lang/rust/issues/36989
-                 ;; `prefix' directory should exist before `install' call
-                 (mkdir-p (assoc-ref outputs "out"))
-                 (mkdir-p (assoc-ref outputs "cargo"))
-                 #t))
-             (add-after 'patch-cargo-tests 'disable-thinlto-test
-               (lambda* _
-                 ;; thinlto required llvm 6.0 for work
-                 (substitute* "src/tools/cargo/tests/testsuite/path.rs"
-                   (("fn thin_lto_works") "#[ignore]\nfn thin_lto_works"))
-                 #t)))))))))
-
-(define-public rust-1.28
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.27 "1.28.0"
-          "11k4rn77bca2rikykkk9fmprrgjswd4x4kaq7fia08vgkir82nhx")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch '("rust-coresimd-doctest.patch"
-                                       "rust-bootstrap-stage0-test.patch"
-                                       "rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                       "rust-reproducible-builds.patch")))))
-      (inputs
-       ;; Use LLVM 6.0
-       (alist-replace "llvm" (list llvm-6)
-                      (package-inputs base-rust)))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'configure 'enable-codegen-tests
-               ;; Codegen tests should pass with llvm 6, so enable them.
-               (lambda* _
-                 (substitute* "config.toml"
-                   (("codegen-tests = false") ""))
-                 #t))
-             (add-after 'patch-tests 'disable-amd64-avx-test
-               ;; That test would fail on x86_64 machines without avx.
-               (lambda* _
-                 (substitute* "src/test/run-pass/issue-44056.rs"
-                   (("only-x86_64") "ignore-test"))
-                 #t))
-             ;; The thinlto test should pass with llvm 6.
-             (delete 'disable-thinlto-test))))))))
-
-(define-public rust-1.29
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.28 "1.29.2"
-          "1jb787080z754caa2w3w1amsygs4qlzj9rs1vy64firfmabfg22h")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (map search-patch '("rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                       "rust-reproducible-builds.patch"))))))))
-
-(define-public rust-1.30
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.29 "1.30.1"
-          "0aavdc1lqv0cjzbqwl5n59yd0bqdlhn0zas61ljf38yrvc18k8rn")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (snippet '(begin
-                      (delete-file-recursively "src/jemalloc")
-                      (delete-file-recursively "src/llvm")
-                      (delete-file-recursively "src/llvm-emscripten")
-                      (delete-file-recursively "src/tools/clang")
-                      (delete-file-recursively "src/tools/lldb")
-                      #t))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'patch-cargo-tests 'patch-cargo-env-shebang
-               (lambda* (#:key inputs #:allow-other-keys)
-                 (let ((coreutils (assoc-ref inputs "coreutils")))
-                   (substitute* "src/tools/cargo/tests/testsuite/fix.rs"
-                     ;; Cargo has a test which explicitly sets a
-                     ;; RUSTC_WRAPPER environment variable which points
-                     ;; to /usr/bin/env. Since it's not a shebang, it
-                     ;; needs to be manually patched
-                     (("\"/usr/bin/env\"")
-                      (string-append "\"" coreutils "/bin/env\"")))
-                   #t)))
-             (add-after 'patch-cargo-env-shebang 'ignore-cargo-package-tests
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/package.rs"
-                   ;; These tests largely check that cargo outputs warning/error
-                   ;; messages as expected. It seems that cargo outputs an
-                   ;; absolute path to something in the store instead of the
-                   ;; expected relative path (e.g. `[..]`) so we'll ignore
-                   ;; these for now
-                   (("fn include") "#[ignore]\nfn include")
-                   (("fn exclude") "#[ignore]\nfn exclude"))
-                   #t))
-             ;; The test has been moved elsewhere.
-             (replace 'disable-amd64-avx-test
-               (lambda _
-                 (substitute* "src/test/ui/run-pass/issues/issue-44056.rs"
-	          (("only-x86_64") "ignore-test"))
-                  #t)))))))))
-
 (define-public rust-1.31
   (let ((base-rust
          (rust-bootstrapped-package rust-1.30 "1.31.1"
@@ -940,10 +656,10 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                      ((" Command::new\\(\"echo\"\\)")
                       (string-append "\nCommand::new(\"" coreutils "/bin/echo\")\n")))
                    #t)))
-	      ;; The test has been moved elsewhere.
-	      (replace 'disable-amd64-avx-test
-	        (lambda _
-	          (substitute* "src/test/ui/issues/issue-44056.rs"
+	     ;; The test has been moved elsewhere.
+             (replace 'disable-amd64-avx-test
+               (lambda _
+                 (substitute* "src/test/ui/issues/issue-44056.rs"
                    (("only-x86_64") "ignore-test"))
                   #t))
              (add-after 'patch-tests 'patch-process-docs-rev-cmd

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH v2 2/2] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2020-03-15 14:20       ` Marius Bakke
@ 2020-03-15 19:23         ` Danny Milosavljevic
  0 siblings, 0 replies; 24+ messages in thread
From: Danny Milosavljevic @ 2020-03-15 19:23 UTC (permalink / raw)
  To: Marius Bakke; +Cc: 38110

[-- Attachment #1: Type: text/plain, Size: 487 bytes --]

Hi Marius,

I've attached the new v3 for core-updates to this bug report now.

Meanwhile, the bug in mrustc https://github.com/thepowersgang/mrustc/issues/140
apparently has not been fixed yet.  It probably manifests itself because of:

> It seems newer toolchains no longer resolve symbols when the library precedes
> the referencing object file.
> This has always been the case for static libraries, as far as I'm aware, but
> now seems to also be the case for shared libs.

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2020-03-15 19:23 ` [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
@ 2020-03-19 23:58   ` Jakub Kądziołka
  2020-03-20 16:11   ` Marius Bakke
  2020-03-20 16:18   ` [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Marius Bakke
  2 siblings, 0 replies; 24+ messages in thread
From: Jakub Kądziołka @ 2020-03-19 23:58 UTC (permalink / raw)
  To: Danny Milosavljevic; +Cc: 38110

[-- Attachment #1: Type: text/plain, Size: 246 bytes --]

On Sun, Mar 15, 2020 at 08:23:11PM +0100, Danny Milosavljevic wrote:
> +      ;; Since rust-2.19 is local, it's quite probable that Hydra
                       ^^^^
Typo? I think this should be rust-1.29.

Kind regards,
Jakub Kądziołka

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2020-03-15 19:23 ` [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
  2020-03-19 23:58   ` Jakub Kądziołka
@ 2020-03-20 16:11   ` Marius Bakke
  2020-03-23 21:24     ` Danny Milosavljevic
  2020-03-20 16:18   ` [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Marius Bakke
  2 siblings, 1 reply; 24+ messages in thread
From: Marius Bakke @ 2020-03-20 16:11 UTC (permalink / raw)
  To: Danny Milosavljevic, 38110


[-- Attachment #1.1: Type: text/plain, Size: 1242 bytes --]

Danny Milosavljevic <dannym@scratchpost.org> writes:

> * gnu/packages/patches/rustc-1.29.0-src.patch: New file.
> * gnu/local.mk (dist_patch_DATA): Add it.
> * gnu/packages/rust.scm (rust-1.19): Delete variable.
> (rust-1.20): Delete variable.
> (rust-1.21): Delete variable.
> (rust-1.22): Delete variable.
> (rust-1.23): Delete variable.
> (rust-1.24): Delete variable.
> (rust-1.25): Delete variable.
> (rust-1.26): Delete variable.
> (rust-1.27): Delete variable.
> (rust-1.28): Delete variable.
> (rust-1.29): Bootstrap from mrustc.
> [source]: Add patch.
> (rust-1.30)[inputs]: Remove llvm 3.  Add llvm 6.
> (mrustc): Update rustc-version to 1.29.0.

Thanks a lot for this work Danny!

I was able to get one step further by hacking the mrustc compiler to
force "group linking" with --start-group and --end-group, based on a
suggestion in #mrustc.  It makes the compiler about 10x slower, but
I suppose that's okay for a one-time job.

Now the build fails when trying to use the built rustc binary, and I'm
struggling to figure out how to proceed.  I think we are pretty close!

I've attached my changes as a diff here.  Some of the changes are purely
cosmetic, feel free to pick-and-choose what you want/need.

Without further ado...


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: Type: text/x-patch, Size: 3323 bytes --]

2 files changed, 26 insertions(+), 5 deletions(-)
gnu/packages/patches/mrustc-group-link.patch | 22 ++++++++++++++++++++++
gnu/packages/rust.scm                        |  9 ++++-----

new file   gnu/packages/patches/mrustc-group-link.patch
@@ -0,0 +1,22 @@
+Surround the libraries with --start-group and --end-group to work
+around <https://github.com/thepowersgang/mrustc/issues/138>.
+
+diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
+--- a/src/trans/codegen_c.cpp
++++ b/src/trans/codegen_c.cpp
+@@ -960,6 +960,7 @@ namespace {
+                     {
+                         args.push_back("-L"); args.push_back(path);
+                     }
++                    args.push_back("-Wl,--start-group");
+                     for(const auto& lib : m_crate.m_ext_libs) {
+                         ASSERT_BUG(Span(), lib.name != "", "");
+                         args.push_back("-l"); args.push_back(lib.name.c_str());
+@@ -975,6 +976,7 @@ namespace {
+                     {
+                         args.push_back("-l"); args.push_back(path.c_str());
+                     }
++                    args.push_back("-Wl,--end-group");
+                     for( const auto& a : Target_GetCurSpec().m_backend_c.m_linker_opts )
+                     {
+                         args.push_back( a.c_str() );
modified   gnu/packages/rust.scm
@@ -98,6 +98,7 @@
                       (url "https://github.com/thepowersgang/mrustc.git")
                       (commit (string-append "v" version))))
                 (file-name (git-file-name name version))
+                (patches (search-patches "mrustc-group-link.patch"))
                 (sha256
                  (base32
                   "194ny7vsks5ygiw7d8yxjmp1qwigd71ilchis6xjl6bb2sj97rd2"))))
@@ -128,10 +129,8 @@
            (add-after 'patch-date 'unpack-target-compiler
              (lambda* (#:key inputs outputs #:allow-other-keys)
                (invoke "tar" "xf" (assoc-ref inputs "rustc"))
-               (chdir ,(string-append "rustc-" rustc-version "-src"))
-               (invoke "patch" "-p0" ,(string-append "../rustc-" rustc-version
+               (invoke "patch" "-p1" ,(string-append "rustc-" rustc-version
                                                      "-src.patch"))
-               (chdir "..")
                (setenv "RUSTC_VERSION" ,rustc-version)
                (setenv "MRUSTC_TARGET_VER"
                 ,(version-major+minor rustc-version))
@@ -274,7 +273,7 @@ safety and thread safety guarantees.")
              #t))
          ;; This phase is overridden by newer versions.
          (replace 'configure
-           (lambda* (#:key inputs outputs #:allow-other-keys)
+           (lambda _
              (setenv "CXX" "g++")
              (setenv "HOST_CXX" "g++")
              #t))
@@ -326,7 +325,7 @@ safety and thread safety guarantees.")
                             (write name)
                             (newline)
                             (apply invoke
-                                   "output/rustc-build/rustc"
+                                   "output/rustc-build/rustc_binary"
                                    "-C" (string-append "linker="
                                                        (getenv "CC"))
                                    ;; Required for libterm.

[back]

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2020-03-15 19:23 ` [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
  2020-03-19 23:58   ` Jakub Kądziołka
  2020-03-20 16:11   ` Marius Bakke
@ 2020-03-20 16:18   ` Marius Bakke
  2 siblings, 0 replies; 24+ messages in thread
From: Marius Bakke @ 2020-03-20 16:18 UTC (permalink / raw)
  To: Danny Milosavljevic, 38110

[-- Attachment #1: Type: text/plain, Size: 485 bytes --]

I forgot to mention another change ...

Danny Milosavljevic <dannym@scratchpost.org> writes:
> +               ;; Crate::load_extern_crate ignores the search path, so make
> +               ;; the situation easier for it.
> +               (copy-recursively (string-append rustc-bootstrap "/lib/mrust")
> +                                 "output")

This hunk is exactly identical to the next expression some lines below,
I removed it from the original patch to avoid a build failure.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2020-03-20 16:11   ` Marius Bakke
@ 2020-03-23 21:24     ` Danny Milosavljevic
  2020-03-23 22:16       ` Marius Bakke
  0 siblings, 1 reply; 24+ messages in thread
From: Danny Milosavljevic @ 2020-03-23 21:24 UTC (permalink / raw)
  To: Marius Bakke; +Cc: 38110

[-- Attachment #1: Type: text/plain, Size: 1176 bytes --]

Hi Marius,

it's good to hear that we have some further progress.

I've tried it myself but I can't build it on my laptop with 8 GiB of RAM, not
even after adding 4 GiB of swap (on an SSD... urgh).

So if the "group linking" caused this massive increase of memory consumption,
that's probably not good.

Isn't it enough to automatically prepend "-lgit2" when "-lssh2" appears
or something?

See https://github.com/thepowersgang/mrustc/issues/140

I have an account on bayfront and it doesn't work there either (copied the
entire working directory over from my laptop):

Building rust, I get a texinfo build failure:
[...]
+ exec ./ginfo --init-file ./t/Infokey-config -f file-menu
info: "./t/Infokey-config", line 2: unknown action `xxx-not-recognized'
info: "./t/Infokey-config", line 3: cannot bind key sequence to menu-digit
+ kill -s WINCH 16225
[...]
+ rm -f t/resize-in-completions.sh.out
+ rm -f t/resize-in-completions.sh.pipein t/resize-in-completions.sh.pipeout
+ exit 1
FAIL t/resize-in-completions.sh (exit status: 1)
command "make" "check" "-j" "6" failed with status 2

(it does the same even after guix gc, so it's reproducible)

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2020-03-23 21:24     ` Danny Milosavljevic
@ 2020-03-23 22:16       ` Marius Bakke
  2020-03-24 11:57         ` Danny Milosavljevic
  0 siblings, 1 reply; 24+ messages in thread
From: Marius Bakke @ 2020-03-23 22:16 UTC (permalink / raw)
  To: Danny Milosavljevic; +Cc: 38110

[-- Attachment #1: Type: text/plain, Size: 1466 bytes --]

Danny Milosavljevic <dannym@scratchpost.org> writes:

> Hi Marius,
>
> it's good to hear that we have some further progress.
>
> I've tried it myself but I can't build it on my laptop with 8 GiB of RAM, not
> even after adding 4 GiB of swap (on an SSD... urgh).
>
> So if the "group linking" caused this massive increase of memory consumption,
> that's probably not good.
>
> Isn't it enough to automatically prepend "-lgit2" when "-lssh2" appears
> or something?

That would be a much better hack yes.  :-)

> See https://github.com/thepowersgang/mrustc/issues/140
>
> I have an account on bayfront and it doesn't work there either (copied the
> entire working directory over from my laptop):
>
> Building rust, I get a texinfo build failure:
> [...]
> + exec ./ginfo --init-file ./t/Infokey-config -f file-menu
> info: "./t/Infokey-config", line 2: unknown action `xxx-not-recognized'
> info: "./t/Infokey-config", line 3: cannot bind key sequence to menu-digit
> + kill -s WINCH 16225
> [...]
> + rm -f t/resize-in-completions.sh.out
> + rm -f t/resize-in-completions.sh.pipein t/resize-in-completions.sh.pipeout
> + exit 1
> FAIL t/resize-in-completions.sh (exit status: 1)
> command "make" "check" "-j" "6" failed with status 2
>
> (it does the same even after guix gc, so it's reproducible)

How are you building Rust?  I've only used the Guix package definition
and did not get as far as actually running the test suite.  Do you have
an updated build script?

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2020-03-23 22:16       ` Marius Bakke
@ 2020-03-24 11:57         ` Danny Milosavljevic
  2020-03-24 14:45           ` Marius Bakke
  0 siblings, 1 reply; 24+ messages in thread
From: Danny Milosavljevic @ 2020-03-24 11:57 UTC (permalink / raw)
  To: Marius Bakke; +Cc: 38110


[-- Attachment #1.1: Type: text/plain, Size: 720 bytes --]

Hi Marius,

On Mon, 23 Mar 2020 23:16:07 +0100
Marius Bakke <mbakke@fastmail.com> wrote:

> > Building rust, I get a texinfo build failure:

> How are you building Rust?  I've only used the Guix package definition
> and did not get as far as actually running the test suite.  Do you have
> an updated build script?

It's failing in texinfo, not in rust.

Also, on my laptop, it's not failing in texinfo.  So I guess it has
something to do with bayfront or the machines it offloads to.

Attached gnu/packages/rust.scm , but it's the same we already have.
What I mean is that I cannot see any way for me to test it myself right now.

What error message do you get when trying to use the rust compiler?

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: rust.scm --]
[-- Type: text/x-scheme, Size: 38946 bytes --]

;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 David Craven <david@craven.ch>
;;; Copyright © 2016 Eric Le Bihan <eric.le.bihan.dev@free.fr>
;;; Copyright © 2016 ng0 <ng0@n0.is>
;;; Copyright © 2017 Ben Woodcroft <donttrustben@gmail.com>
;;; Copyright © 2017, 2018 Nikolai Merinov <nikolai.merinov@member.fsf.org>
;;; Copyright © 2017, 2019 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2018 Danny Milosavljevic <dannym+a@scratchpost.org>
;;; Copyright © 2019 Ivan Petkov <ivanppetkov@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu packages rust)
  #:use-module (gnu packages base)
  #:use-module (gnu packages bison)
  #:use-module (gnu packages bootstrap)
  #:use-module (gnu packages cmake)
  #:use-module (gnu packages compression)
  #:use-module (gnu packages curl)
  #:use-module (gnu packages elf)
  #:use-module (gnu packages flex)
  #:use-module (gnu packages gcc)
  #:use-module (gnu packages gdb)
  #:use-module (gnu packages jemalloc)
  #:use-module (gnu packages linux)
  #:use-module (gnu packages llvm)
  #:use-module (gnu packages pkg-config)
  #:use-module (gnu packages python)
  #:use-module (gnu packages ssh)
  #:use-module (gnu packages tls)
  #:use-module (gnu packages)
  #:use-module (guix build-system cargo)
  #:use-module (guix build-system gnu)
  #:use-module (guix build-system trivial)
  #:use-module (guix download)
  #:use-module (guix git-download)
  #: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))

(define %cargo-reference-hash
  "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")

(define* (nix-system->gnu-triplet-for-rust
          #:optional (system (%current-system)))
  (match system
    ("x86_64-linux"   "x86_64-unknown-linux-gnu")
    ("i686-linux"     "i686-unknown-linux-gnu")
    ("armhf-linux"    "armv7-unknown-linux-gnueabihf")
    ("aarch64-linux"  "aarch64-unknown-linux-gnu")
    ("mips64el-linux" "mips64el-unknown-linux-gnuabi64")
    (_                (nix-system->gnu-triplet system))))

(define* (rust-uri version #:key (dist "static"))
  (string-append "https://" dist ".rust-lang.org/dist/"
                 "rustc-" version "-src.tar.gz"))

(define* (rust-bootstrapped-package base-rust version checksum)
  "Bootstrap rust VERSION with source checksum CHECKSUM using BASE-RUST."
  (package
    (inherit base-rust)
    (version version)
    (source
      (origin
        (inherit (package-source base-rust))
        (uri (rust-uri version))
        (sha256 (base32 checksum))))
    (native-inputs
     (alist-replace "cargo-bootstrap" (list base-rust "cargo")
                    (alist-replace "rustc-bootstrap" (list base-rust)
                                   (package-native-inputs base-rust))))))

(define-public mrustc
  (let ((rustc-version "1.29.0"))
    (package
      (name "mrustc")
      (version "0.9")
      (source (origin
                (method git-fetch)
                (uri (git-reference
                      (url "https://github.com/thepowersgang/mrustc.git")
                      (commit (string-append "v" version))))
                (file-name (git-file-name name version))
                (patches (search-patches "mrustc-group-link.patch"))
                (sha256
                 (base32
                  "194ny7vsks5ygiw7d8yxjmp1qwigd71ilchis6xjl6bb2sj97rd2"))))
      (outputs '("out" "cargo"))
      (build-system gnu-build-system)
      (inputs
       `(("zlib" ,zlib)))
      (native-inputs
       `(("bison" ,bison)
         ("flex" ,flex)
         ;; Required for the libstd sources.
         ("rustc" ,(package-source rust-1.29))))
      (arguments
       `(#:test-target "test"
         #:make-flags
         (list ,(string-append "RUSTC_TARGET="
                               (or (%current-target-system)
                                   (nix-system->gnu-triplet-for-rust))))
         #:phases
         (modify-phases %standard-phases
          (add-after 'unpack 'patch-date
            (lambda _
              (substitute* "Makefile"
               (("shell date") "shell date -d @1"))
              (substitute* "run_rustc/Makefile"
               (("[$]Vtime ") "$V "))
              #t))
           (add-after 'patch-date 'unpack-target-compiler
             (lambda* (#:key inputs outputs #:allow-other-keys)
               (invoke "tar" "xf" (assoc-ref inputs "rustc"))
               (invoke "patch" "-p1" ,(string-append "rustc-" rustc-version
                                                     "-src.patch"))
               (setenv "RUSTC_VERSION" ,rustc-version)
               (setenv "MRUSTC_TARGET_VER"
                ,(version-major+minor rustc-version))
               (setenv "OUTDIR_SUF" "")
               #t))
           (replace 'configure
             (lambda _
               (setenv "CC" "gcc")
               (setenv "CXX" "g++")
               #t))
           (add-after 'build 'build-minicargo
             (lambda* (#:key make-flags #:allow-other-keys)
               ;; TODO: minicargo.mk: RUSTC_VERSION=$(RUSTC_VERSION) RUSTC_CHANNEL=$(RUSTC_SRC_TY) OUTDIR_SUF=$(OUTDIR_SUF)
               (apply invoke "make" "-f" "minicargo.mk" "LIBS" make-flags)
               (apply invoke "make" "-C" "tools/minicargo" make-flags)))
           ;(add-after 'check 'check-locally
           ;  (lambda* (#:key make-flags #:allow-other-keys)
           ;    ;; The enum test wouldn't work otherwise.
           ;    ;; See <https://github.com/thepowersgang/mrustc/issues/137>.
           ;    (setenv "MRUSTC_TARGET_VER" ,(version-major+minor rustc-version))
           ;    (apply invoke "make" "local_tests" make-flags)))
           (replace 'install
             (lambda* (#:key inputs outputs #:allow-other-keys)
               (let* ((out (assoc-ref outputs "out"))
                      (bin (string-append out "/bin"))
                      (tools-bin (string-append out "/tools/bin"))
                      (cargo-out (assoc-ref outputs "cargo"))
                      (cargo-bin (string-append cargo-out "/bin"))
                      (lib (string-append out "/lib"))
                      (lib/rust (string-append lib "/mrust"))
                      (gcc (assoc-ref inputs "gcc"))
                      (run_rustc (string-append out
                                                "/share/mrustc/run_rustc")))
                 ;; These files are not reproducible.
                 (for-each delete-file (find-files "output" "\\.txt$"))
                 ;(delete-file-recursively "output/local_tests")
                 (mkdir-p (dirname lib/rust))
                 (copy-recursively "output" lib/rust)
                 (mkdir-p bin)
                 (mkdir-p tools-bin)
                 (install-file "bin/mrustc" bin)
                 ;; minicargo uses relative paths to resolve mrustc.
                 (install-file "tools/bin/minicargo" tools-bin)
                 (install-file "tools/bin/minicargo" cargo-bin)
                 (mkdir-p run_rustc)
                 (copy-file "run_rustc/Makefile"
                            (string-append run_rustc "/Makefile"))
                 #t))))))
      (synopsis "Compiler for the Rust programming language")
      (description "Rust is a systems programming language that provides memory
safety and thread safety guarantees.")
      (home-page "https://github.com/thepowersgang/mrustc")
      ;; Dual licensed.
      (license (list license:asl2.0 license:expat)))))

;; TODO: Delete src/llvm-emscripten
(define rust-1.29
  (package
    (name "rust")
    (version "1.29.0")
    (source
      (origin
        (method url-fetch)
        (uri (rust-uri "1.29.0"))
        (sha256 (base32 "1sb15znckj8pc8q3g7cq03pijnida6cg64yqmgiayxkzskzk9sx4"))
        (modules '((guix build utils)))
        (snippet '(begin (delete-file-recursively "src/llvm") #t))
        (patches (map search-patch '("rust-1.25-accept-more-detailed-gdb-lines.patch"
                                     "rust-reproducible-builds.patch"
                                     "rustc-1.29.0-src.patch")))))
    (outputs '("out" "cargo" "doc"))
    (properties '((timeout . 72000)               ;20 hours
                  (max-silent-time . 18000)))     ;5 hours (for armel)
    (arguments
     `(#:imported-modules ,%cargo-utils-modules ;for `generate-all-checksums'
       #:modules ((guix build utils) (ice-9 match) (guix build gnu-build-system))
       #:phases
       (modify-phases %standard-phases
         (add-after 'unpack 'set-env
           (lambda* (#:key inputs #:allow-other-keys)
             ;; Disable test for cross compilation support.
(write "X")
             (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"))
             ;; guix llvm-3.9.1 package installs only shared libraries
             (setenv "LLVM_LINK_SHARED" "1")
             #t))
         (add-after 'unpack 'patch-tests
           (lambda* (#:key inputs #:allow-other-keys)
             (let ((bash (assoc-ref inputs "bash")))
               (substitute* "src/libstd/process.rs"
                 ;; The newline is intentional.
                 ;; There's a line length "tidy" check in Rust which would
                 ;; fail otherwise.
                 (("\"/bin/sh\"") (string-append "\n\"" bash "/bin/sh\"")))
               (substitute* "src/libstd/net/tcp.rs"
                 ;; There is no network in build environment
                 (("fn connect_timeout_unroutable")
                  "#[ignore]\nfn connect_timeout_unroutable"))
               ;; <https://lists.gnu.org/archive/html/guix-devel/2017-06/msg00222.html>
               (substitute* "src/libstd/sys/unix/process/process_common.rs"
                (("fn test_process_mask") "#[allow(unused_attributes)]
    #[ignore]
    fn test_process_mask"))
               #t)))
         (add-after 'patch-tests 'patch-cargo-index-update
           (lambda* _
             (substitute* "src/tools/cargo/tests/testsuite/generate_lockfile.rs"
               ;; This test wants to update the crate index.
               (("fn no_index_update") "#[ignore]\nfn no_index_update"))
             #t))
         (add-after 'patch-tests 'patch-aarch64-test
           (lambda* _
             (substitute* "src/librustc_metadata/dynamic_lib.rs"
               ;; This test is known to fail on aarch64 and powerpc64le:
               ;; https://github.com/rust-lang/rust/issues/45410
               (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
             ;; This test fails on aarch64 with llvm@6.0:
             ;; https://github.com/rust-lang/rust/issues/49807
             ;; other possible solution:
             ;; https://github.com/rust-lang/rust/pull/47688
             (delete-file "src/test/debuginfo/by-value-self-argument-in-trait-impl.rs")
             #t))
         (add-after 'patch-tests 'remove-unsupported-tests
           (lambda* _
             ;; 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-fulldeps/linker-output-non-utf8")
             #t))
         (add-after 'patch-source-shebangs 'patch-cargo-checksums
           (lambda* _
             (use-modules (guix build cargo-utils))
             (substitute* "src/Cargo.lock"
               (("(\"checksum .* = )\".*\"" all name)
                (string-append name "\"" ,%cargo-reference-hash "\"")))
             (generate-all-checksums "src/vendor")
             #t))
         ;; This phase is overridden by newer versions.
         (replace 'configure
           (lambda* (#:key inputs outputs #:allow-other-keys)
             (setenv "CXX" "g++")
             (setenv "HOST_CXX" "g++")
             #t))
         ;; This phase is overridden by newer versions.
         (replace 'build
           (lambda* (#:key inputs outputs #:allow-other-keys)
             (let ((rustc-bootstrap (assoc-ref inputs "rustc-bootstrap")))
               (setenv "CFG_COMPILER_HOST_TRIPLE"
                ,(nix-system->gnu-triplet (%current-system)))
               (setenv "CFG_RELEASE" "")
               (setenv "CFG_RELEASE_CHANNEL" "stable")
               (setenv "CFG_LIBDIR_RELATIVE" "lib")
               (setenv "CFG_VERSION" "1.29.0-stable-mrustc")
               (setenv "MRUSTC_TARGET_VER" ,(version-major+minor version))
               ; bad: (setenv "CFG_PREFIX" "mrustc") ; FIXME output path.
               ;; Crate::load_extern_crate ignores the search path, so make
               ;; the situation easier for it.
               ;; Also, mrustc 0.9 doesn't check the search paths for crates
               ;; anymore.
               (copy-recursively (string-append rustc-bootstrap "/lib/mrust")
                                 "output")
               (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
                       "src/rustc" "--vendor-dir" "src/vendor"
                       "--output-dir" "output/rustc-build"
                       "-L" (string-append rustc-bootstrap "/lib/mrust")
                       "-j" "1")
               (setenv "CFG_COMPILER_HOST_TRIPLE" #f)
               (setenv "CFG_RELEASE" #f)
               (setenv "CFG_RELEASE_CHANNEL" #f)
               (setenv "CFG_VERSION" #f)
               (setenv "CFG_PREFIX" #f)
               (setenv "CFG_LIBDIR_RELATIVE" #f)
               (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
                       "src/tools/cargo" "--vendor-dir" "src/vendor"
                       "--output-dir" "output/cargo-build"
                       ;"-L" "output/"
                       "-L" (string-append rustc-bootstrap "/lib/mrust")
                       "-j" "1")
               ;; Now use the newly-built rustc to build the libraries.
               ;; One day that could be replaced by:
               ;; (invoke "output/cargo-build/cargo" "build"
               ;;         "--manifest-path" "src/bootstrap/Cargo.toml"
               ;;         "--verbose") ; "--locked" "--frozen"
               ;; but right now, Cargo has problems with libstd's circular
               ;; dependencies.
               (mkdir-p "output/target-libs")
               (for-each (match-lambda
                          ((name . flags)
                            (write name)
                            (newline)
                            (apply invoke
                                   "output/rustc-build/rustc"
                                   "-C" (string-append "linker="
                                                       (getenv "CC"))
                                   ;; Required for libterm.
                                   "-Z" "force-unstable-if-unmarked"
                                   "-L" "output/target-libs"
                                   (string-append "src/" name "/lib.rs")
                                   "-o"
                                   (string-append "output/target-libs/"
                                                  (car (string-split name #\/))
                                                  ".rlib")
                                   flags)))
                         '(("libcore")
                           ("libstd_unicode")
                           ("liballoc")
                           ("libcollections")
                           ("librand")
                           ("liblibc/src" "--cfg" "stdbuild")
                           ("libunwind" "-l" "gcc_s")
                           ("libcompiler_builtins")
                           ("liballoc_system")
                           ("libpanic_unwind")
                           ;; Uses "cc" to link.
                           ("libstd" "-l" "dl" "-l" "rt" "-l" "pthread")
                           ("libarena")

                           ;; Test dependencies:

                           ("libgetopts")
                           ("libterm")
                           ("libtest")))
               #t)))
         ;; This phase is overridden by newer versions.
         (replace 'check
           (const #t))
         ;; This phase is overridden by newer versions.
         (replace 'install
           (lambda* (#:key inputs outputs #:allow-other-keys)
             (let* ((out (assoc-ref outputs "out"))
                    (target-system ,(or (%current-target-system)
                                        (nix-system->gnu-triplet
                                         (%current-system))))
                    (out-libs (string-append out "/lib/rustlib/"
                                             target-system "/lib")))
                                        ;(setenv "CFG_PREFIX" out)
               (mkdir-p out-libs)
               (copy-recursively "output/target-libs" out-libs)
               (install-file "output/rustc-build/rustc"
                             (string-append out "/bin"))
               (install-file "output/rustc-build/rustdoc"
                             (string-append out "/bin"))
               (install-file "output/cargo-build/cargo"
                             (string-append (assoc-ref outputs "cargo")
                                            "/bin")))
             #t)))))
    (build-system gnu-build-system)
    (native-inputs
     `(("bison" ,bison) ; For the tests
       ("cmake" ,cmake-minimal)
       ("flex" ,flex) ; For the tests
       ("gdb" ,gdb)   ; For the tests
       ("procps" ,procps) ; For the tests
       ("python-2" ,python-2)
       ("rustc-bootstrap" ,mrustc)
       ("cargo-bootstrap" ,mrustc "cargo")
       ("pkg-config" ,pkg-config) ; For "cargo"
       ("which" ,which)))
    (inputs
     `(("jemalloc" ,jemalloc-4.5.0)
       ("llvm" ,llvm-6)
       ("openssl" ,openssl-1.0)
       ("libssh2" ,libssh2) ; For "cargo"
       ("libcurl" ,curl)))  ; For "cargo"

    ;; rustc invokes gcc, so we need to set its search paths accordingly.
    ;; Note: duplicate its value here to cope with circular dependencies among
    ;; modules (see <https://bugs.gnu.org/31392>).
    (native-search-paths
     (list (search-path-specification
            (variable "C_INCLUDE_PATH")
            (files '("include")))
           (search-path-specification
            (variable "CPLUS_INCLUDE_PATH")
            (files '("include/c++" "include")))
           (search-path-specification
            (variable "LIBRARY_PATH")
            (files '("lib" "lib64")))))

    (synopsis "Compiler for the Rust progamming language")
    (description "Rust is a systems programming language that provides memory
safety and thread safety guarantees.")
    (home-page "https://www.rust-lang.org")
    ;; Dual licensed.
    (license (list license:asl2.0 license:expat))))

(define-public rust-1.30
  (let ((base-rust
         (rust-bootstrapped-package rust-1.29 "1.30.1"
          "0aavdc1lqv0cjzbqwl5n59yd0bqdlhn0zas61ljf38yrvc18k8rn")))
    (package
      (inherit base-rust)
      (source
        (origin
          (inherit (package-source base-rust))
          (snippet '(begin
                      (delete-file-recursively "src/jemalloc")
                      (delete-file-recursively "src/llvm")
                      (delete-file-recursively "src/llvm-emscripten")
                      (delete-file-recursively "src/tools/clang")
                      (delete-file-recursively "src/tools/lldb")
                      #t))
          (patches '())))
      (outputs '("out" "doc" "cargo"))
      ;; Since rust-1.29 is local, it's quite probable that Hydra
      ;; will build rust-1.29 only as a dependency of rust-1.30.
      ;; But then Hydra will use the wrong properties, the ones here,
      ;; for rust-1.29.  Therefore, we copied the properties of
      ;; rust-1.29 here.
      (properties '((timeout . 72000)               ;20 hours
                    (max-silent-time . 18000)))     ;5 hours (for armel)
      (inputs
       ;; Use LLVM 6.0
       (alist-replace "llvm" (list llvm-6)
                      (package-inputs base-rust)))
      (arguments
       (substitute-keyword-arguments (package-arguments rust-1.29)
         ((#:phases phases)
          `(modify-phases ,phases
             (add-after 'unpack 'remove-flaky-test
               (lambda _
                 ;; See <https://github.com/rust-lang/rust/issues/43402>.
                 (when (file-exists? "src/test/run-make/issue-26092")
                   (delete-file-recursively "src/test/run-make/issue-26092"))
                 #t))
             (add-after 'configure 'enable-codegen-tests
               ;; Codegen tests should pass with llvm 6, so enable them.
               (lambda* _
                 (substitute* "config.toml"
                   (("codegen-tests = false") ""))
                 #t))
              ;; The test has been moved elsewhere.
              (add-after 'patch-tests 'disable-amd64-avx-test
                (lambda _
                  (substitute* "src/test/ui/issues/issue-44056.rs"
                   (("only-x86_64") "ignore-test"))
                  #t))
             (add-after 'patch-tests 'patch-cargo-tests
               (lambda _
                 (substitute* "src/tools/cargo/tests/build.rs"
                  (("/usr/bin/env") (which "env"))
                  ;; Guix llvm is compiled without asmjs-unknown-emscripten.
                  (("fn wasm32_final_outputs") "#[ignore]\nfn wasm32_final_outputs"))
                 (substitute* "src/tools/cargo/tests/death.rs"
                  ;; This is stuck when built in container.
                  (("fn ctrl_c_kills_everyone") "#[ignore]\nfn ctrl_c_kills_everyone"))
                 ;; Prints test output in the wrong order when built on
                 ;; i686-linux.
                 (substitute* "src/tools/cargo/tests/test.rs"
                   (("fn cargo_test_env") "#[ignore]\nfn cargo_test_env"))

                 ;; These tests pull in a dependency on "git", which changes
                 ;; too frequently take part in the Rust toolchain.
                 (substitute* "src/tools/cargo/tests/new.rs"
                   (("fn author_prefers_cargo") "#[ignore]\nfn author_prefers_cargo")
                   (("fn finds_author_git") "#[ignore]\nfn finds_author_git")
                   (("fn finds_local_author_git") "#[ignore]\nfn finds_local_author_git"))
                 #t))
             (add-after 'patch-cargo-tests 'patch-cargo-env-shebang
               (lambda* (#:key inputs #:allow-other-keys)
                 (let ((coreutils (assoc-ref inputs "coreutils")))
                   (substitute* "src/tools/cargo/tests/testsuite/fix.rs"
                     ;; Cargo has a test which explicitly sets a
                     ;; RUSTC_WRAPPER environment variable which points
                     ;; to /usr/bin/env. Since it's not a shebang, it
                     ;; needs to be manually patched
                     (("\"/usr/bin/env\"")
                      (string-append "\"" coreutils "/bin/env\"")))
                   #t)))
             (add-after 'patch-cargo-env-shebang 'ignore-cargo-package-tests
               (lambda* _
                 (substitute* "src/tools/cargo/tests/testsuite/package.rs"
                   ;; These tests largely check that cargo outputs warning/error
                   ;; messages as expected. It seems that cargo outputs an
                   ;; absolute path to something in the store instead of the
                   ;; expected relative path (e.g. `[..]`) so we'll ignore
                   ;; these for now
                   (("fn include") "#[ignore]\nfn include")
                   (("fn exclude") "#[ignore]\nfn exclude"))
                   #t))

             (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"))
                        (python (assoc-ref inputs "python-2"))
                        (rustc (assoc-ref inputs "rustc-bootstrap"))
                        (cargo (assoc-ref inputs "cargo-bootstrap"))
                        (llvm (assoc-ref inputs "llvm"))
                        (jemalloc (assoc-ref inputs "jemalloc")))
                   (call-with-output-file "config.toml"
                     (lambda (port)
                       (display (string-append "
[llvm]
[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\"
[rust]
default-linker = \"" gcc "/bin/gcc" "\"
channel = \"stable\"
rpath = true
" ;; There are 2 failed codegen tests:
;; codegen/mainsubprogram.rs and codegen/mainsubprogramstart.rs
;; These tests require a patched LLVM
"codegen-tests = false
[target." ,(nix-system->gnu-triplet-for-rust) "]
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-after 'configure 'provide-cc
               (lambda* (#:key inputs #:allow-other-keys)
                 (symlink (string-append (assoc-ref inputs "gcc") "/bin/gcc")
                          "/tmp/cc")
                 (setenv "PATH" (string-append "/tmp:" (getenv "PATH")))
                 #t))
             (delete 'patch-cargo-tomls)
             (add-before 'build 'reset-timestamps-after-changes
               (lambda* _
                 (for-each
                  (lambda (filename)
                    ;; Rust 1.20.0 treats timestamp 0 as "file doesn't exist".
                    ;; Therefore, use timestamp 1.
                    (utime filename 1 1 1 1))
                  (find-files "." #:directories? #t))
                 #t))
             (replace 'build
               (lambda* _
                 (invoke "./x.py" "build")
                 (invoke "./x.py" "build" "src/tools/cargo")))
             (replace 'check
               (lambda* _
                 ;; Enable parallel execution.
                 (let ((parallel-job-spec
                        (string-append "-j" (number->string
                                             (min 4
                                                  (parallel-job-count))))))
                   (invoke "./x.py" parallel-job-spec "test" "-vv")
                   (invoke "./x.py" parallel-job-spec "test"
                           "src/tools/cargo"))))
             (replace '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")))
             (add-after 'install 'delete-install-logs
               (lambda* (#:key outputs #:allow-other-keys)
                 (define (delete-manifest-file out-path file)
                   (delete-file (string-append out-path "/lib/rustlib/" file)))

                 (let ((out (assoc-ref outputs "out"))
                       (cargo-out (assoc-ref outputs "cargo")))
                   (for-each
                     (lambda (file) (delete-manifest-file out file))
                     '("install.log"
                       "manifest-rust-docs"
                       "manifest-rust-std-x86_64-unknown-linux-gnu"
                       "manifest-rustc"))
                   (for-each
                     (lambda (file) (delete-manifest-file cargo-out file))
                     '("install.log"
                       "manifest-cargo"))
                   #t)))
             (add-after 'install 'wrap-rustc
               (lambda* (#:key inputs outputs #:allow-other-keys)
                 (let ((out (assoc-ref outputs "out"))
                       (libc (assoc-ref inputs "libc"))
                       (ld-wrapper (assoc-ref inputs "ld-wrapper")))
                   ;; Let gcc find ld and libc startup files.
                   (wrap-program (string-append out "/bin/rustc")
                     `("PATH" ":" prefix (,(string-append ld-wrapper "/bin")))
                     `("LIBRARY_PATH" ":" suffix (,(string-append libc "/lib"))))
                   #t))))))))))

(define-public rust-1.31
  (let ((base-rust
         (rust-bootstrapped-package rust-1.30 "1.31.1"
          "0sk84ff0cklybcp0jbbxcw7lk7mrm6kb6km5nzd6m64dy0igrlli")))
    (package
      (inherit base-rust)
      (arguments
       (substitute-keyword-arguments (package-arguments base-rust)
         ((#:phases phases)
          `(modify-phases ,phases
             (add-after 'patch-tests 'patch-command-exec-tests
               (lambda* (#:key inputs #:allow-other-keys)
                 (let ((coreutils (assoc-ref inputs "coreutils")))
                   (substitute* "src/test/run-pass/command-exec.rs"
                     ;; This test suite includes some tests that the stdlib's
                     ;; `Command` execution properly handles situations where
                     ;; the environment or PATH variable are empty, but this
                     ;; fails since we don't have `echo` available in the usual
                     ;; Linux directories.
                     ;; NB: the leading space is so we don't fail a tidy check
                     ;; for trailing whitespace, and the newlines are to ensure
                     ;; we don't exceed the 100 chars tidy check as well
                     ((" Command::new\\(\"echo\"\\)")
                      (string-append "\nCommand::new(\"" coreutils "/bin/echo\")\n")))
                   #t)))
	     ;; The test has been moved elsewhere.
             (replace 'disable-amd64-avx-test
               (lambda _
                 (substitute* "src/test/ui/issues/issue-44056.rs"
                   (("only-x86_64") "ignore-test"))
                  #t))
             (add-after 'patch-tests 'patch-process-docs-rev-cmd
               (lambda* _
                 ;; Disable some doc tests which depend on the "rev" command
                 ;; https://github.com/rust-lang/rust/pull/58746
                 (substitute* "src/libstd/process.rs"
                   (("```rust") "```rust,no_run"))
                 #t)))))))))

(define-public rust-1.32
  (let ((base-rust
         (rust-bootstrapped-package rust-1.31 "1.32.0"
          "0ji2l9xv53y27xy72qagggvq47gayr5lcv2jwvmfirx029vlqnac")))
    (package
      (inherit base-rust)
      (source
        (origin
          (inherit (package-source base-rust))
          (snippet '(begin (delete-file-recursively "src/llvm")
                           (delete-file-recursively "src/llvm-emscripten")
                           (delete-file-recursively "src/tools/clang")
                           (delete-file-recursively "src/tools/lldb")
                           (delete-file-recursively "vendor/jemalloc-sys/jemalloc")
                           #t))
          (patches (map search-patch '("rust-reproducible-builds.patch")))
          ;; the vendor directory has moved to the root of
          ;; the tarball, so we have to strip an extra prefix
          (patch-flags '("-p2"))))
      (inputs
       ;; Downgrade to LLVM 6, all LTO tests appear to fail with LLVM 7.0.1
       (alist-replace "llvm" (list llvm-6)
                      (package-inputs base-rust)))
      (arguments
       (substitute-keyword-arguments (package-arguments base-rust)
         ((#:phases phases)
          `(modify-phases ,phases
             ;; Cargo.lock and the vendor/ directory have been moved to the
             ;; root of the rust tarball
             (replace 'patch-cargo-checksums
               (lambda* _
                 (use-modules (guix build cargo-utils))
                 (substitute* "Cargo.lock"
                   (("(\"checksum .* = )\".*\"" all name)
                    (string-append name "\"" ,%cargo-reference-hash "\"")))
                 (generate-all-checksums "vendor")
                 #t))
             (add-after 'enable-codegen-tests 'override-jemalloc
               (lambda* (#:key inputs #:allow-other-keys)
                 ;; The compiler is no longer directly built against jemalloc,
                 ;; but rather via the jemalloc-sys crate (which vendors the
                 ;; jemalloc source). To use jemalloc we must enable linking to
                 ;; it (otherwise it would use the system allocator), and set
                 ;; an environment variable pointing to the compiled jemalloc.
                 (substitute* "config.toml"
                   (("^jemalloc =.*$") "")
                   (("[[]rust[]]") "\n[rust]\njemalloc=true\n"))
                 (setenv "JEMALLOC_OVERRIDE" (string-append (assoc-ref inputs "jemalloc")
                                                            "/lib/libjemalloc_pic.a"))
                 #t))
             ;; Remove no longer relevant steps
             (delete 'remove-flaky-test)
             (delete 'patch-aarch64-test))))))))

(define-public rust-1.33
  (let ((base-rust
         (rust-bootstrapped-package rust-1.32 "1.33.0"
           "152x91mg7bz4ygligwjb05fgm1blwy2i70s2j03zc9jiwvbsh0as")))
    (package
      (inherit base-rust)
      (source
        (origin
          (inherit (package-source base-rust))
          (patches '())
          (patch-flags '("-p1"))))
      (inputs
       ;; Upgrade to jemalloc@5.1.0
       (alist-replace "jemalloc" (list jemalloc)
                      (package-inputs base-rust)))
      (arguments
       (substitute-keyword-arguments (package-arguments base-rust)
         ((#:phases phases)
          `(modify-phases ,phases
             (delete 'ignore-cargo-package-tests)
             (add-after 'configure 'configure-test-threads
               ;; Several rustc and cargo tests will fail if run on one core
               ;; https://github.com/rust-lang/rust/issues/59122
               ;; https://github.com/rust-lang/cargo/issues/6746
               ;; https://github.com/rust-lang/rust/issues/58907
               (lambda* (#:key inputs #:allow-other-keys)
                 (setenv "RUST_TEST_THREADS" "2")
                 #t)))))))))

(define-public rust-1.34
  (let ((base-rust
         (rust-bootstrapped-package rust-1.33 "1.34.1"
           "19s09k7y5j6g3y4d2rk6kg9pvq6ml94c49w6b72dmq8p9lk8bixh")))
    (package
      (inherit base-rust)
      (source
        (origin
          (inherit (package-source base-rust))
          (snippet '(begin
                      (delete-file-recursively "src/llvm-emscripten")
                      (delete-file-recursively "src/llvm-project")
                      (delete-file-recursively "vendor/jemalloc-sys/jemalloc")
                      #t)))))))

(define-public rust-1.35
  (let ((base-rust
         (rust-bootstrapped-package rust-1.34 "1.35.0"
           "0bbizy6b7002v1rdhrxrf5gijclbyizdhkglhp81ib3bf5x66kas")))
    (package
      (inherit base-rust)
      (inputs
       (alist-replace "llvm" (list llvm-8)
                      (package-inputs base-rust)))
      (arguments
       (substitute-keyword-arguments (package-arguments base-rust)
         ((#:phases phases)
          `(modify-phases ,phases
             ;; The tidy test includes a pass which ensures large binaries
             ;; don't accidentally get checked into the rust git repo.
             ;; Unfortunately the test assumes that git is always available,
             ;; so we'll comment out the invocation of this pass.
             (add-after 'configure 'disable-tidy-bins-check
               (lambda* _
                 (substitute* "src/tools/tidy/src/main.rs"
                   (("bins::check") "//bins::check"))
                 #t)))))))))

(define-public rust-1.36
  (let ((base-rust
         (rust-bootstrapped-package rust-1.35 "1.36.0"
           "06xv2p6zq03lidr0yaf029ii8wnjjqa894nkmrm6s0rx47by9i04")))
    (package
      (inherit base-rust)
      (arguments
       (substitute-keyword-arguments (package-arguments base-rust)
         ((#:phases phases)
          `(modify-phases ,phases
             (delete 'patch-process-docs-rev-cmd))))))))

(define-public rust
  (let ((base-rust
         (rust-bootstrapped-package rust-1.36 "1.37.0"
           "1hrqprybhkhs6d9b5pjskfnc5z9v2l2gync7nb39qjb5s0h703hj")))
    (package
      (inherit base-rust)
      (arguments
       (substitute-keyword-arguments (package-arguments base-rust)
         ((#:phases phases)
          `(modify-phases ,phases
             (add-before 'configure 'configure-cargo-home
               (lambda _
                 (let ((cargo-home (string-append (getcwd) "/.cargo")))
                   (mkdir-p cargo-home)
                   (setenv "CARGO_HOME" cargo-home)
                   #t))))))))))

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2020-03-24 11:57         ` Danny Milosavljevic
@ 2020-03-24 14:45           ` Marius Bakke
  2020-12-10 21:55             ` Maxim Cournoyer
  0 siblings, 1 reply; 24+ messages in thread
From: Marius Bakke @ 2020-03-24 14:45 UTC (permalink / raw)
  To: Danny Milosavljevic; +Cc: 38110

[-- Attachment #1: Type: text/plain, Size: 880 bytes --]

Danny Milosavljevic <dannym@scratchpost.org> writes:

> Hi Marius,
>
> On Mon, 23 Mar 2020 23:16:07 +0100
> Marius Bakke <mbakke@fastmail.com> wrote:
>
>> > Building rust, I get a texinfo build failure:
>
>> How are you building Rust?  I've only used the Guix package definition
>> and did not get as far as actually running the test suite.  Do you have
>> an updated build script?
>
> It's failing in texinfo, not in rust.

Oh right, sorry for the confusion.

> Also, on my laptop, it's not failing in texinfo.  So I guess it has
> something to do with bayfront or the machines it offloads to.

I haven't seen this in the countless times I've built core-updates over
the last few months, nor on Berlin.  I suspect it has to do with
parallelism; can you see if #:parallel-tests? #f makes a difference?

You should be able to grab a Texinfo substitute from ci.guix.gnu.org
though.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.
  2020-03-24 14:45           ` Marius Bakke
@ 2020-12-10 21:55             ` Maxim Cournoyer
  2021-02-05 14:58               ` bug#38110: [PATCH 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Maxim Cournoyer
  0 siblings, 1 reply; 24+ messages in thread
From: Maxim Cournoyer @ 2020-12-10 21:55 UTC (permalink / raw)
  To: Marius Bakke; +Cc: 38110

[-- Attachment #1: Type: text/plain, Size: 1149 bytes --]

Hello Marius,

Marius Bakke <mbakke@fastmail.com> writes:

> Danny Milosavljevic <dannym@scratchpost.org> writes:
>
>> Hi Marius,
>>
>> On Mon, 23 Mar 2020 23:16:07 +0100
>> Marius Bakke <mbakke@fastmail.com> wrote:
>>
>>> > Building rust, I get a texinfo build failure:
>>
>>> How are you building Rust?  I've only used the Guix package definition
>>> and did not get as far as actually running the test suite.  Do you have
>>> an updated build script?
>>
>> It's failing in texinfo, not in rust.
>
> Oh right, sorry for the confusion.
>
>> Also, on my laptop, it's not failing in texinfo.  So I guess it has
>> something to do with bayfront or the machines it offloads to.
>
> I haven't seen this in the countless times I've built core-updates over
> the last few months, nor on Berlin.  I suspect it has to do with
> parallelism; can you see if #:parallel-tests? #f makes a difference?
>
> You should be able to grab a Texinfo substitute from ci.guix.gnu.org
> though.

I don't recall how close or how far it was from actually building, but
attached is a modified version of Danny's patch I was working on, that
applies to current core-updates:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-gnu-rust-Bootstrap-rust-1.29.0-by-mrustc-0.9.patch --]
[-- Type: text/x-patch, Size: 45372 bytes --]

From 745ed53938b6e19268e0fc2cb07b7bc2131c151e Mon Sep 17 00:00:00 2001
From: Danny Milosavljevic <dannym@scratchpost.org>
Date: Tue, 18 Aug 2020 14:59:03 -0400
Subject: [PATCH] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9.

* gnu/packages/patches/mrustc-group-link.patch: New file.
* gnu/packages/patches/rustc-1.29.0-src.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register new files.
* gnu/packages/rust.scm (mrustc): Update rustc-version to 1.29.0 and apply
patch.
(rust-1.19): Delete variable.
(rust-1.20, rust-1.21 rust-1.22, rust-1.23, rust-1.24): Likewise.
(rust-1.25, rust-1.26, rust-1.27, rust-1.28): Delete variable.
(rust-1.29): Bootstrap from mrustc and apply patch.
(rust-1.30)[inputs]: Remove llvm 3.  Add llvm 6.
---
 gnu/local.mk                                 |   2 +
 gnu/packages/patches/mrustc-group-link.patch |  22 +
 gnu/packages/patches/rustc-1.29.0-src.patch  |  86 +++
 gnu/packages/rust.scm                        | 582 +++++--------------
 4 files changed, 242 insertions(+), 450 deletions(-)
 create mode 100644 gnu/packages/patches/mrustc-group-link.patch
 create mode 100644 gnu/packages/patches/rustc-1.29.0-src.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 9979e9172e..1d6d801e8d 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1361,6 +1361,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/mozjs38-tracelogger.patch		\
   %D%/packages/patches/mozjs38-version-detection.patch		\
   %D%/packages/patches/mrrescue-support-love-11.patch		\
+  %D%/packages/patches/mrustc-group-link.patch			\
   %D%/packages/patches/mtools-mformat-uninitialized.patch	\
   %D%/packages/patches/mumps-build-parallelism.patch		\
   %D%/packages/patches/mumps-shared-libseq.patch		\
@@ -1588,6 +1589,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/rust-1.25-accept-more-detailed-gdb-lines.patch \
   %D%/packages/patches/rust-1.45-linker-locale.patch		\
   %D%/packages/patches/rust-bootstrap-stage0-test.patch		\
+  %D%/packages/patches/rustc-1.29.0-src.patch			\
   %D%/packages/patches/rust-coresimd-doctest.patch		\
   %D%/packages/patches/rust-nettle-disable-vendor.patch		 \
   %D%/packages/patches/rust-nettle-sys-disable-vendor.patch	 \
diff --git a/gnu/packages/patches/mrustc-group-link.patch b/gnu/packages/patches/mrustc-group-link.patch
new file mode 100644
index 0000000000..fec0dfbe69
--- /dev/null
+++ b/gnu/packages/patches/mrustc-group-link.patch
@@ -0,0 +1,22 @@
+Surround the libraries with --start-group and --end-group to work
+around <https://github.com/thepowersgang/mrustc/issues/138>.
+
+diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
+--- a/src/trans/codegen_c.cpp
++++ b/src/trans/codegen_c.cpp
+@@ -960,6 +960,7 @@ namespace {
+                     {
+                         args.push_back("-L"); args.push_back(path);
+                     }
++                    args.push_back("-Wl,--start-group");
+                     for(const auto& lib : m_crate.m_ext_libs) {
+                         ASSERT_BUG(Span(), lib.name != "", "");
+                         args.push_back("-l"); args.push_back(lib.name.c_str());
+@@ -975,6 +976,7 @@ namespace {
+                     {
+                         args.push_back("-l"); args.push_back(path.c_str());
+                     }
++                    args.push_back("-Wl,--end-group");
+                     for( const auto& a : Target_GetCurSpec().m_backend_c.m_linker_opts )
+                     {
+                         args.push_back( a.c_str() );
diff --git a/gnu/packages/patches/rustc-1.29.0-src.patch b/gnu/packages/patches/rustc-1.29.0-src.patch
new file mode 100644
index 0000000000..0af626b615
--- /dev/null
+++ b/gnu/packages/patches/rustc-1.29.0-src.patch
@@ -0,0 +1,86 @@
+From mrustc 0.9.
+# Add mrustc slice length intrinsics
+--- rustc-1.29.0-src/src/libcore/intrinsics.rs
++++ rustc-1.29.0-src/src/libcore/intrinsics.rs
+@@ -678,5 +678,9 @@
+     pub fn min_align_of_val<T: ?Sized>(_: &T) -> usize;
+
++    /// Obtain the length of a slice pointer
++    #[cfg(rust_compiler="mrustc")]
++    pub fn mrustc_slice_len<T>(pointer: *const [T]) -> usize;
++
+     /// Gets a static string slice containing the name of a type.
+     pub fn type_name<T: ?Sized>() -> &'static str;
+
+--- rustc-1.29.0-src/src/libcore/slice/mod.rs
++++ rustc-1.29.0-src/src/libcore/slice/mod.rs
+@@ -413,5 +413,7 @@
+     pub const fn len(&self) -> usize {
+-        unsafe {
+-            Repr { rust: self }.raw.len
+-        }
++        #[cfg(not(rust_compiler="mrustc"))]
++        const fn len_inner<T>(s: &[T]) -> usize { unsafe { Repr { rust: s }.raw.len } };
++        #[cfg(rust_compiler="mrustc")]
++        const fn len_inner<T>(s: &[T]) -> usize { unsafe { ::intrinsics::mrustc_slice_len(s) } }
++        len_inner(self)
+     }
+# Static-link rustc_codegen_llvm because mrustc doesn't have dylib support
+--- rustc-1.29.0-src/src/librustc_driver/Cargo.toml
++++ rustc-1.29.0-src/src/librustc_driver/Cargo.toml
+@@ -39,1 +39,2 @@
+ syntax_pos = { path = "../libsyntax_pos" }
++rustc_codegen_llvm = { path = "../librustc_codegen_llvm" }
+--- rustc-1.29.0-src/src/librustc_driver/lib.rs
++++ rustc-1.29.0-src/src/librustc_driver/lib.rs
+@@ -63,2 +63,3 @@
+ extern crate syntax_pos;
++extern crate rustc_codegen_llvm;
+
+@@ -296,3 +296,7 @@
+     }
+
++    if backend_name == "llvm" {
++        return rustc_codegen_llvm::__rustc_codegen_backend;
++    }
++
+     let target = session::config::host_triple();
+# No workspace support in minicargo, patch cargo's Cargo.toml
+--- rustc-1.29.0-src/src/tools/cargo/Cargo.toml
++++ rustc-1.29.0-src/src/tools/cargo/Cargo.toml
+@@ -60,5 +60,5 @@
+ # A noop dependency that changes in the Rust repository, it's a bit of a hack.
+ # See the `src/tools/rustc-workspace-hack/README.md` file in `rust-lang/rust`
+ # for more information.
+-rustc-workspace-hack = "1.0.0"
++rustc-workspace-hack = { path = "../rustc-workspace-hack" }
+
+# mrustc can't represent a 24 byte version of this enum (no way of storing the
+# tag in padding)
+--- rustc-1.29.0-src/src/librustc/ty/context.rs
++++ rustc-1.29.0-src/src/librustc/ty/context.rs
+@@ -805,5 +805,5 @@
+         // Ensure our type representation does not grow
+-        #[cfg(target_pointer_width = "64")]
+-        assert!(mem::size_of::<ty::TypeVariants>() <= 24);
+-        #[cfg(target_pointer_width = "64")]
+-        assert!(mem::size_of::<ty::TyS>() <= 32);
++        //#[cfg(target_pointer_width = "64")]
++        //assert!(mem::size_of::<ty::TypeVariants>() <= 24);
++        //#[cfg(target_pointer_width = "64")]
++        //assert!(mem::size_of::<ty::TyS>() <= 32);
+
+--- rustc-1.29.0-src/src/stdsimd/stdsimd/arch/detect/os/x86.rs
++++ rustc-1.29.0-src/src/stdsimd/stdsimd/arch/detect/os/x86.rs
+@@ -14,5 +14,11 @@
+ /// Performs run-time feature detection.
+ #[inline]
++#[cfg(not(rust_compiler="mrustc"))]
+ pub fn check_for(x: Feature) -> bool {
+     cache::test(x as u32, detect_features)
+ }
++#[inline]
++#[cfg(rust_compiler="mrustc")]
++pub fn check_for(x: Feature) -> bool {
++    false
++}
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index 35a96b5754..dd6db6da97 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -116,7 +116,7 @@
                                    (package-native-inputs base-rust))))))
 
 (define-public mrustc
-  (let ((rustc-version "1.19.0"))
+  (let ((rustc-version "1.29.0"))
     (package
       (name "mrustc")
       (version "0.9")
@@ -126,6 +126,7 @@
                       (url "https://github.com/thepowersgang/mrustc")
                       (commit (string-append "v" version))))
                 (file-name (git-file-name name version))
+                (patches (search-patches "mrustc-group-link.patch"))
                 (sha256
                  (base32
                   "194ny7vsks5ygiw7d8yxjmp1qwigd71ilchis6xjl6bb2sj97rd2"))))
@@ -137,7 +138,7 @@
        `(("bison" ,bison)
          ("flex" ,flex)
          ;; Required for the libstd sources.
-         ("rustc" ,(package-source rust-1.19))))
+         ("rustc" ,(package-source rust-1.29))))
       (arguments
        `(#:test-target "test"
          #:make-flags
@@ -156,21 +157,17 @@
            (add-after 'patch-date 'unpack-target-compiler
              (lambda* (#:key inputs outputs #:allow-other-keys)
                (invoke "tar" "xf" (assoc-ref inputs "rustc"))
-               (chdir ,(string-append "rustc-" rustc-version "-src"))
-               (invoke "patch" "-p0" ,(string-append "../rustc-" rustc-version
+               (invoke "patch" "-p1" ,(string-append "rustc-" rustc-version
                                                      "-src.patch"))
-               (chdir "..")
                (setenv "RUSTC_VERSION" ,rustc-version)
                (setenv "MRUSTC_TARGET_VER"
                 ,(version-major+minor rustc-version))
                (setenv "OUTDIR_SUF" "")
                #t))
            (replace 'configure
-             (lambda* (#:key inputs #:allow-other-keys)
-               (setenv "CC" (string-append (assoc-ref inputs "gcc")
-                                           "/bin/gcc"))
-               (setenv "CXX" (string-append (assoc-ref inputs "gcc")
-                                            "/bin/g++"))
+             (lambda _
+               (setenv "CC" "gcc")
+               (setenv "CXX" "g++")
                #t))
            (add-after 'build 'build-minicargo
              (lambda* (#:key make-flags #:allow-other-keys)
@@ -217,21 +214,24 @@ safety and thread safety guarantees.")
       ;; Dual licensed.
       (license (list license:asl2.0 license:expat)))))
 
-(define rust-1.19
+(define rust-1.29
   (package
     (name "rust")
-    (version "1.19.0")
+    (version "1.29.0")
     (source
       (origin
         (method url-fetch)
-        (uri (rust-uri "1.19.0"))
-        (sha256 (base32 "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm"))
+        (uri (rust-uri "1.29.0"))
+        (sha256 (base32 "1sb15znckj8pc8q3g7cq03pijnida6cg64yqmgiayxkzskzk9sx4"))
         (modules '((guix build utils)))
         (snippet '(begin (delete-file-recursively "src/llvm") #t))
-        (patches (search-patches "rust-1.19-mrustc.patch"))))
-    (outputs '("out" "cargo"))
+        (patches (map search-patch '("rust-1.25-accept-more-detailed-gdb-lines.patch"
+                                     "rust-reproducible-builds.patch"
+                                     "rustc-1.29.0-src.patch")))))
+    (outputs '("out" "cargo" "doc"))
     (properties '((timeout . 72000)               ;20 hours
                   (max-silent-time . 18000)))     ;5 hours (for armel)
+    (build-system gnu-build-system)
     (arguments
      `(#:imported-modules ,%cargo-utils-modules ;for `generate-all-checksums'
        #:modules ((guix build utils) (ice-9 match) (guix build gnu-build-system))
@@ -244,27 +244,9 @@ safety and thread safety guarantees.")
              (setenv "SHELL" (which "sh"))
              (setenv "CONFIG_SHELL" (which "sh"))
              (setenv "CC" (string-append (assoc-ref inputs "gcc") "/bin/gcc"))
-             ;; guix llvm-3.9.1 package installs only shared libraries
+             ;; The Guix LLVM package installs only shared libraries.
              (setenv "LLVM_LINK_SHARED" "1")
              #t))
-         (add-after 'unpack 'patch-cargo-tomls
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (substitute* "src/librustc_errors/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-term = \"0.4.4\"
-"))
-             (substitute* "src/librustc/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-getopts = { path = \"../libgetopts\" }
-"))
-             (substitute* "src/librustdoc/Cargo.toml"
-               (("[[]dependencies[]]") "
-[dependencies]
-test = { path = \"../libtest\" }
-"))
-             #t))
          (add-after 'unpack 'patch-tests
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((bash (assoc-ref inputs "bash")))
@@ -283,27 +265,29 @@ test = { path = \"../libtest\" }
     #[ignore]
     fn test_process_mask"))
                #t)))
+         (add-after 'patch-tests 'patch-cargo-index-update
+           (lambda* _
+             (substitute* "src/tools/cargo/tests/testsuite/generate_lockfile.rs"
+               ;; This test wants to update the crate index.
+               (("fn no_index_update") "#[ignore]\nfn no_index_update"))
+             #t))
          (add-after 'patch-tests 'patch-aarch64-test
            (lambda* _
-             (substitute* "src/librustc_back/dynamic_lib.rs"
+             (substitute* "src/librustc_metadata/dynamic_lib.rs"
                ;; This test is known to fail on aarch64 and powerpc64le:
                ;; https://github.com/rust-lang/rust/issues/45410
                (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-             #t))
-         (add-after 'patch-tests 'use-readelf-for-tests
-           (lambda* _
-             ;; nm doesn't recognize the file format because of the
-             ;; nonstandard sections used by the Rust compiler, but readelf
-             ;; ignores them.
-             (substitute* "src/test/run-make/atomic-lock-free/Makefile"
-               (("\tnm ")
-                "\treadelf -c "))
+             ;; This test fails on aarch64 with llvm@6.0:
+             ;; https://github.com/rust-lang/rust/issues/49807
+             ;; other possible solution:
+             ;; https://github.com/rust-lang/rust/pull/47688
+             (delete-file "src/test/debuginfo/by-value-self-argument-in-trait-impl.rs")
              #t))
          (add-after 'patch-tests 'remove-unsupported-tests
            (lambda* _
              ;; 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")
+             (delete-file-recursively "src/test/run-make-fulldeps/linker-output-non-utf8")
              #t))
          (add-after 'patch-source-shebangs 'patch-cargo-checksums
            (lambda* _
@@ -315,28 +299,36 @@ test = { path = \"../libtest\" }
              #t))
          ;; This phase is overridden by newer versions.
          (replace 'configure
-           (const #t))
+           (lambda _
+             (setenv "CXX" "g++")
+             (setenv "HOST_CXX" "g++")
+             #t))
          ;; This phase is overridden by newer versions.
          (replace 'build
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((rustc-bootstrap (assoc-ref inputs "rustc-bootstrap")))
+           (lambda* (#:key inputs outputs parallel-build? #:allow-other-keys)
+             (let ((rustc-bootstrap (assoc-ref inputs "rustc-bootstrap"))
+                   (job-count (if parallel-build?
+                                  (number->string (parallel-job-count))
+                                  "1")))
                (setenv "CFG_COMPILER_HOST_TRIPLE"
                 ,(nix-system->gnu-triplet (%current-system)))
                (setenv "CFG_RELEASE" "")
                (setenv "CFG_RELEASE_CHANNEL" "stable")
                (setenv "CFG_LIBDIR_RELATIVE" "lib")
-               (setenv "CFG_VERSION" "1.19.0-stable-mrustc")
+               (setenv "CFG_VERSION" "1.29.0-stable-mrustc")
                (setenv "MRUSTC_TARGET_VER" ,(version-major+minor version))
                ; bad: (setenv "CFG_PREFIX" "mrustc") ; FIXME output path.
-               (mkdir-p "output")
-               ;; mrustc 0.9 doesn't check the search paths for crates anymore.
+               ;; Crate::load_extern_crate ignores the search path, so make
+               ;; the situation easier for it.
+               ;; Also, mrustc 0.9 doesn't check the search paths for crates
+               ;; anymore.
                (copy-recursively (string-append rustc-bootstrap "/lib/mrust")
                                  "output")
                (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
                        "src/rustc" "--vendor-dir" "src/vendor"
                        "--output-dir" "output/rustc-build"
                        "-L" (string-append rustc-bootstrap "/lib/mrust")
-                       "-j" "1")
+                       "-j" job-count)
                (setenv "CFG_COMPILER_HOST_TRIPLE" #f)
                (setenv "CFG_RELEASE" #f)
                (setenv "CFG_RELEASE_CHANNEL" #f)
@@ -346,9 +338,8 @@ test = { path = \"../libtest\" }
                (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
                        "src/tools/cargo" "--vendor-dir" "src/vendor"
                        "--output-dir" "output/cargo-build"
-                       "-L" "output/"
                        "-L" (string-append rustc-bootstrap "/lib/mrust")
-                       "-j" "1")
+                       "-j" job-count)
                ;; Now use the newly-built rustc to build the libraries.
                ;; One day that could be replaced by:
                ;; (invoke "output/cargo-build/cargo" "build"
@@ -362,7 +353,7 @@ test = { path = \"../libtest\" }
                             (write name)
                             (newline)
                             (apply invoke
-                                   "output/rustc-build/rustc"
+                                   "output/rustc-build/rustc_binary"
                                    "-C" (string-append "linker="
                                                        (getenv "CC"))
                                    ;; Required for libterm.
@@ -387,9 +378,7 @@ test = { path = \"../libtest\" }
                            ;; Uses "cc" to link.
                            ("libstd" "-l" "dl" "-l" "rt" "-l" "pthread")
                            ("libarena")
-
                            ;; Test dependencies:
-
                            ("libgetopts")
                            ("libterm")
                            ("libtest")))
@@ -417,7 +406,6 @@ test = { path = \"../libtest\" }
                              (string-append (assoc-ref outputs "cargo")
                                             "/bin")))
              #t)))))
-    (build-system gnu-build-system)
     (native-inputs
      `(("bison" ,bison) ; For the tests
        ("cmake" ,cmake-minimal)
@@ -433,36 +421,22 @@ test = { path = \"../libtest\" }
        ("which" ,which)))
     (inputs
      `(("jemalloc" ,jemalloc-4.5.0)
-       ("llvm" ,llvm-3.9.1)
+       ("llvm" ,llvm-6)
        ("openssl" ,openssl-1.0)
        ("libssh2" ,libssh2) ; For "cargo"
        ("libcurl" ,curl)))  ; For "cargo"
-
-    ;; rustc invokes gcc, so we need to set its search paths accordingly.
-    ;; Note: duplicate its value here to cope with circular dependencies among
-    ;; modules (see <https://bugs.gnu.org/31392>).
-    (native-search-paths
-     (list (search-path-specification
-            (variable "C_INCLUDE_PATH")
-            (files '("include")))
-           (search-path-specification
-            (variable "CPLUS_INCLUDE_PATH")
-            (files '("include/c++" "include")))
-           (search-path-specification
-            (variable "LIBRARY_PATH")
-            (files '("lib" "lib64")))))
-
-    (synopsis "Compiler for the Rust programming language")
+    (native-search-paths (package-native-search-paths gcc))
+    (synopsis "Compiler for the Rust progamming language")
     (description "Rust is a systems programming language that provides memory
 safety and thread safety guarantees.")
     (home-page "https://www.rust-lang.org")
     ;; Dual licensed.
     (license (list license:asl2.0 license:expat))))
 
-(define-public rust-1.20
+(define-public rust-1.30
   (let ((base-rust
-         (rust-bootstrapped-package rust-1.19 "1.20.0"
-          "0542y4rnzlsrricai130mqyxl8r6rd991frb4qsnwb27yigqg91a")))
+         (rust-bootstrapped-package rust-1.29 "1.30.1"
+          "0aavdc1lqv0cjzbqwl5n59yd0bqdlhn0zas61ljf38yrvc18k8rn")))
     (package
       (inherit base-rust)
       (source
@@ -471,24 +445,45 @@ safety and thread safety guarantees.")
           (snippet '(begin
                       (delete-file-recursively "src/jemalloc")
                       (delete-file-recursively "src/llvm")
+                      (delete-file-recursively "src/llvm-emscripten")
+                      (delete-file-recursively "src/tools/clang")
+                      (delete-file-recursively "src/tools/lldb")
                       #t))
           (patches '())))
-      (native-inputs
-       `(;; The tests fail with newer versions of GNU Make.
-         ("make" ,gnu-make-4.2)
-         ,@(package-native-inputs base-rust)))
       (outputs '("out" "doc" "cargo"))
-      ;; Since rust-1.19 is local, it's quite probable that Hydra
-      ;; will build rust-1.19 only as a dependency of rust-1.20.
+      ;; Since rust-1.29 is local, it's quite probable that Hydra
+      ;; will build rust-1.29 only as a dependency of rust-1.30.
       ;; But then Hydra will use the wrong properties, the ones here,
-      ;; for rust-1.19.  Therefore, we copied the properties of
-      ;; rust-1.19 here.
+      ;; for rust-1.29.  Therefore, we copied the properties of
+      ;; rust-1.29 here.
       (properties '((timeout . 72000)               ;20 hours
                     (max-silent-time . 18000)))     ;5 hours (for armel)
+      (inputs
+       ;; Use LLVM 6.0
+       (alist-replace "llvm" (list llvm-6)
+                      (package-inputs base-rust)))
       (arguments
-       (substitute-keyword-arguments (package-arguments rust-1.19)
+       (substitute-keyword-arguments (package-arguments rust-1.29)
          ((#:phases phases)
           `(modify-phases ,phases
+             (add-after 'unpack 'remove-flaky-test
+               (lambda _
+                 ;; See <https://github.com/rust-lang/rust/issues/43402>.
+                 (when (file-exists? "src/test/run-make/issue-26092")
+                   (delete-file-recursively "src/test/run-make/issue-26092"))
+                 #t))
+             (add-after 'configure 'enable-codegen-tests
+               ;; Codegen tests should pass with llvm 6, so enable them.
+               (lambda* _
+                 (substitute* "config.toml"
+                   (("codegen-tests = false") ""))
+                 #t))
+              ;; The test has been moved elsewhere.
+              (add-after 'patch-tests 'disable-amd64-avx-test
+                (lambda _
+                  (substitute* "src/test/ui/issues/issue-44056.rs"
+                   (("only-x86_64") "ignore-test"))
+                  #t))
              (add-after 'patch-tests 'patch-cargo-tests
                (lambda _
                  (substitute* "src/tools/cargo/tests/build.rs"
@@ -510,12 +505,29 @@ safety and thread safety guarantees.")
                    (("fn finds_author_git") "#[ignore]\nfn finds_author_git")
                    (("fn finds_local_author_git") "#[ignore]\nfn finds_local_author_git"))
                  #t))
-             (add-after 'patch-cargo-tests 'ignore-glibc-2.27-incompatible-test
-               ;; https://github.com/rust-lang/rust/issues/47863
-               (lambda _
-                 (substitute* "src/test/run-pass/out-of-stack.rs"
-                   (("// ignore-android") "// ignore-test\n// ignore-android"))
-                 #t))
+             (add-after 'patch-cargo-tests 'patch-cargo-env-shebang
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (let ((coreutils (assoc-ref inputs "coreutils")))
+                   (substitute* "src/tools/cargo/tests/testsuite/fix.rs"
+                     ;; Cargo has a test which explicitly sets a
+                     ;; RUSTC_WRAPPER environment variable which points
+                     ;; to /usr/bin/env. Since it's not a shebang, it
+                     ;; needs to be manually patched
+                     (("\"/usr/bin/env\"")
+                      (string-append "\"" coreutils "/bin/env\"")))
+                   #t)))
+             (add-after 'patch-cargo-env-shebang 'ignore-cargo-package-tests
+               (lambda* _
+                 (substitute* "src/tools/cargo/tests/testsuite/package.rs"
+                   ;; These tests largely check that cargo outputs warning/error
+                   ;; messages as expected. It seems that cargo outputs an
+                   ;; absolute path to something in the store instead of the
+                   ;; expected relative path (e.g. `[..]`) so we'll ignore
+                   ;; these for now
+                   (("fn include") "#[ignore]\nfn include")
+                   (("fn exclude") "#[ignore]\nfn exclude"))
+                   #t))
+
              (replace 'configure
                (lambda* (#:key inputs outputs #:allow-other-keys)
                  (let* ((out (assoc-ref outputs "out"))
@@ -567,16 +579,6 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                           "/tmp/cc")
                  (setenv "PATH" (string-append "/tmp:" (getenv "PATH")))
                  #t))
-             (add-after 'provide-cc 'configure-archiver
-               (lambda* (#:key inputs #:allow-other-keys)
-                 (substitute* "src/build_helper/lib.rs"
-                  ;; Make sure "ar" is always used as the archiver.
-                  (("\"musl\"") "\"\"")
-                  ;; Then substitute "ar" by our name.
-                  (("\"ar\"") (string-append "\""
-                               (assoc-ref inputs "binutils")
-                               "/bin/ar\"")))
-                 #t))
              (delete 'patch-cargo-tomls)
              (add-before 'build 'reset-timestamps-after-changes
                (lambda* _
@@ -593,11 +595,14 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                  (invoke "./x.py" "build" "src/tools/cargo")))
              (replace 'check
                (lambda* _
-                 ;; Disable parallel execution to prevent EAGAIN errors when
-                 ;; running tests.
-                 (invoke "./x.py" "-j1" "test" "-vv")
-                 (invoke "./x.py" "-j1" "test" "src/tools/cargo")
-                 #t))
+                 ;; Enable parallel execution.
+                 (let ((parallel-job-spec
+                        (string-append "-j" (number->string
+                                             (min 4
+                                                  (parallel-job-count))))))
+                   (invoke "./x.py" parallel-job-spec "test" "-vv")
+                   (invoke "./x.py" parallel-job-spec "test"
+                           "src/tools/cargo"))))
              (replace 'install
                (lambda* (#:key outputs #:allow-other-keys)
                  (invoke "./x.py" "install")
@@ -636,341 +641,6 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                      `("LIBRARY_PATH" ":" suffix (,(string-append libc "/lib"))))
                    #t))))))))))
 
-(define-public rust-1.21
-  (let ((base-rust (rust-bootstrapped-package rust-1.20 "1.21.0"
-                    "1yj8lnxybjrybp00fqhxw8fpr641dh8wcn9mk44xjnsb4i1c21qp")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'configure 'remove-ar
-               (lambda* (#:key inputs #:allow-other-keys)
-                 ;; Remove because toml complains about "unknown field".
-                 (substitute* "config.toml"
-                  (("^ar =.*") "\n"))
-                 #t)))))))))
-
-(define-public rust-1.22
-  (let ((base-rust (rust-bootstrapped-package rust-1.21 "1.22.1"
-                    "1lrzzp0nh7s61wgfs2h6ilaqi6iq89f1pd1yaf65l87bssyl4ylb")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'unpack 'remove-flaky-test
-               (lambda _
-                 ;; See <https://github.com/rust-lang/rust/issues/43402>.
-                 (when (file-exists? "src/test/run-make/issue-26092")
-                   (delete-file-recursively "src/test/run-make/issue-26092"))
-                 #t)))))))))
-
-(define-public rust-1.23
-  (let ((base-rust (rust-bootstrapped-package rust-1.22 "1.23.0"
-                    "14fb8vhjzsxlbi6yrn1r6fl5dlbdd1m92dn5zj5gmzfwf4w9ar3l")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'configure-archiver)
-             (delete 'remove-ar)
-             (add-after 'unpack 'dont-build-native
-               (lambda _
-                 ;; XXX: Revisit this when we use gcc 6.
-                 (substitute* "src/binaryen/CMakeLists.txt"
-                  (("ADD_COMPILE_FLAG\\(\\\"-march=native\\\"\\)") ""))
-                 #t)))))))))
-
-(define-public rust-1.24
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.23 "1.24.1"
-          "1vv10x2h9kq7fxh2v01damdq8pvlp5acyh1kzcda9sfjx12kv99y")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'use-readelf-for-tests)
-             (replace 'patch-aarch64-test
-               (lambda* _
-                 (substitute* "src/librustc_metadata/dynamic_lib.rs"
-                   ;; This test is known to fail on aarch64 and powerpc64le:
-                   ;; https://github.com/rust-lang/rust/issues/45410
-                   (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-                 #t)))))))))
-
-;;; Rust 1.25 release support work with llvm 6--but build with llvm 6 is
-;;; not determenistic due to <https://github.com/rust-lang/rust/issues/50556>.
-;;; Keep using llvm 3.9.1 until builds become determenistic
-(define-public rust-1.25
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.24 "1.25.0"
-          "0baxjr99311lvwdq0s38bipbnj72pn6fgbk6lcq7j555xq53mxpf")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (snippet '(begin
-                      (delete-file-recursively "src/jemalloc")
-                      (delete-file-recursively "src/llvm")
-                      (delete-file-recursively "src/llvm-emscripten")
-                      #t))
-          (patches (search-patches
-                     "rust-1.25-accept-more-detailed-gdb-lines.patch"))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'patch-cargo-tests 'patch-cargo-index-update
-               (lambda _
-                 (substitute* "src/tools/cargo/tests/generate-lockfile.rs"
-                   ;; This test wants to update the crate index.
-                   (("fn no_index_update") "#[ignore]\nfn no_index_update"))
-                 #t))
-             (replace 'patch-aarch64-test
-               (lambda _
-                 (substitute* "src/librustc_metadata/dynamic_lib.rs"
-                   ;; This test is known to fail on aarch64 and powerpc64le:
-                   ;; https://github.com/rust-lang/rust/issues/45410
-                   (("fn test_loading_cosine") "#[ignore]\nfn test_loading_cosine"))
-                 ;; This test fails on aarch64 with llvm@6.0:
-                 ;; https://github.com/rust-lang/rust/issues/49807
-                 ;; other possible solution:
-                 ;; https://github.com/rust-lang/rust/pull/47688
-                 (delete-file "src/test/debuginfo/by-value-self-argument-in-trait-impl.rs")
-                 #t))
-             (delete 'ignore-glibc-2.27-incompatible-test))))))))
-
-(define-public rust-1.26
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.25 "1.26.2"
-          "0047ais0fvmqvngqkdsxgrzhb0kljg8wy85b01kbbjc88hqcz7pv")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (search-patches
-                     "rust-coresimd-doctest.patch"
-                     "rust-1.25-accept-more-detailed-gdb-lines.patch"))))
-      (inputs
-       (alist-replace "openssl" (list openssl)
-                      (package-inputs base-rust)))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             ;; binaryen was replaced with LLD project from LLVM
-             (delete 'dont-build-native)
-             (replace 'check
-               (lambda* _
-                 ;; Enable parallel execution.
-                 (let ((parallel-job-spec
-                        (string-append "-j" (number->string
-                                             (min 4
-                                                  (parallel-job-count))))))
-                   (invoke "./x.py" parallel-job-spec "test" "-vv")
-                   (invoke "./x.py" parallel-job-spec "test"
-                           "src/tools/cargo"))))
-             (replace 'remove-unsupported-tests
-               (lambda* _
-                 ;; 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-fulldeps/linker-output-non-utf8")
-                 #t))
-             (replace 'patch-cargo-tests
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/build.rs"
-                   (("/usr/bin/env") (which "env"))
-                   ;; Guix llvm is compiled without asmjs-unknown-emscripten.
-                   (("fn wasm32_final_outputs") "#[ignore]\nfn wasm32_final_outputs"))
-                 (substitute* "src/tools/cargo/tests/testsuite/death.rs"
-                   ;; This is stuck when built in container.
-                   (("fn ctrl_c_kills_everyone") "#[ignore]\nfn ctrl_c_kills_everyone"))
-                 ;; Prints test output in the wrong order when built on
-                 ;; i686-linux.
-                 (substitute* "src/tools/cargo/tests/testsuite/test.rs"
-                   (("fn cargo_test_env") "#[ignore]\nfn cargo_test_env"))
-
-                 ;; Avoid dependency on "git".
-                 (substitute* "src/tools/cargo/tests/testsuite/new.rs"
-                   (("fn author_prefers_cargo") "#[ignore]\nfn author_prefers_cargo")
-                   (("fn finds_author_git") "#[ignore]\nfn finds_author_git")
-                   (("fn finds_local_author_git") "#[ignore]\nfn finds_local_author_git"))
-                 #t))
-             (add-after 'patch-cargo-tests 'disable-cargo-test-for-nightly-channel
-               (lambda* _
-                 ;; This test failed to work on "nightly" channel builds
-                 ;; https://github.com/rust-lang/cargo/issues/5648
-                 (substitute* "src/tools/cargo/tests/testsuite/resolve.rs"
-                   (("fn test_resolving_minimum_version_with_transitive_deps")
-                    "#[ignore]\nfn test_resolving_minimum_version_with_transitive_deps"))
-                 #t))
-             (replace 'patch-cargo-index-update
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/generate_lockfile.rs"
-                   ;; This test wants to update the crate index.
-                   (("fn no_index_update") "#[ignore]\nfn no_index_update"))
-                 #t)))))))))
-
-(define-public rust-1.27
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.26 "1.27.2"
-          "0pg1s37bhx9zqbynxyydq5j6q7kij9vxkcv8maz0m25prm88r0cs")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (search-patches "rust-coresimd-doctest.patch"
-                                   "rust-bootstrap-stage0-test.patch"
-                                   "rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                   "rust-reproducible-builds.patch"))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-before 'install 'mkdir-prefix-paths
-               (lambda* (#:key outputs #:allow-other-keys)
-                 ;; As result of https://github.com/rust-lang/rust/issues/36989
-                 ;; `prefix' directory should exist before `install' call
-                 (mkdir-p (assoc-ref outputs "out"))
-                 (mkdir-p (assoc-ref outputs "cargo"))
-                 #t))
-             (add-after 'patch-cargo-tests 'disable-thinlto-test
-               (lambda* _
-                 ;; thinlto required llvm 6.0 for work
-                 (substitute* "src/tools/cargo/tests/testsuite/path.rs"
-                   (("fn thin_lto_works") "#[ignore]\nfn thin_lto_works"))
-                 #t)))))))))
-
-(define-public rust-1.28
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.27 "1.28.0"
-          "11k4rn77bca2rikykkk9fmprrgjswd4x4kaq7fia08vgkir82nhx")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (search-patches "rust-coresimd-doctest.patch"
-                                   "rust-bootstrap-stage0-test.patch"
-                                   "rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                   "rust-reproducible-builds.patch"))))
-      (inputs
-       ;; Use LLVM 6.0
-       (alist-replace "llvm" (list llvm-6)
-                      (package-inputs base-rust)))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'configure 'enable-codegen-tests
-               ;; Codegen tests should pass with llvm 6, so enable them.
-               (lambda* _
-                 (substitute* "config.toml"
-                   (("codegen-tests = false") ""))
-                 #t))
-             (add-after 'patch-tests 'disable-amd64-avx-test
-               ;; That test would fail on x86_64 machines without avx.
-               (lambda* _
-                 (substitute* "src/test/run-pass/issue-44056.rs"
-                   (("only-x86_64") "ignore-test"))
-                 #t))
-             ;; This is no longer needed as of 1.28
-             (delete 'disable-cargo-test-for-nightly-channel)
-             ;; The thinlto test should pass with llvm 6.
-             (delete 'disable-thinlto-test))))))))
-
-(define-public rust-1.29
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.28 "1.29.2"
-          "1jb787080z754caa2w3w1amsygs4qlzj9rs1vy64firfmabfg22h")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (patches (search-patches "rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                   "rust-reproducible-builds.patch")))))))
-
-(define-public rust-1.30
-  (let ((base-rust
-         (rust-bootstrapped-package rust-1.29 "1.30.1"
-          "0aavdc1lqv0cjzbqwl5n59yd0bqdlhn0zas61ljf38yrvc18k8rn")))
-    (package
-      (inherit base-rust)
-      (source
-        (origin
-          (inherit (package-source base-rust))
-          (snippet '(begin
-                      (delete-file-recursively "src/jemalloc")
-                      (delete-file-recursively "src/llvm")
-                      (delete-file-recursively "src/llvm-emscripten")
-                      (delete-file-recursively "src/tools/clang")
-                      (delete-file-recursively "src/tools/lldb")
-                      #t))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'patch-cargo-tests 'patch-cargo-env-shebang
-               (lambda* (#:key inputs #:allow-other-keys)
-                 (let ((coreutils (assoc-ref inputs "coreutils")))
-                   (substitute* "src/tools/cargo/tests/testsuite/fix.rs"
-                     ;; Cargo has a test which explicitly sets a
-                     ;; RUSTC_WRAPPER environment variable which points
-                     ;; to /usr/bin/env. Since it's not a shebang, it
-                     ;; needs to be manually patched
-                     (("\"/usr/bin/env\"")
-                      (string-append "\"" coreutils "/bin/env\"")))
-                   #t)))
-             (add-after 'patch-cargo-env-shebang 'ignore-cargo-package-tests
-               (lambda* _
-                 (substitute* "src/tools/cargo/tests/testsuite/package.rs"
-                   ;; These tests largely check that cargo outputs warning/error
-                   ;; messages as expected. It seems that cargo outputs an
-                   ;; absolute path to something in the store instead of the
-                   ;; expected relative path (e.g. `[..]`) so we'll ignore
-                   ;; these for now
-                   (("fn include") "#[ignore]\nfn include")
-                   (("fn exclude") "#[ignore]\nfn exclude"))
-                   #t))
-             ;; The test has been moved elsewhere.
-             (replace 'disable-amd64-avx-test
-               (lambda _
-                 (substitute* "src/test/ui/run-pass/issues/issue-44056.rs"
-                  (("only-x86_64") "ignore-test"))
-                  #t)))))))))
-
-(define (patch-command-exec-tests-phase test-path)
-  "The command-exec.rs test moves around between releases.  We need to apply
-a Guix-specific patch to it for each release.  This function generates the phase
-that applies said patch, parametrized by the test-path.  This is done this way
-because the phase is more complex than the equivalents for other tests that
-move around."
- `(lambda* (#:key inputs #:allow-other-keys)
-    (let ((coreutils (assoc-ref inputs "coreutils")))
-      (substitute* ,test-path
-        ;; This test suite includes some tests that the stdlib's
-        ;; `Command` execution properly handles situations where
-        ;; the environment or PATH variable are empty, but this
-        ;; fails since we don't have `echo` available in the usual
-        ;; Linux directories.
-        ;; NB: the leading space is so we don't fail a tidy check
-        ;; for trailing whitespace, and the newlines are to ensure
-        ;; we don't exceed the 100 chars tidy check as well
-        ((" Command::new\\(\"echo\"\\)")
-         (string-append "\nCommand::new(\"" coreutils "/bin/echo\")\n")))
-      #t)))
-
 (define-public rust-1.31
   (let ((base-rust
          (rust-bootstrapped-package rust-1.30 "1.31.1"
@@ -982,14 +652,26 @@ move around."
          ((#:phases phases)
           `(modify-phases ,phases
              (add-after 'patch-tests 'patch-command-exec-tests
-               ,(patch-command-exec-tests-phase
-                  "src/test/run-pass/command-exec.rs"))
-             ;; The test has been moved elsewhere.
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (let ((coreutils (assoc-ref inputs "coreutils")))
+                   (substitute* "src/test/run-pass/command-exec.rs"
+                     ;; This test suite includes some tests that the stdlib's
+                     ;; `Command` execution properly handles situations where
+                     ;; the environment or PATH variable are empty, but this
+                     ;; fails since we don't have `echo` available in the usual
+                     ;; Linux directories.
+                     ;; NB: the leading space is so we don't fail a tidy check
+                     ;; for trailing whitespace, and the newlines are to ensure
+                     ;; we don't exceed the 100 chars tidy check as well
+                     ((" Command::new\\(\"echo\"\\)")
+                      (string-append "\nCommand::new(\"" coreutils "/bin/echo\")\n")))
+                   #t)))
+	     ;; The test has been moved elsewhere.
              (replace 'disable-amd64-avx-test
                (lambda _
                  (substitute* "src/test/ui/issues/issue-44056.rs"
-                  (("only-x86_64") "ignore-test"))
-                 #t))
+                   (("only-x86_64") "ignore-test"))
+                  #t))
              (add-after 'patch-tests 'patch-process-docs-rev-cmd
                (lambda* _
                  ;; Disable some doc tests which depend on the "rev" command
@@ -1131,7 +813,7 @@ move around."
           `(modify-phases ,phases
              (delete 'patch-process-docs-rev-cmd))))))))
 
-(define-public rust-1.37
+(define-public rust
   (let ((base-rust
          (rust-bootstrapped-package rust-1.36 "1.37.0"
            "1hrqprybhkhs6d9b5pjskfnc5z9v2l2gync7nb39qjb5s0h703hj")))
-- 
2.29.2


[-- Attachment #3: Type: text/plain, Size: 34 bytes --]


Perhaps it can be useful.

Maxim

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* bug#38110: [PATCH 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9.
  2020-12-10 21:55             ` Maxim Cournoyer
@ 2021-02-05 14:58               ` Maxim Cournoyer
  0 siblings, 0 replies; 24+ messages in thread
From: Maxim Cournoyer @ 2021-02-05 14:58 UTC (permalink / raw)
  To: Marius Bakke; +Cc: Danny Milosavljevic, 38110-done

Hello,

Maxim Cournoyer <maxim.cournoyer@gmail.com> writes:

> Hello Marius,
>
> Marius Bakke <mbakke@fastmail.com> writes:
>
>> Danny Milosavljevic <dannym@scratchpost.org> writes:
>>
>>> Hi Marius,
>>>
>>> On Mon, 23 Mar 2020 23:16:07 +0100
>>> Marius Bakke <mbakke@fastmail.com> wrote:
>>>
>>>> > Building rust, I get a texinfo build failure:
>>>
>>>> How are you building Rust?  I've only used the Guix package definition
>>>> and did not get as far as actually running the test suite.  Do you have
>>>> an updated build script?
>>>
>>> It's failing in texinfo, not in rust.
>>
>> Oh right, sorry for the confusion.
>>
>>> Also, on my laptop, it's not failing in texinfo.  So I guess it has
>>> something to do with bayfront or the machines it offloads to.
>>
>> I haven't seen this in the countless times I've built core-updates over
>> the last few months, nor on Berlin.  I suspect it has to do with
>> parallelism; can you see if #:parallel-tests? #f makes a difference?
>>
>> You should be able to grab a Texinfo substitute from ci.guix.gnu.org
>> though.
>
> I don't recall how close or how far it was from actually building, but
> attached is a modified version of Danny's patch I was working on, that
> applies to current core-updates:
>
>
>
> Perhaps it can be useful.
>
> Maxim

I ended up pushing a heavily modified version of the original patch from
Danny, as commit df93fc21a4 on core-updates.

Closing.

Thank you!

Maxim




^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2021-02-05 15:01 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-07 22:27 [bug#38110] [PATCH 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
2019-11-07 22:29 ` [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
2019-11-07 22:30   ` [bug#38110] [PATCH 2/2] gnu: rust: Bootstrap rust@1.29.0 from mrustc Danny Milosavljevic
2019-11-07 23:18     ` Danny Milosavljevic
2019-11-07 23:17   ` [bug#38110] [PATCH 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
2019-11-08  2:46   ` [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
2019-11-08  2:46     ` [bug#38110] [PATCH v2 1/2] gnu: mrustc: Update to 0.9 Danny Milosavljevic
2019-11-08 22:47       ` Ludovic Courtès
2019-11-08  2:46     ` [bug#38110] [PATCH v2 2/2] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
2019-11-08 22:50       ` Ludovic Courtès
2020-03-15 14:20       ` Marius Bakke
2020-03-15 19:23         ` Danny Milosavljevic
2020-01-19 22:19     ` [bug#38110] [PATCH v2 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Danny Milosavljevic
2020-01-21  0:15       ` Danny Milosavljevic
2020-03-15 19:23 ` [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Danny Milosavljevic
2020-03-19 23:58   ` Jakub Kądziołka
2020-03-20 16:11   ` Marius Bakke
2020-03-23 21:24     ` Danny Milosavljevic
2020-03-23 22:16       ` Marius Bakke
2020-03-24 11:57         ` Danny Milosavljevic
2020-03-24 14:45           ` Marius Bakke
2020-12-10 21:55             ` Maxim Cournoyer
2021-02-05 14:58               ` bug#38110: [PATCH 0/2] Bootstrap rust@1.29.0 directly from mrustc@0.9 Maxim Cournoyer
2020-03-20 16:18   ` [bug#38110] [PATCH core-updates v3] gnu: rust: Bootstrap rust@1.29.0 by mrustc@0.9 Marius Bakke

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).