From 03b45230d409c5f09e6ad18f23f313a13dbddb7d Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Sat, 12 Jun 2021 23:23:43 +0300 Subject: [PATCH] gnu: bootstrap: Add support for riscv64-linux. On 7d93b21ab1c132990054372a9677c1639d54e631 gnu: glibc-for-bootstrap: Update patch. Run ./pre-inst-env guix build --target=riscv64-linux-gnu bootstrap-tarballs Producing /gnu/store/4hdzva9i0wyyfbgj1lmqc1wkk644pv07-bootstrap-tarballs-0 With guix hash -rx 1nj0fdgj08bbmfny01mp2blv7c3p2iciqh31zmf04ap5s7ygsqlp * gnu/packages/bootstrap.scm (%bootstrap-executables): Add entries for riscv64-linux. (%bootstrap-guile-hash, %bootstrap-coreutils&co, %bootstrap-binutils, %bootstrap-glibc, %bootstrap-gcc): Add entry for riscv64-linux. (raw-build-guile3): New procedure. (make-raw-bag): Use raw-build-guile3 for riscv64-linux. * guix/packages.scm (%supported-systems): Add riscv64-linux. (%cuirass-supported-systems): Remove riscv64-linux. * guix/utils.scm (target-64bit?): Add riscv64-linux. * m4/guix.m4: Add riscv64-linux as a supported system. * doc/guix.texi (GNU Distribution): Add riscv64-linux. --- doc/guix.texi | 14 ++++- gnu/packages/bootstrap.scm | 112 +++++++++++++++++++++++++++++++++- gnu/packages/commencement.scm | 1 + guix/packages.scm | 4 +- guix/utils.scm | 3 +- m4/guix.m4 | 2 +- 6 files changed, 127 insertions(+), 9 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index bc289bad7b..92971a531c 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -33,7 +33,7 @@ Copyright @copyright{} 2015, 2016, 2017, 2019, 2020, 2021 Leo Famulari@* Copyright @copyright{} 2015, 2016, 2017, 2018, 2019, 2020, 2021 Ricardo Wurmus@* Copyright @copyright{} 2016 Ben Woodcroft@* Copyright @copyright{} 2016, 2017, 2018, 2021 Chris Marusich@* -Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Efraim Flashner@* +Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022 Efraim Flashner@* Copyright @copyright{} 2016 John Darrington@* Copyright @copyright{} 2016, 2017 Nikita Gillmann@* Copyright @copyright{} 2016, 2017, 2018, 2019, 2020 Jan Nieuwenhuizen@* @@ -564,6 +564,15 @@ build (@pxref{Tracking Bugs and Patches}). That said, the Guix community is actively working on improving this support, and now is a great time to try it and get involved! +@item riscv64-linux +little-endian 64-bit RISC-V processors, specifically RV64GC, and +Linux-Libre kernel. This playform is available as a "technology preview": +although it is supported, substitutes are not yet available from the +build farm (@pxref{Substitutes}), and some packages may fail to build +(@pxref{Tracking Bugs and Patches}). That said, the Guix community is +actively working on improving this support, and now is a great time to +try it and get involved! + @end table With Guix@tie{}System, you @emph{declare} all aspects of the operating system @@ -575,7 +584,8 @@ Manual}), the well-known GNU utilities and tool chain, as well as the graphical environment or system services of your choice. Guix System is available on all the above platforms except -@code{mips64el-linux} and @code{powerpc64le-linux}. +@code{mips64el-linux}, @code{powerpc-linux}, @code{powerpc64le-linux} and +@code{riscv64-linux}. @noindent For information on porting to other architectures or kernels, diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm index 5a8028a465..8bd0c4eaf3 100644 --- a/gnu/packages/bootstrap.scm +++ b/gnu/packages/bootstrap.scm @@ -144,7 +144,16 @@ ("tar" ,(base32 "150c8948cz8r208g6qgn2dn4f4zs5kpgbpbg6bwag6yw42rapw2l")) ("xz" - ,(base32 "0v5738idy9pqzcbrjdpxi5c6qs5m78zrpsydmrpx5cfcfzbkxzjh"))))) + ,(base32 "0v5738idy9pqzcbrjdpxi5c6qs5m78zrpsydmrpx5cfcfzbkxzjh"))) + ("riscv64-linux" + ("bash" + ,(base32 "0almlf73k6hbm495kzf4bw1rzsg5qddn7z2rf5l3d1xcapac2hj3")) + ("mkdir" + ,(base32 "0rg1amdcqfkplcy1608jignl8jq0wqzfkp430mwik3f62959gya6")) + ("tar" + ,(base32 "17d3x27qhiwk7h6ns0xrvbrq0frxz89mjjh2cdwx2rraq5x6wffm")) + ("xz" + ,(base32 "0nxn75xf386vdq3igmgm8gnyk4h4x0cm8jv71vlb2jvwxh0cyw1q"))))) (define %bootstrap-executable-base-urls ;; This is where the bootstrap executables come from. @@ -159,6 +168,7 @@ ("powerpc64le-linux" (string-append system "/20210106/" program)) ("i586-gnu" (string-append system "/20200326/" program)) ("powerpc-linux" (string-append system "/20200923/bin/" program)) + ("riscv64-linux" (string-append system "/20210725/bin/" program)) (_ (string-append system "/" program "?id=44f07d1dc6806e97c4e9ee3e6be883cc59dc666e")))) @@ -362,6 +372,8 @@ or false to signal an error." "/20200326/guile-static-stripped-2.0.14-i586-pc-gnu.tar.xz") ("powerpc64le-linux" "/20210106/guile-static-stripped-2.0.14-powerpc64le-linux-gnu.tar.xz") + ("riscv64-linux" + "/20210725/guile-3.0.2.tar.xz") (_ "/20131110/guile-2.0.9.tar.xz")))) @@ -383,7 +395,9 @@ or false to signal an error." ("i586-gnu" (base32 "0wgqpsmvg25rnqn49ap7kwd2qxccd8dr4lllzp7i3rjvgav27vac")) ("powerpc-linux" - (base32 "1by2p7s27fbyjzfkcw8h65h4kkqh7d23kv4sgg5jppjn2qx7swq4")))) + (base32 "1by2p7s27fbyjzfkcw8h65h4kkqh7d23kv4sgg5jppjn2qx7swq4")) + ("riscv64-linux" + (base32 "12pqmhsbbp7hh9r1bjdl14l3a4q06plpz6dcks9dysb4czay8p9f")))) (define (bootstrap-guile-origin system) "Return an object for the Guile tarball of SYSTEM." @@ -455,6 +469,76 @@ GUILE_SYSTEM_PATH=$out/share/guile/2.0 \ GUILE_SYSTEM_COMPILED_PATH=$out/lib/guile/2.0/ccache \ $out/bin/guile -c ~s $out ~a +# Sanity check. +$out/bin/guile --version~%" + (derivation->output-path mkdir) + (derivation->output-path xz) + (derivation->output-path tar) + (object->string wrapper) + (derivation->output-path bash))))) + (raw-derivation name + (derivation->output-path bash) `(,builder) + #:system system + #:inputs (map derivation-input + (list bash mkdir tar xz guile)) + #:sources (list builder) + #:env-vars `(("GUILE_TARBALL" + . ,(derivation->output-path guile)))))) + +(define* (raw-build-guile3 name inputs + #:key outputs system search-paths + #:allow-other-keys) + (define (->store file) + (lower-object (bootstrap-executable file system) + system)) + + (define (make-guile-wrapper bash guile-real) + ;; The following code, run by the bootstrap guile after it is unpacked, + ;; creates a wrapper for itself to set its load path. This replaces the + ;; previous non-portable method based on reading the /proc/self/exe + ;; symlink. + '(begin + (use-modules (ice-9 match)) + (match (command-line) + ((_ out bash) + (let ((bin-dir (string-append out "/bin")) + (guile (string-append out "/bin/guile")) + (guile-real (string-append out "/bin/.guile-real")) + ;; We must avoid using a bare dollar sign in this code, + ;; because it would be interpreted by the shell. + (dollar (string (integer->char 36)))) + (chmod bin-dir #o755) + (rename-file guile guile-real) + (call-with-output-file guile + (lambda (p) + (format p "\ +#!~a +export GUILE_SYSTEM_PATH=~a/share/guile/3.0 +export GUILE_SYSTEM_COMPILED_PATH=~a/lib/guile/3.0/ccache +exec -a \"~a0\" ~a \"~a@\"\n" + bash out out dollar guile-real dollar))) + (chmod guile #o555) + (chmod bin-dir #o555)))))) + + (mlet* %store-monad ((tar (->store "tar")) + (xz (->store "xz")) + (mkdir (->store "mkdir")) + (bash (->store "bash")) + (guile (download-bootstrap-guile system)) + (wrapper -> (make-guile-wrapper bash guile)) + (builder + (text-file "build-bootstrap-guile.sh" + (format #f " +echo \"unpacking bootstrap Guile to '$out'...\" +~a $out +cd $out +~a -dc < $GUILE_TARBALL | ~a xv + +# Use the bootstrap guile to create its own wrapper to set the load path. +GUILE_SYSTEM_PATH=$out/share/guile/3.0 \ +GUILE_SYSTEM_COMPILED_PATH=$out/lib/guile/3.0/ccache \ +$out/bin/guile -c ~s $out ~a + # Sanity check. $out/bin/guile --version~%" (derivation->output-path mkdir) @@ -478,7 +562,9 @@ $out/bin/guile --version~%" (name name) (system system) (build-inputs inputs) - (build raw-build))) + (build (cond ((target-riscv64?) + raw-build-guile3) + (else raw-build))))) (define %bootstrap-guile ;; The Guile used to run the build scripts of the initial derivations. @@ -518,6 +604,8 @@ $out/bin/guile --version~%" "/20200326/static-binaries-0-i586-pc-gnu.tar.xz") ("powerpc-linux" "/20200923/static-binaries.tar.xz") + ("riscv64-linux" + "/20210725/static-binaries.tar.xz") (_ "/20131110/static-binaries.tar.xz"))) %bootstrap-base-urls)) @@ -544,6 +632,9 @@ $out/bin/guile --version~%" ("powerpc-linux" (base32 "0kspxy0yczan2vlih6aa9hailr2inz000fqa0gn5x9d1fxxa5y8m")) + ("riscv64-linux" + (base32 + "0x0xjlpmyh6rkr51p00gp6pscgl6zjida1rsg8vk3rinyi6rrbkg")) ("mips64el-linux" (base32 "072y4wyfsj1bs80r6vbybbafy8ya4vfy7qj25dklwk97m6g71753")))))) @@ -596,6 +687,8 @@ $out/bin/guile --version~%" "/20200326/binutils-static-stripped-2.34-i586-pc-gnu.tar.xz") ("powerpc-linux" "/20200923/binutils-2.35.1.tar.xz") + ("riscv64-linux" + "/20210725/binutils-2.34.tar.xz") (_ "/20131110/binutils-2.23.2.tar.xz"))) %bootstrap-base-urls)) @@ -616,6 +709,9 @@ $out/bin/guile --version~%" ("powerpc64le-linux" (base32 "1klxy945c61134mzhqzz2gbk8w0n8jq7arwkrvz78d22ff2q0cwz")) + ("riscv64-linux" + (base32 + "0n9qf4vbilfmh1lknhw000waakj4q6s50pnjazr5137skm976z5m")) ("i586-gnu" (base32 "11kykv1kmqc5wln57rs4klaqa13hm952smkc57qcsyss21kfjprs")) @@ -681,6 +777,8 @@ $out/bin/guile --version~%" "/20200326/glibc-stripped-2.31-i586-pc-gnu.tar.xz") ("powerpc-linux" "/20200923/glibc-2.32.tar.xz") + ("riscv64-linux" + "/20210725/glibc-2.31.tar.xz") (_ "/20131110/glibc-2.18.tar.xz"))) %bootstrap-base-urls)) @@ -701,6 +799,9 @@ $out/bin/guile --version~%" ("powerpc64le-linux" (base32 "1a1df6z8gkaq09md3jy94lixnh20599p58p0s856p10xwjaqr1iz")) + ("riscv64-linux" + (base32 + "0d9x80vm7ca1pd2whcmpm1h14zxpb58kqajlxlwffzm04xfsjnxm")) ("i586-gnu" (base32 "14ddm10lpbas8bankmn5bcrlqvz1v5dnn1qjzxb19r57vd2w5952")) @@ -782,6 +883,8 @@ exec ~a/bin/.gcc-wrapped -B~a/lib \ "/20200326/gcc-stripped-5.5.0-i586-pc-gnu.tar.xz") ("powerpc-linux" "/20200923/gcc-5.5.0.tar.xz") + ("riscv64-linux" + "/20210725/gcc-7.5.0.tar.xz") (_ "/20131110/gcc-4.8.2.tar.xz"))) %bootstrap-base-urls)) @@ -802,6 +905,9 @@ exec ~a/bin/.gcc-wrapped -B~a/lib \ ("powerpc64le-linux" (base32 "151kjsai25vz2s667bgzpisx8f281fpl3n9pxz2yrp9jlnadz3m1")) + ("riscv64-linux" + (base32 + "1k4mbnb54wj2q37fgshf5dfixixqnhn002vhzvi9pnb57xb9v14d")) ("i586-gnu" (base32 "1j2zc58wzil71a34h7c70sd68dmqvcscrw3rmn2whq79vd70zvv5")) diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm index a067c9cd27..94fcea0463 100644 --- a/gnu/packages/commencement.scm +++ b/gnu/packages/commencement.scm @@ -2496,6 +2496,7 @@ exec " gcc "/bin/" program ,@(substitute-keyword-arguments (package-arguments findutils) ((#:configure-flags flags ''()) `(append + ;; TODO: Figure out exactly with architectures need this. ,(if (target-64bit?) ''("TIME_T_32_BIT_OK=yes") ''()) diff --git a/guix/packages.scm b/guix/packages.scm index da8b66dfa6..9d5b23eb8a 100644 --- a/guix/packages.scm +++ b/guix/packages.scm @@ -395,7 +395,7 @@ from forcing GEXP-PROMISE." ;; This is the list of system types that are supported. By default, we ;; expect all packages to build successfully here. '("x86_64-linux" "i686-linux" "armhf-linux" "aarch64-linux" "mips64el-linux" "i586-gnu" - "powerpc64le-linux" "powerpc-linux")) + "powerpc64le-linux" "powerpc-linux" "riscv64-linux")) (define %hurd-systems ;; The GNU/Hurd systems for which support is being developed. @@ -406,7 +406,7 @@ from forcing GEXP-PROMISE." ;; ;; XXX: MIPS is unavailable in CI: ;; . - (fold delete %supported-systems '("mips64el-linux" "powerpc-linux"))) + (fold delete %supported-systems '("mips64el-linux" "powerpc-linux" "riscv64-linux"))) (define-inlinable (sanitize-inputs inputs) "Sanitize INPUTS by turning it into a list of name/package tuples if it's diff --git a/guix/utils.scm b/guix/utils.scm index 536323978e..cba6464523 100644 --- a/guix/utils.scm +++ b/guix/utils.scm @@ -712,7 +712,8 @@ architecture (x86_64)?" (define* (target-64bit? #:optional (system (or (%current-target-system) (%current-system)))) - (any (cut string-prefix? <> system) '("x86_64" "aarch64" "mips64" "powerpc64"))) + (any (cut string-prefix? <> system) '("x86_64" "aarch64" "mips64" + "powerpc64" "riscv64"))) (define* (cc-for-target #:optional (target (%current-target-system))) (if target diff --git a/m4/guix.m4 b/m4/guix.m4 index 6c8e4f1c85..700c0dfd4a 100644 --- a/m4/guix.m4 +++ b/m4/guix.m4 @@ -89,7 +89,7 @@ courageous and port the GNU System distribution to it (see # Currently only Linux-based systems are supported, and only on some # platforms. case "$guix_system" in - x86_64-linux|i686-linux|armhf-linux|aarch64-linux|powerpc64le-linux|i586-gnu) + x86_64-linux|i686-linux|armhf-linux|aarch64-linux|powerpc64le-linux|riscv64-linux|i586-gnu) ;; mips64el-linux|powerpc-linux) AC_MSG_WARN([building Guix on `$guix_system', which is not supported])