summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-03-12 19:31:07 +0100
committerLudovic Courtès <ludo@gnu.org>2015-03-12 19:31:25 +0100
commit8c9653b3735749cc16e01c6d0a9de7a89e038a18 (patch)
tree3b86762ac9fef7b6f7238d2895eb8895ffaa4482
parent9751c39a6d493535d3866f536fed8b16b5a4f1f8 (diff)
downloadguix-8c9653b3735749cc16e01c6d0a9de7a89e038a18.tar.gz
build-system/python: Delay evaluation of the 'python2' package.
This fixes a bug whereby uses of 'package-with-python2' at the top-level
in modules other than (gnu packages python) could lead to an "Unbound
variable: python2" error due to the circular references.

Reported by Tomáš Čech.

* guix/build-system/python.scm (package-with-explicit-python)[arguments]:
  Check whether PYTHON is a promise, and force it if it is.
  (package-with-python2): Wrap 'default-python2' call in 'delay'.
-rw-r--r--guix/build-system/python.scm13
1 files changed, 10 insertions, 3 deletions
diff --git a/guix/build-system/python.scm b/guix/build-system/python.scm
index e8af9f8146..37108650d0 100644
--- a/guix/build-system/python.scm
+++ b/guix/build-system/python.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;;
@@ -76,7 +76,10 @@ prepended to the name."
                                      (substring name (string-length old-prefix))
                                      name))))
           (arguments
-           (let ((arguments (package-arguments p)))
+           (let ((arguments (package-arguments p))
+                 (python    (if (promise? python)
+                                (force python)
+                                python)))
              (if (member #:python arguments)
                  (substitute-keyword-arguments arguments ((#:python p) python))
                  (append arguments `(#:python ,python)))))
@@ -86,7 +89,11 @@ prepended to the name."
         p)))
 
 (define package-with-python2
-  (cut package-with-explicit-python <> (default-python2) "python-" "python2-"))
+  ;; Note: delay call to 'default-python2' until after the 'arguments' field
+  ;; of packages is accessed to avoid a circular dependency when evaluating
+  ;; the top-level of (gnu packages python).
+  (cut package-with-explicit-python <> (delay (default-python2))
+       "python-" "python2-"))
 
 (define* (lower name
                 #:key source inputs native-inputs outputs system target