[PATCH 0/5] Add build system for Gerbil Scheme

OpenSubmitted by Xinglu Chen.
Details
3 participants
  • Ludovic Courtès
  • Maxime Devos
  • Xinglu Chen
Owner
unassigned
Severity
normal
X
X
Xinglu Chen wrote on 5 Aug 2021 16:06
(address . guix-patches@gnu.org)
cover.1628172101.git.public@yoctocell.xyz
This series adds the ‘gerbil-build-system’ for building Gerbil packages.

The first patch moves the ‘gerbil’ package from (gnu packages scheme) to
(gnu packages gerbil).

The third patch adds the build system itself, and the fourth and fifth
patches add two Gerbil packages that use the new ‘gerbil-build-system’.

I don’t know if Gerbil packages should be ‘inputs’ or
‘propagated-inputs’. I found two Gerbil packages that depended on other
Gerbil packages, but they both require a newer, unreleased Gerbil
package (Gerbil hasn’t had a new release for more than a year). Maybe
we should add a ‘gerbil-next’ package? ;-)

Xinglu Chen (5):
gnu: gerbil: Move to (gnu packages gerbil).
gnu: gerbil: Add 'native-search-paths' field.
guix: Add 'gerbil-build-system'.
gnu: Add gerbil-srfi-54.
gnu: Add gerbil-clojerbil.

Makefile.am | 2 +
doc/guix.texi | 21 +++
etc/snippets/scheme-mode/guix-package | 1 +
gnu/local.mk | 2 +
gnu/packages/gerbil.scm | 199 ++++++++++++++++++++++++++
gnu/packages/scheme.scm | 105 +-------------
guix/build-system/gerbil.scm | 138 ++++++++++++++++++
guix/build/gerbil-build-system.scm | 78 ++++++++++
8 files changed, 442 insertions(+), 104 deletions(-)
create mode 100644 gnu/packages/gerbil.scm
create mode 100644 guix/build-system/gerbil.scm
create mode 100644 guix/build/gerbil-build-system.scm


base-commit: 517dacdb99e15f35c0ead462c9156896b5728be4
--
2.32.0
X
X
Xinglu Chen wrote on 5 Aug 2021 16:09
[PATCH 1/5] gnu: gerbil: Move to (gnu packages gerbil).
(address . 49889@debbugs.gnu.org)
983c3e3a6b0b63c75044e33ed4b2dad87583158f.1628172101.git.public@yoctocell.xyz
* gnu/packages/scheme.scm (gerbil): Move from here...
* gnu/packages/gerbil.scm: New module.
(gerbil): ...to here
* gnu/local.mk (GNU_SYSTEM_MODULES): Register gnu/packages/gerbil.scm.
---
gnu/local.mk | 2 +
gnu/packages/gerbil.scm | 137 ++++++++++++++++++++++++++++++++++++++++
gnu/packages/scheme.scm | 105 +-----------------------------
3 files changed, 140 insertions(+), 104 deletions(-)
create mode 100644 gnu/packages/gerbil.scm

Toggle diff (285 lines)
diff --git a/gnu/local.mk b/gnu/local.mk
index 51a76e3638..ddbc057dc7 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -44,6 +44,7 @@
 # Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net>
 # Copyright © 2021 Sharlatan Hellseher <sharlatanus@gmail.com>
 # Copyright © 2021 Dmitry Polyakov <polyakov@liltechdude.xyz>
+# Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
 #
 # This file is part of GNU Guix.
 #
@@ -239,6 +240,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/genealogy.scm			\
   %D%/packages/genimage.scm			\
   %D%/packages/geo.scm				\
+  %D%/packages/gerbil.scm                       \
   %D%/packages/gettext.scm			\
   %D%/packages/ghostscript.scm			\
   %D%/packages/gimp.scm				\
diff --git a/gnu/packages/gerbil.scm b/gnu/packages/gerbil.scm
new file mode 100644
index 0000000000..69e7ae76a8
--- /dev/null
+++ b/gnu/packages/gerbil.scm
@@ -0,0 +1,137 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020 Edouard Klein <edk@beaver-labs.com>
+;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages gerbil)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages linux)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages scheme)
+  #:use-module (gnu packages sqlite)
+  #:use-module (gnu packages tls)
+  #:use-module (gnu packages)
+  #:use-module (guix build-system gerbil)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix git-download)
+  #:use-module (guix packages)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1))
+
+(define-public gerbil
+  (package
+    (name "gerbil")
+    (version "0.16")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/vyzo/gerbil")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0vng0kxpnwsg8jbjdpyn4sdww36jz7zfpfbzayg9sdpz6bjxjy0f"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (delete 'bootstrap)
+         (add-before 'configure 'chdir
+           (lambda _
+             (chdir "src")))
+         (replace 'configure
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (invoke "chmod" "755" "-R" ".")
+             ;; Otherwise fails when editing an r--r--r-- file.
+             (invoke "gsi-script" "configure"
+                     "--prefix" (assoc-ref outputs "out")
+                     "--with-gambit" (assoc-ref inputs "gambit-c"))))
+         (add-before 'patch-generated-file-shebangs 'fix-gxi-shebangs
+           (lambda _
+             ;; Some .ss files refer to gxi using /usr/bin/env gxi
+             ;; and 'patch-generated-file-shebangs can't fix that
+             ;; because gxi has not been compiled yet.
+             ;; We know where gxi is going to end up so we
+             ;; Doctor Who our fix here before the problem
+             ;; happens towards the end of the build.sh script.
+             (let ((abs-srcdir (getcwd)))
+               (for-each
+                (lambda (f)
+                   (substitute* f
+                     (("#!/usr/bin/env gxi")
+                      (string-append "#!" abs-srcdir "/../bin/gxi"))))
+                 '("./gerbil/gxc"
+                   "./lang/build.ss"
+                   "./misc/http-perf/build.ss"
+                   "./misc/rpc-perf/build.ss"
+                   "./misc/scripts/docsnarf.ss"
+                   "./misc/scripts/docstub.ss"
+                   "./misc/scripts/docsyms.ss"
+                   "./r7rs-large/build.ss"
+                   "./release.ss"
+                   "./std/build.ss"
+                   "./std/run-tests.ss"
+                   "./std/web/fastcgi-test.ss"
+                   "./std/web/rack-test.ss"
+                   "./tools/build.ss"
+                   "./tutorial/httpd/build.ss"
+                   "./tutorial/kvstore/build.ss"
+                   "./tutorial/lang/build.ss"
+                   "./tutorial/proxy/build-static.ss"
+                   "./tutorial/proxy/build.ss")))))
+         (replace
+          'build
+          (lambda*
+           (#:key inputs #:allow-other-keys)
+           (setenv "HOME" (getcwd))
+             (invoke
+              ;; The build script needs a tty or it'll crash on an ioctl
+              ;; trying to find the width of the terminal it's running on.
+              ;; Calling in script prevents that.
+              "script"
+              "-qefc"
+              "./build.sh")))
+         (delete 'check)
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (bin (string-append out "/bin"))
+                    (lib (string-append out "/lib")))
+               (mkdir-p bin)
+               (mkdir-p lib)
+               (copy-recursively "../bin" bin)
+               (copy-recursively "../lib" lib)))))))
+    (native-inputs
+     `(("coreutils" ,coreutils)
+       ("util-linux" ,util-linux)))
+    (propagated-inputs
+     `(("gambit-c" ,gambit-c)
+       ("zlib" ,zlib)
+       ("openssl" ,openssl)
+       ("sqlite" ,sqlite)))
+    (synopsis "Meta-dialect of Scheme with post-modern features")
+    (description "Gerbil is an opinionated dialect of Scheme designed for Systems
+Programming, with a state of the art macro and module system on top of the Gambit
+runtime.  The macro system is based on quote-syntax, and provides the full meta-syntactic
+tower with a native implementation of syntax-case.  It also provides a full-blown module
+system, similar to PLT Scheme's (sorry, Racket) modules.  The main difference from Racket
+is that Gerbil modules are single instantiation, supporting high performance ahead of
+time compilation and compiled macros.")
+    (home-page "https://cons.io")
+    (license (list license:lgpl2.1 license:asl2.0))))
diff --git a/gnu/packages/scheme.scm b/gnu/packages/scheme.scm
index c43d17219e..1ab4c329f8 100644
--- a/gnu/packages/scheme.scm
+++ b/gnu/packages/scheme.scm
@@ -13,7 +13,6 @@
 ;;; Copyright © 2018 Gabriel Hondet <gabrielhondet@gmail.com>
 ;;; Copyright © 2020 Pierre Neidhardt <mail@ambrevar.xyz>
 ;;; Copyright © 2020 Brett Gilio <brettg@gnu.org>
-;;; Copyright © 2020 Edouard Klein <edk@beaver-labs.com>
 ;;; Copyright © 2021 Philip McGrath <philip@philipmcgrath.com>
 ;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net>
 ;;;
@@ -919,106 +918,4 @@ manager/installer @code{gauche-package} which can download, compile, install
 and list gauche extension packages.")
     (license bsd-3)))
 
-(define-public gerbil
-  (package
-    (name "gerbil")
-    (version "0.16")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url "https://github.com/vyzo/gerbil")
-             (commit (string-append "v" version))))
-       (file-name (git-file-name name version))
-       (sha256
-        (base32 "0vng0kxpnwsg8jbjdpyn4sdww36jz7zfpfbzayg9sdpz6bjxjy0f"))))
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (delete 'bootstrap)
-         (add-before 'configure 'chdir
-           (lambda _
-             (chdir "src")
-             #t))
-         (replace 'configure
-           (lambda* (#:key outputs inputs #:allow-other-keys)
-             (invoke "chmod" "755" "-R" ".")
-             ;; Otherwise fails when editing an r--r--r-- file.
-             (invoke "gsi-script" "configure"
-                     "--prefix" (assoc-ref outputs "out")
-                     "--with-gambit" (assoc-ref inputs "gambit-c"))))
-         (add-before 'patch-generated-file-shebangs 'fix-gxi-shebangs
-           (lambda _
-             ;; Some .ss files refer to gxi using /usr/bin/env gxi
-             ;; and 'patch-generated-file-shebangs can't fix that
-             ;; because gxi has not been compiled yet.
-             ;; We know where gxi is going to end up so we
-             ;; Doctor Who our fix here before the problem
-             ;; happens towards the end of the build.sh script.
-             (let ((abs-srcdir (getcwd)))
-               (for-each
-                (lambda (f)
-                   (substitute* f
-                     (("#!/usr/bin/env gxi")
-                      (string-append "#!" abs-srcdir "/../bin/gxi"))))
-                 '("./gerbil/gxc"
-                   "./lang/build.ss"
-                   "./misc/http-perf/build.ss"
-                   "./misc/rpc-perf/build.ss"
-                   "./misc/scripts/docsnarf.ss"
-                   "./misc/scripts/docstub.ss"
-                   "./misc/scripts/docsyms.ss"
-                   "./r7rs-large/build.ss"
-                   "./release.ss"
-                   "./std/build.ss"
-                   "./std/run-tests.ss"
-                   "./std/web/fastcgi-test.ss"
-                   "./std/web/rack-test.ss"
-                   "./tools/build.ss"
-                   "./tutorial/httpd/build.ss"
-                   "./tutorial/kvstore/build.ss"
-                   "./tutorial/lang/build.ss"
-                   "./tutorial/proxy/build-static.ss"
-                   "./tutorial/proxy/build.ss")))
-             #t))
-         (replace
-          'build
-          (lambda*
-           (#:key inputs #:allow-other-keys)
-           (setenv "HOME" (getcwd))
-             (invoke
-              ;; The build script needs a tty or it'll crash on an ioctl
-              ;; trying to find the width of the terminal it's running on.
-              ;; Calling in script prevents that.
-              "script"
-              "-qefc"
-              "./build.sh")))
-         (delete 'check)
-         (replace 'install
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (bin (string-append out "/bin"))
-                    (lib (string-append out "/lib")))
-               (mkdir-p bin)
-               (mkdir-p lib)
-               (copy-recursively "../bin" bin)
-               (copy-recursively "../lib" lib)))))))
-    (native-inputs
-     `(("coreutils" ,coreutils)
-       ("util-linux" ,util-linux)))
-    (propagated-inputs
-     `(("gambit-c" ,gambit-c)
-       ("zlib" ,zlib)
-       ("openssl" ,openssl)
-       ("sqlite" ,sqlite)))
-    (build-system gnu-build-system)
-    (synopsis "Meta-dialect of Scheme with post-modern features")
-    (description "Gerbil is an opinionated dialect of Scheme designed for Systems
-Programming, with a state of the art macro and module system on top of the Gambit
-runtime.  The macro system is based on quote-syntax, and provides the full meta-syntactic
-tower with a native implementation of syntax-case.  It also provides a full-blown module
-system, similar to PLT Scheme's (sorry, Racket) modules.  The main difference from Racket
-is that Gerbil modules are single instantiation, supporting high performance ahead of
-time compilation and compiled macros.")
-    (home-page "https://cons.io")
-    (license `(,lgpl2.1 ,asl2.0))))
+
-- 
2.32.0
X
X
Xinglu Chen wrote on 5 Aug 2021 16:09
[PATCH 2/5] gnu: gerbil: Add 'native-search-paths' field.
(address . 49889@debbugs.gnu.org)
021b419a576c675a1ea40a5f4885c098478fcc48.1628172101.git.public@yoctocell.xyz
* gnu/packages/gerbil.scm (gerbil): Add ‘native-search-paths’ field.
---
gnu/packages/gerbil.scm | 4 ++++
1 file changed, 4 insertions(+)

Toggle diff (17 lines)
diff --git a/gnu/packages/gerbil.scm b/gnu/packages/gerbil.scm
index 69e7ae76a8..90559e9ea2 100644
--- a/gnu/packages/gerbil.scm
+++ b/gnu/packages/gerbil.scm
@@ -125,6 +125,10 @@
        ("zlib" ,zlib)
        ("openssl" ,openssl)
        ("sqlite" ,sqlite)))
+    (native-search-paths
+     (list (search-path-specification
+            (variable "GERBIL_LOADPATH")
+            (files (list "lib/gerbil")))))
     (synopsis "Meta-dialect of Scheme with post-modern features")
     (description "Gerbil is an opinionated dialect of Scheme designed for Systems
 Programming, with a state of the art macro and module system on top of the Gambit
-- 
2.32.0
X
X
Xinglu Chen wrote on 5 Aug 2021 16:10
[PATCH 3/5] guix: Add 'gerbil-build-system'.
(address . 49889@debbugs.gnu.org)
925c0e686f56bcc19b2db7ab1c38767e3bd74b9e.1628172101.git.public@yoctocell.xyz
* guix/build/gerbil-build-system.scm: New module.
* guix/build-system/gerbil.scm: Likewise.
* Makefile.am (MODULES): Register them.
* doc/guix.texi (Build Systems): Document it
* etc/snippets/scheme-mode/guix-package: Add ‘gerbil-build-system’ to list of
build systems.
---
Makefile.am | 2 +
doc/guix.texi | 21 ++++
etc/snippets/scheme-mode/guix-package | 1 +
guix/build-system/gerbil.scm | 138 ++++++++++++++++++++++++++
guix/build/gerbil-build-system.scm | 78 +++++++++++++++
5 files changed, 240 insertions(+)
create mode 100644 guix/build-system/gerbil.scm
create mode 100644 guix/build/gerbil-build-system.scm

Toggle diff (294 lines)
diff --git a/Makefile.am b/Makefile.am
index 5542aa1c56..4f773f27e5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -143,6 +143,7 @@ MODULES =					\
   guix/build-system/minify.scm			\
   guix/build-system/asdf.scm			\
   guix/build-system/copy.scm			\
+  guix/build-system/gerbil.scm                  \
   guix/build-system/glib-or-gtk.scm		\
   guix/build-system/gnu.scm			\
   guix/build-system/guile.scm			\
@@ -190,6 +191,7 @@ MODULES =					\
   guix/build/meson-build-system.scm		\
   guix/build/minify-build-system.scm		\
   guix/build/font-build-system.scm		\
+  guix/build/gerbil-build-system.scm            \
   guix/build/go-build-system.scm		\
   guix/build/android-repo.scm			\
   guix/build/asdf-build-system.scm		\
diff --git a/doc/guix.texi b/doc/guix.texi
index a826171f34..4f2146b7ac 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -7733,6 +7733,27 @@ only one of them.  This is equivalent to passing the @code{-p} argument to
 @code{dune}.
 @end defvr
 
+@defvr {Scheme Variable} gerbil-build-system
+This variable is exported by @code{(guix build-system gerbil)}.  It
+implements a build procedure for Gerbil packages the standard
+@uref{https://cons.io/guide/package-manager.html, Gerbil build
+mechanism}.
+
+It runs the @file{build.ss} Gerbile script, which compiles the package.
+The script can also take custom commands and flags, which can be
+specified by the @code{#:build-flags} parameter.
+
+One can also specify a custom Gerbil package to use for compiling the
+package by specifying the the @code{#:gerbil} parameter.
+
+Gerbil projects don't have a standardized way of running tests, so not
+@code{check} phase is exists by default.
+
+@c TODO: Should Gerbil packages be ‘inputs’ or ‘propagated-inputs’?
+
+As of right now, cross-compilation is not supported.
+@end defvr
+
 @defvr {Scheme Variable} go-build-system
 This variable is exported by @code{(guix build-system go)}.  It
 implements a build procedure for Go packages using the standard
diff --git a/etc/snippets/scheme-mode/guix-package b/etc/snippets/scheme-mode/guix-package
index 9ff6f997d1..e2d645f731 100644
--- a/etc/snippets/scheme-mode/guix-package
+++ b/etc/snippets/scheme-mode/guix-package
@@ -18,6 +18,7 @@
                                           "dune-build-system"
                                           "emacs-build-system"
                                           "font-build-system"
+                                          "gerbil-build-system"
                                           "glib-or-gtk-build-system"
                                           "gnu-build-system"
                                           "go-build-system"
diff --git a/guix/build-system/gerbil.scm b/guix/build-system/gerbil.scm
new file mode 100644
index 0000000000..0dd61767b8
--- /dev/null
+++ b/guix/build-system/gerbil.scm
@@ -0,0 +1,138 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (guix build-system gerbil)
+  #:use-module (guix utils)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix search-paths)
+  #:use-module (guix packages)
+  #:use-module (guix derivations)
+  #:use-module (ice-9 match)
+  #:export (gerbil-build-system))
+
+;;; Commentary:
+;;;
+;;; Standard build procedure for packages using the Gerbil build system.
+;;;
+;;; Code:
+
+(define %gerbil-build-system-modules
+  ;; Build-side modules imported and used by default.
+  `((guix build gerbil-build-system)
+    (guix build union)
+    ,@%gnu-build-system-modules))
+
+(define (default-gerbil)
+  "Return the default Gerbil package."
+  ;; Lazily resolve the binding to avoid circular dependency.
+  (let ((gerbil (resolve-interface '(gnu packages gerbil))))
+    (module-ref gerbil 'gerbil)))
+
+(define* (lower name
+                #:key source inputs native-inputs outputs system target
+                (gerbil (default-gerbil))
+                #:allow-other-keys
+                #:rest arguments)
+  "Return a bag for NAME."
+  (define private-keywords
+    '(#:source #:target #:gerbil #:inputs #:native-inputs))
+
+  ;; TODO: Cross-compilation support.
+  (and (not target)
+       (bag
+         (name name)
+         (system system)
+         (host-inputs `(,@(if source
+                              `(("source" ,source))
+                              '())
+                        ,@inputs))
+         (build-inputs `(("gerbil" ,gerbil)
+                         ("libc" ,(module-ref (resolve-interface
+                                               '(gnu packages base))
+                                              'glibc))
+                         ("gcc" ,(module-ref (resolve-interface
+                                              '(gnu packages gcc))
+                                             'gcc))
+                         ("binutils" ,(module-ref (resolve-interface
+                                                   '(gnu packages base))
+                                                  'binutils))
+                         ,@native-inputs))
+         (outputs outputs)
+         (build gerbil-build)
+         (arguments (strip-keyword-arguments private-keywords arguments)))))
+
+(define* (gerbil-build store name inputs
+                       #:key
+                       (phases '(@ (guix build gerbil-build-system)
+                                   %standard-phases))
+                       (outputs '("out"))
+                       (search-paths '())
+                       (build-flags ''())
+                       (gerbil (default-gerbil))
+                       ;; Tests are disabled by default because there is no
+                       ;; standard way to test Gerbil packages.  However, some
+                       ;; packages might have custom test phases, so pass the
+                       ;; #:tests? keyword, just in case.
+                       (tests? #f)
+                       (system (%current-system))
+                       (guile #f)
+                       (imported-modules %gerbil-build-system-modules)
+                       (modules '((guix build gerbil-build-system)
+                                  (guix build utils))))
+  (define builder
+    `(begin
+       (use-modules ,@modules)
+       (gerbil-build #:name ,name
+                     #:source ,(match (assoc-ref inputs "source")
+                                 (((? derivation? source))
+                                  (derivation->output-path source))
+                                 ((source)
+                                  source)
+                                 (source
+                                  source))
+                     #:tests? ,tests?
+                     #:system ,system
+                     #:phases ,phases
+                     #:outputs %outputs
+                     #:build-flags ,build-flags
+                     #:search-paths ',(map search-path-specification->sexp
+                                           search-paths)
+                     #:inputs %build-inputs)))
+
+  (define guile-for-build
+    (match guile
+      ((? package?)
+       (package-derivation store guile system #:graft? #f))
+      (#f                                         ; the default
+       (let* ((distro (resolve-interface '(gnu packages commencement)))
+              (guile  (module-ref distro 'guile-final)))
+         (package-derivation store guile system #:graft? #f)))))
+
+  (build-expression->derivation store name builder
+                                #:inputs inputs
+                                #:system system
+                                #:modules imported-modules
+                                #:outputs outputs
+                                #:guile-for-build guile-for-build))
+
+(define gerbil-build-system
+  (build-system
+    (name 'gerbil)
+    (description "The standard Gerbil build system")
+    (lower lower)))
diff --git a/guix/build/gerbil-build-system.scm b/guix/build/gerbil-build-system.scm
new file mode 100644
index 0000000000..4355d8e444
--- /dev/null
+++ b/guix/build/gerbil-build-system.scm
@@ -0,0 +1,78 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (guix build gerbil-build-system)
+  #:use-module ((guix build gnu-build-system) #:prefix gnu:)
+  #:use-module (guix build union)
+  #:use-module (guix build utils)
+  #:use-module (srfi srfi-26)
+  #:export (%standard-phases
+            gerbil-build))
+
+;;; Commentary:
+;;;
+;;; Build-side code for building Gerbil packages.
+;;;
+;;; Something to note is that there is no standard way to run tests
+;;; for Gerbil packages, so there is not `check' phase by default.
+;;;
+;;; Code:
+
+(define (gerbil-package? name)
+  "Whether NAME is a Gerbil package."
+  (string-prefix? "gerbil-" name))
+
+(define (gerbil-load-path inputs)
+  "Given an alist of inputs, INPUTS, return a list of directories to add
+to the GERBIL_LOADPTH environment variable."
+  (let* ((labels (map car inputs))
+         (gerbil-packages (filter gerbil-package? labels)))
+    (map (cut string-append <> "/lib/gerbil")
+         gerbil-packages)))
+  
+(define* (setup-gerbil-environment #:key inputs #:allow-other-keys)
+  ;; This is where the compiled modules will end up.
+  (setenv "GERBIL_PATH" (string-append (getcwd) "/.build"))
+  ;; Where to look for other Gerbil modules.
+  (setenv "GERBIL_LOADPATH" (string-join (gerbil-load-path inputs) ":")))
+  
+(define* (build #:key build-flags #:allow-other-keys)
+  ;; The build.ss script contians the build instructions.
+  (apply invoke "./build.ss" build-flags))
+
+(define* (install #:key outputs #:allow-other-keys)
+  (let ((out (assoc-ref outputs "out")))
+    (mkdir-p (string-append out "/lib/gerbil"))
+    (copy-recursively ".build/lib" (string-append out "/lib/gerbil"))
+    (copy-recursively ".build/bin" (string-append out "/bin"))))
+
+(define %standard-phases
+  (modify-phases gnu:%standard-phases
+    (delete 'bootstrap)
+    (delete 'configure)
+    (add-after 'unpack 'setup-gerbil-environment setup-gerbil-environment)
+    (replace 'build build)
+    (delete 'check)
+    (replace 'install install)))
+
+(define* (gerbil-build #:key (phases %standard-phases)
+                       #:allow-other-keys #:rest args)
+  "Build the given Gerbil packages, applying all of PHASES in order."
+  (apply gnu:gnu-build #:phases phases args))
+
+    
-- 
2.32.0
X
X
Xinglu Chen wrote on 5 Aug 2021 16:10
[PATCH 4/5] gnu: Add gerbil-srfi-54.
(address . 49889@debbugs.gnu.org)
aeaee21194336c39b3300acd62bbf118278d8d33.1628172101.git.public@yoctocell.xyz
* gnu/packages/gerbil.scm (gerbil-srfi-54): New variable.
---
gnu/packages/gerbil.scm | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)

Toggle diff (35 lines)
diff --git a/gnu/packages/gerbil.scm b/gnu/packages/gerbil.scm
index 90559e9ea2..aee5da60cd 100644
--- a/gnu/packages/gerbil.scm
+++ b/gnu/packages/gerbil.scm
@@ -139,3 +139,28 @@ is that Gerbil modules are single instantiation, supporting high performance ahe
 time compilation and compiled macros.")
     (home-page "https://cons.io")
     (license (list license:lgpl2.1 license:asl2.0))))
+
+(define-public gerbil-srfi-54
+  ;; No releases; commit from 2019-01-13.
+  (let ((commit "a7db045ad3f150b5dde79c3320c34d8ac3589525")
+        (revision "0"))
+  (package
+    (name "gerbil-srfi-54")
+    (version (git-version "0.0.0" revision commit))
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/hckiang/srfi-54")
+                    (commit commit)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0k1ddfhvbmf9njxm1ybs61n9kpzjvha2j63mf756r7b3x5rk51b0"))))
+    (build-system gerbil-build-system)
+    (home-page "https://github.com/hckiang/srfi-54")
+    (synopsis "SRFI-54 for Gerbil Scheme")
+    (description "This package provides SRFI-54 for Gerbil Scheme.
+The implementation is exactly the same as the
+@uref{https://srfi.schemers.org/srfi-54/srfi-54.html, official
+reference documentation}.")
+    (license license:lgpl3+))))
-- 
2.32.0
X
X
Xinglu Chen wrote on 5 Aug 2021 16:10
[PATCH 5/5] gnu: Add gerbil-clojerbil.
(address . 49889@debbugs.gnu.org)
771dac2950d0b1b092a34a3332ab2162c39c0e1e.1628172101.git.public@yoctocell.xyz
* gnu/packages/gerbil.scm (gerbil-clojerbil): New variable.
---
gnu/packages/gerbil.scm | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)

Toggle diff (43 lines)
diff --git a/gnu/packages/gerbil.scm b/gnu/packages/gerbil.scm
index aee5da60cd..d254b39eff 100644
--- a/gnu/packages/gerbil.scm
+++ b/gnu/packages/gerbil.scm
@@ -164,3 +164,36 @@ The implementation is exactly the same as the
 @uref{https://srfi.schemers.org/srfi-54/srfi-54.html, official
 reference documentation}.")
     (license license:lgpl3+))))
+
+(define-public gerbil-clojerbil
+  ;; No releases; commit from 2021-05-24
+  (let ((commit "542f0d2cf0afb1d99ded76dee1f646e4d10efeb2")
+        (revision "0"))
+    (package
+      (name "gerbil-clojerbil")
+      (version (git-version "0.0.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/eraserhd/clojerbil")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "1jipcmqhg9l2zi7bnbki5wky89i5xpd1ixnmyw2lm660i3p0gib4"))))
+      (build-system gerbil-build-system)
+      (arguments
+       `(#:phases
+         (modify-phases %standard-phases
+           (add-after 'build 'check
+             (lambda* (#:key inputs #:allow-other-keys)
+               (let ((gerbil (assoc-ref inputs "gerbil")))
+                 (invoke (string-append gerbil "/bin/gxi") "run-tests.ss")))))))
+      (home-page "https://github.com/eraserhd/clojerbil")
+      (synopsis "Thin implementation of Clojure on top of Gerbil Scheme")
+      (description
+       "Clojerbil is a deliberately thin implementation of Clojure on top of
+Gerbil Scheme.  Its intent is to add Clojure-type niceties on top of Gerbil and
+allow simple Clojure code to work without making a complicated compatibility
+layer.")
+      (license license:unlicense))))
-- 
2.32.0
M
M
Maxime Devos wrote on 7 Aug 2021 18:59
a0234b038b7acd1743356365086e94b60f7be3c9.camel@telenet.be
Xinglu Chen schreef op do 05-08-2021 om 16:10 [+0200]:
Toggle quote (5 lines)
> + (add-after 'build 'check
> + (lambda* (#:key inputs #:allow-other-keys)
> + (let ((gerbil (assoc-ref inputs "gerbil")))
> + (invoke (string-append gerbil "/bin/gxi") "run-tests.ss")))))))

By wrapping the body in (when tests? ...), "--without-tests" would be supported.
The 'tests-true' linter should detect this, try "./pre-inst-env guix lint gerbil-clojerbil".

Greetings,
Maxime.
-----BEGIN PGP SIGNATURE-----

iI0EABYKADUWIQTB8z7iDFKP233XAR9J4+4iGRcl7gUCYQ677RccbWF4aW1lZGV2
b3NAdGVsZW5ldC5iZQAKCRBJ4+4iGRcl7tYrAQCaYwC2RD6tmUbxkM/I7dSWX3k0
5VwM1poBh5X/APD75wD9GQWnkDMAbDpe3T5YcNlHDYlyTf+8+J649vkXtDIgQwM=
=8jRq
-----END PGP SIGNATURE-----


X
X
Xinglu Chen wrote on 15 Aug 2021 09:41
87bl5z9mtm.fsf@yoctocell.xyz
On Sat, Aug 07 2021, Maxime Devos wrote:

Toggle quote (10 lines)
> Xinglu Chen schreef op do 05-08-2021 om 16:10 [+0200]:
>> + (add-after 'build 'check
>> + (lambda* (#:key inputs #:allow-other-keys)
>> + (let ((gerbil (assoc-ref inputs "gerbil")))
>> + (invoke (string-append gerbil "/bin/gxi") "run-tests.ss")))))))
>
> By wrapping the body in (when tests? ...), "--without-tests" would be supported.
> The 'tests-true' linter should detect this, try "./pre-inst-env guix
> lint gerbil-clojerbil".

Good, catch! I will send a reroll when I get some feedback on the build
system. :-)
-----BEGIN PGP SIGNATURE-----

iQJJBAEBCAAzFiEEAVhh4yyK5+SEykIzrPUJmaL7XHkFAmEYxTUVHHB1YmxpY0B5
b2N0b2NlbGwueHl6AAoJEKz1CZmi+1x59vwP/17XhiF/1uTVLx4VDh8Suw1uPt1U
qaiEmWYwYgX3bqFElpPXtH1lTaq0DMfZCKV3Di1EQ8E2IC+a8Dg6v00H/zYjtmlQ
SMx4slvE1MDlimdLebUq9c/9qOCU6ODi0QNoTj+pssn1Ik8eEmyboayROWO9/HFv
qQbifZgD9yc4+Wov6CZkmee8QlHIzP8dU6lawSAFR063/z0Cy0+qMOdfy4lrmeNt
EiueFmxeqRW17qAQRcIc5DAd9/c3NVrsfOGyO7NPxi/s2hLWMfLLXkUhUZ8ya9So
m4Q4CdXMjr3/NVPxz04CZM+i3WDtjKF9tMSoUYTtXFacNOXFDvjIZvEKtkC3iorj
vHwu6lzpGSj6AF5yf4f5CmtODUZb9T8SIsyZFNpHxVVT1gqwuT+cyT84XHEPdqxd
4PEffdsbQ0eq95Q8zWzEAUsYjhM+XPRVGne2xdb+rxEiobfGmbKB+cIE+dBwslg7
wZeLGh8xuKCG5j16056JLIthKyX6BD4jNvybyJBod6k9aF9NLhajRUlQjY3LleWu
oeiyPPGFTLcx/izMfb8bje5W7mBeBrU6KEJp0v2gAROs43SXjTf1Jv6CbkZxsvJQ
M2uqNhKmFIRIcYXcueY5o2pKnNRfil3cQYRQIoql5+RJHXDiAALdbPiyjDIJm0LC
lVJNpaZLp4ygTt41
=Po1N
-----END PGP SIGNATURE-----

L
L
Ludovic Courtès wrote on 4 Feb 22:42 +0100
Re: bug#49889: [PATCH 0/5] Add build system for Gerbil Scheme
(name . Xinglu Chen)(address . public@yoctocell.xyz)(address . 49889@debbugs.gnu.org)
87r18imhpo.fsf@gnu.org
Hello!

Xinglu Chen <public@yoctocell.xyz> skribis:

Toggle quote (21 lines)
> This series adds the ‘gerbil-build-system’ for building Gerbil packages.
>
> The first patch moves the ‘gerbil’ package from (gnu packages scheme) to
> (gnu packages gerbil).
>
> The third patch adds the build system itself, and the fourth and fifth
> patches add two Gerbil packages that use the new ‘gerbil-build-system’.
>
> I don’t know if Gerbil packages should be ‘inputs’ or
> ‘propagated-inputs’. I found two Gerbil packages that depended on other
> Gerbil packages, but they both require a newer, unreleased Gerbil
> package (Gerbil hasn’t had a new release for more than a year). Maybe
> we should add a ‘gerbil-next’ package? ;-)
>
> Xinglu Chen (5):
> gnu: gerbil: Move to (gnu packages gerbil).
> gnu: gerbil: Add 'native-search-paths' field.
> guix: Add 'gerbil-build-system'.
> gnu: Add gerbil-srfi-54.
> gnu: Add gerbil-clojerbil.

Looks like this fell through the cracks during the summer. :-/

It all LGTM. You’ll have to update the build system to the new API
though, and run ‘guix style -S inputs’ to remove input labels, and
possibly ‘guix style’ to adjust layout for ‘gerbil-clojerbil’ for
instance.

That’s all.

Could you send updated patches?

Thanks!

Ludo’.
?