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'.
This commit is contained in:
Ludovic Courtès 2015-03-12 19:31:07 +01:00
parent 9751c39a6d
commit 8c9653b373
1 changed files with 10 additions and 3 deletions

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; 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 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;; ;;;
@ -76,7 +76,10 @@ prepended to the name."
(substring name (string-length old-prefix)) (substring name (string-length old-prefix))
name)))) name))))
(arguments (arguments
(let ((arguments (package-arguments p))) (let ((arguments (package-arguments p))
(python (if (promise? python)
(force python)
python)))
(if (member #:python arguments) (if (member #:python arguments)
(substitute-keyword-arguments arguments ((#:python p) python)) (substitute-keyword-arguments arguments ((#:python p) python))
(append arguments `(#:python ,python))))) (append arguments `(#:python ,python)))))
@ -86,7 +89,11 @@ prepended to the name."
p))) p)))
(define package-with-python2 (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 (define* (lower name
#:key source inputs native-inputs outputs system target #:key source inputs native-inputs outputs system target