[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Desktops on non-x86_64 systems
From: |
Maxim Cournoyer |
Subject: |
Re: Desktops on non-x86_64 systems |
Date: |
Tue, 30 Nov 2021 23:56:21 -0500 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) |
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