Hello! I've updated the branch wip-cross-built-rust; it seems to build and run OK (although running the binary produced by compiling hello.rs with the cross-built i686-linux rustc in a 32 bit VM took 47 sec (!?)), apparently hanging on something before outputting correctly the message and exiting with 0.
I'd now like to figure out the top-level plumbing required to get this rust-i686-linux x86-64 package accepted in the real of i686-linux packages (cross the architecture boundary). Is this even possible in Guix? In other words, I'd like the i686 architecture to be able to use this rust-i686-linux cross built from x86_64 as if it was a *native* package. Following what was done for polkit-mozjs/polkit-duktape, I've laid the basic blocks: --8<---------------cut here---------------start------------->8--- 2 files changed, 25 insertions(+), 8 deletions(-) gnu/packages/rust.scm | 26 ++++++++++++++++++++------ guix/build-system/cargo.scm | 7 +++++-- modified gnu/packages/rust.scm @@ -54,11 +54,13 @@ (define-module (gnu packages rust) #:use-module (guix download) #:use-module (guix git-download) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix memoization) #:use-module (guix packages) #:use-module ((guix build utils) #:select (alist-replace)) #:use-module (guix utils) #:use-module (ice-9 match) - #:use-module (srfi srfi-26)) + #:use-module (srfi srfi-26) + #:export (rust)) ;; This is the hash for the empty file, and the reason it's relevant is not ;; the most obvious. @@ -780,10 +782,22 @@ (define rust-1.54 (package-native-inputs base-rust)))))) ;;; 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. -(define-public rust rust-1.54) +;;; 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. +(define-public rust-x86-64-linux rust-1.54) + +(define rust-for-system + (mlambda (system) + "Return a rust package that can be built for SYSTEM." + (if (string-prefix? "i686" system) + rust-i686-linux + rust-x86-64-linux))) + +(define-syntax rust + (identifier-syntax (rust-for-system + (or (%current-target-system) + (%current-system))))) (define (force-system p system) (package/inherit p @@ -796,7 +810,7 @@ (define force-i686 (cut force-system <> "i686-linux")) ;;; Rust cross-built for i686-linux. ;;; TODO: Make a procedure of it that returns a cross-built rust package. (define-public rust-i686-linux - (let* ((base-rust (rust-bootstrapped-package rust)) + (let* ((base-rust (rust-bootstrapped-package rust-x86-64-linux)) (base-source (package-source base-rust))) (package/inherit base-rust (source (origin modified guix/build-system/cargo.scm @@ -58,8 +58,11 @@ (define (crate-uri name version) (define (default-rust) "Return the default Rust package." ;; Lazily resolve the binding to avoid a circular dependency. - (let ((rust (resolve-interface '(gnu packages rust)))) - (module-ref rust 'rust))) + (let-system (system target) + (let ((rust (resolve-interface '(gnu packages rust)))) + (if (string-prefix? "i686" (or target system)) + (module-ref rust 'rust-i686-linux) + (module-ref rust 'rust-x86-64-linux))))) (define %cargo-utils-modules ;; Build-side modules imported by default. --8<---------------cut here---------------end--------------->8--- But this doesn't take care of switching the x86_64-associated rust-i686-linux package to become known as a i686 one. How to proceed? I need a wizard :-). Thanks! Maxim