Subject: [bug#74290] [PATCH v4 04/58] gnu: Add basic support for x86_64-pc-gnu target, aka 64bit Hurd.

From: Janneke Nieuwenhuizen <[email-masked]>
Date: Sun, 24 Nov 2024 08:54:27 +0100

* gnu/packages/bootstrap.scm (glibc-dynamic-linker): Update comment on where
to find shared linker name.
(make-raw-bag): Also use raw-build-guile3 when building for the 64bit Hurd.
* gnu/packages/cross-base.scm (cross-kernel-headers*): Use target-hurd?
instead of custom "i586..."  matching to also use xhurd-core-headers for
target-hurd64.
* gnu/packages/make-bootstrap.scm (package-with-relocatable-glibc)
[native-inputs]: Move final-inputs before cross-packages.
(%binutils-static)[arguments]: When building for the 64bit Hurd, add
"lt_cv_prog_compiler_static_works=yes", "lt_cv_prog_compiler_static_works_CXX=yes"
to #:make-flags to convince to actually link the binaries statically.
(make-guile-static)[arguments]: When building for the 64bit Hurd, add
"lt_cv_prog_compiler_static_works=yes" to #:configure-flags to convince
libtool to actually link guile statically.
* guix/platforms/x86.scm (x86_64-gnu): New exported variable.
* guix/utils.scm (target-hurd64? system-hurd64?): New procedures.
---
 gnu/packages/bootstrap.scm      |  3 ++-
 gnu/packages/cross-base.scm     |  6 +++---
 gnu/packages/make-bootstrap.scm | 24 +++++++++++++++++-------
 guix/platforms/x86.scm          | 11 ++++++++++-
 guix/utils.scm                  | 15 ++++++++++++++-
 5 files changed, 46 insertions(+), 13 deletions(-)

diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm
index 3743abf9fe..33cbaa30ae 100644
--- a/gnu/packages/bootstrap.scm
+++ b/gnu/packages/bootstrap.scm
@@ -558,7 +558,8 @@ (define* (make-raw-bag name
     (name name)
     (system system)
     (build-inputs inputs)
-    (build (cond ((target-riscv64?)
+    (build (cond ((or (target-riscv64?)
+                      (target-hurd64?))
                   raw-build-guile3)
                  (else raw-build)))))
 
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index 5781341a87..83672ab383 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -641,9 +641,9 @@ (define* (cross-kernel-headers* target
                 ("hurd-headers" ,xhurd-headers)
                 ("hurd-minimal" ,xhurd-minimal)))))
 
-  (match target
-    ((or "i586-pc-gnu" "i586-gnu") xhurd-core-headers)
-    (_ xlinux-headers)))
+  (if (target-hurd? target)
+      xhurd-core-headers
+      xlinux-headers))
 
 (define* (cross-libc . args)
   (if (or (= (length args) 1) (contains-keyword? args))
diff --git a/gnu/packages/make-bootstrap.scm b/gnu/packages/make-bootstrap.scm
index edc536bff4..689d48d342 100644
--- a/gnu/packages/make-bootstrap.scm
+++ b/gnu/packages/make-bootstrap.scm
@@ -145,7 +145,10 @@ (define (package-with-relocatable-glibc p)
                       target
                       #:xbinutils (cross-binutils target)
                       #:libc (cross-bootstrap-libc target))))
-          `(("cross-gcc" ,(package
+          `(,@(%final-inputs)
+            ;; As versions for gcc and cross-gcc can differ, make sure to have
+            ;; cross-gcc behind gcc in CPLUS_INCLUDE_PATH.
+            ("cross-gcc" ,(package
                             (inherit xgcc)
                             (search-paths
                              ;; Ensure the cross libc headers appears on the
@@ -154,8 +157,7 @@ (define (package-with-relocatable-glibc p)
                                     (variable "CROSS_CPLUS_INCLUDE_PATH")
                                     (files '("include")))
                                    (package-search-paths gcc)))))
-            ("cross-binutils" ,(cross-binutils target))
-            ,@(%final-inputs)))
+            ("cross-binutils" ,(cross-binutils target))))
         `(("libc" ,(glibc-for-bootstrap glibc))
           ("libc:static" ,(glibc-for-bootstrap glibc) "static")
           ("gcc" ,(gcc-for-bootstrap glibc))
@@ -395,10 +397,15 @@ (define %binutils-static
                        ((#:configure-flags flags _ ...)
                         flags)))
            #:make-flags
-           (match (memq #:make-flags (package-arguments binutils))
-             ((#:make-flags flags _ ...)
-              flags)
-             (_ #~'()))
+           #~(append
+              #$(if (target-hurd64?)
+                    #~'("lt_cv_prog_compiler_static_works=yes"
+                        "lt_cv_prog_compiler_static_works_CXX=yes")
+                    #~'())
+              #$(match (memq #:make-flags (package-arguments binutils))
+                  ((#:make-flags flags _ ...)
+                   flags)
+                  (_ #~'())))
            #:strip-flags #~'("--strip-all")
            #:phases
            #~(modify-phases %standard-phases
@@ -642,6 +649,9 @@ (define* (make-guile-static guile patches)
 
                   #$@(if (target-hurd?)
                          #~("--disable-jit")
+                         #~())
+                  #$@(if (target-hurd64?)
+                         #~("lt_cv_prog_compiler_static_works=yes")
                          #~())))
          ((#:phases phases '%standard-phases)
           #~(modify-phases #$phases
diff --git a/guix/platforms/x86.scm b/guix/platforms/x86.scm
index 0c8fc7296c..5617e6dd68 100644
--- a/guix/platforms/x86.scm
+++ b/guix/platforms/x86.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2022 Mathieu Othacehe <[email-masked]>
 ;;; Copyright © 2023, 2024 Efraim Flashner <[email-masked]>
+;;; Copyright © 2024 Janneke Nieuwenhuizen <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,7 +26,8 @@ (define-module (guix platforms x86)
             x86_64-linux-x32
             i686-mingw
             x86_64-mingw
-            i586-gnu))
+            i586-gnu
+            x86_64-gnu))
 
 (define i686-linux
   (platform
@@ -71,3 +73,10 @@ (define i586-gnu
    (system "i586-gnu")
    (rust-target "i686-unknown-hurd-gnu")
    (glibc-dynamic-linker "/lib/ld.so.1")))
+
+(define x86_64-gnu
+  (platform
+   (target "x86_64-pc-gnu")
+   (system "x86_64-gnu")
+   (rust-target "x86_64-unknown-hurd-gnu")
+   (glibc-dynamic-linker "/lib/ld-x86-64.so.1")))
diff --git a/guix/utils.scm b/guix/utils.scm
index f161cb4ef3..e100c03365 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -17,7 +17,7 @@
 ;;; Copyright © 2022 Denis 'GNUtoo' Carikli <[email-masked]>
 ;;; Copyright © 2022 Antero Mejr <[email-masked]>
 ;;; Copyright © 2023 Philip McGrath <[email-masked]>
-;;; Copyright © 2023 Janneke Nieuwenhuizen <[email-masked]>
+;;; Copyright © 2023, 2024 Janneke Nieuwenhuizen <[email-masked]>
 ;;; Copyright © 2023 Zheng Junjie <[email-masked]>
 ;;; Copyright © 2023 Foundation Devices, Inc. <[email-masked]>
 ;;; Copyright © 2024 Herman Rimm <[email-masked]>
@@ -94,6 +94,8 @@ (define-module (guix utils)
             target-linux?
             target-hurd?
             system-hurd?
+            target-hurd64?
+            system-hurd64?
             target-mingw?
             target-x86-32?
             target-x86-64?
@@ -716,6 +718,17 @@ (define* (system-hurd?)
   "Is the current system the GNU(/Hurd) system?"
   (and=> (%current-system) target-hurd?))
 
+(define* (target-hurd64? #:optional (target (or (%current-target-system)
+                                                (%current-system))))
+  "Does TARGET represent the 64bit GNU(/Hurd) system?"
+  (and (target-hurd?)
+       (target-64bit? target)))
+
+(define* (system-hurd64?)
+  "Is the current system the 64bit GNU(/Hurd) system?"
+  (and (system-hurd?)
+       (target-64bit? (%current-system))))
+
 (define* (target-mingw? #:optional (target (%current-target-system)))
   "Is the operating system of TARGET Windows?"
   (and target
-- 
2.46.0