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]<target-inputs>: 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
This commit is contained in:
Hilton Chain 2025-04-22 20:21:30 +08:00
parent 765a369c5e
commit 4e8eab6fe4
No known key found for this signature in database
GPG key ID: ACC66D09CA528292
2 changed files with 13 additions and 5 deletions

View file

@ -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))

View file

@ -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"))