~ruther/guix-local

d298c815e638581d466222f3a883b280f019b368 — Ludovic Courtès 9 years ago dedb512
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.
3 files changed, 32 insertions(+), 16 deletions(-)

M doc/guix.texi
M gnu/services.scm
M guix/gexp.scm
M doc/guix.texi => doc/guix.texi +11 -0
@@ 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

M gnu/services.scm => gnu/services.scm +1 -16
@@ 95,9 95,7 @@

            %boot-service
            %activation-service
            etc-service

            directory-union))
            etc-service))

;;; Comment:
;;;


@@ 387,19 385,6 @@ boot."
                 (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."

M guix/gexp.scm => guix/gexp.scm +20 -0
@@ 79,6 79,7 @@
            text-file*
            mixed-text-file
            file-union
            directory-union
            imported-files
            imported-modules
            compiled-modules


@@ 1203,6 1204,25 @@ This yields an 'etc' directory containing these two 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.