gnu: Add scheme48-prescheme.
* gnu/packages/scheme.scm (scheme48-prescheme): New variable. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
parent
96739561b8
commit
47a14185b1
1 changed files with 132 additions and 0 deletions
|
@ -20,6 +20,7 @@
|
||||||
;;; Copyright © 2022 Morgan Smith <Morgan.J.Smith@outlook.com>
|
;;; Copyright © 2022 Morgan Smith <Morgan.J.Smith@outlook.com>
|
||||||
;;; Copyright © 2022 jgart <jgart@dismail.de>
|
;;; Copyright © 2022 jgart <jgart@dismail.de>
|
||||||
;;; Copyright © 2022 Robby Zambito <contact@robbyzambito.me>
|
;;; Copyright © 2022 Robby Zambito <contact@robbyzambito.me>
|
||||||
|
;;; Copyright © 2023 Andrew Whatson <whatson@tailcall.au>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -41,6 +42,7 @@
|
||||||
#:use-module ((guix licenses)
|
#:use-module ((guix licenses)
|
||||||
#:select (gpl2+ lgpl2.0+ lgpl2.1 lgpl2.1+ lgpl3+ asl2.0 bsd-3
|
#:select (gpl2+ lgpl2.0+ lgpl2.1 lgpl2.1+ lgpl3+ asl2.0 bsd-3
|
||||||
cc-by-sa4.0 non-copyleft expat public-domain))
|
cc-by-sa4.0 non-copyleft expat public-domain))
|
||||||
|
#:use-module (guix gexp)
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module (guix download)
|
#:use-module (guix download)
|
||||||
#:use-module (guix git-download)
|
#:use-module (guix git-download)
|
||||||
|
@ -409,6 +411,136 @@ implementation techniques and as an expository tool.")
|
||||||
;; Most files are BSD-3; see COPYING for the few exceptions.
|
;; Most files are BSD-3; see COPYING for the few exceptions.
|
||||||
(license bsd-3)))
|
(license bsd-3)))
|
||||||
|
|
||||||
|
(define-public scheme48-prescheme
|
||||||
|
(package
|
||||||
|
(inherit scheme48)
|
||||||
|
(name "scheme48-prescheme")
|
||||||
|
(arguments
|
||||||
|
(list
|
||||||
|
#:tests? #f ; tests only cover scheme48
|
||||||
|
#:modules '((guix build gnu-build-system)
|
||||||
|
(guix build utils)
|
||||||
|
(ice-9 popen)
|
||||||
|
(srfi srfi-1))
|
||||||
|
#:phases
|
||||||
|
#~(modify-phases %standard-phases
|
||||||
|
(add-after 'configure 'patch-prescheme-version
|
||||||
|
(lambda _
|
||||||
|
;; Ensure the Pre-Scheme version matches the package version
|
||||||
|
(call-with-output-file "ps-compiler/minor-version-number"
|
||||||
|
(lambda (port)
|
||||||
|
(let* ((version #$(package-version this-package))
|
||||||
|
(vparts (string-split version #\.))
|
||||||
|
(vminor (string-join (drop vparts 1) ".")))
|
||||||
|
(write vminor port))))))
|
||||||
|
(add-after 'configure 'patch-prescheme-headers
|
||||||
|
(lambda _
|
||||||
|
;; Rename "io.h" to play nicely with others
|
||||||
|
(copy-file "c/io.h" "c/prescheme-io.h")
|
||||||
|
(substitute* "c/prescheme.h"
|
||||||
|
(("^#include \"io\\.h\"")
|
||||||
|
"#include \"prescheme-io.h\""))))
|
||||||
|
(add-after 'configure 'generate-pkg-config
|
||||||
|
(lambda _
|
||||||
|
;; Generate a pkg-config file
|
||||||
|
(call-with-output-file "prescheme.pc"
|
||||||
|
(lambda (port)
|
||||||
|
(let ((s48-version #$(package-version scheme48))
|
||||||
|
(version #$(package-version this-package)))
|
||||||
|
(format port (string-join
|
||||||
|
'("prefix=~a"
|
||||||
|
"exec_prefix=${prefix}"
|
||||||
|
"libdir=${prefix}/lib/scheme48-~a"
|
||||||
|
"includedir=${prefix}/include"
|
||||||
|
""
|
||||||
|
"Name: Pre-Scheme (Scheme 48)"
|
||||||
|
"Description: Pre-Scheme C runtime"
|
||||||
|
"Version: ~a"
|
||||||
|
"Libs: -L${libdir} -lprescheme"
|
||||||
|
"Cflags: -I${includedir}")
|
||||||
|
"\n" 'suffix)
|
||||||
|
#$output s48-version version))))))
|
||||||
|
(add-after 'configure 'generate-prescheme-wrapper
|
||||||
|
(lambda _
|
||||||
|
;; Generate a wrapper to load and run ps-compiler.image
|
||||||
|
(call-with-output-file "prescheme"
|
||||||
|
(lambda (port)
|
||||||
|
(let ((s48-version #$(package-version scheme48)))
|
||||||
|
(format port (string-join
|
||||||
|
'("#!/bin/sh"
|
||||||
|
"scheme48=~a/lib/scheme48-~a/scheme48vm"
|
||||||
|
"prescheme=~a/lib/scheme48-~a/prescheme.image"
|
||||||
|
"exec ${scheme48} -i ${prescheme} \"$@\"")
|
||||||
|
"\n" 'suffix)
|
||||||
|
#$scheme48 s48-version #$output s48-version))))
|
||||||
|
(chmod "prescheme" #o755)))
|
||||||
|
(replace 'build
|
||||||
|
(lambda _
|
||||||
|
;; Build a minimal static library for linking Pre-Scheme code
|
||||||
|
(let ((lib "c/libprescheme.a")
|
||||||
|
(objs '("c/unix/io.o"
|
||||||
|
"c/unix/misc.o")))
|
||||||
|
(apply invoke "make" objs)
|
||||||
|
(apply invoke "ar" "rcs" lib objs))
|
||||||
|
;; Dump a Scheme 48 image with both the Pre-Scheme compatibility
|
||||||
|
;; library and compiler pre-loaded, courtesy of Taylor Campbell's
|
||||||
|
;; Pre-Scheme Manual:
|
||||||
|
;; https://groups.scheme.org/prescheme/1.3/#Invoking-the-Pre_002dScheme-compiler
|
||||||
|
(with-directory-excursion "ps-compiler"
|
||||||
|
(let ((version #$(package-version this-package))
|
||||||
|
(port (open-pipe* OPEN_WRITE "scheme48")))
|
||||||
|
(format port (string-join
|
||||||
|
'(",batch"
|
||||||
|
",config ,load ../scheme/prescheme/interface.scm"
|
||||||
|
",config ,load ../scheme/prescheme/package-defs.scm"
|
||||||
|
",exec ,load load-ps-compiler.scm"
|
||||||
|
",in prescheme-compiler prescheme-compiler"
|
||||||
|
",user (define prescheme-compiler ##)"
|
||||||
|
",dump ../prescheme.image \"(Pre-Scheme ~a)\""
|
||||||
|
",exit")
|
||||||
|
"\n" 'suffix)
|
||||||
|
version)
|
||||||
|
(close-pipe port)))))
|
||||||
|
(replace 'install
|
||||||
|
(lambda _
|
||||||
|
(let* ((s48-version #$(package-version scheme48))
|
||||||
|
(bin-dir (string-append #$output "/bin"))
|
||||||
|
(lib-dir (string-append #$output "/lib/scheme48-" s48-version))
|
||||||
|
(pkgconf-dir (string-append #$output "/lib/pkgconfig"))
|
||||||
|
(share-dir (string-append #$output "/share/scheme48-" s48-version))
|
||||||
|
(include-dir (string-append #$output "/include")))
|
||||||
|
;; Install Pre-Scheme compiler image
|
||||||
|
(install-file "prescheme" bin-dir)
|
||||||
|
(install-file "prescheme.image" lib-dir)
|
||||||
|
;; Install Pre-Scheme config, headers, and lib
|
||||||
|
(install-file "prescheme.pc" pkgconf-dir)
|
||||||
|
(install-file "c/prescheme.h" include-dir)
|
||||||
|
(install-file "c/prescheme-io.h" include-dir)
|
||||||
|
(install-file "c/libprescheme.a" lib-dir)
|
||||||
|
;; Install Pre-Scheme sources
|
||||||
|
(copy-recursively "scheme/prescheme"
|
||||||
|
(string-append share-dir "/prescheme"))
|
||||||
|
(copy-recursively "ps-compiler"
|
||||||
|
(string-append share-dir "/ps-compiler"))
|
||||||
|
;; Remove files specific to building the Scheme 48 VM
|
||||||
|
(for-each (lambda (file)
|
||||||
|
(delete-file (string-append share-dir "/" file)))
|
||||||
|
'("ps-compiler/compile-bibop-gc-32.scm"
|
||||||
|
"ps-compiler/compile-bibop-gc-64.scm"
|
||||||
|
"ps-compiler/compile-gc.scm"
|
||||||
|
"ps-compiler/compile-twospace-gc-32.scm"
|
||||||
|
"ps-compiler/compile-twospace-gc-64.scm"
|
||||||
|
"ps-compiler/compile-vm-no-gc-32.scm"
|
||||||
|
"ps-compiler/compile-vm-no-gc-64.scm"))))))))
|
||||||
|
(propagated-inputs (list scheme48))
|
||||||
|
(home-page "http://s48.org/")
|
||||||
|
(synopsis "Pre-Scheme compiler from Scheme 48")
|
||||||
|
(description
|
||||||
|
"Pre-Scheme is a statically compilable dialect of Scheme, used to implement the
|
||||||
|
Scheme 48 virtual machine. Scheme 48 ships with a Pre-Scheme to C compiler written
|
||||||
|
in Scheme, and a runtime library which allows Pre-Scheme code to run as Scheme.")
|
||||||
|
(license bsd-3)))
|
||||||
|
|
||||||
(define-public gambit-c
|
(define-public gambit-c
|
||||||
(package
|
(package
|
||||||
(name "gambit-c")
|
(name "gambit-c")
|
||||||
|
|
Reference in a new issue