Subject: [bug#31955] [PATCH] gnu: rust: support build with glibc-2.27, update to 1.26.2

From: Nikolai Merinov <[email-masked]>
Date: Tue, 19 Jun 2018 02:34:31 +0500

* gnu/packages/rust.scm (rust-source, rust-bootstrapped-package): Allow to
specify list of patches to rust sources. Update all rust new releases to use
`rust-bootstrapped-package' as base package.
(rust-1.19): Split `patch-test' code to several phases to make it easier to
change code in next releases.
(rust-1.23): Disable "run-pass/out-of-stack.rs" test due to rust issue #47863.
(rust-1.24): Instead of rewriting `patch-test' phase fix only required places.
(rust-1.25): Switch to LLVM 6.0 that was supported starting from rust 1.25
release. Enable "run-pass/out-of-stack.rs" back in release that can work with
glibc-2.27. Enable rust codegen tests back.
(rust): new package for 1.26.2 rust release with many changes in paths to old
tests.
* gnu/packages/patches/rust-coresimd-doctest.patch: use "avx" processor
feature for _mm256 operations.
---
 .../patches/rust-coresimd-doctest.patch       |  19 ++
 gnu/packages/rust.scm                         | 168 ++++++++++++------
 2 files changed, 128 insertions(+), 59 deletions(-)
 create mode 100644 gnu/packages/patches/rust-coresimd-doctest.patch

diff --git a/gnu/packages/patches/rust-coresimd-doctest.patch b/gnu/packages/patches/rust-coresimd-doctest.patch
new file mode 100644
index 000000000..a3ea2e94e
--- /dev/null
+++ b/gnu/packages/patches/rust-coresimd-doctest.patch
@@ -0,0 +1,19 @@
+Use correct feature for __m256
+--- rustc-1.26.2-src-orig/src/stdsimd/coresimd/x86/mod.rs	1970-01-01 05:00:00.000000000 +0500
++++ rustc-1.26.2-src/src/stdsimd/coresimd/x86/mod.rs	2018-06-22 00:01:55.142026720 +0500
+@@ -293,13 +293,13 @@
+     /// use std::arch::x86_64::*;
+     ///
+     /// # fn main() {
+-    /// # #[target_feature(enable = "sse")]
++    /// # #[target_feature(enable = "avx")]
+     /// # unsafe fn foo() {
+     /// let eight_zeros = _mm256_setzero_ps();
+     /// let eight_ones = _mm256_set1_ps(1.0);
+     /// let eight_floats = _mm256_set_ps(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
+     /// # }
+-    /// # if is_x86_feature_detected!("sse") { unsafe { foo() } }
++    /// # if is_x86_feature_detected!("avx") { unsafe { foo() } }
+     /// # }
+     /// ```
+     pub struct __m256(f32, f32, f32, f32, f32, f32, f32, f32);
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index 7fcc795b6..fcd79e37b 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -157,14 +157,15 @@ in turn be used to build the final Rust.")
     (license license:asl2.0)))
 
 
-(define (rust-source version hash)
+(define* (rust-source version hash #:key (patches '()))
   (origin
     (method url-fetch)
     (uri (string-append "https://static.rust-lang.org/dist/"
                         "rustc-" version "-src.tar.gz"))
     (sha256 (base32 hash))
     (modules '((guix build utils)))
-    (snippet '(begin (delete-file-recursively "src/llvm") #t))))
+    (snippet '(begin (delete-file-recursively "src/llvm") #t))
+    (patches (map search-patch patches))))
 
 (define-public rust-1.19
   (package
@@ -203,20 +204,29 @@ in turn be used to build the final Rust.")
                 (("fn test_process_mask") "#[allow(unused_attributes)]
     #[ignore]
     fn test_process_mask"))
-               ;; Our ld-wrapper cannot process non-UTF8 bytes in LIBRARY_PATH.
-               ;; <https://lists.gnu.org/archive/html/guix-devel/2017-06/msg00193.html>
-               (delete-file-recursively "src/test/run-make/linker-output-non-utf8")
-               (substitute* "src/librustc_back/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"))
-               ;; 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 "))
                #t)))
+         (add-after 'patch-tests 'patch-aarch64-test
+           (lambda* _
+             (substitute* "src/librustc_back/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 "))
+             #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")
+             #t))
          (add-after 'patch-source-shebangs 'patch-cargo-checksums
            (lambda* _
              (substitute* "src/Cargo.lock"
@@ -279,13 +289,14 @@ safety and thread safety guarantees.")
     ;; Dual licensed.
     (license (list license:asl2.0 license:expat))))
 
-(define (rust-bootstrapped-package base-rust version checksum)
-  "Bootstrap rust VERSION with source checksum CHECKSUM using BASE-RUST."
+(define* (rust-bootstrapped-package base-rust version checksum
+                                    #:key (patches '()))
+  "Bootstrap rust VERSION with source checksum CHECKSUM patched with PATCHES using BASE-RUST."
   (package
     (inherit base-rust)
     (version version)
     (source
-     (rust-source version checksum))
+     (rust-source version checksum #:patches patches))
     (native-inputs
      (alist-replace "cargo-bootstrap" (list base-rust "cargo")
                     (alist-replace "rustc-bootstrap" (list base-rust)
@@ -410,7 +421,12 @@ safety and thread safety guarantees.")
                (substitute* "src/tools/cargo/tests/test.rs"
                  (("fn cargo_test_env") "#[ignore]\nfn cargo_test_env"))
                #t))
-           (add-after 'patch-cargo-tests 'fix-mtime-bug
+           (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"))))
+           (add-after 'ignore-glibc-2.27-incompatible-test 'fix-mtime-bug
              (lambda* _
                (substitute* "src/build_helper/lib.rs"
                  ;; Bug in Rust code.
@@ -452,10 +468,10 @@ localstatedir = \"var/lib\"
 default-linker = \"" gcc "/bin/gcc" "\"
 channel = \"stable\"
 rpath = true
-# There is 2 failed codegen tests:
-# codegen/mainsubprogram.rs and codegen/mainsubprogramstart.rs
-# This tests required patched LLVM
-codegen-tests = false
+" ;; There is 2 failed codegen tests:
+  ;; codegen/mainsubprogram.rs and codegen/mainsubprogramstart.rs
+  ;; This tests required patched LLVM
+"codegen-tests = false
 [target." ,(nix-system->gnu-triplet-for-rust) "]
 llvm-config = \"" llvm "/bin/llvm-config" "\"
 cc = \"" gcc "/bin/gcc" "\"
@@ -513,45 +529,26 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
        (substitute-keyword-arguments (package-arguments base-rust)
          ((#:phases phases)
           `(modify-phases ,phases
-             (replace '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"))
-                   ;; Our ld-wrapper cannot process non-UTF8 bytes in LIBRARY_PATH.
-                   ;; <https://lists.gnu.org/archive/html/guix-devel/2017-06/msg00193.html>
-                   (delete-file-recursively "src/test/run-make/linker-output-non-utf8")
-                   (substitute* "src/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)))
+             (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))
              (delete 'fix-mtime-bug))))))))
 
-(define-public rust
-  (let ((base-rust rust-1.24))
+(define-public rust-1.25
+  (let ((base-rust
+         (rust-bootstrapped-package rust-1.24 "1.25.0"
+                                    "0baxjr99311lvwdq0s38bipbnj72pn6fgbk6lcq7j555xq53mxpf")))
     (package
       (inherit base-rust)
-      (version "1.25.0")
-      (source
-       (rust-source version
-                    "0baxjr99311lvwdq0s38bipbnj72pn6fgbk6lcq7j555xq53mxpf"))
-      (native-inputs
-       (alist-replace "cargo-bootstrap" (list base-rust "cargo")
-                      (alist-replace "rustc-bootstrap" (list base-rust)
-                                     (package-native-inputs base-rust))))
+      (inputs
+       ;; Use LLVM 6.0
+       (alist-replace "llvm" (list llvm)
+                      (package-inputs base-rust)))
       (arguments
        (substitute-keyword-arguments (package-arguments base-rust)
          ((#:phases phases)
@@ -560,4 +557,57 @@ jemalloc = \"" jemalloc "/lib/libjemalloc_pic.a" "\"
                (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")))))))))))
+                   (("fn no_index_update") "#[ignore]\nfn no_index_update"))))
+             (add-after 'configure 'enable-codegen-tests
+               (lambda* _
+                 (substitute* "config.toml"
+                   (("codegen-tests = false") ""))))
+             (delete 'ignore-glibc-2.27-incompatible-test))))))))
+
+(define-public rust
+  (let ((base-rust
+         (rust-bootstrapped-package rust-1.25 "1.26.2"
+                                    "0047ais0fvmqvngqkdsxgrzhb0kljg8wy85b01kbbjc88hqcz7pv"
+                                    #:patches '("rust-coresimd-doctest.patch"))))
+    (package
+      (inherit 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 '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"))
+                 #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)))))))))
-- 
2.17.0