@@ -71,7 +71,7 @@ CLEANFILES = \
# Crash handler.
-EXTRA_DIST = etc/crash-handler.c
+EXTRA_DIST = etc/crash-handler.c build-aux/guix.scm
if BUILD_CRASH_HANDLER
new file mode 100644
@@ -0,0 +1,79 @@
+;;; guix.scm -- Guix package definition
+;; Copyright (C) 2020 Efraim Flashner <efraim@flashner.co.il>
+;;
+;; This file is part of the GNU Shepherd.
+;;
+;; The GNU Shepherd 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.
+;;
+;; The GNU Shepherd 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 the GNU Shepherd. If not, see <http://www.gnu.org/licenses/>.
+
+(use-modules
+ (guix packages)
+ ((guix git-download) #:select (git-version))
+ ((guix build utils) #:select (find-files))
+ ((guix gexp) #:select (local-file))
+ ((guix utils) #:select (substitute-keyword-arguments))
+ ((gnu packages) #:select (specification->package))
+ ((ice-9 popen) #:select (open-pipe))
+ ((ice-9 rdelim) #:select (read-string))
+ ((srfi srfi-1) #:select (any)))
+
+(define %source-dir (dirname (dirname (current-filename))))
+
+(define %git-commit
+ (read-string (open-pipe "git show HEAD | head -1 | cut -d ' ' -f 2" OPEN_READ)))
+
+(define (keep-file? file stat)
+ (not (any (lambda (my-string)
+ (string-contains file my-string))
+ (list ".git" ".dir-locals.el" "build-aux"))))
+
+(define (build-from-git base)
+ (package
+ (inherit base)
+ (version (git-version (package-version base) "HEAD" %git-commit))
+ (source (local-file %source-dir
+ #:recursive? #t
+ #:select? keep-file?))
+ (native-inputs
+ `(("autoconf" ,(specification->package "autoconf"))
+ ("automake" ,(specification->package "automake"))
+ ("gettext" ,(specification->package "gettext"))
+ ("help2man" ,(specification->package "help2man"))
+ ("texinfo" ,(specification->package "texinfo"))
+ ,@(package-native-inputs base)))
+ (arguments
+ `(#:configure-flags '("--localstatedir=/var")
+ #:make-flags (list "GUILE_AUTO_COMPILE=0")
+ #:phases
+ (modify-phases %standard-phases
+ (add-after 'unpack 'make-po-directory-writable
+ (lambda _
+ (for-each make-file-writable
+ (find-files "po"))
+ #t)))))))
+
+(list (build-from-git (specification->package "shepherd"))
+ (build-from-git (specification->package "guile2.2-shepherd"))
+ (let ((base (build-from-git (specification->package "guile2.0-shepherd"))))
+ (package
+ (inherit base)
+ (arguments
+ (substitute-keyword-arguments (package-arguments base)
+ ((#:phases phases)
+ `(modify-phases ,phases
+ (add-after 'unpack 'patch-source
+ (lambda _
+ ;; (ice-9 threads) isn't available in guile-2.0
+ (substitute* "modules/shepherd.scm"
+ ((".*\\(ice-9 threads\\).*") ""))
+ #t)))))))))