~ruther/guix-local

56b821069722c6341e9079299d90ae1cdfe9a916 — Ludovic Courtès 11 years ago a83c6a6
guix build: Allow gexps to be passed to '-e'.

* guix/ui.scm (%guix-user-module): New variable.
  (read/eval): Pass it as the second argument to 'eval'.
* guix/scripts/build.scm (options/resolve-packages): Add case for
  'gexp?'.
* tests/guix-build.sh: Add tests.
* doc/guix.texi (Invoking guix build): Document '-e gexp'.
guxi build: Allow gexps to be passed to '-e'.

* guix/ui.scm (%guix-user-module): New variable.
  (read/eval): Pass it as the second argument to 'eval'.
* guix/scripts/build.scm (options/resolve-packages): Add case for
  'gexp?'.
* tests/guix-build.sh: Add tests.
* doc/guix.texi (Invoking guix build): Document '-e gexp'.
4 files changed, 24 insertions(+), 2 deletions(-)

M doc/guix.texi
M guix/scripts/build.scm
M guix/ui.scm
M tests/guix-build.sh
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'