#| Copyright (C) 2025 Peter McGoron | | This program is free software: you can redistribute it and/or modify it | under the terms of the GNU General Public License as published by the | Free Software Foundation, either version 3 of the License, or (at your | option) any later version. | | This program is distributed in the hope that it will be useful, but | WITHOUT ANY WARRANTY; without even the implied warranty of | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | General Public License for more details. | | You should have received a copy of the GNU General Public License along | with this program. If not, see . |# (define-module (mcgoron guix scheme-packages) #:use-module (guix packages) #:use-module (gnu packages) #:use-module (guix licenses) #:use-module (guix git-download) #:use-module (guix download) #:use-module (gnu packages version-control) #:use-module (gnu packages bash) #:use-module (guix build-system gnu) #:use-module (guix build-system) #:use-module (guix build-system copy) #:use-module (guix build-system trivial) #:use-module (gnu packages scheme) #:use-module (gnu packages cmake) #:use-module (guix build-system cmake) #:use-module (gnu packages compression) #:use-module (gnu packages bdw-gc) #:use-module (gnu packages libffi) #:use-module (gnu packages tls) #:use-module (guix gexp)) ;;;;;;;;;;;;; ;;;; Portable ;;;;;;;;;;;;; (define-public r7rs-lib-dir "share/scheme/r7rs") (define-public r6rs-lib-dir "share/scheme/r6rs") (define-public (default-copying-build-system name desc dir) (let ((lower* (build-system-lower copy-build-system))) (build-system (name name) (description desc) (lower (lambda args (apply lower* (if (memq #:install-plan args) args (append args (list #:install-plan `'(("." ,(string-append dir "/")))))))))))) (define-public portable-r7rs-build-system (default-copying-build-system 'r7rs "Copy Scheme libraries into R7RS directory" r7rs-lib-dir)) (define-public hello-world-r7rs (package (name "hello-world-r7rs") (version "1.0.0") (synopsis "Prints hello world") (description "A test library for packages that respect R7RS_LIBRARY_PATH") (license public-domain) (home-page "https://example.com") (build-system portable-r7rs-build-system) (source (origin (method url-fetch) (uri "https://florida.moe/ftp/hello-world-r7rs/1.0.0.tar.gz") (sha256 (base32 "1cx9p2mz3cmn02imp137vqmq8aw3mh5s23ybprgkc8pshgmaf8jn")))))) (define-public r7rs-search-path-specification (search-path-specification (variable "R7RS_LIBRARY_PATH") (files (list r7rs-lib-dir)))) (define* (package/path imported-package package-name synopsis description binary-name target-binary-name impl-envar guix-impl-envar portable-envar #:optional (set-environment-beforehand "")) (package (name (string-append package-name "-with-path")) (synopsis synopsis) (description description) (version "1.0.0") (source #f) (license gpl3+) (build-system trivial-build-system) (home-page "https://florida.moe/guix-scheme") (arguments `(#:modules ((guix build utils)) #:builder (begin (use-modules (guix build utils)) (let* ((bin (assoc-ref %outputs "out")) (impl (string-append (assoc-ref %build-inputs ,package-name) ,binary-name)) (sh (string-append (assoc-ref %build-inputs "bash-minimal") "/bin/bash")) (script (string-append bin ,target-binary-name))) (mkdir-p (dirname script)) (with-output-to-file script (lambda () (format #t "#!~a if [ -z \"$~a\" ] && [ -z \"$~a\" ]; then exec -a $0 \"~a\" \"$@\" else ~a ~a=\"${~a:+${~a}:}${~a:+${~a}:}${~a:+${~a}:}\" exec -a $0 \"~a\" \"$@\" fi" sh ,guix-impl-envar ,portable-envar impl ,set-environment-beforehand ,impl-envar ,impl-envar ,impl-envar ,guix-impl-envar ,guix-impl-envar ,portable-envar ,portable-envar impl))) (chmod script #o755))))) (inputs (list imported-package bash-minimal)) (native-inputs (list imported-package bash-minimal)) (native-search-paths (list (search-path-specification (variable guix-impl-envar) (files (list foment-lib-dir))) r7rs-search-path-specification)))) ;;;;;;;;;;;;;; ;;;; Foment ;;;;;;;;;;;;;; (define-public foment-lib-dir "share/foment") (define-public foment-build-system (default-copying-build-system 'foment-scheme "Copy Scheme libraries into Foment Scheme directory" foment-lib-dir)) (define-public foment (package (name "foment") (version "0.4.1-1.6089c3c") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/leftmike/foment") (commit "6089c3c9e762875f619ef382d27943819bbe002b"))) (sha256 (base32 "1a6q8qfd6ggc6fl9lf1d8m20q8k498jrswc4qcn3bb7rkq4w258a")) #;(patches (search-patches "mcgoron/guix/patches/foment-0.4.1-library-path.patch")))) (build-system gnu-build-system) (arguments (list #:phases #~(modify-phases %standard-phases (delete 'configure) (add-before 'build 'patch-makefile (lambda* (#:key outputs #:allow-other-keys) (substitute* "unix/makefile" (("sudo *") "") (("git rev-parse --abbrev-ref HEAD") "echo \"master\"") (("git rev-parse --short HEAD") "echo 6089c3c")) ;; Replace hardcoded path /bin/sh with the current interpreter. ;; This follows what racket does: ;; https://issues.guix.gnu.org/47180 (substitute* "src/base.scm" (("\"/bin/sh\"") (let ((sh (which "sh"))) (string-append "(if (file-exists? \"" sh "\")\n" " \"" sh "\"\n" " \"/bin/sh\")")))))) (replace 'build (lambda _ (with-directory-excursion "unix" (invoke "make")))) (replace 'check (lambda* (#:key tests? #:allow-other-keys) (when tests? (with-directory-excursion "unix" (invoke "make" "test") (invoke "make" "stress-test"))))) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let ((bin (string-append (assoc-ref outputs "out") "/bin"))) (install-file "unix/release/foment" bin) (copy-recursively "unix/debug/foment" (string-append bin "/foment-debug")))))))) (home-page "https://github.com/leftmike/foment") (synopsis "Foment is an implementation of R7RS Scheme.") (license expat) (inputs '()) (native-inputs (list bash)) (description "Foment is an implementation of R7RS Scheme written in C++ with support for continuation marks and many SRFIs."))) (define-public foment-with-path (package/path foment "foment" "Foment with Guix paths" "Wrapper for Foment Scheme that adds Guix-managed paths to Foment search path" "/bin/foment" "/bin/foment" "FOMENT_LIBPATH" "GUIX_FOMENT_PATH" "R7RS_LIBRARY_PATH")) ;;;;;;;;;;;;;;;;;;; ;;;; Chibi ;;;;;;;;;;;;;;;;;;; (define-public chibi-lib-dir "share/guix-chibi") (define-public chibi-binlib-dir "lib/guix-chibi") (define-public chibi-scheme-build-system (default-copying-build-system 'chibi-scheme "Copy Scheme libraries into Chibi Scheme directory" foment-lib-dir)) #;(define-public chibi-scheme-with-path (package (name "chibi-scheme-with-path") (home-page "https://github.com/ashinn/chibi-scheme") (version "0.11") (source #f) (native-search-paths (list (search-path-specification (variable "GUIX_CHIBI_PATH") (files (list chibi-lib-dir chibi-binlib-dir))) r7rs-search-path-specification)))) ;;;;;;;;;;;;;;;; ;;;; Sagittarius ;;;;;;;;;;;;;;;; (define-public sagittarius-lib-dir "share/guix-sagittarius") (define-public sagittarius-scheme-build-system (default-copying-build-system 'sagittarius "Copy Scheme libraries into Sagittarius directory" foment-lib-dir)) (define-public sagittarius-scheme (package (name "sagittarius-scheme") (version "0.9.13") (source (origin (method url-fetch) (uri "https://github.com/ktakashi/sagittarius-scheme/releases/download/v0.9.13/sagittarius-0.9.13.tar.gz") (patches (search-patches "mcgoron/guix/patches/sagittarius-scheme-0.9.13-library-path.patch")) (sha256 (base32 "0wspsv7mr1lchv0lfc50s750a358534pgri1c2fqlws31hci5y4c")))) (build-system cmake-build-system) (arguments '(#:phases (modify-phases %standard-phases ;; Tests don't work yet. Issues with network. (delete 'check)))) (inputs (list libgc zlib libffi openssl)) (home-page "https://ktakashi.github.io/") (synopsis "Script interpreter with many built-in libraries") (license bsd-2) (description "Sagittarius Scheme is a R6RS/R7RS Scheme implementation with a lot of practical libraries, especially cryptographic libraries.")))