Message ID | 7c5ee85372e4682282dc6a543c99a3620abf2cd5.1661416343.git.philip@philipmcgrath.com |
---|---|
State | Accepted |
Headers | show |
Series | gnu: Update Racket to 8.6. Add Zuo. | expand |
Context | Check | Description |
---|---|---|
cbaines/comparison | success | View comparision |
cbaines/git-branch | success | View Git branch |
cbaines/applying patch | success | View Laminar job |
cbaines/issue | success | View issue |
Should be "Support all systems". Am Donnerstag, dem 25.08.2022 um 04:54 -0400 schrieb Philip McGrath: > On systems for which Racket's variant of Chez Scheme cannot generate > native code, it can use a 'pbarch' machine type: a variant of the > ``portable bytecode'' backend specialized to word size and endianness. > This allows Racket CS to replace Racket BC on those systems while > maintaining comparable performance. (Racket BC lacks JIT support for > those systems anyway.) It also lets us provide a Chez Scheme package on > all systems Guix supports. > > This patch adds 'pbarch' support to both 'chez-scheme-for-racket' and > 'racket-vm-cs', but it does not change the Racket VM implementation > used > for the 'racket' and 'racket-minimal' packages. > > * gnu/packages/chez.scm (nix-system->pbarch-machine-type): New > variable. > (chez-scheme-for-racket)[inputs]: Use 'libffi' for non-native systems. > [arguments]<#:configure-flags>: Always supply '-m='. Add applicable > flags for non-native systems. > [supported-systems]: Use '%supported-systems'. > [description]: Update. > (chez-scheme-for-racket-bootstrap-bootfiles)[arguments]<#:phases>: > Adapt > 'build' phase for non-native systems. > * gnu/packages/racket.scm (racket-vm-bc)[description]: Update. > (racket-vm-cs)[description]: Likewise. > [inputs]: Use 'libffi' for non-native systems. > [arguments]<#:configure-flags>: Add applicable flags for non-native > systems. > --- > gnu/packages/chez.scm | 76 ++++++++++++++++++++++++++++++----------- > gnu/packages/racket.scm | 26 +++++++++----- > 2 files changed, 74 insertions(+), 28 deletions(-) > > diff --git a/gnu/packages/chez.scm b/gnu/packages/chez.scm > index 26f653ea9d..5d152b3db5 100644 > --- a/gnu/packages/chez.scm > +++ b/gnu/packages/chez.scm > @@ -37,6 +37,7 @@ (define-module (gnu packages chez) > #:use-module (gnu packages compression) > #:use-module (gnu packages ncurses) > #:use-module (gnu packages ghostscript) > + #:use-module (gnu packages libffi) > #:use-module (gnu packages linux) > #:use-module (gnu packages netpbm) > #:use-module (gnu packages racket) > @@ -49,6 +50,7 @@ (define-module (gnu packages chez) > #:use-module (srfi srfi-26) > #:export (chez-scheme-for-system > racket-cs-native-supported-system? > + nix-system->pbarch-machine-type > unpack-nanopass+stex)) > > ;; Commentary: > @@ -231,6 +233,28 @@ (define* (chez-upstream-features-for-system > #:optional > (and=> (assoc-ref %chez-features-table chez-os) > (cut assoc-ref <> chez-arch)))) > > +(define* (nix-system->pbarch-machine-type #:optional > + (system > + (or (%current-target- > system) > + (%current-system))) > + #:key (threads? #t)) > + "Return a string naming the pseudo–machine type used by Racket's > variant of > +Chez Scheme to represent the appropriate ``pbarch'' backend for > SYSTEM: that > +is, the ``portable bytecode'' backend specialized for SYSTEM's word > size and > +endianness. The result will name the threaded machine type unless > THREADS? is > +provided and is #f." > + (string-append (if threads? > + "t" > + "") > + "pb" > + (if (target-64bit? system) > + "64" > + "32") > + ;; missing (guix utils) predicate target-little- > endian? > + (if (target-ppc32? system) > + "b" > + "l"))) > + Don't we already have a function that does something similar? Can't we add a #:portable-bytecode? keyword to that one? > (define* (racket-cs-native-supported-system? #:optional > (system > (or (%current-target- > system) > @@ -449,10 +473,14 @@ (define-public chez-scheme-for-racket > ;; When updating, remember to also update %racket-version in > racket.scm. > (source #f) ; avoid problematic cycle with racket.scm > (inputs > - (modify-inputs (package-inputs chez-scheme) > - (delete "libx11" "util-linux:lib") > - (replace "chez-scheme-bootstrap-bootfiles" > - chez-scheme-for-racket-bootstrap-bootfiles))) > + (let ((inputs (modify-inputs (package-inputs chez-scheme) > + (replace "chez-scheme-bootstrap-bootfiles" > + chez-scheme-for-racket-bootstrap-bootfiles) > + (delete "libx11" "util-linux:lib")))) > + (if (racket-cs-native-supported-system?) > + inputs > + (modify-inputs inputs > + (prepend libffi))))) > (native-inputs > (let ((native-inputs (modify-inputs (package-native-inputs chez- > scheme) > (prepend zuo)))) > @@ -473,10 +501,16 @@ (define-public chez-scheme-for-racket > ((#:configure-flags cfg-flags #~'()) > #~`("--disable-x11" > "--threads" ;; ok to potentially duplicate > - #$@(if (%current-target-system) > - (list (string-append "-m=" > - (racket-cs-native-supported- > system?))) > - '()) > + #$(string-append "-m=" (or (racket-cs-native-supported- > system?) > + (nix-system->pbarch-machine- > type))) > + ;; ^ could skip -m= for non-cross non-pbarch builds > + #$@(if (racket-cs-native-supported-system?) > + #~() > + ;; not inferred on non-native platforms: see > + ;; https://racket.discourse.group/t/950/9 > + #~("--enable-libffi" > + "CFLAGS=-g -O2 -D_REENTRANT -pthread" > + "LIBS=-lm -ldl -lrt -lffi -lncurses")) > #$@(if (%current-target-system) > (list (string-append "--toolprefix=" > (%current-target-system) > @@ -543,10 +577,7 @@ (define-public chez-scheme-for-racket > (add-after 'unpack 'chdir > (lambda args > (chdir "racket/src/ChezScheme")))))))) > - ;; TODO: How to build pbarch/pbchunks for other systems? > - ;; See https://racket.discourse.group/t/950 > - (supported-systems (filter racket-cs-native-supported-system? > - %supported-systems)) > + (supported-systems %supported-systems) I don't think this needs to be specified, does it? See the definition in guix/packages.scm: (supported-systems package-supported-systems ; list of strings (default %supported-systems)) Cheers
On Thu, Aug 25, 2022 at 11:24:31AM +0200, Liliana Marie Prikler wrote: > Should be "Support all systems". > > Am Donnerstag, dem 25.08.2022 um 04:54 -0400 schrieb Philip McGrath: > > On systems for which Racket's variant of Chez Scheme cannot generate > > native code, it can use a 'pbarch' machine type: a variant of the > > ``portable bytecode'' backend specialized to word size and endianness. > > This allows Racket CS to replace Racket BC on those systems while > > maintaining comparable performance. (Racket BC lacks JIT support for > > those systems anyway.) It also lets us provide a Chez Scheme package on > > all systems Guix supports. > > > > This patch adds 'pbarch' support to both 'chez-scheme-for-racket' and > > 'racket-vm-cs', but it does not change the Racket VM implementation > > used > > for the 'racket' and 'racket-minimal' packages. > > > > * gnu/packages/chez.scm (nix-system->pbarch-machine-type): New > > variable. > > (chez-scheme-for-racket)[inputs]: Use 'libffi' for non-native systems. > > [arguments]<#:configure-flags>: Always supply '-m='. Add applicable > > flags for non-native systems. > > [supported-systems]: Use '%supported-systems'. > > [description]: Update. > > (chez-scheme-for-racket-bootstrap-bootfiles)[arguments]<#:phases>: > > Adapt > > 'build' phase for non-native systems. > > * gnu/packages/racket.scm (racket-vm-bc)[description]: Update. > > (racket-vm-cs)[description]: Likewise. > > [inputs]: Use 'libffi' for non-native systems. > > [arguments]<#:configure-flags>: Add applicable flags for non-native > > systems. > > --- > > gnu/packages/chez.scm | 76 ++++++++++++++++++++++++++++++----------- > > gnu/packages/racket.scm | 26 +++++++++----- > > 2 files changed, 74 insertions(+), 28 deletions(-) > > > > diff --git a/gnu/packages/chez.scm b/gnu/packages/chez.scm > > index 26f653ea9d..5d152b3db5 100644 > > --- a/gnu/packages/chez.scm > > +++ b/gnu/packages/chez.scm > > @@ -37,6 +37,7 @@ (define-module (gnu packages chez) > > #:use-module (gnu packages compression) > > #:use-module (gnu packages ncurses) > > #:use-module (gnu packages ghostscript) > > + #:use-module (gnu packages libffi) > > #:use-module (gnu packages linux) > > #:use-module (gnu packages netpbm) > > #:use-module (gnu packages racket) > > @@ -49,6 +50,7 @@ (define-module (gnu packages chez) > > #:use-module (srfi srfi-26) > > #:export (chez-scheme-for-system > > racket-cs-native-supported-system? > > + nix-system->pbarch-machine-type > > unpack-nanopass+stex)) > > > > ;; Commentary: > > @@ -231,6 +233,28 @@ (define* (chez-upstream-features-for-system > > #:optional > > (and=> (assoc-ref %chez-features-table chez-os) > > (cut assoc-ref <> chez-arch)))) > > > > +(define* (nix-system->pbarch-machine-type #:optional > > + (system > > + (or (%current-target- > > system) > > + (%current-system))) > > + #:key (threads? #t)) > > + "Return a string naming the pseudo–machine type used by Racket's > > variant of > > +Chez Scheme to represent the appropriate ``pbarch'' backend for > > SYSTEM: that > > +is, the ``portable bytecode'' backend specialized for SYSTEM's word > > size and > > +endianness. The result will name the threaded machine type unless > > THREADS? is > > +provided and is #f." > > + (string-append (if threads? > > + "t" > > + "") > > + "pb" > > + (if (target-64bit? system) > > + "64" > > + "32") > > + ;; missing (guix utils) predicate target-little- > > endian? > > + (if (target-ppc32? system) > > + "b" > > + "l"))) > > + > Don't we already have a function that does something similar? Can't we > add a #:portable-bytecode? keyword to that one? I'm not aware of a function that checks for endianness. The only other place I know of is (guix build-system meson), but there the logic is hand-written. > > (define* (racket-cs-native-supported-system? #:optional > > (system > > (or (%current-target- > > system) > > @@ -449,10 +473,14 @@ (define-public chez-scheme-for-racket > > ;; When updating, remember to also update %racket-version in > > racket.scm. > > (source #f) ; avoid problematic cycle with racket.scm > > (inputs > > - (modify-inputs (package-inputs chez-scheme) > > - (delete "libx11" "util-linux:lib") > > - (replace "chez-scheme-bootstrap-bootfiles" > > - chez-scheme-for-racket-bootstrap-bootfiles))) > > + (let ((inputs (modify-inputs (package-inputs chez-scheme) > > + (replace "chez-scheme-bootstrap-bootfiles" > > + chez-scheme-for-racket-bootstrap-bootfiles) > > + (delete "libx11" "util-linux:lib")))) > > + (if (racket-cs-native-supported-system?) > > + inputs > > + (modify-inputs inputs > > + (prepend libffi))))) > > (native-inputs > > (let ((native-inputs (modify-inputs (package-native-inputs chez- > > scheme) > > (prepend zuo)))) > > @@ -473,10 +501,16 @@ (define-public chez-scheme-for-racket > > ((#:configure-flags cfg-flags #~'()) > > #~`("--disable-x11" > > "--threads" ;; ok to potentially duplicate > > - #$@(if (%current-target-system) > > - (list (string-append "-m=" > > - (racket-cs-native-supported- > > system?))) > > - '()) > > + #$(string-append "-m=" (or (racket-cs-native-supported- > > system?) > > + (nix-system->pbarch-machine- > > type))) > > + ;; ^ could skip -m= for non-cross non-pbarch builds > > + #$@(if (racket-cs-native-supported-system?) > > + #~() > > + ;; not inferred on non-native platforms: see > > + ;; https://racket.discourse.group/t/950/9 > > + #~("--enable-libffi" > > + "CFLAGS=-g -O2 -D_REENTRANT -pthread" > > + "LIBS=-lm -ldl -lrt -lffi -lncurses")) > > #$@(if (%current-target-system) > > (list (string-append "--toolprefix=" > > (%current-target-system) > > @@ -543,10 +577,7 @@ (define-public chez-scheme-for-racket > > (add-after 'unpack 'chdir > > (lambda args > > (chdir "racket/src/ChezScheme")))))))) > > - ;; TODO: How to build pbarch/pbchunks for other systems? > > - ;; See https://racket.discourse.group/t/950 > > - (supported-systems (filter racket-cs-native-supported-system? > > - %supported-systems)) > > + (supported-systems %supported-systems) > I don't think this needs to be specified, does it? > > See the definition in guix/packages.scm: > (supported-systems package-supported-systems ; list of strings > (default %supported-systems)) Unless this package inherits from somewhere else then by default supported-systems is all systems. (Regardless if all dependencies are supported. To see more look at the difference between (package-supported-systems "pandoc") and (package-transitive-supported-systems "pandoc"))
On Thu, Aug 25, 2022, at 6:50 AM, Efraim Flashner wrote: > On Thu, Aug 25, 2022 at 11:24:31AM +0200, Liliana Marie Prikler wrote: >> Should be "Support all systems". >> Thanks. >> Am Donnerstag, dem 25.08.2022 um 04:54 -0400 schrieb Philip McGrath: >> > +(define* (nix-system->pbarch-machine-type #:optional >> > + (system >> > + (or (%current-target- >> > system) >> > + (%current-system))) >> > + #:key (threads? #t)) >> > + "Return a string naming the pseudo–machine type used by Racket's >> > variant of >> > +Chez Scheme to represent the appropriate ``pbarch'' backend for >> > SYSTEM: that >> > +is, the ``portable bytecode'' backend specialized for SYSTEM's word >> > size and >> > +endianness. The result will name the threaded machine type unless >> > THREADS? is >> > +provided and is #f." >> > + (string-append (if threads? >> > + "t" >> > + "") >> > + "pb" >> > + (if (target-64bit? system) >> > + "64" >> > + "32") >> > + ;; missing (guix utils) predicate target-little- >> > endian? >> > + (if (target-ppc32? system) >> > + "b" >> > + "l"))) >> > + >> Don't we already have a function that does something similar? Can't we >> add a #:portable-bytecode? keyword to that one? > > I'm not aware of a function that checks for endianness. The only other > place I know of is (guix build-system meson), but there the logic is > hand-written. > I also don't know of any function we could readily adapt. Thanks for the pointer to (guix build-system meson): I see 'target-ppc32?' is the only big-endian case there as well. >> > @@ -543,10 +577,7 @@ (define-public chez-scheme-for-racket >> > (add-after 'unpack 'chdir >> > (lambda args >> > (chdir "racket/src/ChezScheme")))))))) >> > - ;; TODO: How to build pbarch/pbchunks for other systems? >> > - ;; See https://racket.discourse.group/t/950 >> > - (supported-systems (filter racket-cs-native-supported-system? >> > - %supported-systems)) >> > + (supported-systems %supported-systems) >> I don't think this needs to be specified, does it? >> >> See the definition in guix/packages.scm: >> (supported-systems package-supported-systems ; list of strings >> (default %supported-systems)) > > Unless this package inherits from somewhere else then by default > supported-systems is all systems. (Regardless if all dependencies are > supported. To see more look at the difference between > (package-supported-systems "pandoc") and > (package-transitive-supported-systems "pandoc")) > > 'chez-scheme-for-racket' and 'chez-scheme-for-racket-bootstrap-bootfiles' inherit from 'chez-scheme' and 'chez-scheme-bootstrap-bootfiles', respectively, so we need to override the inherited value. -Philip
diff --git a/gnu/packages/chez.scm b/gnu/packages/chez.scm index 26f653ea9d..5d152b3db5 100644 --- a/gnu/packages/chez.scm +++ b/gnu/packages/chez.scm @@ -37,6 +37,7 @@ (define-module (gnu packages chez) #:use-module (gnu packages compression) #:use-module (gnu packages ncurses) #:use-module (gnu packages ghostscript) + #:use-module (gnu packages libffi) #:use-module (gnu packages linux) #:use-module (gnu packages netpbm) #:use-module (gnu packages racket) @@ -49,6 +50,7 @@ (define-module (gnu packages chez) #:use-module (srfi srfi-26) #:export (chez-scheme-for-system racket-cs-native-supported-system? + nix-system->pbarch-machine-type unpack-nanopass+stex)) ;; Commentary: @@ -231,6 +233,28 @@ (define* (chez-upstream-features-for-system #:optional (and=> (assoc-ref %chez-features-table chez-os) (cut assoc-ref <> chez-arch)))) +(define* (nix-system->pbarch-machine-type #:optional + (system + (or (%current-target-system) + (%current-system))) + #:key (threads? #t)) + "Return a string naming the pseudo–machine type used by Racket's variant of +Chez Scheme to represent the appropriate ``pbarch'' backend for SYSTEM: that +is, the ``portable bytecode'' backend specialized for SYSTEM's word size and +endianness. The result will name the threaded machine type unless THREADS? is +provided and is #f." + (string-append (if threads? + "t" + "") + "pb" + (if (target-64bit? system) + "64" + "32") + ;; missing (guix utils) predicate target-little-endian? + (if (target-ppc32? system) + "b" + "l"))) + (define* (racket-cs-native-supported-system? #:optional (system (or (%current-target-system) @@ -449,10 +473,14 @@ (define-public chez-scheme-for-racket ;; When updating, remember to also update %racket-version in racket.scm. (source #f) ; avoid problematic cycle with racket.scm (inputs - (modify-inputs (package-inputs chez-scheme) - (delete "libx11" "util-linux:lib") - (replace "chez-scheme-bootstrap-bootfiles" - chez-scheme-for-racket-bootstrap-bootfiles))) + (let ((inputs (modify-inputs (package-inputs chez-scheme) + (replace "chez-scheme-bootstrap-bootfiles" + chez-scheme-for-racket-bootstrap-bootfiles) + (delete "libx11" "util-linux:lib")))) + (if (racket-cs-native-supported-system?) + inputs + (modify-inputs inputs + (prepend libffi))))) (native-inputs (let ((native-inputs (modify-inputs (package-native-inputs chez-scheme) (prepend zuo)))) @@ -473,10 +501,16 @@ (define-public chez-scheme-for-racket ((#:configure-flags cfg-flags #~'()) #~`("--disable-x11" "--threads" ;; ok to potentially duplicate - #$@(if (%current-target-system) - (list (string-append "-m=" - (racket-cs-native-supported-system?))) - '()) + #$(string-append "-m=" (or (racket-cs-native-supported-system?) + (nix-system->pbarch-machine-type))) + ;; ^ could skip -m= for non-cross non-pbarch builds + #$@(if (racket-cs-native-supported-system?) + #~() + ;; not inferred on non-native platforms: see + ;; https://racket.discourse.group/t/950/9 + #~("--enable-libffi" + "CFLAGS=-g -O2 -D_REENTRANT -pthread" + "LIBS=-lm -ldl -lrt -lffi -lncurses")) #$@(if (%current-target-system) (list (string-append "--toolprefix=" (%current-target-system) @@ -543,10 +577,7 @@ (define-public chez-scheme-for-racket (add-after 'unpack 'chdir (lambda args (chdir "racket/src/ChezScheme")))))))) - ;; TODO: How to build pbarch/pbchunks for other systems? - ;; See https://racket.discourse.group/t/950 - (supported-systems (filter racket-cs-native-supported-system? - %supported-systems)) + (supported-systems %supported-systems) (home-page "https://github.com/racket/ChezScheme") ;; ^ This is downstream of https://github.com/racket/racket, ;; but it's designed to be a friendly landing place for people @@ -559,13 +590,17 @@ (define-public chez-scheme-for-racket Main additions to Chez Scheme in the Racket variant: @itemize @bullet @item -AArch64 support +AArch64 code generation @item -Portable bytes (@code{pb}) support, which is mainly useful for bootstrapping -a build on any supported platform +Portable bytecode (@code{pb}) mode, which is mainly useful for bootstrapping a +build on any platform, but can also be used on platforms without native-code +generation, compiled via Emscripten, linked with @code{libffi}, or used with +bytecode partially compiled to C @item Unboxed floating-point arithmetic and flvectors @item +Faster multiplication and division for large exact numbers +@item Type reconstruction during optimization (especially for safe code) @item Continuation attachments @@ -576,8 +611,6 @@ (define-public chez-scheme-for-racket @item Ordered finalization, immobile (but collectable) objects, weak/ephemeron generic hash tables, and reference bytevectors -@item -Faster multiplication and division for large exact numbers @end itemize") (license asl2.0))) @@ -655,13 +688,18 @@ (define-public chez-scheme-for-racket-bootstrap-bootfiles "makefiles/boot.zuo" (search-input-file (or native-inputs inputs) "/bin/scheme") - #$(racket-cs-native-supported-system?))) + #$(or (racket-cs-native-supported-system?) + (nix-system->pbarch-machine-type)))) (else ;; bootstrapping #~(invoke (search-input-file (or native-inputs inputs) "/opt/racket-vm/bin/racket") - "rktboot/main.rkt")))))))))) + "rktboot/main.rkt" + #$@(if (racket-cs-native-supported-system?) + #~() + (let ((m (nix-system->pbarch-machine-type))) + #~("--machine" #$m))))))))))))) (supported-systems (package-supported-systems chez-scheme-for-racket)) (home-page "https://github.com/racket/ChezScheme") diff --git a/gnu/packages/racket.scm b/gnu/packages/racket.scm index 90e5e88be5..2fecae31f8 100644 --- a/gnu/packages/racket.scm +++ b/gnu/packages/racket.scm @@ -313,7 +313,7 @@ (define-public racket-vm-cgc (version %racket-version) (source %racket-origin) (inputs (list ncurses ;; <- common to all variants (for #%terminal) - libffi)) ;; <- only for BC variants + libffi)) ;; <- for BC and non-native CS variants (native-inputs (cons* zuo ;; <- for all variants libtool ;; <- only for BC variants (if (%current-target-system) @@ -419,10 +419,8 @@ (define-public racket-vm-bc (description "The Racket BC (``before Chez'' or ``bytecode'') implementation was the default before Racket 8.0. It uses a compiler written in C targeting architecture-independent bytecode, plus a JIT compiler on most -platforms. Racket BC has a different C API and supports a slightly different -set of architectures than the current default runtime system, Racket CS (based -on ``Chez Scheme''). It is the recommended implementation for architectures -that Racket CS doesn't support. +platforms. Racket BC has a different C API than the current default runtime +system, Racket CS (based on ``Chez Scheme''). This package is the normal implementation of Racket BC with a precise garbage collector, 3M (``Moving Memory Manager'').") @@ -435,9 +433,12 @@ (define-public racket-vm-cs (inherit racket-vm-bc) (name "racket-vm-cs") (inputs - (modify-inputs (package-inputs racket-vm-cgc) - (prepend zlib lz4) - (delete "libffi"))) + (let ((inputs (modify-inputs (package-inputs racket-vm-cgc) + (prepend zlib lz4)))) + (if (racket-cs-native-supported-system?) + (modify-inputs inputs + (delete "libffi")) + inputs))) (native-inputs (let ((native-inputs (package-native-inputs racket-vm-cgc))) (modify-inputs (if (%current-target-system) @@ -466,12 +467,19 @@ (define-public racket-vm-cs #+(this-package-native-input "chez-scheme-for-racket") "/bin/scheme") + #$@(if (racket-cs-native-supported-system?) + #~() + #~(#$(string-append "--enable-mach=" + (nix-system->pbarch-machine-type)) + "--enable-pb")) #$racket-vm-common-configure-flags)))) (synopsis "Racket CS implementation") (description "The Racket CS implementation, which uses ``Chez Scheme'' as its core compiler and runtime system, has been the default Racket VM implementation since Racket 8.0. It performs better than the Racket BC -implementation for most programs. +implementation for most programs. On systems for which Racket CS cannot +generate machine code, this package uses a variant of its ``portable +bytecode'' backend specialized for word size and endianness. Using the Racket VM packages directly is not recommended: instead, install the @code{racket-minimal} or @code{racket} packages.")