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

From: Nils Gillmann <[email-masked]>
Date: Wed, 4 Jul 2018 09:31:37 +0000

Hi Nikolai, comments inlined below.

Nikolai Merinov transcribed 13K bytes:
> * 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

I think i nthe file below you should mention the source and/or its
intention. commitid and URL if you did not write it youself. Better
even would be a short comment.

> 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

While you are at fixing this section: use "There are..." instead of
"There is...", and "This tests requires a patched LLVM".

> +" ;; 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

Rest looks okay for me, did not test-compile it.