gnu: rust: Introduce rust-next package and various

  • Open
  • quality assurance status badge
Details
3 participants
  • brennan
  • Felix Lechner
  • Simon Tournier
Owner
unassigned
Submitted by
brennan
Severity
normal
B
B
brennan wrote on 30 Sep 2023 23:28
(no subject)
E1qmhVX-00063M-8q@lists.gnu.org
From 82b31da5a5ea7f65c0d62cd01c761f4ccbfb1ff8 Mon Sep 17 00:00:00 2001
Message-ID: <82b31da5a5ea7f65c0d62cd01c761f4ccbfb1ff8.1696109284.git.brennan@umanwizard.com>
From: Brennan Vincent <brennan@umanwizard.com>
Date: Sat, 30 Sep 2023 17:01:59 -0400
Subject: [PATCH] * gnu: rust: Introduce rust-next package and various
intermediates.
To: guix-patches@gnu.org
X-Fes-Encrypted: true
X-Fes-Ehlo-Domain: localhost

This change introduces intermediate bootstrapping packages rust-1.69, rust-1.70,
rust-1.71, and rust-1.72. It also refactors the code that raises the intermediate
bootstrapping rust-1.67 package into the public "rust" package into a reusable
function so that we can make more such packages. It then uses that function to
create five more packages: rust-next-1.68 through rust-next-1.71, and
rust-next (which is version 1.72.1).

The only one of these that this change exposes publicly is rust-next (i.e.,
rust 1.72.1). This will allow developers who require recent Rust versions to use
Guix to manage their development environment.
---
.../patches/cargo-failed-install-test.patch | 16 +
.../patches/cargo-registry-auth.patch | 12 +
gnu/packages/rust.scm | 538 ++++++++++++------
3 files changed, 386 insertions(+), 180 deletions(-)
create mode 100644 gnu/packages/patches/cargo-failed-install-test.patch
create mode 100644 gnu/packages/patches/cargo-registry-auth.patch

Toggle diff (370 lines)
diff --git a/gnu/packages/patches/cargo-failed-install-test.patch b/gnu/packages/patches/cargo-failed-install-test.patch
new file mode 100644
index 0000000000..d687346243
--- /dev/null
+++ b/gnu/packages/patches/cargo-failed-install-test.patch
@@ -0,0 +1,16 @@
+diff --git a/tests/testsuite/install.rs b/tests/testsuite/install.rs
+index 0c7fc5037..8cd6222a0 100644
+--- a/src/tools/cargo/tests/testsuite/install.rs
++++ b/src/tools/cargo/tests/testsuite/install.rs
+@@ -2276,7 +2276,9 @@ fn failed_install_retains_temp_directory() {
+
+ // Find the path in the output.
+ let start = stderr.find("found at `").unwrap() + 10;
+- let end = stderr[start..].find('.').unwrap() - 1;
+- let path = Path::new(&stderr[start..(end + start)]);
++ let end = stderr[start..].trim_end_matches(r"`.
++To reuse those artifacts with a future compilation, set the environment variable `CARGO_TARGET_DIR` to that path.
++");
++ let path = Path::new(end);
+ assert!(path.exists());
+ assert!(path.join("release/deps").exists());
diff --git a/gnu/packages/patches/cargo-registry-auth.patch b/gnu/packages/patches/cargo-registry-auth.patch
new file mode 100644
index 0000000000..914db3a21d
--- /dev/null
+++ b/gnu/packages/patches/cargo-registry-auth.patch
@@ -0,0 +1,12 @@
+diff --git a/tests/testsuite/registry_auth.rs b/tests/testsuite/registry_auth.rs
+index 97cdf6748..36d579823 100644
+--- a/src/tools/cargo/tests/testsuite/registry_auth.rs
++++ b/src/tools/cargo/tests/testsuite/registry_auth.rs
+@@ -585,6 +585,6 @@ note: Waiting [..]
+ // 5. /api/v1/crates/new
+ // 6. config.json for the "wait for publish"
+ // 7. /index/3/f/foo for the "wait for publish"
+- assert_eq!(authorizations.len(), 7);
++ assert!(authorizations.len() >= 7);
+ assert!(!log.contains("a-unique_token"));
+ }
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index 38db41549a..11af172a42 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -16,6 +16,7 @@
;;; Copyright © 2022 Zheng Junjie <873216071@qq.com>
;;; Copyright © 2022 Jim Newsome <jnewsome@torproject.org>
;;; Copyright © 2022 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2023 Brennan Vincent <brennan@umanwizard.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -703,194 +704,371 @@ (define rust-1.67
(replace "llvm" llvm-15))))))
(define rust-1.68
- (rust-bootstrapped-package
- rust-1.67 "1.68.2" "15ifyd5jj8rd979dkakp887hgmhndr68pqaqvd2hqkfdywirqcwk"))
+ (let ((base-rust (rust-bootstrapped-package
+ rust-1.67 "1.68.2" "15ifyd5jj8rd979dkakp887hgmhndr68pqaqvd2hqkfdywirqcwk")))
+ (package
+ (inherit base-rust)
+ (arguments
+ (substitute-keyword-arguments (package-arguments base-rust)
+ ((#:validate-runpath? _) #f))))))
-;;; Note: Only the latest version of Rust is supported and tested. The
-;;; intermediate rusts are built for bootstrapping purposes and should not
-;;; be relied upon. This is to ease maintenance and reduce the time
-;;; required to build the full Rust bootstrap chain.
-;;;
-;;; Here we take the latest included Rust, make it public, and re-enable tests
-;;; and extra components such as rustfmt.
-(define-public rust
- (let ((base-rust rust-1.68))
+(define rust-1.69
+ (let ((base-rust (rust-bootstrapped-package
+ rust-1.68 "1.69.0" "03zn7kx5bi5mdfsqfccj4h8gd6abm7spj0kjsfxwlv5dcwc9f1gv")))
+ (package
+ (inherit base-rust)
+ (source
+ (origin
+ (inherit (package-source base-rust))
+ (snippet
+ '(begin
+ (for-each delete-file-recursively
+ '("src/llvm-project"
+ "vendor/tikv-jemalloc-sys/jemalloc"))
+ ;; find . -not -type d -executable -exec file {} \+ | grep ELF
+ ;; returns nothing.
+
+ ;; Also remove the bundled (mostly Windows) libraries.
+ (for-each delete-file
+ (find-files "vendor" ".*\\.(a|dll|exe|lib)$")))))))))
+
+(define (assemble-rustix-outline-asm-phase . dirs)
+ `(lambda _
+ (let* ((system (or ,(%current-target-system)
+ ,(%current-system)))
+ (arch
+ (match system
+ ("x86_64-linux" "x86_64")
+ ("i686-linux" "x86")
+ ("armhf-linux" "arm")
+ ("aarch64-linux" "aarch64")
+ ("mips64el-linux" "mips64")
+ ("riscv64-linux" "riscv64")
+ (_ (let ((dash (string-index system #\-)))
+ (substring system 0 dash))))))
+ (for-each
+ (lambda (dir)
+ (with-directory-excursion dir
+ (invoke "gcc" "-c" (format #f "~a.s" arch))
+ (invoke "ar" "r"
+ (format #f "debug/librustix_outline_~a.a" arch)
+ (format #f "~a.o" arch))
+ (invoke "ar" "r"
+ (format #f "release/librustix_outline_~a.a" arch)
+ (format #f "~a.o" arch))))
+ ',dirs))))
+
+(define rust-1.70
+ (let ((base-rust (rust-bootstrapped-package
+ rust-1.69 "1.70.0" "0z6j7d0ni0rmfznv0w3mrf882m11kyh51g2bxkj40l3s1c0axgxj")))
(package
(inherit base-rust)
- (outputs (cons "rustfmt" (package-outputs base-rust)))
(arguments
(substitute-keyword-arguments (package-arguments base-rust)
- ((#:tests? _ #f)
- (not (%current-target-system)))
((#:phases phases)
`(modify-phases ,phases
- (add-after 'unpack 'relax-gdb-auto-load-safe-path
- ;; Allow GDB to load binaries from any location, otherwise the
- ;; gdbinfo tests fail. This is only useful when testing with a
- ;; GDB version newer than 8.2.
- (lambda _
- (setenv "HOME" (getcwd))
- (with-output-to-file (string-append (getenv "HOME") "/.gdbinit")
- (lambda _
- (format #t "set auto-load safe-path /~%")))
- ;; Do not launch gdb with '-nx' which causes it to not execute
- ;; any init file.
- (substitute* "src/tools/compiletest/src/runtest.rs"
- (("\"-nx\".as_ref\\(\\), ")
- ""))))
- (add-after 'unpack 'patch-cargo-env-shebang
- (lambda _
- (substitute* '("src/tools/cargo/tests/testsuite/build.rs"
- "src/tools/cargo/tests/testsuite/fix.rs")
- ;; The cargo *_wrapper tests set 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")
- (which "env")))))
- (add-after 'unpack 'disable-tests-requiring-git
- (lambda _
- (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"))))
- (add-after 'unpack 'disable-tests-requiring-mercurial
- (lambda _
- (substitute*
- "src/tools/cargo/tests/testsuite/init/simple_hg_ignore_exists/mod.rs"
- (("fn simple_hg_ignore_exists")
- "#[ignore]\nfn simple_hg_ignore_exists"))
- (substitute*
- "src/tools/cargo/tests/testsuite/init/mercurial_autodetect/mod.rs"
- (("fn mercurial_autodetect")
- "#[ignore]\nfn mercurial_autodetect"))))
- (add-after 'unpack 'disable-tests-broken-on-aarch64
- (lambda _
- (with-directory-excursion "src/tools/cargo/tests/testsuite/"
- (substitute* "build_script_extra_link_arg.rs"
- (("^fn build_script_extra_link_arg_bin_single" m)
- (string-append "#[ignore]\n" m)))
- (substitute* "build_script.rs"
- (("^fn env_test" m)
- (string-append "#[ignore]\n" m)))
- (substitute* "collisions.rs"
- (("^fn collision_doc_profile_split" m)
- (string-append "#[ignore]\n" m)))
- (substitute* "concurrent.rs"
- (("^fn no_deadlock_with_git_dependencies" m)
- (string-append "#[ignore]\n" m)))
- (substitute* "features2.rs"
- (("^fn dep_with_optional_host_deps_activated" m)
- (string-append "#[ignore]\n" m))))))
- (add-after 'unpack 'patch-command-exec-tests
- ;; This test suite includes some tests that the stdlib's
- ;; `Command` execution properly handles in situations where
- ;; the environment or PATH variable are empty, but this fails
- ;; since we don't have `echo` available at its usual FHS
- ;; location.
- (lambda _
- (substitute* (match (find-files "." "^command-exec.rs$")
- ((file) file))
- (("Command::new\\(\"echo\"\\)")
- (format #f "Command::new(~s)" (which "echo"))))))
- (add-after 'unpack 'patch-command-uid-gid-test
- (lambda _
- (substitute* (match (find-files "." "^command-uid-gid.rs$")
- ((file) file))
- (("/bin/sh")
- (which "sh")))))
- (add-after 'unpack 'skip-shebang-tests
- ;; This test 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.
- (lambda _
- (delete-file "tests/ui/parser/shebang/sneaky-attrib.rs")))
- (add-after 'unpack 'patch-process-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\"")))
- ;; The three tests which are known to fail upstream on QEMU
- ;; emulation on aarch64 and riscv64 also fail on x86_64 in Guix's
- ;; build system. Skip them on all builds.
- (substitute* "library/std/src/sys/unix/process/process_common/tests.rs"
- (("target_arch = \"arm\",") "target_os = \"linux\",")))))
- (add-after 'unpack 'disable-interrupt-tests
+ ;; Rustix ships with some bundled assembly-language
+ ;; libraries. We strip the pre-assembled versions from
+ ;; the sources, so regenerate them here.
+ (add-after 'configure 'assemble-rustix-outline-asm
+ ,(assemble-rustix-outline-asm-phase
+ "vendor/rustix-0.36.5/src/backend/linux_raw/arch/outline/"
+ "vendor/rustix/src/backend/linux_raw/arch/outline/")))))))))
+
+(define rust-1.71
+ (let ((base-rust (rust-bootstrapped-package
+ rust-1.70 "1.71.0" "15jc0d13cmrh2xvpkyyvsbwgn3w4klqiwf2wlgzfp22mvjmy8rx6")))
+ (package
+ (inherit base-rust)
+ (arguments
+ (substitute-keyword-arguments (package-arguments base-rust)
+ ((#:phases phases)
+ `(modify-phases ,phases
+ (replace 'patch-cargo-checksums
(lambda _
- ;; This test hangs in the build container; disable it.
- (substitute* (match (find-files "." "^freshness.rs$")
- ((file) file))
- (("fn linking_interrupted")
- "#[ignore]\nfn linking_interrupted"))
- ;; Likewise for the ctrl_c_kills_everyone test.
- (substitute* (match (find-files "." "^death.rs$")
- ((file) file))
- (("fn ctrl_c_kills_everyone")
- "#[ignore]\nfn ctrl_c_kills_everyone"))))
- (add-after 'unpack 'adjust-rpath-values
- ;; This adds %output:out to rpath, allowing us to install utilities in
- ;; different outputs while reusing the shared libraries.
- (lambda* (#:key outputs #:allow-other-keys)
- (let ((out (assoc-ref outputs "out")))
- (substitute* "src/bootstrap/builder.rs"
- ((" = rpath.*" all)
- (string-append all
- " "
- "rustflags.arg(\"-Clink-args=-Wl,-rpath="
- out "/lib\");\n"))))))
- (add-after 'configure 'add-gdb-to-config
- (lambda* (#:key inputs #:allow-other-keys)
- (let ((gdb (assoc-ref inputs "gdb")))
- (substitute* "config.toml"
- (("^python =.*" all)
- (string-append all
- "gdb = \"" gdb "/bin/gdb\"\n"))))))
- (replace 'build
- ;; Phase overridden to also build rustfmt.
- (lambda* (#:key parallel-build? #:allow-other-keys)
- (let ((job-spec (string-append
- "-j" (if parallel-build?
- (number->string (parallel-job-count))
- "1"))))
- (invoke "./x.py" job-spec "build"
- "library/std" ;rustc
- "src/tools/cargo"
- "src/tools/rustfmt"))))
- (replace 'check
- ;; Phase overridden to also test rustfmt.
- (lambda* (#:key tests? parallel-build? #:allow-other-keys)
- (when tests?
- (let ((job-spec (string-append
- "-j" (if parallel-build?
- (number->string (parallel-job-count))
- "1"))))
- (invoke "./x.py" job-spec "test" "-vv"
- "library/std"
- "src/tools/cargo"
- "src/tools/rustfmt")))))
- (replace 'install
- ;; Phase overridden to also install rustfmt.
- (lambda* (#:key outputs #:allow-other-keys)
- (invoke "./x.py" "install")
- (substitute* "config.toml"
- ;; Adjust the prefix to the 'cargo' output.
- (("prefix = \"[^\"]*\"")
- (format #f "prefix = ~s" (assoc-ref outputs "cargo"))))
- (invoke "./x.py" "install" "cargo")
- (substitute* "config.toml"
- ;; Adjust the prefix to the 'rustfmt' output.
- (("prefix = \"[^\"]*\"")
- (format #f "prefix = ~s" (assoc-ref outputs "rustfmt"))))
- (invoke "./x.py" "install" "rustfmt")))))))
- ;; Add test inputs.
- (native-inputs (cons* `("gdb" ,gdb/pinned)
- `("procps" ,procps)
- (package-native-inputs base-rust))))))
+ (substitute* '("Cargo.lock"
+ "src/bootstrap/Cargo.lock"
+ "src/tools/rust-analyzer/Cargo.lock"
+ "src/tools/cargo/Cargo.lock")
+ (("(checksum = )\".*\"" all name)
+ (string-append name "\"" ,%cargo-reference-hash "\"")))
+ (generate-all-checksums "vendor")))
+ (replace 'assemble-rustix-outline-asm
+ ,(assemble-rustix-outline-asm-phase
+ "vendor/rustix-0.37.6/src/backend/linux_raw/arch/outline/"
+ "vendor/rustix-0.37.7/src/backend/linux_raw/arch/outline/"
+ "vendor/rustix/src/backend/linux_raw/arch/outline/")))))))))
+
+(define rust-1.72
+ (let ((base-rust (rust-bootstrapped-package
+ rust-1.71 "1.72.1" "15gqd1jzhnc16a7gjmav4x1v83jjbzyjh1gvcdfvpkajd9gq8j3z")))
+ (package
+ (inherit base-rust)
+ (arguments
+ (substitute-keyword-arguments
+ (package-arguments base-rust)
+ ((#:phases phases)
+ `(modify-phases
+ ,phases
+ (replace 'assemble-rustix-outline-asm
+ ,(assemble-rustix-outline-asm-phase
+ "vendor/rustix-0.37.6/src/backend/linux_raw/arch/outline/"
+ "vendor/rustix-0.37.11/src/backend/linux_raw/arch/outline/"
+ "vendor/rustix-0.37.20/src/backend/linux_raw/arch/outline/")))))))))
+
+(define public-rust-1.67-phase-mods
+ '((add-after 'unpack 'relax-gdb-auto-load-safe-path
+ ;; Allow GDB to load binaries from any location, otherwise the
+ ;; gdbinfo tests fail. This is only useful when testing with a
+ ;; GDB version newer than 8.2.
+ (lambda _
+ (setenv "HOME" (getcwd))
+ (with-output-to-file (string-append (getenv "HOME") "/.gdbinit")
+ (lambda _
+ (format #t "set auto-load safe-path /~%")))
+ ;; Do not launch gdb with '-nx' which causes it to not execute
+ ;; any init file.
+ (substitute* "src/tools/compiletest/src/runtest.rs"
+ (("\"-nx\".as_ref\\(\\), ")
+ ""))))
+ (add-after 'unpack 'patch-cargo-env-shebang
+ (lambda _
+ (substitute* '("src/tools/cargo/tests/testsuite/build.rs"
+ "src/tools/cargo/tests/testsuite/fix.rs")
+ ;; The cargo *_wrapper tests set RUSTC.*WRAPPER environment
+ ;; variable which points to /usr/bin/env. Since it's not a
+ ;; shebang, it needs to b
This message was truncated. Download the full message here.
F
F
Felix Lechner wrote on 29 Nov 2023 18:43
(address . control@debbugs.gnu.org)(address . brennan@umanwizard.com)
87edg8lal5.fsf@lease-up.com
reassign 66284 guix-patches
thanks
S
S
Simon Tournier wrote on 10 Sep 16:12 +0200
control message for bug #66284
(address . control@debbugs.gnu.org)
875xr3egxv.fsf@gmail.com
retitle 66284 gnu: rust: Introduce rust-next package and various
quit
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send an email to 66284@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 66284
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch