diff --git a/doc/guix.texi b/doc/guix.texi index 2d10ec9b59..665bdb028d 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -2948,7 +2948,8 @@ derivations can be defined, such that these objects can also be inserted into gexps. Another useful type of high-level object that can be inserted in a gexp is @dfn{local files}, which allows files from the local file system to be added to the store and referred to by -derivations and such (see @code{local-file} below.) +derivations and such (see @code{local-file} and @code{plain-file} +below.) To illustrate the idea, here is an example of a gexp: @@ -3126,6 +3127,13 @@ This is the declarative counterpart of the @code{interned-file} monadic procedure (@pxref{The Store Monad, @code{interned-file}}). @end deffn +@deffn {Scheme Procedure} plain-file @var{name} @var{content} +Return an object representing a text file called @var{name} with the given +@var{content} (a string) to be added to the store. + +This is the declarative counterpart of @code{text-file}. +@end deffn + @deffn {Monadic Procedure} gexp->script @var{name} @var{exp} Return an executable script @var{name} that runs @var{exp} using @var{guile} with @var{modules} in its search path. diff --git a/guix/gexp.scm b/guix/gexp.scm index 03b4cbf19e..10056e5a1f 100644 --- a/guix/gexp.scm +++ b/guix/gexp.scm @@ -31,12 +31,18 @@ (define-module (guix gexp) gexp-input gexp-input? + local-file local-file? local-file-file local-file-name local-file-recursive? + plain-file + plain-file? + plain-file-name + plain-file-content + gexp->derivation gexp->file gexp->script @@ -140,7 +146,7 @@ (define-gexp-compiler (derivation-compiler (drv derivation?) system target) ;;; -;;; Local files. +;;; File declarations. ;;; (define-record-type @@ -169,6 +175,28 @@ (define-gexp-compiler (local-file-compiler (file local-file?) system target) (($ file name recursive?) (interned-file file name #:recursive? recursive?)))) +(define-record-type + (%plain-file name content references) + plain-file? + (name plain-file-name) ;string + (content plain-file-content) ;string + (references plain-file-references)) ;list (currently unused) + +(define (plain-file name content) + "Return an object representing a text file called NAME with the given +CONTENT (a string) to be added to the store. + +This is the declarative counterpart of 'text-file'." + ;; XXX: For now just ignore 'references' because it's not clear how to use + ;; them in a declarative context. + (%plain-file name content '())) + +(define-gexp-compiler (plain-file-compiler (file plain-file?) system target) + ;; "Compile" FILE by adding it to the store. + (match file + (($ name content references) + (text-file name content references)))) + ;;; ;;; Inputs & outputs. diff --git a/tests/gexp.scm b/tests/gexp.scm index f81ef39860..7e14073fd4 100644 --- a/tests/gexp.scm +++ b/tests/gexp.scm @@ -109,6 +109,16 @@ (define-syntax-rule (test-assertm name exp) (eq? x local))) (equal? `(display ,intd) (gexp->sexp* exp))))) +(test-assert "one plain file" + (let* ((file (plain-file "hi" "Hello, world!")) + (exp (gexp (display (ungexp file)))) + (expected (add-text-to-store %store "hi" "Hello, world!"))) + (and (gexp? exp) + (match (gexp-inputs exp) + (((x "out")) + (eq? x file))) + (equal? `(display ,expected) (gexp->sexp* exp))))) + (test-assert "same input twice" (let ((exp (gexp (begin (display (ungexp coreutils))