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