M doc/guix.texi => doc/guix.texi +5 -1
@@ 2244,7 2244,11 @@ (gnu packages guile)
guile-1.8)}, which unambiguously designates this specific variant of
version 1.8 of Guile.
-Alternately, @var{expr} may refer to a zero-argument monadic procedure
+Alternately, @var{expr} may be a G-expression, in which case it is used
+as a build program passed to @code{gexp->derivation}
+(@pxref{G-Expressions}).
+
+Lastly, @var{expr} may refer to a zero-argument monadic procedure
(@pxref{The Store Monad}). The procedure must return a derivation as a
monadic value, which is then passed through @code{run-with-store}.
M guix/scripts/build.scm => guix/scripts/build.scm +6 -0
@@ 24,6 24,7 @@
#:use-module (guix packages)
#:use-module (guix utils)
#:use-module (guix monads)
+ #:use-module (guix gexp)
#:use-module (ice-9 format)
#:use-module (ice-9 match)
#:use-module (ice-9 vlist)
@@ 338,6 339,11 @@ packages."
`(argument . ,p))
((? procedure? proc)
(let ((drv (run-with-store store (proc) #:system system)))
+ `(argument . ,drv)))
+ ((? gexp? gexp)
+ (let ((drv (run-with-store store
+ (gexp->derivation "gexp" gexp
+ #:system system))))
`(argument . ,drv)))))
(opt opt))
opts))
M guix/ui.scm => guix/ui.scm +9 -1
@@ 238,6 238,14 @@ interpreted."
(leave (_ "~a: ~a~%") proc
(apply format #f format-string format-args))))))
+(define %guix-user-module
+ ;; Module in which user expressions are evaluated.
+ (let ((module (make-module)))
+ (beautify-user-module! module)
+ ;; Use (guix gexp) so that one can use #~ & co.
+ (module-use! module (resolve-interface '(guix gexp)))
+ module))
+
(define (read/eval str)
"Read and evaluate STR, raising an error if something goes wrong."
(let ((exp (catch #t
@@ 248,7 256,7 @@ interpreted."
str args)))))
(catch #t
(lambda ()
- (eval exp the-root-module))
+ (eval exp %guix-user-module))
(lambda args
(leave (_ "failed to evaluate expression `~a': ~s~%")
exp args)))))
M tests/guix-build.sh => tests/guix-build.sh +4 -0
@@ 80,3 80,7 @@ guix build -e "(begin
(gexp->derivation \"test\"
(gexp (mkdir (ungexp output))))))" \
--dry-run
+
+# Running a gexp.
+guix build -e '#~(mkdir #$output)' -d
+guix build -e '#~(mkdir #$output)' -d | grep 'gexp\.drv'