guix-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]