summaryrefslogtreecommitdiff
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"))