summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/guix.texi12
-rw-r--r--guix/monads.scm21
-rw-r--r--tests/monads.scm11
3 files changed, 36 insertions, 8 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index 92eccad118..a7803a4aee 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -2065,15 +2065,19 @@ The example below adds a file to the store, under two different names:
 @end deffn
 
 @deffn {Monadic Procedure} package-file @var{package} [@var{file}] @
-       [#:system (%current-system)] [#:output "out"] Return as a monadic
+       [#:system (%current-system)] [#:target #f] @
+       [#:output "out"] Return as a monadic
 value in the absolute file name of @var{file} within the @var{output}
 directory of @var{package}.  When @var{file} is omitted, return the name
-of the @var{output} directory of @var{package}.
+of the @var{output} directory of @var{package}.  When @var{target} is
+true, use it as a cross-compilation target triplet.
 @end deffn
 
 @deffn {Monadic Procedure} package->derivation @var{package} [@var{system}]
-Monadic version of @code{package-derivation} (@pxref{Defining
-Packages}).
+@deffnx {Monadic Procedure} package->cross-derivation @var{package} @
+          @var{target} [@var{system}]
+Monadic version of @code{package-derivation} and
+@code{package-cross-derivation} (@pxref{Defining Packages}).
 @end deffn
 
 
diff --git a/guix/monads.scm b/guix/monads.scm
index 4af2b704ab..8909312a87 100644
--- a/guix/monads.scm
+++ b/guix/monads.scm
@@ -59,6 +59,7 @@
             package-file
             origin->derivation
             package->derivation
+            package->cross-derivation
             built-derivations)
   #:replace (imported-modules
              compiled-modules))
@@ -377,13 +378,22 @@ permission bits are kept."
 
 (define* (package-file package
                        #:optional file
-                       #:key (system (%current-system)) (output "out"))
+                       #:key
+                       (system (%current-system))
+                       (output "out") target)
   "Return as a monadic value the absolute file name of FILE within the
 OUTPUT directory of PACKAGE.  When FILE is omitted, return the name of the
-OUTPUT directory of PACKAGE."
+OUTPUT directory of PACKAGE.  When TARGET is true, use it as a
+cross-compilation target triplet."
   (lambda (store)
-    (let* ((drv (package-derivation store package system))
-           (out (derivation->output-path drv output)))
+    (define compute-derivation
+      (if target
+          (cut package-cross-derivation <> <> target <>)
+          package-derivation))
+
+    (let* ((system (or system (%current-system)))
+           (drv    (compute-derivation store package system))
+           (out    (derivation->output-path drv output)))
       (if file
           (string-append out "/" file)
           out))))
@@ -411,6 +421,9 @@ input list as a monadic value."
 (define package->derivation
   (store-lift package-derivation))
 
+(define package->cross-derivation
+  (store-lift package-cross-derivation))
+
 (define origin->derivation
   (store-lift package-source-derivation))
 
diff --git a/tests/monads.scm b/tests/monads.scm
index ea3e4006ab..78a014ea6a 100644
--- a/tests/monads.scm
+++ b/tests/monads.scm
@@ -24,6 +24,7 @@
                 #:select (package-derivation %current-system))
   #:use-module (gnu packages)
   #:use-module (gnu packages bootstrap)
+  #:use-module ((gnu packages base) #:select (coreutils))
   #:use-module (ice-9 match)
   #:use-module (rnrs io ports)
   #:use-module (srfi srfi-1)
@@ -108,6 +109,16 @@
                       guile)))
     #:guile-for-build (package-derivation %store %bootstrap-guile)))
 
+(test-assert "package-file + package->cross-derivation"
+  (run-with-store %store
+    (mlet* %store-monad ((file (package-file coreutils "bin/ls"
+                                             #:target "foo64-gnu"))
+                         (xcu  (package->cross-derivation coreutils
+                                                          "foo64-gnu")))
+      (let ((output (derivation->output-path xcu)))
+        (return (string=? file (string-append output "/bin/ls")))))
+    #:guile-for-build (package-derivation %store %bootstrap-guile)))
+
 (test-assert "interned-file"
   (run-with-store %store
     (mlet* %store-monad ((file -> (search-path %load-path "guix.scm"))