aboutsummaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-08-26 11:28:23 +0200
committerLudovic Courtès <ludo@gnu.org>2015-08-27 00:49:23 +0200
commitc2b8467645bb2c2e17eb9c580f39e345c4dc2f4a (patch)
tree754462cfbcccdb8c58f000ee5bf88d064279b657 /guix
parentf7283db37d58f1a7dede5f410c6c0a75aa82b12e (diff)
downloadgnu-guix-c2b8467645bb2c2e17eb9c580f39e345c4dc2f4a.tar
gnu-guix-c2b8467645bb2c2e17eb9c580f39e345c4dc2f4a.tar.gz
gexp: Add 'lower-object'.
* guix/gexp.scm (lower-object): New procedure. (lower-inputs, lower-references, gexp->sexp): Use it. * tests/gexp.scm ("lower-object"): New test. * doc/guix.texi (G-Expressions): Document it.
Diffstat (limited to 'guix')
-rw-r--r--guix/gexp.scm31
1 files changed, 21 insertions, 10 deletions
diff --git a/guix/gexp.scm b/guix/gexp.scm
index 49dcc99ac3..6dc816dc40 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -53,6 +53,7 @@
define-gexp-compiler
gexp-compiler?
+ lower-object
lower-inputs))
@@ -126,6 +127,16 @@ procedure to lower it; otherwise return #f."
(and (predicate object) lower)))
%gexp-compilers))
+(define* (lower-object obj
+ #:optional (system (%current-system))
+ #:key target)
+ "Return as a value in %STORE-MONAD the derivation or store item
+corresponding to OBJ for SYSTEM, cross-compiling for TARGET if TARGET is true.
+OBJ must be an object that has an associated gexp compiler, such as a
+<package>."
+ (let ((lower (lookup-compiler obj)))
+ (lower obj system target)))
+
(define-syntax-rule (define-gexp-compiler (name (param predicate)
system target)
body ...)
@@ -258,8 +269,8 @@ the cross-compilation target triplet."
(sequence %store-monad
(map (match-lambda
(((? struct? thing) sub-drv ...)
- (mlet* %store-monad ((lower -> (lookup-compiler thing))
- (drv (lower thing system target)))
+ (mlet %store-monad ((drv (lower-object
+ thing system #:target target)))
(return `(,drv ,@sub-drv))))
(input
(return input)))
@@ -288,13 +299,13 @@ names and file names suitable for the #:allowed-references argument to
((? string? output)
(return output))
(($ <gexp-input> thing output native?)
- (mlet* %store-monad ((lower -> (lookup-compiler thing))
- (drv (lower thing system
- (if native? #f target))))
+ (mlet %store-monad ((drv (lower-object thing system
+ #:target (if native?
+ #f target))))
(return (derivation->output-path drv output))))
(thing
- (mlet* %store-monad ((lower -> (lookup-compiler thing))
- (drv (lower thing system target)))
+ (mlet %store-monad ((drv (lower-object thing system
+ #:target target)))
(return (derivation->output-path drv))))))
(sequence %store-monad (map lower lst))))
@@ -540,9 +551,9 @@ and in the current monad setting (system type, etc.)"
native?))
refs)))
(($ <gexp-input> (? struct? thing) output n?)
- (let ((lower (lookup-compiler thing))
- (target (if (or n? native?) #f target)))
- (mlet %store-monad ((obj (lower thing system target)))
+ (let ((target (if (or n? native?) #f target)))
+ (mlet %store-monad ((obj (lower-object thing system
+ #:target target)))
;; OBJ must be either a derivation or a store file name.
(return (match obj
((? derivation? drv)