gnu: chez-scheme: Update and simplify machine-type handling.

Since Chez Scheme 10.0.0 supports all of the backends added in Racket's
branch, the complexity of '%chez-features-table' is no longer needed.
Ideally, even more of this logic could be maintained upstream, but this
change will simplify maintenance in the mean time.

* gnu/packages/chez.scm (target-chez-arch): Recognize loongarch64.
(chez-upsteam-features-for-system): Remove function.
(%chez-features-table): Replace with ...
(define-machine-types, %machine-types): ... this new macro and variable,
using the list copied directly from the Chez Scheme source code.
(nix-system->pbarch-machine-type): Update docstring, since pbarch
machine types are supported upstream as of Chez Scheme 10.0.0.
(racket-cs-native-supported-system?): Replace with ...
(nix-system->native-chez-machine-type): ... this new function,
implemented using '%machine-types'.
(chez-scheme-for-racket): Update accordingly.
(chez-scheme-for-racket-bootstrap-bootfiles): Likewise.
* gnu/packages/racket.scm (racket-vm-cs): Likewise.

Change-Id: I46efebaf48cce388075ab4873c16a6f5f9692bb7
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Philip McGrath 2024-04-01 02:51:12 -04:00 committed by Ludovic Courtès
parent c3930c8bb0
commit 9d407205e8
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 81 additions and 120 deletions

View file

@ -50,7 +50,7 @@
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-26) #:use-module (srfi srfi-26)
#:export (chez-scheme-for-system #:export (chez-scheme-for-system
racket-cs-native-supported-system? nix-system->native-chez-machine-type
nix-system->pbarch-machine-type nix-system->pbarch-machine-type
unpack-nanopass)) unpack-nanopass))
@ -93,6 +93,8 @@ Scheme machine types, or '#f' if none is defined."
"ppc32") "ppc32")
((target-riscv64? system) ((target-riscv64? system)
"rv64") "rv64")
((string-prefix? "loongarch64-" system)
"la64")
(else (else
#f))) #f)))
@ -127,111 +129,67 @@ in Chez Scheme machine types, or '#f' if none is defined."
(else (else
#f))) #f)))
(define %chez-features-table (define-syntax define-machine-types
;; An alist of alists mapping: (lambda (stx)
;; os -> arch -> (or/c #f (listof symbol?)) (syntax-case stx (any)
;; where: ((_ any id0 id ...)
;; - `os` is a string for the OS part of a Chez Scheme machine type; and #`(define #,(datum->syntax #'id0 '%machine-types)
;; - `arch` is a string for the architecture part of a Chez machine type. '(id0 id ...))))))
;; ;; The following is copied from s/cmacros.ss, line 36, in the Chez source
;; The absence of an entry for a given arch--os pair means that neither (define-machine-types
;; upstream Chez Scheme nor the Racket variant can generate native code for any
;; that system. (The Racket variant can still provide support via its pb tpb
;; ``portable bytecode'' backends and optional compilation to C.) A value pb32l tpb32l
;; of `#f` means that upstream Chez Scheme does not support the arch--os pb32b tpb32b
;; pair at all, but the Racket variant does. A list has the same meaning as pb64l tpb64l
;; a result from `chez-upstream-features-for-system`. pb64b tpb64b
;; i3nt ti3nt
;; The arch--os pairs marked "commented out" have been commented out in the i3osx ti3osx
;; STeX source for the upstream release notes since the initial release as i3le ti3le
;; free software, but they are reported to work and/or have been described i3fb ti3fb
;; as supported by upstream maintainers. i3ob ti3ob
;; i3nb ti3nb
;; For this overall approach to make sense, we assume that Racket's variant i3s2 ti3s2
;; of Chez Scheme can generate native code for a superset of the platforms i3qnx ti3qnx
;; supported upstream, supports threads on all platforms it supports at all i3gnu ti3gnu
;; (because they are needed for Racket), and doesn't need bootstrap a6nt ta6nt
;; bootfiles. Those assumptions have held for several years. a6osx ta6osx
'(;; Linux a6le ta6le
("le" a6fb ta6fb
("i3" threads bootstrap-bootfiles) a6ob ta6ob
("a6" threads bootstrap-bootfiles) a6nb ta6nb
("arm32" bootstrap-bootfiles) a6s2 ta6s2
("arm64" . #f) ppc32osx tppc32osx
("rv64" . #f) ppc32le tppc32le
("ppc32" threads)) ppc32fb tppc32fb
;; Hurd ppc32ob tppc32ob
("gnu" ppc32nb tppc32nb
("i3" . #f)) arm32le tarm32le
;; FreeBSD arm32fb tarm32fb
("fb" arm32ob tarm32ob
("i3" threads) ;; commented out arm32nb tarm32nb
("a6" threads) ;; commented out arm64nt tarm64nt
("arm32" . #f) arm64osx tarm64osx
("arm64" . #f) arm64le tarm64le
("ppc32" . #f)) arm64fb tarm64fb
;; OpenBSD arm64ob tarm64ob
("ob" arm64nb tarm64nb
("i3" threads) ;; commented out rv64le trv64le
("a6" threads) ;; commented out rv64fb trv64fb
("arm32" . #f) rv64ob trv64ob
("arm64" . #f) rv64nb trv64nb
("ppc32" . #f)) la64le tla64le
;; NetBSD )
("nb"
("i3" threads) ;; commented out
("a6" threads) ;; commented out
("arm32" . #f)
("arm64" . #f)
("ppc32" . #f))
;; OpenSolaris / OpenIndiana / Illumos
("s2"
("i3" threads) ;; commented out
("a6" threads)) ;; commented out
;; QNX
("qnx"
("i3" . #f))
;; Windows
("nt"
("i3" threads bootstrap-bootfiles)
("a6" threads bootstrap-bootfiles)
;; ^ threads "experiemental", but reportedly fine
("arm64" . #f))
;; Darwin
("osx"
("i3" threads bootstrap-bootfiles)
("a6" threads bootstrap-bootfiles)
("arm64" . #f)
("ppc32" . #f))))
(define* (chez-upstream-features-for-system #:optional
(system
(or (%current-target-system)
(%current-system))))
"Return a list of symbols naming features supported by upstream Chez Scheme
for the Nix system identifier SYSTEM, or @code{#f} if upstream Chez Scheme
does not support SYSTEM at all.
If native threads are supported, the returned list will include
@code{'threads}. If bootstrap bootfiles for SYSTEM are distributed in the
upstream Chez Scheme repository, the returned list will include
@code{'bootstrap-bootfiles}. Other feature symbols may be added in the
future."
(let ((chez-arch (target-chez-arch system))
(chez-os (target-chez-os system)))
(and=> (assoc-ref %chez-features-table chez-os)
(cut assoc-ref <> chez-arch))))
(define* (nix-system->pbarch-machine-type #:optional (define* (nix-system->pbarch-machine-type #:optional
(system (system
(or (%current-target-system) (or (%current-target-system)
(%current-system))) (%current-system)))
#:key (threads? #t)) #:key (threads? #t))
"Return a string naming the pseudomachine type used by Racket's variant of "Return a string naming the Chez Scheme machine type of the appropriate
Chez Scheme to represent the appropriate ``pbarch'' backend for SYSTEM: that ``pbarch'' backend for SYSTEM: that is, the ``portable bytecode'' backend
is, the ``portable bytecode'' backend specialized for SYSTEM's word size and specialized for SYSTEM's word size and endianness. The result will name the
endianness. The result will name the threaded machine type unless THREADS? is threaded machine type unless THREADS? is provided as #f."
provided and is #f."
(string-append (if threads? (string-append (if threads?
"t" "t"
"") "")
@ -243,20 +201,23 @@ provided and is #f."
"l" "l"
"b"))) "b")))
(define* (racket-cs-native-supported-system? #:optional (define* (nix-system->native-chez-machine-type #:optional
(system (system
(or (%current-target-system) (or (%current-target-system)
(%current-system)))) (%current-system)))
"Can Racket's variant of Chez Scheme generate native code for SYSTEM? If #:key (threads? #t))
so, return the applicable machine type as a string. Otherwise, when SYSTEM "Return a string naming the Chez Scheme machine type of the native-code
can use only the ``portable bytecode'' backends, return #f." backend for SYSTEM, if such a native-code backend exists. Otherwise, when
(let ((chez-arch (target-chez-arch system)) SYSTEM can use only the ``portable bytecode'' backends, return #f. The result
(chez-os (target-chez-os system))) will name the threaded machine type unless THREADS? is provided as #f."
(and (and=> (assoc-ref %chez-features-table chez-os) (let* ((chez-arch (target-chez-arch system))
;; NOT assoc-ref: supported even if cdr is #f (chez-os (target-chez-os system))
(cut assoc chez-arch <>)) (machine
(string-append "t" chez-arch chez-os)))) (and chez-arch chez-os
(string-append (if threads? "t" "") chez-arch chez-os))))
(and machine
(memq (string->symbol machine) %machine-types)
machine)))
;; ;;
;; Chez Scheme: ;; Chez Scheme:
;; ;;
@ -300,7 +261,7 @@ can use only the ``portable bytecode'' backends, return #f."
(version "9.9.9-pre-release.23") (version "9.9.9-pre-release.23")
(source #f) (source #f)
(build-system gnu-build-system) (build-system gnu-build-system)
(inputs `(,@(if (racket-cs-native-supported-system?) (inputs `(,@(if (nix-system->native-chez-machine-type)
'() '()
(list libffi)) (list libffi))
,chez-scheme-for-racket-bootstrap-bootfiles ,chez-scheme-for-racket-bootstrap-bootfiles
@ -353,10 +314,10 @@ can use only the ``portable bytecode'' backends, return #f."
(search-input-directory %build-inputs "/include/X11")) (search-input-directory %build-inputs "/include/X11"))
'() '()
'("--disable-x11")) '("--disable-x11"))
#$(string-append "-m=" (or (racket-cs-native-supported-system?) #$(string-append "-m=" (or (nix-system->native-chez-machine-type)
(nix-system->pbarch-machine-type))) (nix-system->pbarch-machine-type)))
;; ^ could skip -m= for non-cross non-pbarch builds ;; ^ could skip -m= for non-cross non-pbarch builds
#$@(if (racket-cs-native-supported-system?) #$@(if (nix-system->native-chez-machine-type)
#~() #~()
;; not inferred on non-native platforms: see ;; not inferred on non-native platforms: see
;; https://racket.discourse.group/t/950/9 ;; https://racket.discourse.group/t/950/9
@ -588,7 +549,7 @@ with reliability taking precedence over efficiency if necessary.")
(invoke "./configure" (invoke "./configure"
"--force" ; don't complain about missing bootfiles "--force" ; don't complain about missing bootfiles
#$(string-append #$(string-append
"-m=" (or (racket-cs-native-supported-system?) "-m=" (or (nix-system->native-chez-machine-type)
(nix-system->pbarch-machine-type))) (nix-system->pbarch-machine-type)))
"ZUO=zuo" "ZUO=zuo"
;; ignore submodules: ;; ignore submodules:

View file

@ -433,7 +433,7 @@ collector, 3M (``Moving Memory Manager'').")
(inputs (inputs
(let ((inputs (modify-inputs (package-inputs racket-vm-cgc) (let ((inputs (modify-inputs (package-inputs racket-vm-cgc)
(prepend zlib lz4)))) (prepend zlib lz4))))
(if (racket-cs-native-supported-system?) (if (nix-system->native-chez-machine-type)
(modify-inputs inputs (modify-inputs inputs
(delete "libffi")) (delete "libffi"))
inputs))) inputs)))
@ -461,7 +461,7 @@ collector, 3M (``Moving Memory Manager'').")
#+(this-package-native-input #+(this-package-native-input
"chez-scheme-for-racket") "chez-scheme-for-racket")
"/bin/scheme") "/bin/scheme")
#$@(if (racket-cs-native-supported-system?) #$@(if (nix-system->native-chez-machine-type)
#~() #~()
#~(#$(string-append "--enable-mach=" #~(#$(string-append "--enable-mach="
(nix-system->pbarch-machine-type)) (nix-system->pbarch-machine-type))