From d298c815e638581d466222f3a883b280f019b368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Mon, 16 Oct 2017 10:12:53 +0200 Subject: [PATCH] gexp: Add 'directory-union'. * gnu/services.scm (directory-union): Move to... * guix/gexp.scm (directory-union): ... here. New procedure. * doc/guix.texi (G-Expressions): Document it. --- doc/guix.texi | 11 +++++++++++ gnu/services.scm | 17 +---------------- guix/gexp.scm | 20 ++++++++++++++++++++ 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index ce8b977e1b..d7fabe9599 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -5007,6 +5007,17 @@ denoting the target file. Here's an example: This yields an @code{etc} directory containing these two files. @end deffn +@deffn {Scheme Procedure} directory-union @var{name} @var{things} +Return a directory that is the union of @var{things}, where @var{things} is a list of +file-like objects denoting directories. For example: + +@example +(directory-union "guile+emacs" (list guile emacs)) +@end example + +yields a directory that is the union of the @code{guile} and @code{emacs} packages. +@end deffn + @deffn {Scheme Procedure} file-append @var{obj} @var{suffix} @dots{} Return a file-like object that expands to the concatenation of @var{obj} and @var{suffix}, where @var{obj} is a lowerable object and each diff --git a/gnu/services.scm b/gnu/services.scm index bc866eafe3..50be28a382 100644 --- a/gnu/services.scm +++ b/gnu/services.scm @@ -95,9 +95,7 @@ (define-module (gnu services) %boot-service %activation-service - etc-service - - directory-union)) + etc-service)) ;;; Comment: ;;; @@ -387,19 +385,6 @@ (define cleanup-service-type (list (service-extension boot-service-type cleanup-gexp))))) -(define (directory-union name things) - "Return a directory that is the union of THINGS." - (match things - ((one) - ;; Only one thing; return it. - one) - (_ - (computed-file name - (with-imported-modules '((guix build union)) - #~(begin - (use-modules (guix build union)) - (union-build #$output '#$things))))))) - (define* (activation-service->script service) "Return as a monadic value the activation script for SERVICE, a service of ACTIVATION-SCRIPT-TYPE." diff --git a/guix/gexp.scm b/guix/gexp.scm index 9835599bb8..b9525603ee 100644 --- a/guix/gexp.scm +++ b/guix/gexp.scm @@ -79,6 +79,7 @@ (define-module (guix gexp) text-file* mixed-text-file file-union + directory-union imported-files imported-modules compiled-modules @@ -1203,6 +1204,25 @@ (define (file-union name files) (ungexp target)))))) files)))))) +(define (directory-union name things) + "Return a directory that is the union of THINGS, where THINGS is a list of +file-like objects denoting directories. For example: + + (directory-union \"guile+emacs\" (list guile emacs)) + +yields a directory that is the union of the 'guile' and 'emacs' packages." + (match things + ((one) + ;; Only one thing; return it. + one) + (_ + (computed-file name + (with-imported-modules '((guix build union)) + (gexp (begin + (use-modules (guix build union)) + (union-build (ungexp output) + '(ungexp things))))))))) + ;;; ;;; Syntactic sugar.