On Sun, Dec 14, 2014 at 9:28 PM, Ludovic Courtès <l...@gnu.org> wrote: >> +(define* (fix-pth #:key name inputs outputs #:allow-other-keys) > > What about calling it ‘rename-pth-file’, which should be more > descriptive? Also please add a docstring.
Agreed. >> + (let* ((out (assoc-ref outputs "out")) >> + (python (assoc-ref inputs "python")) >> + (site-packages (string-append out "/lib/python" >> + (get-python-version python) >> + "/site-packages")) >> + (easy-install-pth (string-append site-packages >> "/easy-install.pth")) >> + (new-pth (string-append site-packages "/" name ".pth"))) >> + (if (file-exists? easy-install-pth) >> + (rename-file easy-install-pth new-pth)))) > > Please use ‘when’ instead of ‘if’, and add a trailing #t, to make it > clear that the phase succeeds. OK > Is PACKAGE.pth a common convention? I mean, does Python (or > setuptools?) actually use files called PYTHON.pth? Yes, the basename of path configuration files with extension .pth does not matter. The site module will load them all. Setuptools, on top of easy-install.pth, installs a site.py file. This program adds (with site.addsitedir) all directories in PYTHONPATH to the list of directories to be processed by the site module. https://docs.python.org/2/library/site.html Before writing the path I had conflicts, e.g., between matplotlib and cairocffi resulting in import failures. After the patch they work nicely together. Using NAME.pth instead of easy-install.pth should guarantee that no package configuration file collisions occurs between different packages installed with setuptools, nor between two versions of the same library. Attached the amended patch. Regards, Fede
From d32c6b5b51c4d61a2aef7467705073dafc1087d5 Mon Sep 17 00:00:00 2001 From: Federico Beffa <be...@fbengineering.ch> Date: Sat, 13 Dec 2014 22:19:08 +0100 Subject: [PATCH 1/4] build/python-build-system: Fix easy-install.pth collisions. * guix/build/python-build-system.scm (rename-pth-file): New rename-pth-file phase and corresponding function. --- guix/build/python-build-system.scm | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/guix/build/python-build-system.scm b/guix/build/python-build-system.scm index 2f3d04a..74ba0c7 100644 --- a/guix/build/python-build-system.scm +++ b/guix/build/python-build-system.scm @@ -105,19 +105,36 @@ files))) bindirs))) +(define* (rename-pth-file #:key name inputs outputs #:allow-other-keys) + "Rename easy-install.pth to NAME.pth to avoid conflicts between packages +installed with setuptools." + (let* ((out (assoc-ref outputs "out")) + (python (assoc-ref inputs "python")) + (site-packages (string-append out "/lib/python" + (get-python-version python) + "/site-packages")) + (easy-install-pth (string-append site-packages "/easy-install.pth")) + (new-pth (string-append site-packages "/" name ".pth"))) + (when (file-exists? easy-install-pth) + (rename-file easy-install-pth new-pth)) + #t)) + (define %standard-phases ;; 'configure' and 'build' phases are not needed. Everything is done during ;; 'install'. - (alist-cons-after - 'install 'wrap - wrap - (alist-replace - 'build build + (alist-cons-before + 'strip 'rename-pth-file + rename-pth-file + (alist-cons-after + 'install 'wrap + wrap (alist-replace - 'check check - (alist-replace 'install install - (alist-delete 'configure - gnu:%standard-phases)))))) + 'build build + (alist-replace + 'check check + (alist-replace 'install install + (alist-delete 'configure + gnu:%standard-phases))))))) (define* (python-build #:key inputs (phases %standard-phases) #:allow-other-keys #:rest args) -- 1.8.4