;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2020 Edouard Klein ;;; ;;; 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 . (define-module (guix build gerbil-build-system) #:use-module ((guix build gnu-build-system) #:prefix gnu:) #:use-module (guix build utils) #:use-module (ice-9 match) #:use-module (ice-9 ftw) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:export (%standard-phases gerbil-build)) ;; Gerbil's build system and package management is documented at ;; https://cons.io/guide/package-manager.html ;; https://cons.io/guide/build.html ;; https://cons.io/guide/env-vars.html ;; ;; The compiler is writing its output in the directory ;; pointed to by GERBIL_PATH (or ~/.gerbil by default). ;; ;; Every package is supposed to have a build.ss script ;; whose default action (when called with no argument) ;; is to compile the package. ;; ;; The GERBIL_LOADPATH env variable tells gerbil's runtime ;; where it can find its loadable code. ;; ;; GERBIL_HOME tells gerbil where to find its runtime ;; and standard library ;; ;; This build system therefore just ;; - makes GERBIL_PATH point to the output directory in the store, ;; - makes GERBIL_LOADPATH point to the lib subdir ;; of all the gerbil inputs, ;; - calls ./build.ss, ;; - wrap any executable with GERBIL_LOADPATH set the the lib ;; subdir of all the gerbil inputs plus the lib subdir ;; of the current package's output, and with GERBIL_HOME ;; set to the lib directory of the 'gerbil' input (define (loadpath inputs) (string-join (map (match-lambda ((_ . path) (string-append path "/lib"))) ;; Restrict to inputs beginning with "gerbil-". (filter (match-lambda ((name . _) (string-prefix? "gerbil-" name))) inputs)) ":")) (define (gerbil-home inputs) (assoc-ref inputs "gerbil")) (define* (install #:key inputs outputs #:allow-other-keys) "Install a given Gerbil package." (let ((out (assoc-ref outputs "out")) (in (loadpath inputs))) (setenv "GERBIL_PATH" out) (setenv "GERBIL_LOADPATH" in) (invoke "./build.ss")) #t) (define* (wrap #:key inputs outputs #:allow-other-keys) "Wrap any executable with a proper GERBIL_LOADPATH and GERBIL_HOME" (let* ((out (assoc-ref outputs "out")) (in (loadpath inputs)) (gerbil-loadpath (string-append out "/lib:" in))) (for-each (cut wrap-program <> `("GERBIL_LOADPATH" = (,gerbil-loadpath)) `("GERBIL_HOME" = (,(gerbil-home inputs)))) (find-files (string-append out "/bin"))))) (define %standard-phases (modify-phases gnu:%standard-phases (delete 'bootstrap) (delete 'configure) ;not needed (delete 'build) ;build.ss does both build and install (delete 'check) ;no standard way of testing (replace 'install install) (add-after 'install 'wrap wrap))) (define* (gerbil-build #:key inputs (phases %standard-phases) #:allow-other-keys #:rest args) "Build the given Gerbil package, applying all of PHASES in order." (apply gnu:gnu-build #:inputs inputs #:phases phases args))