>From 745ed53938b6e19268e0fc2cb07b7bc2131c151e Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic 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 . + +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) -> usize; + ++ /// Obtain the length of a slice pointer ++ #[cfg(rust_compiler="mrustc")] ++ pub fn mrustc_slice_len(pointer: *const [T]) -> usize; ++ + /// Gets a static string slice containing the name of a type. + pub fn type_name() -> &'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(s: &[T]) -> usize { unsafe { Repr { rust: s }.raw.len } }; ++ #[cfg(rust_compiler="mrustc")] ++ const fn len_inner(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::() <= 24); +- #[cfg(target_pointer_width = "64")] +- assert!(mem::size_of::() <= 32); ++ //#[cfg(target_pointer_width = "64")] ++ //assert!(mem::size_of::() <= 24); ++ //#[cfg(target_pointer_width = "64")] ++ //assert!(mem::size_of::() <= 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. ;; - (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 ). - (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 . + (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 . - (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 . -;;; 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. - ;; - (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