summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--guix/packages.scm13
-rw-r--r--tests/packages.scm9
2 files changed, 21 insertions, 1 deletions
diff --git a/guix/packages.scm b/guix/packages.scm
index b372f03818..51984baa3b 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -20,10 +20,12 @@
   #:use-module (guix utils)
   #:use-module (guix store)
   #:use-module (guix base32)
+  #:use-module (guix derivations)
   #:use-module (guix build-system)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-9 gnu)
+  #:use-module (srfi srfi-11)
   #:use-module (srfi srfi-34)
   #:use-module (srfi srfi-35)
   #:re-export (%current-system)
@@ -62,6 +64,7 @@
             package-source-derivation
             package-derivation
             package-cross-derivation
+            package-output
 
             &package-error
             package-error?
@@ -305,3 +308,13 @@ PACKAGE for SYSTEM."
 (define* (package-cross-derivation store package)
   ;; TODO
   #f)
+
+(define* (package-output store package output
+                         #:optional (system (%current-system)))
+  "Return the output path of PACKAGE's OUTPUT for SYSTEM---where OUTPUT is the
+symbolic output name, such as \"out\".  Note that this procedure calls
+`package-derivation', which is costly."
+  (let-values (((_ drv)
+                (package-derivation store package system)))
+    (derivation-output-path
+     (assoc-ref (derivation-outputs drv) output))))
diff --git a/tests/packages.scm b/tests/packages.scm
index 32ee558518..f441532d22 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -71,7 +71,7 @@
                    ("d" ,d) ("d/x" "something.drv"))
                  (pk 'x (package-transitive-inputs e))))))
 
-(test-skip (if (not %store) 3 0))
+(test-skip (if (not %store) 4 0))
 
 (test-assert "return values"
   (let-values (((drv-path drv)
@@ -79,6 +79,13 @@
     (and (derivation-path? drv-path)
          (derivation? drv))))
 
+(test-assert "package-output"
+  (let* ((package  (dummy-package "p"))
+         (drv-path (package-derivation %store package)))
+    (and (derivation-path? drv-path)
+         (string=? (derivation-path->output-path drv-path)
+                   (package-output %store package "out")))))
+
 (test-assert "trivial"
   (let* ((p (package (inherit (dummy-package "trivial"))
               (build-system trivial-build-system)