gnu: emacs-svg-icon: Fix grammar.
[jackhill/guix/guix.git] / gnu / packages / rust.scm
index 5e5748f..3952a17 100644 (file)
@@ -1,13 +1,16 @@
 ;;; 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 © 2016 Nikita <nikita@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 © 2017, 2019, 2020 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>
+;;; Copyright © 2020, 2021 Jakub Kądziołka <kuba@kadziolka.net>
+;;; Copyright © 2020 Pierre Langlois <pierre.langlois@gmx.com>
+;;; Copyright © 2020 Matthew Kraai <kraai@ftbfs.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
-                      (url "https://github.com/thepowersgang/mrustc.git")
+                      (url "https://github.com/thepowersgang/mrustc")
                       (commit (string-append "v" version))))
                 (file-name (git-file-name name version))
                 (sha256
@@ -226,7 +229,7 @@ safety and thread safety guarantees.")
         (sha256 (base32 "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm"))
         (modules '((guix build utils)))
         (snippet '(begin (delete-file-recursively "src/llvm") #t))
-        (patches (map search-patch '("rust-1.19-mrustc.patch")))))
+        (patches (search-patches "rust-1.19-mrustc.patch"))))
     (outputs '("out" "cargo"))
     (properties '((timeout . 72000)               ;20 hours
                   (max-silent-time . 18000)))     ;5 hours (for armel)
@@ -420,7 +423,9 @@ test = { path = \"../libtest\" }
      `(("bison" ,bison) ; For the tests
        ("cmake" ,cmake-minimal)
        ("flex" ,flex) ; For the tests
-       ("gdb" ,gdb)   ; For the tests
+       ;; FIXME: Rust 1.27 and some later versions require GDB 8.2 specifically.
+       ;; See <https://bugs.gnu.org/37810>.  Use it on all Rusts for simplicity.
+       ("gdb" ,gdb-8.2) ; For the tests
        ("procps" ,procps) ; For the tests
        ("python-2" ,python-2)
        ("rustc-bootstrap" ,mrustc)
@@ -448,7 +453,10 @@ test = { path = \"../libtest\" }
             (variable "LIBRARY_PATH")
             (files '("lib" "lib64")))))
 
-    (synopsis "Compiler for the Rust progamming language")
+    (supported-systems
+     (delete "i686-linux"               ; fails to build, see #35519
+             %supported-systems))
+    (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://www.rust-lang.org")
@@ -613,7 +621,8 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                      (lambda (file) (delete-manifest-file out file))
                      '("install.log"
                        "manifest-rust-docs"
-                       "manifest-rust-std-x86_64-unknown-linux-gnu"
+                       ,(string-append "manifest-rust-std-"
+                                       (nix-system->gnu-triplet-for-rust))
                        "manifest-rustc"))
                    (for-each
                      (lambda (file) (delete-manifest-file cargo-out file))
@@ -717,8 +726,8 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                       (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")))))
+          (patches (search-patches
+                     "rust-1.25-accept-more-detailed-gdb-lines.patch"))))
       (arguments
        (substitute-keyword-arguments (package-arguments base-rust)
          ((#:phases phases)
@@ -752,9 +761,12 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
       (source
         (origin
           (inherit (package-source base-rust))
-          (patches (map search-patch
-                        '("rust-coresimd-doctest.patch"
-                          "rust-1.25-accept-more-detailed-gdb-lines.patch")))))
+          (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)
@@ -810,7 +822,10 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                  (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)))))))))
+                 #t))))))
+      (supported-systems
+       (delete "aarch64-linux"          ; fails to build, see #47019
+               (package-supported-systems base-rust))))))
 
 (define-public rust-1.27
   (let ((base-rust
@@ -821,15 +836,10 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
       (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)))
+          (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)
@@ -857,10 +867,10 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
       (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")))))
+          (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)
@@ -881,6 +891,8 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                  (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))))))))
 
@@ -893,8 +905,8 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
       (source
         (origin
           (inherit (package-source base-rust))
-          (patches (map search-patch '("rust-1.25-accept-more-detailed-gdb-lines.patch"
-                                       "rust-reproducible-builds.patch"))))))))
+          (patches (search-patches "rust-1.25-accept-more-detailed-gdb-lines.patch"
+                                   "rust-reproducible-builds.patch")))))))
 
 (define-public rust-1.30
   (let ((base-rust
@@ -1008,7 +1020,7 @@ move around."
                            (delete-file-recursively "src/tools/lldb")
                            (delete-file-recursively "vendor/jemalloc-sys/jemalloc")
                            #t))
-          (patches (map search-patch '("rust-reproducible-builds.patch")))
+          (patches (search-patches "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"))))
@@ -1149,6 +1161,9 @@ move around."
            "101dlpsfkq67p0hbwx4acqq6n90dj4bbprndizpgh1kigk566hk4")))
     (package
       (inherit base-rust)
+      (inputs
+        (alist-replace "llvm" (list llvm-9)
+                       (package-inputs base-rust)))
       (arguments
        (substitute-keyword-arguments (package-arguments base-rust)
          ((#:phases phases)
@@ -1183,4 +1198,271 @@ move around."
                  (generate-all-checksums "vendor")
                  #t)))))))))
 
-(define-public rust rust-1.37)
+(define-public rust-1.40
+  (let ((base-rust
+         (rust-bootstrapped-package rust-1.39 "1.40.0"
+           "1ba9llwhqm49w7sz3z0gqscj039m53ky9wxzhaj11z6yg1ah15yx")))
+    (package
+      (inherit base-rust)
+      (source
+        (origin
+          (inherit (package-source base-rust))
+          ;; llvm-emscripten is no longer bundled, as that codegen backend
+          ;; got removed.
+          (snippet '(begin
+                      (delete-file-recursively "src/llvm-project")
+                      (delete-file-recursively "vendor/jemalloc-sys/jemalloc")
+                      #t))))
+      (arguments
+       ;; Rust 1.40 does not ship rustc-internal libraries by default
+       ;; (see rustc-dev-split). This means that librustc_driver.so is no
+       ;; longer available in lib/rustlib/$target/lib, which is the directory
+       ;; included in the runpath of librustc_codegen_llvm-llvm.so.
+       ;; This is detected by our validate-runpath phase as an error, but it
+       ;; is harmless as the codegen backend is loaded by librustc_driver.so
+       ;; itself, which must at that point have been already loaded.
+       ;; As such, we skip validating the runpath for Rust 1.40.
+       ;; Rust 1.41 stopped putting the codegen backend in a separate library,
+       ;; which makes this workaround only necessary for this release.
+       (cons* #:validate-runpath? #f
+         (substitute-keyword-arguments (package-arguments base-rust)
+           ((#:phases phases)
+            `(modify-phases ,phases
+               ;; We often need to patch tests with various Guix-specific paths.
+               ;; This often increases the line length and makes tidy, rustc's
+               ;; style checker, complain. We could insert additional newlines
+               ;; or add an "// ignore-tidy-linelength" comment, but as an
+               ;; ignore comment must be used, both approaches are fragile due
+               ;; to upstream formatting changes. As such, disable running the
+               ;; linter during tests, since it's intended for rustc developers
+               ;; anyway.
+               ;;
+               ;; TODO(rebuild-rust): This phase could be added earlier to
+               ;; simplify a significant amount of code, but it would require
+               ;; rebuilding the entire rusty universe.
+               (add-after 'patch-tests 'neuter-tidy
+                 (lambda _
+                   (substitute* "src/bootstrap/builder.rs"
+                     (("^.*::Tidy,") ""))
+                   #t))
+               ;; TODO(rebuild-rust): Adapt the find-files approach for
+               ;; earlier testsuite patches.
+               (replace 'patch-command-uid-gid-test
+                 (lambda _
+                   (match (find-files "src/test" "command-uid-gid\\.rs")
+                     ((file)
+                      (substitute* file
+                        (("/bin/sh") (which "sh")))))
+                   #t))
+               (replace 'patch-command-exec-tests
+                 ,(patch-command-exec-tests-phase
+                    '(match (find-files "src/test" "command-exec\\.rs")
+                       ((file) file))))
+               ;; The test got removed in commit 000fe63b6fc57b09828930cacbab20c2ee6e6d15
+               ;; "Remove painful test that is not pulling its weight"
+               (delete 'remove-unsupported-tests)))))))))
+
+(define-public rust-1.41
+  (let ((base-rust
+         (rust-bootstrapped-package rust-1.40 "1.41.1"
+           "0ws5x0fxv57fyllsa6025h3q6j9v3m8nb3syl4x0hgkddq0kvj9q")))
+    (package
+      (inherit base-rust)
+      (arguments
+       (substitute-keyword-arguments (package-arguments base-rust)
+         ((#:validate-runpath? _) #t))))))
+
+(define-public rust-1.42
+  (rust-bootstrapped-package rust-1.41 "1.42.0"
+    "0x9lxs82may6c0iln0b908cxyn1cv7h03n5cmbx3j1bas4qzks6j"))
+
+(define-public rust-1.43
+  (rust-bootstrapped-package rust-1.42 "1.43.0"
+    "18akhk0wz1my6y9vhardriy2ysc482z0fnjdcgs9gy59kmnarxkm"))
+
+(define-public rust-1.44
+  (rust-bootstrapped-package rust-1.43 "1.44.1"
+    "0ww4z2v3gxgn3zddqzwqya1gln04p91ykbrflnpdbmcd575n8bky"))
+
+(define-public rust-1.45
+  (let ((base-rust
+         (rust-bootstrapped-package rust-1.44 "1.45.2"
+           "0273a1g3f59plyi1n0azf21qjzwml1yqdnj5z472crz37qggr8xp")))
+    (package
+      (inherit base-rust)
+      (source
+        (origin
+          (inherit (package-source base-rust))
+          (patches (search-patches "rust-1.45-linker-locale.patch"))))
+      (inputs
+        (alist-replace "llvm" (list llvm-10)
+                       (package-inputs base-rust)))
+      (arguments
+        (substitute-keyword-arguments (package-arguments base-rust)
+          ((#:phases phases)
+           `(modify-phases ,phases
+              ;; These tests make sure that the parser behaves properly when
+              ;; a source file starts with a shebang. Unfortunately,
+              ;; the patch-shebangs phase changes the meaning of these edge-cases.
+              ;; We skip the test since it's drastically unlikely Guix's packaging
+              ;; will introduce a bug here.
+              (add-after 'patch-tests 'skip-shebang-tests
+                (lambda _
+                  (with-directory-excursion "src/test/ui/parser/shebang"
+                    (delete-file "shebang-doc-comment.rs")
+                    (delete-file "sneaky-attrib.rs")
+                    #t)))
+              ;; This test case synchronizes itself by starting a localhost TCP
+              ;; server. This doesn't work as networking is not available.
+              (add-after 'patch-tests 'skip-networking-test
+                (lambda _
+                  (substitute* "src/tools/cargo/tests/testsuite/freshness.rs"
+                    (("fn linking_interrupted" all)
+                     (string-append "#[ignore] " all)))
+                 #t)))))))))
+
+(define-public rust-1.46
+  (let ((base-rust
+         (rust-bootstrapped-package rust-1.45 "1.46.0"
+           "0a17jby2pd050s24cy4dfc0gzvgcl585v3vvyfilniyvjrqknsid")))
+    (package
+      (inherit base-rust)
+      (outputs (cons "rustfmt" (package-outputs base-rust)))
+      (arguments
+       (substitute-keyword-arguments (package-arguments base-rust)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             (replace 'build
+               (lambda* _
+                 (invoke "./x.py" "build")
+                 (invoke "./x.py" "build" "src/tools/cargo")
+                 (invoke "./x.py" "build" "src/tools/rustfmt")))
+             (replace 'check
+               (lambda* _
+                 ;; Test rustfmt.
+                 (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")
+                   (invoke "./x.py" parallel-job-spec "test"
+                           "src/tools/rustfmt"))))
+             (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")
+                 (substitute* "config.toml"
+                   ;; replace prefix to specific output
+                   (("prefix = \"[^\"]*\"")
+                    (string-append "prefix = \"" (assoc-ref outputs "rustfmt") "\"")))
+                 (invoke "./x.py" "install" "rustfmt")))
+             (replace '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"))
+                       (rustfmt-out (assoc-ref outputs "rustfmt")))
+                   (for-each
+                     (lambda (file) (delete-manifest-file out file))
+                     '("install.log"
+                       "manifest-rust-docs"
+                       ,(string-append "manifest-rust-std-"
+                                       (nix-system->gnu-triplet-for-rust))
+                       "manifest-rustc"))
+                   (for-each
+                     (lambda (file) (delete-manifest-file cargo-out file))
+                     '("install.log"
+                       "manifest-cargo"))
+                   (for-each
+                     (lambda (file) (delete-manifest-file rustfmt-out file))
+                     '("install.log"
+                       "manifest-rustfmt-preview"))
+                   #t))))))))))
+
+(define-public rust-1.47
+  (let ((base-rust
+         (rust-bootstrapped-package rust-1.46 "1.47.0"
+          "07fqd2vp7cf1ka3hr207dnnz93ymxml4935vp74g4is79h3dz19i")))
+    (package
+      (inherit base-rust)
+      (inputs
+        (alist-replace "llvm" (list llvm-11)
+                       (package-inputs base-rust)))
+      (arguments
+       (substitute-keyword-arguments (package-arguments base-rust)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             ;; The source code got rearranged: libstd is now in the newly created library folder.
+             (replace 'patch-tests
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (let ((bash (assoc-ref inputs "bash")))
+                   (substitute* "library/std/src/process.rs"
+                     (("\"/bin/sh\"") (string-append "\"" bash "/bin/sh\"")))
+                   ;; <https://lists.gnu.org/archive/html/guix-devel/2017-06/msg00222.html>
+                   (substitute* "library/std/src/sys/unix/process/process_common.rs"
+                     (("fn test_process_mask") "#[allow(unused_attributes)]
+    #[ignore]
+    fn test_process_mask"))
+                   #t)))
+             (delete 'patch-cargo-checksums)
+             (add-after 'patch-generated-file-shebangs 'patch-cargo-checksums
+               ;; Generate checksums after patching generated files (in
+               ;; particular, vendor/jemalloc/rep/Makefile).
+               (lambda* _
+                 (use-modules (guix build cargo-utils))
+                 (substitute* "Cargo.lock"
+                   (("(checksum = )\".*\"" all name)
+                    (string-append name "\"" ,%cargo-reference-hash "\"")))
+                 (generate-all-checksums "vendor")
+                 #t)))))))))
+
+(define-public rust-1.48
+  (let ((base-rust
+         (rust-bootstrapped-package rust-1.47 "1.48.0"
+           "0fz4gbb5hp5qalrl9lcl8yw4kk7ai7wx511jb28nypbxninkwxhf")))
+    (package
+      (inherit base-rust)
+      (source
+        (origin
+          (inherit (package-source base-rust))
+          ;; New patch required due to the second part of the source code rearrangement:
+          ;; the relevant source code is now in the compiler directory.
+          (patches (search-patches "rust-1.48-linker-locale.patch"))))
+      (arguments
+       (substitute-keyword-arguments (package-arguments base-rust)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             ;; Some tests got split out into separate files.
+             (replace 'patch-tests
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (let ((bash (assoc-ref inputs "bash")))
+                   (substitute* "library/std/src/process/tests.rs"
+                     (("\"/bin/sh\"") (string-append "\"" bash "/bin/sh\"")))
+                   (substitute* "library/std/src/sys/unix/process/process_common/tests.rs"
+                     (("fn test_process_mask") "#[allow(unused_attributes)]
+    #[ignore]
+    fn test_process_mask"))
+                   #t))))))))))
+
+(define-public rust-1.49
+  (rust-bootstrapped-package rust-1.48 "1.49.0"
+    "0yf7kll517398dgqsr7m3gldzj0iwsp3ggzxrayckpqzvylfy2mm"))
+
+(define-public rust-1.50
+  (rust-bootstrapped-package rust-1.49 "1.50.0"
+    "0pjs7j62maiyvkmhp9zrxl528g2n0fphp4rq6ap7aqdv0a6qz5wm"))
+
+(define-public rust-1.51
+  (rust-bootstrapped-package rust-1.50 "1.51.0"
+    "0ixqkqglv3isxbvl4ldr4byrkx692wghsz3fasy1pn5kr2prnsvs"))
+
+;; TODO(staging): Bump this variable to the latest packaged rust.
+(define-public rust rust-1.45)