From patchwork Tue May 3 18:33:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philip McGrath X-Patchwork-Id: 39109 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 CFA5827BBEA; Tue, 3 May 2022 19:36:55 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-3.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS 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 BB18127BBE9 for ; Tue, 3 May 2022 19:36:54 +0100 (BST) Received: from localhost ([::1]:36704 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nlxOH-0000p1-MJ for patchwork@mira.cbaines.net; Tue, 03 May 2022 14:36:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49352) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nlxMW-0000Ee-S5 for guix-patches@gnu.org; Tue, 03 May 2022 14:35:04 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:47165) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nlxMW-0007CH-J6 for guix-patches@gnu.org; Tue, 03 May 2022 14:35:04 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1nlxMW-0002nu-Ga for guix-patches@gnu.org; Tue, 03 May 2022 14:35:04 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#55248] [PATCH 7/7] gnu: chez-scheme-for-system: Adjust support logic. Resent-From: Philip McGrath Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Tue, 03 May 2022 18:35:04 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 55248 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 55248@debbugs.gnu.org Cc: Philip McGrath Received: via spool by 55248-submit@debbugs.gnu.org id=B55248.165160289910719 (code B ref 55248); Tue, 03 May 2022 18:35:04 +0000 Received: (at 55248) by debbugs.gnu.org; 3 May 2022 18:34:59 +0000 Received: from localhost ([127.0.0.1]:41056 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nlxMN-0002mk-P1 for submit@debbugs.gnu.org; Tue, 03 May 2022 14:34:59 -0400 Received: from mail-vs1-f44.google.com ([209.85.217.44]:33428) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nlxML-0002mI-GS for 55248@debbugs.gnu.org; Tue, 03 May 2022 14:34:54 -0400 Received: by mail-vs1-f44.google.com with SMTP id v139so17359631vsv.0 for <55248@debbugs.gnu.org>; Tue, 03 May 2022 11:34:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=philipmcgrath.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=8ycsc98fpE1bZer5wTillA3/L9AMfgXNrFk4vRKwYW0=; b=S3bdUzJNj0LkV4KxShcuj0Dizu64+axTfXkzwNDEFLCN6zWnT1GFLqZRCfwmqdceb9 r/cXE+C6rgSiThVZwM2lZjxwjlsXwNNJRYR/fYUItaNr3aoozIFihFkzh46byA50OVdY qRNNaRwe8YADjT+TmdZc9kJ442IdKfMnFhLq4MbiBmG8jRQ5fN9vd/Qr9f3H5PeFzxfP tbUVmFL/L7a9mfhrayj5e/+LBvkRx4j9rmyjnhDzsZVl6YTR1Dz0tqkS3uLUSR7qKO4H 4F1BFtjoh54GOJ7hVqIyTb6RusOqYCKHTb8YuR4pBHFDz0CtkUJp0Wbx/F6CHdw6Uxrh tpig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8ycsc98fpE1bZer5wTillA3/L9AMfgXNrFk4vRKwYW0=; b=BiYuUZIhkkjrqPN5aYZhYoD1IEnSga0o52y7PeAums8euj1YL044g3pNzvJW1MDyQN Zc2icp8pBMFzfsYIues4Rb6D1P46AGr8x6bUPMvY0Ip+4xuLDeKNp674lIEEVZbWSOSy da4Sk0DFpnw+fONaS5FHEUZ49OHXt2XSF6w8JMokKL42u68YNZROg9j9F8E+cmETxuYe KubGFa8zX5dZbb8t6nKivb5QaIvGg90OaxQE8/LM1TBqiee9vjPDgyr7qcN9xQzKdcI+ 1QaOhy7MnbnFaYnM3DZSAoCw0hD4qCMmEETSd/GJp6eA2yx54bw/dHvbEoYDPSqNqTUL T9rA== X-Gm-Message-State: AOAM532bgGgJTTlphyxfHLvzLbiB87EwOjWzKp6adpea6rlYVAix9X8L aVjyNJdJMB4+dIU85V0qfhapRd6cs4W+VqRu X-Google-Smtp-Source: ABdhPJy5MLXOf5hZY5yLu+TDw+Va/XpHbnCxi3MSiEJZhdfgO5OhX6BhZQeoJMbqQJcXrj+JoYfLPg== X-Received: by 2002:a05:6102:3e8e:b0:31b:aaec:cece with SMTP id m14-20020a0561023e8e00b0031baaeccecemr4899477vsv.42.1651602887554; Tue, 03 May 2022 11:34:47 -0700 (PDT) Received: from localhost (c-73-125-98-51.hsd1.fl.comcast.net. [73.125.98.51]) by smtp.gmail.com with UTF8SMTPSA id g1-20020a056102080100b0032ccd227898sm1537836vsb.1.2022.05.03.11.34.47 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 03 May 2022 11:34:47 -0700 (PDT) From: Philip McGrath Date: Tue, 3 May 2022 14:33:46 -0400 Message-Id: <9ba89b23f86a163679047f113e3524b4352df55d.1651594312.git.philip@philipmcgrath.com> X-Mailer: git-send-email 2.32.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" X-getmail-retrieved-from-mailbox: Patches This is a follow-up to commit b8fc9169515ef1a6d6037c84e30ad308e5418b6f: see . Thanks to Liliana Marie Prikler for pointing out various issues, e.g. that being able to represent a Nix system as a Chez Scheme machine type does not necessarily mean the system is supported! Racket's variant of Chez Scheme does or will soon run even on systems for which native code generation is not supported: see discussion at . This helps us to eliminate unused functions (that may not have been quite right, anyway). * gnu/packages/chez.scm (chez-machine->nonthreaded, chez-machine->threaded, %nix-arch-to-chez-alist, %nix-os-to-chez-alist, chez-machine->nix-system, nix-system->chez-machine): Replace with ... (%chez-features-table, target-chez-arch, target-chez-os): ... these new variables. (chez-upstream-features-for-system): Adapt accordingly. (chez-scheme-bootstrap-bootfiles)[supported-systems]: Use enhanced 'chez-upstream-features-for-system'. (chez-scheme-for-system): Likewise, and use 'chez-scheme-for-racket' on systems without native code generation. (racket-cs-native-supported-system?): New variable. (chez-scheme-for-racket)[supported-systems]: Use it. * gnu/packages/racket.scm (racket-vm-for-system): Likewise. --- gnu/packages/chez.scm | 269 +++++++++++++++++++++++----------------- gnu/packages/racket.scm | 7 +- 2 files changed, 159 insertions(+), 117 deletions(-) diff --git a/gnu/packages/chez.scm b/gnu/packages/chez.scm index ea53cf5774..a61146eb02 100644 --- a/gnu/packages/chez.scm +++ b/gnu/packages/chez.scm @@ -48,9 +48,7 @@ (define-module (gnu packages chez) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:export (chez-scheme-for-system - nix-system->chez-machine - chez-machine->nonthreaded - chez-machine->threaded + racket-cs-native-supported-system? unpack-nanopass+stex)) ;; Commentary: @@ -73,96 +71,17 @@ (define* (chez-scheme-for-system #:optional (%current-system)))) "Return 'chez-scheme' unless only 'chez-scheme-for-racket' supports SYSTEM, including support for native threads." - (if (or - ;; full support upstream - (and=> (chez-upstream-features-for-system system) - (cut memq 'threads <>)) - ;; no support anywhere - (not (nix-system->chez-machine system))) + (if (and=> (chez-upstream-features-for-system system) + (lambda (features) + (every (cut memq <> features) + '(threads + ;; We can cross-compile for platforms without + ;; bootstrap bootfiles, but we can't self-host + ;; on them short of adding more binary seeds. + bootstrap-bootfiles)))) chez-scheme chez-scheme-for-racket)) -(define (chez-machine->nonthreaded machine) - "Given a string MACHINE naming a Chez Scheme machine type, returns a string -naming the nonthreaded machine type for the same architecture and OS as -MACHINE. The returned string may share storage with MACHINE." - ;; Chez Scheme documentation consistently uses "nonthreaded" rather than - ;; e.g. "unthreaded" - (if (eqv? #\t (string-ref machine 0)) - (substring machine 1) - machine)) -(define (chez-machine->threaded machine) - "Like @code{chez-machine->nonthreaded}, but returns the threaded machine -type." - (if (eqv? #\t (string-ref machine 0)) - machine - (string-append "t" machine))) - -;; Based on the implementation from raco-cross-lib/private/cross/platform.rkt -;; in https://github.com/racket/raco-cross. -;; For supported platforms, refer to release_notes/release_notes.stex in the -;; upstream Chez Scheme repository or to racket/src/ChezScheme/README.md -;; in https://github.com/racket/racket. -(define %nix-arch-to-chez-alist - `(("x86_64" . "a6") - ("i386" . "i3") - ("aarch64" . "arm64") - ("armhf" . "arm32") ;; Chez supports ARM v6+ - ("ppc" . "ppc32"))) -(define %nix-os-to-chez-alist - `(("w64-mingw32" . "nt") - ("darwin" . "osx") - ("linux" . "le") - ("freebsd" . "fb") - ("openbsd" . "ob") - ("netbsd" . "nb") - ("solaris" . "s2"))) - -(define (chez-machine->nix-system machine) - "Return the Nix system type corresponding to the Chez Scheme machine type -MACHINE. If MACHINE is not a string representing a known machine type, an -exception is raised. This function does not distinguish between threaded and -nonthreaded variants of MACHINE. - -Note that this function only handles Chez Scheme machine types in the -strictest sense, not other kinds of descriptors sometimes used in place of a -Chez Scheme machine type by Racket, such as @code{\"pb\"}, @code{#f}, or -@code{\"racket\"}. (When using such extensions, the Chez Scheme machine type -for the host system is often still relevant.)" - (let ((machine (chez-machine->nonthreaded machine))) - (let find-arch ((alist %nix-arch-to-chez-alist)) - (match alist - (((nix . chez) . alist) - (if (string-prefix? chez machine) - (string-append - nix "-" (let ((machine-os - (substring machine (string-length chez)))) - (let find-os ((alist %nix-os-to-chez-alist)) - (match alist - (((nix . chez) . alist) - (if (equal? chez machine-os) - nix - (find-os alist))))))) - (find-arch alist))))))) - -(define* (nix-system->chez-machine #:optional - (system (or (%current-target-system) - (%current-system)))) - "Return the Chez Scheme machine type corresponding to the Nix system -identifier SYSTEM, or @code{#f} if the translation of SYSTEM to a Chez Scheme -machine type is undefined. - -It is unspecified whether the resulting string will name a threaded or a -nonthreaded machine type: when the distinction is relevant, use -@code{chez-machine->nonthreaded} or @code{chez-machine->threaded} to adjust -the result." - (let* ((hyphen (string-index system #\-)) - (nix-arch (substring system 0 hyphen)) - (nix-os (substring system (+ 1 hyphen))) - (chez-arch (assoc-ref %nix-arch-to-chez-alist nix-arch)) - (chez-os (assoc-ref %nix-os-to-chez-alist nix-os))) - (and chez-arch chez-os (string-append chez-arch chez-os)))) - (define* (chez-upstream-features-for-system #:optional (system (or (%current-target-system) @@ -172,20 +91,150 @@ (define* (chez-upstream-features-for-system #:optional does not support SYSTEM at all. If native threads are supported, the returned list will include -@code{'threads}. Other feature symbols may be added in the future." +@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* (racket-cs-native-supported-system? #:optional + (system + (or (%current-target-system) + (%current-system)))) + "Can Racket's variant of Chez Scheme generate native code for SYSTEM? +Otherwise, SYSTEM can use only the ``portable bytecode'' backends." + (let ((chez-arch (target-chez-arch system)) + (chez-os (target-chez-os system))) + (and (and=> (assoc-ref %chez-features-table chez-os) + ;; NOT assoc-ref: supported even if cdr is #f + (cut assoc chez-arch <>)) + #t))) + +(define %chez-features-table + ;; An alist of alists mapping: + ;; os -> arch -> (or/c #f (listof symbol?)) + ;; where: + ;; - `os` is a string for the OS part of a Chez Scheme machine type; and + ;; - `arch` is a string for the architecture part of a Chez machine type. + ;; + ;; The absence of an entry for a given arch--os pair means that neither + ;; upstream Chez Scheme nor the Racket variant can generate native code for + ;; that system. (The Racket variant can still provide support via its + ;; ``portable bytecode'' backends and optional compilation to C.) A value + ;; of `#f` means that upstream Chez Scheme does not support the arch--os + ;; pair at all, but the Racket variant does. A list has the same meaning as + ;; a result from `chez-upstream-features-for-system`. + ;; + ;; The arch--os pairs marked "commented out" have been commented out in the + ;; STeX source for the upstream release notes since the initial release as + ;; free software, but they are reported to work and/or have been described + ;; as supported by upstream maintainers. + ;; + ;; For this overall approach to make sense, we assume that Racket's variant + ;; of Chez Scheme can generate native code for a superset of the platforms + ;; supported upstream, supports threads on all platforms it supports at all + ;; (because they are needed for Racket), and doesn't need bootstrap + ;; bootfiles. Those assumptions have held for several years. + '(;; Linux + ("le" + ("i3" threads bootstrap-bootfiles) + ("a6" threads bootstrap-bootfiles) + ("arm32" bootstrap-bootfiles) + ("arm64" . #f) + ("ppc32" threads)) + ;; FreeBSD + ("fb" + ("i3" threads) ;; commented out + ("a6" threads) ;; commented out + ("arm32" . #f) + ("arm64" . #f) + ("ppc32" . #f)) + ;; OpenBSD + ("ob" + ("i3" threads) ;; commented out + ("a6" threads) ;; commented out + ("arm32" . #f) + ("arm64" . #f) + ("ppc32" . #f)) + ;; 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 + ;; 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* (target-chez-arch #:optional (system + (or (%current-target-system) + (%current-system)))) + "Return a string representing the architecture of SYSTEM as used in Chez +Scheme machine types, or '#f' if none is defined." (cond - ((not (nix-system->chez-machine system)) - #f) + ((target-x86-64? system) + "a6") + ((target-x86-32? system) + "i3") ((target-aarch64? system) - #f) + "arm64") ((target-arm32? system) - (and (target-linux? system) - '())) + "arm32") + ((target-ppc64le? system) + #f) ((target-ppc32? system) - (and (target-linux? system) - '(threads))) + "ppc32") + ((target-riscv64? system) + #f) (else - '(threads)))) + #f))) + +(define* (target-chez-os #:optional (system (or (%current-target-system) + (%current-system)))) + "Return a string representing the operating system kernel of SYSTEM as used +in Chez Scheme machine types, or '#f' if none is defined." + ;; e.g. "le" includes both GNU/Linux and Android + (cond + ((target-linux? system) + "le") + ((target-hurd? system) + #f) + ((target-mingw? system) + "nt") + ;; missing (guix utils) predicates + ;; cf. https://github.com/NixOS/nixpkgs/blob/master/lib/systems/doubles.nix + ((string-suffix? "-darwin" system) + "osx") + ((string-suffix? "-freebsd" system) + "fb") + ((string-suffix? "-openbsd" system) + "ob") + ((string-suffix? "-netbsd" system) + "nb") + ;; Nix says "x86_64-solaris", but accommodate "-solaris2" + ((string-contains system "solaris") + "s2") + ;; unknown + (else + #f))) + ;; ;; Chez Scheme: @@ -365,14 +414,9 @@ (define-public chez-scheme ((pth) (symlink pth "csug.pdf"))))))))) - ;; Chez Scheme does not have a MIPS backend. - ;; FIXME: Debian backports patches to get armhf working. - ;; We should too. It is the Chez machine type arm32le - ;; (no threaded version upstream yet, though there is in - ;; Racket's fork), more specifically (per the release notes) ARMv6. (supported-systems (delete - "armhf-linux" ;; <-- should work, but reportedly broken + "armhf-linux" ;; XXX is this still broken? (filter chez-upstream-features-for-system %supported-systems))) (home-page "https://cisco.github.io/ChezScheme/") @@ -418,7 +462,9 @@ (define-public chez-scheme-for-racket (add-after 'unpack 'chdir (lambda args (chdir "racket/src/ChezScheme")))))))) - (supported-systems (filter nix-system->chez-machine + ;; 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)) (home-page "https://github.com/racket/ChezScheme") ;; ^ This is downstream of https://github.com/racket/racket, @@ -471,16 +517,9 @@ (define-public chez-scheme-bootstrap-bootfiles (list #:install-plan #~`(("boot/" "lib/chez-scheme-bootfiles")))) (supported-systems - ;; Upstream only distributes pre-built bootfiles for - ;; arm32le and t?(i3|a6)(le|nt|osx) (filter (lambda (system) - (let ((machine (and=> (nix-system->chez-machine system) - chez-machine->nonthreaded))) - (or (equal? "arm32le" machine) - (and machine - (member (substring machine 0 2) '("i3" "a6")) - (or-map (cut string-suffix? <> machine) - '("le" "nt" "osx")))))) + (and=> (chez-upstream-features-for-system system) + (cut memq 'bootstrap-bootfiles <>))) %supported-systems)) (synopsis "Chez Scheme bootfiles (binary seed)") (description diff --git a/gnu/packages/racket.scm b/gnu/packages/racket.scm index 2f4f7cebd8..41f45f4215 100644 --- a/gnu/packages/racket.scm +++ b/gnu/packages/racket.scm @@ -190,8 +190,11 @@ (define-module (gnu packages racket) (define* (racket-vm-for-system #:optional (system (or (%current-target-system) (%current-system)))) - "Return 'racket-vm-cs' if it supports SYSTEM; 'racket-vm-bc' otherwise." - (if (nix-system->chez-machine system) + "Return 'racket-vm-cs' we are able to build it for SYSTEM; 'racket-vm-bc' +otherwise." + ;; Once we figure out the issues in https://racket.discourse.group/t/950, + ;; we can use 'racket-vm-cs' everywhere. + (if (racket-cs-native-supported-system? system) racket-vm-cs racket-vm-bc))