diff --git a/doc/guix.texi b/doc/guix.texi index c1e51eac94..c14272ed9a 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -2244,7 +2244,11 @@ For example, @var{expr} may be @code{(@@ (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}. diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm index 6d864bfe3b..5e4647de79 100644 --- a/guix/scripts/build.scm +++ b/guix/scripts/build.scm @@ -24,6 +24,7 @@ (define-module (guix scripts build) #: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 @@ (define system `(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)) diff --git a/guix/ui.scm b/guix/ui.scm index 6fef9b36e4..beb41e925a 100644 --- a/guix/ui.scm +++ b/guix/ui.scm @@ -238,6 +238,14 @@ (define (call-with-error-handling thunk) (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 @@ (define (read/eval str) 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))))) diff --git a/tests/guix-build.sh b/tests/guix-build.sh index e0c774d055..7c6594775a 100644 --- a/tests/guix-build.sh +++ b/tests/guix-build.sh @@ -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'