From patchwork Tue Nov 12 16:25:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Janneke Nieuwenhuizen X-Patchwork-Id: 70319 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 0BFAB27BBEA; Tue, 12 Nov 2024 16:32:07 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-7.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_BLOCKED, RCVD_IN_VALIDITY_CERTIFIED,RCVD_IN_VALIDITY_RPBL,RCVD_IN_VALIDITY_SAFE, SPF_HELO_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id 14C9427BBE9 for ; Tue, 12 Nov 2024 16:32:06 +0000 (GMT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tAtmZ-00043z-B7; Tue, 12 Nov 2024 11:30:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tAtmT-0003xV-FV for guix-patches@gnu.org; Tue, 12 Nov 2024 11:30:17 -0500 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tAtmT-0005x5-5S; Tue, 12 Nov 2024 11:30:17 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=MIME-Version:References:In-Reply-To:Date:From:To:Subject; bh=H5qy9XPsB/mEj4r6U2Yh+9AIAYWfh1xGVuKd1oqGgEc=; b=ccflDRm9OUCgF1MO/FVqwMQTbzPc9GWD1WVw0+PkfwKP0V2DjZMBdVbwaAFzkJsekm8E1Vegzv8cvyzPfjLBYozmauy9e25SkdldcUgF8qT/4mv+fHyVzPkuZGKvwiLPwStpfihOevWnSv7zMqBDpuluSvwuFE3BUHVjlSny6XNtvE72dJSp3YDDqk84S7IIxYn64bYU9sG9My9Uz9AGSsQ7kGSWqEDK15YILMmssn0eH4grU2/A0d4CWI4cGx7saDUy5WULOuIA7HShIvubloPRgfuuBd8cgRujQVbnp5PCcho3T95eSJuTejsKfj6s85kk6TqSpRlWQgIduCtauA==; Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1tAtmG-0000PU-QY; Tue, 12 Nov 2024 11:30:04 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#74290] [PATCH v2 05/40] gnu: Add basic support for x86_64-pc-gnu target, aka 64bit Hurd. Resent-From: Janneke Nieuwenhuizen Original-Sender: "Debbugs-submit" Resent-CC: andreas@enge.fr, guix@cbaines.net, efraim@flashner.co.il, ekaitz@elenq.tech, dev@jpoiret.xyz, ludo@gnu.org, othacehe@gnu.org, zimon.toutoune@gmail.com, me@tobias.gr, guix-patches@gnu.org Resent-Date: Tue, 12 Nov 2024 16:30:04 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 74290 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 74290@debbugs.gnu.org Cc: Andreas Enge , Christopher Baines , Efraim Flashner , Ekaitz Zarraga , Josselin Poiret , Ludovic =?utf-8?q?Court=C3=A8s?= , Mathieu Othacehe , Simon Tournier , Tobias Geerinckx-Rice X-Debbugs-Original-Xcc: Andreas Enge , Christopher Baines , Efraim Flashner , Ekaitz Zarraga , Josselin Poiret , Ludovic =?utf-8?q?Court=C3=A8s?= , Mathieu Othacehe , Simon Tournier , Tobias Geerinckx-Rice Received: via spool by 74290-submit@debbugs.gnu.org id=B74290.17314289571064 (code B ref 74290); Tue, 12 Nov 2024 16:30:04 +0000 Received: (at 74290) by debbugs.gnu.org; 12 Nov 2024 16:29:17 +0000 Received: from localhost ([127.0.0.1]:39057 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tAtlS-0000Gg-3V for submit@debbugs.gnu.org; Tue, 12 Nov 2024 11:29:16 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60302) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tAtlP-0000Fv-5f for 74290@debbugs.gnu.org; Tue, 12 Nov 2024 11:29:12 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tAtjD-0005KX-3Z; Tue, 12 Nov 2024 11:26:55 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:References:In-Reply-To:Date:Subject:To: From; bh=H5qy9XPsB/mEj4r6U2Yh+9AIAYWfh1xGVuKd1oqGgEc=; b=bVTaJOPRlnMPS+NX+1Su idTw6wGHrRYQg4k98YBLr1ZyeOEi3fWyslWpTTBEjT2QgA8V3u6QdjgyFv24J3ds9HyXWq5gwz0f0 Ag5uSqnxI9klcCc6RHWPX158EWT13o7dH+YkGxsmLcFYTI3s5xK2j5z9mYZeKEPfqcQPr3X5sC8eo B3dtwbJicD8uPAsgBGpjzYKDAo4HBpXeMCqdSAQ0MQ8/hhqcMRV3JWmDb1ZvlbQAAVfxCdjmlDEyM tcX8UEJFFcrQ2p5iFgWabmjXaa5OKavQdIFjmkFvD0Xsnk/gUkEZSCYqCPeuEPAhByVIs4Z42SXwu ib4HlZ5A/BcIXg==; From: Janneke Nieuwenhuizen Date: Tue, 12 Nov 2024 17:25:14 +0100 Message-ID: <99a9152dc069538a151504d65b85fd5105149a51.1731427612.git.janneke@gnu.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: References: MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org X-getmail-retrieved-from-mailbox: Patches * 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. * guix/platforms/x86.scm (x86_64-gnu): New exported variable. * guix/utils.scm (target-hurd64? system-hurd64?): New procedures. * gnu/packages/gcc.scm: (current-gcc): Use target-hurd64? in new procedure to select gcc-14 on 64bit Hurd. (libstdc++): Change to procedure. (libstdc++-headers): Update accordingly. * gnu/packages/commencement.scm (current-gcc-toolchain): Likewise, to select gcc-toolchain-14 on 64bit Hurd. * gnu/packages/cross-base.scm (%xgcc): Use current-gcc. (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): Capture (current-gcc) before resetting %current-target-system. [native-inputs]: Move final-inputs before cross-packages. (%glibc-stripped): Likewise. (%gcc-static): Change to procedure. (%gcc-stripped): Likewise, update accordingly. (%gcc-bootstrap-tarball): Likewise, update accordingly. (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. (%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. * gnu/ci.scm (%core-packages): Update accordingly. * gnu/packages/patches/gcc-14-cross-without-bootstrap.patch: New file. * gnu/local.mk (dist_patch_DATA): Register it. * gnu/packages/cross-base.scm (cross-gcc)[origin]: Use it when cross-building gcc >= 14. Change-Id: I4ae189e7e5188ced91744b89fe9d753b6a1fca78 --- gnu/ci.scm | 4 +-- gnu/packages/bootstrap.scm | 3 +- gnu/packages/commencement.scm | 6 ++-- gnu/packages/cross-base.scm | 6 ++-- gnu/packages/gcc.scm | 32 ++++++++++--------- gnu/packages/make-bootstrap.scm | 56 ++++++++++++++++++++++----------- guix/platforms/x86.scm | 11 ++++++- guix/utils.scm | 15 ++++++++- 8 files changed, 90 insertions(+), 43 deletions(-) diff --git a/gnu/ci.scm b/gnu/ci.scm index 4e282d197f..e7e839d968 100644 --- a/gnu/ci.scm +++ b/gnu/ci.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012-2024 Ludovic Courtès -;;; Copyright © 2017, 2020 Jan (janneke) Nieuwenhuizen +;;; Copyright © 2017, 2020, 2024 Janneke Nieuwenhuizen ;;; Copyright © 2018, 2019 Clément Lassieur ;;; Copyright © 2020 Julien Lepiller ;;; Copyright © 2020, 2021 Mathieu Othacehe @@ -146,7 +146,7 @@ (define %core-packages %bootstrap-binaries-tarball %binutils-bootstrap-tarball (%glibc-bootstrap-tarball) - %gcc-bootstrap-tarball + (%gcc-bootstrap-tarball) %guile-bootstrap-tarball %bootstrap-tarballs)) diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm index c4640b62e1..234d001fc1 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/commencement.scm b/gnu/packages/commencement.scm index 70641267a8..a000cbfdc5 100644 --- a/gnu/packages/commencement.scm +++ b/gnu/packages/commencement.scm @@ -3643,10 +3643,12 @@ (define-public gcc-toolchain-14 ;; The default GCC (define (current-gcc-toolchain) "The current default gcc-toolchain version." - gcc-toolchain-11) + (if (target-hurd64?) + gcc-toolchain-14 + gcc-toolchain-11)) (define-public gcc-toolchain - (deprecated-package "gcc-toolchain" gcc-toolchain-11)) + (deprecated-package "gcc-toolchain" (current-gcc-toolchain))) (define-public gcc-toolchain-aka-gcc ;; It's natural for users to try "guix install gcc". This package diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm index 9c701efae8..7b32a6b64e 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/gcc.scm b/gnu/packages/gcc.scm index 3b5d05b9a9..fc3746fb05 100644 --- a/gnu/packages/gcc.scm +++ b/gnu/packages/gcc.scm @@ -861,10 +861,12 @@ (define-public gcc-14 ;; the gcc-toolchain-* definitions. (define (current-gcc) "The current default gcc version." - gcc-11) + (if (target-hurd64?) + gcc-14 + gcc-11)) (define-public gcc - (deprecated-package "gcc" gcc-11)) + (deprecated-package "gcc" (current-gcc))) ;;; @@ -903,15 +905,15 @@ (define-public gcc-2.95 (outputs '("out")) (arguments (let ((matching-system - (match (%current-system) - ;; This package predates our 64-bit architectures. - ;; Force a 32-bit build targeting a similar architecture. - ("aarch64-linux" - "armhf-linux") - ("x86_64-linux" - "i686-linux") - (_ - (%current-system))))) + (match (%current-system) + ;; This package predates our 64-bit architectures. + ;; Force a 32-bit build targeting a similar architecture. + ("aarch64-linux" + "armhf-linux") + ("x86_64-linux" + "i686-linux") + (_ + (%current-system))))) (list #:system matching-system #:configure-flags #~'("--disable-werror") @@ -1050,8 +1052,8 @@ (define-public (make-libstdc++ gcc) (propagated-inputs '()) (synopsis "GNU C++ standard library"))) -(define libstdc++ - ;; Libstdc++ matching the default GCC. +(define (current-libstdc++) + ;; Libstdc++ matching the CURRENT-GCC. (make-libstdc++ (current-gcc))) (define libstdc++-headers @@ -1061,7 +1063,7 @@ (define libstdc++-headers ;; is right under include/c++ and not under ;; include/c++/x86_64-unknown-linux-gnu (aka. GPLUSPLUS_TOOL_INCLUDE_DIR). (package - (inherit libstdc++) + (inherit (current-libstdc++)) (name "libstdc++-headers") (outputs '("out")) (build-system trivial-build-system) @@ -1072,7 +1074,7 @@ (define libstdc++-headers (mkdir (string-append out "/include")) (symlink (string-append libstdc++ "/include") (string-append out "/include/c++"))))) - (inputs `(("libstdc++" ,libstdc++))) + (inputs `(("libstdc++" ,(current-libstdc++)))) (synopsis "Headers of GNU libstdc++"))) (define-public libstdc++-4.9 diff --git a/gnu/packages/make-bootstrap.scm b/gnu/packages/make-bootstrap.scm index c6293b9a38..f4165178fe 100644 --- a/gnu/packages/make-bootstrap.scm +++ b/gnu/packages/make-bootstrap.scm @@ -124,8 +124,11 @@ (define (package-with-relocatable-glibc p) (glibc-for-bootstrap ;; `cross-libc' already returns a cross libc, so clear ;; %CURRENT-TARGET-SYSTEM. - (parameterize ((%current-target-system #f)) - (cross-libc target)))) + (let ((xgcc (cross-gcc target #:xgcc (current-gcc)))) + (parameterize ((%current-target-system #f)) + (cross-libc target #:xgcc xgcc + #:xheaders (cross-kernel-headers + target #:xgcc xgcc)))))) ;; Standard inputs with the above libc and corresponding GCC. @@ -145,7 +148,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 +160,7 @@ (define (package-with-relocatable-glibc p) (variable "CROSS_CPLUS_INCLUDE_PATH") (files '("include"))) (package-search-paths (current-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 +400,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 @@ -446,7 +456,8 @@ (define (%glibc-stripped) ;; GNU libc's essential shared libraries, dynamic linker, and headers, ;; with all references to store directories stripped. As a result, ;; libc.so is unusable and need to be patched for proper relocation. - (let ((glibc (glibc-for-bootstrap glibc))) + (let ((glibc (glibc-for-bootstrap glibc)) + (gcc (current-gcc))) (package (inherit glibc) (name "glibc-stripped") (build-system trivial-build-system) @@ -463,8 +474,13 @@ (define (%glibc-stripped) `(("libc" ,(let ((target (%current-target-system))) (if target (glibc-for-bootstrap - (parameterize ((%current-target-system #f)) - (cross-libc target))) + (let* ((xgcc (cross-gcc target #:xgcc gcc)) + (xheaders (cross-kernel-headers target + #:xgcc xgcc))) + (parameterize ((%current-target-system #f)) + (cross-libc target + #:xgcc xgcc + #:xheaders xheaders)))) glibc))))) (inputs `(("kernel-headers" @@ -478,11 +494,12 @@ (define (%glibc-stripped) ;; Only one output. (outputs '("out"))))) -(define %gcc-static +(define (%gcc-static) ;; A statically-linked GCC, with stripped-down functionality. (package-with-relocatable-glibc (package (inherit (current-gcc)) (name "gcc-static") + (source (package-source (current-gcc))) (outputs '("out")) ; all in one (arguments (substitute-keyword-arguments (package-arguments (current-gcc)) @@ -552,7 +569,7 @@ (define %gcc-static ,@(package-native-inputs (current-gcc))) (package-native-inputs (current-gcc))))))) -(define %gcc-stripped +(define (%gcc-stripped) ;; The subset of GCC files needed for bootstrap. (package (inherit (current-gcc)) @@ -575,7 +592,7 @@ (define %gcc-stripped (libdir (string-append out "/lib")) (includedir (string-append out "/include")) (libexecdir (string-append out "/libexec")) - (gcc #$%gcc-static)) + (gcc #$(%gcc-static))) (copy-recursively (string-append gcc "/bin") bindir) (for-each remove-store-references (find-files bindir ".*")) @@ -642,6 +659,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 @@ -813,9 +833,9 @@ (define (%glibc-bootstrap-tarball) ;; A tarball with GNU libc's shared libraries, dynamic linker, and headers. (tarball-package (%glibc-stripped))) -(define %gcc-bootstrap-tarball +(define (%gcc-bootstrap-tarball) ;; A tarball with a dynamic-linked GCC and its headers. - (tarball-package %gcc-stripped)) + (tarball-package (%gcc-stripped))) (define %guile-bootstrap-tarball ;; A tarball with the statically-linked, relocatable Guile. @@ -856,7 +876,7 @@ (define %bootstrap-tarballs ((or "i686-linux" "x86_64-linux") (list %linux-libre-headers-bootstrap-tarball)) (_ - (list %gcc-bootstrap-tarball + (list (%gcc-bootstrap-tarball) %binutils-bootstrap-tarball (%glibc-bootstrap-tarball) %bootstrap-binaries-tarball))))) 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 ;;; Copyright © 2023, 2024 Efraim Flashner +;;; Copyright © 2024 Janneke Nieuwenhuizen ;;; ;;; 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 ;;; Copyright © 2022 Antero Mejr ;;; Copyright © 2023 Philip McGrath -;;; Copyright © 2023 Janneke Nieuwenhuizen +;;; Copyright © 2023, 2024 Janneke Nieuwenhuizen ;;; Copyright © 2023 Zheng Junjie <873216071@qq.com> ;;; Copyright © 2023 Foundation Devices, Inc. ;;; Copyright © 2024 Herman Rimm @@ -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