diff options
author | Ludovic Courtès <ludo@gnu.org> | 2015-09-09 09:44:43 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-10-10 22:46:14 +0200 |
commit | b751cde36b508690d5f893360f964d3098549131 (patch) | |
tree | 2a0d68122bb43b245706388fb2e5e8f00063e7da | |
parent | 15a01c72209b2d43239fe7516a22e531b7fcb85f (diff) |
gexp: Add 'mixed-text-file'.
* guix/gexp.scm (mixed-text-file): New procedure.
* tests/gexp.scm ("mixed-text-file"): New test.
* doc/guix.texi (G-Expressions): Document it.
-rw-r--r-- | doc/guix.texi | 13 | ||||
-rw-r--r-- | guix/gexp.scm | 16 | ||||
-rw-r--r-- | tests/gexp.scm | 15 |
3 files changed, 44 insertions, 0 deletions
diff --git a/doc/guix.texi b/doc/guix.texi index e0a6f2bddf..6334b37a7f 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -3463,6 +3463,19 @@ will references @var{coreutils}, @var{grep}, and @var{sed}, thereby preventing them from being garbage-collected during its lifetime. @end deffn +@deffn {Scheme Procedure} mixed-text-file @var{name} @var{text} @dots{} +Return an object representing store file @var{name} containing +@var{text}. @var{text} is a sequence of strings and file-like objects, +as in: + +@example +(mixed-text-file "profile" + "export PATH=" coreutils "/bin:" grep "/bin") +@end example + +This is the declarative counterpart of @code{text-file*}. +@end deffn + Of course, in addition to gexps embedded in ``host'' code, there are also modules containing build tools. To make it clear that they are meant to be used in the build stratum, these modules are kept in the diff --git a/guix/gexp.scm b/guix/gexp.scm index 10acf2ba1b..f44df9c6ea 100644 --- a/guix/gexp.scm +++ b/guix/gexp.scm @@ -61,6 +61,7 @@ gexp->file gexp->script text-file* + mixed-text-file imported-files imported-modules compiled-modules @@ -969,6 +970,21 @@ resulting store file holds references to all these." (gexp->derivation name builder)) +(define* (mixed-text-file name #:rest text) + "Return an object representing store file NAME containing TEXT. TEXT is a +sequence of strings and file-like objects, as in: + + (mixed-text-file \"profile\" + \"export PATH=\" coreutils \"/bin:\" grep \"/bin\") + +This is the declarative counterpart of 'text-file*'." + (define build + (gexp (call-with-output-file (ungexp output "out") + (lambda (port) + (display (string-append (ungexp-splicing text)) port))))) + + (computed-file name build)) + ;;; ;;; Syntactic sugar. diff --git a/tests/gexp.scm b/tests/gexp.scm index 0a8ce6544f..77439cf6e9 100644 --- a/tests/gexp.scm +++ b/tests/gexp.scm @@ -660,6 +660,21 @@ file))))) #:guile-for-build (package-derivation %store %bootstrap-guile)))) +(test-assertm "mixed-text-file" + (mlet* %store-monad ((file -> (mixed-text-file "mixed" + "export PATH=" + %bootstrap-guile "/bin")) + (drv (lower-object file)) + (out -> (derivation->output-path drv)) + (guile-drv (package->derivation %bootstrap-guile)) + (guile -> (derivation->output-path guile-drv))) + (mbegin %store-monad + (built-derivations (list drv)) + (mlet %store-monad ((refs ((store-lift references) out))) + (return (and (string=? (string-append "export PATH=" guile "/bin") + (call-with-input-file out get-string-all)) + (equal? refs (list guile)))))))) + (test-assert "gexp->derivation vs. %current-target-system" (let ((mval (gexp->derivation "foo" #~(begin |