diff options
-rw-r--r-- | doc/guix.texi | 12 | ||||
-rw-r--r-- | guix/monads.scm | 21 | ||||
-rw-r--r-- | tests/monads.scm | 11 |
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")) |