summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--guix/derivations.scm14
-rw-r--r--tests/derivations.scm6
2 files changed, 20 insertions, 0 deletions
diff --git a/guix/derivations.scm b/guix/derivations.scm
index ae9d2f46c7..5a8cc2c57a 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -57,6 +57,8 @@
             derivation-input-output-paths
 
             fixed-output-derivation?
+            offloadable-derivation?
+            substitutable-derivation?
             derivation-hash
 
             read-derivation
@@ -156,6 +158,18 @@ download with a fixed hash (aka. `fetchurl')."
                      read-derivation))
                  inputs)))))
 
+(define (offloadable-derivation? drv)
+  "Return true if DRV can be offloaded, false otherwise."
+  (match (assoc "preferLocalBuild"
+                (derivation-builder-environment-vars drv))
+    (("preferLocalBuild" . "1") #f)
+    (_ #t)))
+
+(define substitutable-derivation?
+  ;; Return #t if the derivation can be substituted.  Currently the two are
+  ;; synonymous, see <http://bugs.gnu.org/18747>.
+  offloadable-derivation?)
+
 (define* (derivation-prerequisites-to-build store drv
                                             #:key
                                             (outputs
diff --git a/tests/derivations.scm b/tests/derivations.scm
index e774fed4c3..698640b548 100644
--- a/tests/derivations.scm
+++ b/tests/derivations.scm
@@ -173,6 +173,12 @@
                 (= (stat:ino (lstat file1))
                    (stat:ino (lstat file2))))))))
 
+(test-assert "offloadable-derivation?"
+  (and (offloadable-derivation? (derivation %store "foo" %bash '()))
+       (not (offloadable-derivation?
+             (derivation %store "foo" %bash '()
+                         #:local-build? #t)))))
+
 (test-assert "fixed-output-derivation?"
   (let* ((builder    (add-text-to-store %store "my-fixed-builder.sh"
                                         "echo -n hello > $out" '()))