[PATCH] * gnu: rust: Introduce rust-next package and various intermediates.

  • Open
  • quality assurance status badge
Details
One participant
  • Brennan Vincent
Owner
unassigned
Submitted by
Brennan Vincent
Severity
normal
B
B
Brennan Vincent wrote on 2 Jul 2023 21:13
(address . guix-patches@gnu.org)
f072ae9d-7488-d65f-88ad-07ec328f778d@umanwizard.com
This change introduces intermediate bootstrapping packages rust-1.69 and
rust-1.70. 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 three more packages: rust-next-1.68, rust-next-1.69, and
rust-next (which is version 1.70).

The only one of these that this change exposes publicly is rust-next (i.e.,
rust 1.70). This will allow developers who require recent Rust versions to use
Guix to manage their development environment.
---
gnu/packages/rust.scm | 450 ++++++++++++++++++++++++++----------------
1 file changed, 281 insertions(+), 169 deletions(-)

Toggle diff (372 lines)
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index 8e106a9927..9145d4bc10 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -702,183 +702,295 @@ (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 versions of Rust are 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.67))
+(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 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
+ ;; 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
(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 "src/test/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
- (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 '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))))))
+ (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))))
+ '("vendor/rustix-0.36.5/src/backend/linux_raw/arch/outline/"
+ "vendor/rustix/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 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 "src/test/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
+ (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 '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? #:a
This message was truncated. Download the full message here.
B
B
Brennan Vincent wrote on 2 Jul 2023 21:52
(address . guix-patches@gnu.org)
91994f94-9046-dbe7-abd9-80786b4d306b@umanwizard.com
My apologies. git imap-send seems to have mangled the patch somehow. Please use the one attached to this message instead.

On 7/2/23 15:13, Brennan Vincent wrote:
Toggle quote (366 lines)
> This change introduces intermediate bootstrapping packages rust-1.69 and
> rust-1.70. 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 three more packages: rust-next-1.68, rust-next-1.69, and
> rust-next (which is version 1.70).
>
> The only one of these that this change exposes publicly is rust-next (i.e.,
> rust 1.70). This will allow developers who require recent Rust versions to use
> Guix to manage their development environment.
> ---
>  gnu/packages/rust.scm | 450 ++++++++++++++++++++++++++----------------
>  1 file changed, 281 insertions(+), 169 deletions(-)
>
> diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
> index 8e106a9927..9145d4bc10 100644
> --- a/gnu/packages/rust.scm
> +++ b/gnu/packages/rust.scm
> @@ -702,183 +702,295 @@ (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 versions of Rust are 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.67))
> +(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 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
> +             ;; 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
>                 (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 "src/test/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
> -               (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 '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))))))
> +                 (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))))
> +                    '("vendor/rustix-0.36.5/src/backend/linux_raw/arch/outline/"
> +                      "vendor/rustix/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 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 "src/test/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
> +      (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 'configure 'add-gdb-to-
This message was truncated. Download the full message here.
Attachment: patch.eml
?