@@ -38,6 +38,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)
@@ -50,6 +51,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:
@@ -232,6 +234,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)
@@ -453,10 +477,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
+ (append libffi)))))
(native-inputs
(let ((native-inputs (modify-inputs (package-native-inputs chez-scheme)
(append zuo))))
@@ -477,10 +505,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)
@@ -547,10 +581,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
@@ -563,13 +594,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
@@ -580,8 +615,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)))
@@ -659,13 +692,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")
@@ -331,7 +331,7 @@ (define-public racket-vm-cgc
(source %racket-origin)
(inputs (list ncurses ;; <- common to all variants (for #%terminal)
bash-minimal ;; <- common to all variants (for `system`)
- 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)
@@ -437,10 +437,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'').")
@@ -453,9 +451,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)
@@ -484,12 +485,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.")