From 4e8eab6fe433ada4717250b4a682c4a8c79ced3e Mon Sep 17 00:00:00 2001 From: Hilton Chain Date: Tue, 22 Apr 2025 20:21:30 +0800 Subject: [PATCH] build/cargo: Accept rust-sysroot from native-inputs. This is a workaround to support Rust cross-compilation in build systems other than cargo-build-system. Since there's no interface for target-inputs, using native-inputs makes most sense. * guix/build-system/cargo.scm (lower)[bag]: Label rust-sysroot with its package name. * guix/build/cargo-build-system.scm (configure): Use it. When cross-compiling, accept rust-sysroot from native-inputs if there's none in inputs. Change-Id: I5cb63c8c815d3a2c9f0ece01857254f6d0090dd1 --- guix/build-system/cargo.scm | 3 ++- guix/build/cargo-build-system.scm | 15 +++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/guix/build-system/cargo.scm b/guix/build-system/cargo.scm index 045809874c1..d2d9a075b99 100644 --- a/guix/build-system/cargo.scm +++ b/guix/build-system/cargo.scm @@ -430,7 +430,8 @@ any dependent crates. This can be a benefits: ;; This provides a separate sysroot for the regular rustc ,@(if target - `(("rust-sysroot" ,(rust-sysroot target))) + `((,(string-append "rust-sysroot-for-" target) + ,(rust-sysroot target))) '()))) (outputs outputs) (build (if target cargo-cross-build cargo-build)) diff --git a/guix/build/cargo-build-system.scm b/guix/build/cargo-build-system.scm index 8273ac4ed0f..2c321ec2125 100644 --- a/guix/build/cargo-build-system.scm +++ b/guix/build/cargo-build-system.scm @@ -157,7 +157,7 @@ libraries or executables." (format #t "error: Possible pre-generated file found: ~a~%" file))) (find-files "." (negate empty-file?))))) -(define* (configure #:key source inputs +(define* (configure #:key source inputs native-inputs target system (cargo-target #f) (vendor-dir "guix-vendor") @@ -194,9 +194,16 @@ libraries or executables." ;; For cross-building (when target (setenv "CARGO_BUILD_TARGET" cargo-target) - (setenv "RUSTFLAGS" (string-append - (or (getenv "RUSTFLAGS") "") - " --sysroot " (assoc-ref inputs "rust-sysroot"))) + (setenv "RUSTFLAGS" + (string-append + (or (getenv "RUSTFLAGS") "") + " --sysroot " + (assoc-ref + (append inputs + ;; Workaround for other build systems, as no interface + ;; is available for target-inputs. + (or native-inputs '())) + (string-append "rust-sysroot-for-" target)))) (setenv "PKG_CONFIG" (string-append target "-pkg-config"))