gexp: Add 'plain-file'.

* guix/gexp.scm (<plain-file>): New type.
  (plain-file, plain-file-compiler): New procedures.
* tests/gexp.scm ("one plain file"): New test.
* doc/guix.texi (G-Expressions): Document 'plain-file'.
This commit is contained in:
Ludovic Courtès 2015-06-03 11:45:27 +02:00
parent 74d441abee
commit 558e8b11d7
3 changed files with 48 additions and 2 deletions

View file

@ -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.

View file

@ -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 <local-file>
@ -169,6 +175,28 @@ (define-gexp-compiler (local-file-compiler (file local-file?) system target)
(($ <local-file> file name recursive?)
(interned-file file name #:recursive? recursive?))))
(define-record-type <plain-file>
(%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
(($ <plain-file> name content references)
(text-file name content references))))
;;;
;;; Inputs & outputs.

View file

@ -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))