~ruther/guix-local

aae4ead8142d4fd7c674a1e6e302f40469f878c6 — Andreas Enge 12 years ago 29479de + 2875caf
Merge branch 'python'
M gnu/packages/cryptsetup.scm => gnu/packages/cryptsetup.scm +1 -1
@@ 45,7 45,7 @@
    `(("libgcrypt" ,libgcrypt)
      ("lvm2" ,lvm2)
      ("popt" ,popt)
      ("python" ,python)
      ("python" ,python-wrapper)
      ("util-linux" ,util-linux)))
   (synopsis "hard disk encryption tool")
   (description

M gnu/packages/gdb.scm => gnu/packages/gdb.scm +1 -1
@@ 53,7 53,7 @@
       ("gmp" ,gmp)
       ("readline" ,readline)
       ("ncurses" ,ncurses)
       ("python" ,python)
       ("python" ,python-wrapper)
       ("texinfo" ,texinfo)
       ("dejagnu" ,dejagnu)))
    (home-page "http://www.gnu.org/software/gdb/")

M gnu/packages/ghostscript.scm => gnu/packages/ghostscript.scm +1 -1
@@ 136,7 136,7 @@ printing, and psresize, for adjusting page sizes.")
             ("libtiff" ,libtiff)
             ("perl" ,perl)
             ("pkg-config" ,pkg-config) ; needed to find libtiff
             ("python" ,python)
             ("python" ,python-wrapper)
             ("tcl" ,tcl)
             ("zlib" ,zlib)))
   (arguments

M gnu/packages/glib.scm => gnu/packages/glib.scm +1 -1
@@ 104,7 104,7 @@ shared NFS home directories.")
      ("gettext" ,guix:gettext)
      ("libffi" ,libffi)
      ("pkg-config" ,pkg-config)
      ("python" ,python)
      ("python" ,python-wrapper)
      ("zlib" ,zlib)
      ("perl" ,perl)                              ; needed by GIO tests
      ("dbus" ,dbus)                              ; for GDBus tests

M gnu/packages/gnupg.scm => gnu/packages/gnupg.scm +1 -1
@@ 191,7 191,7 @@ S/MIME.")
                     "1g1jly3wl4ks6h8ydkygyl2c4i7v3z91rg42005m6vm70y1d8b3d"))))
   (build-system gnu-build-system)
   (inputs `(("perl" ,perl)
             ("python" ,python)
             ("python" ,python-wrapper)
             ("gpg" ,gnupg)))
   (arguments
    `(#:tests? #f

M gnu/packages/gtk.scm => gnu/packages/gtk.scm +2 -2
@@ 83,7 83,7 @@ tools have full access to view and control running applications.")
      ("libspectre" ,libspectre)
      ("pkg-config" ,pkg-config)
      ("poppler" ,poppler)
      ("python" ,python)
      ("python" ,python-wrapper)
      ("xextproto" ,xextproto)
      ("zlib" ,zlib)))
    (arguments


@@ 123,7 123,7 @@ affine transformation (scale, rotation, shear, etc.)")
    `(("cairo" ,cairo)
      ("icu4c" ,icu4c)
      ("pkg-config" ,pkg-config)
      ("python" ,python)))
      ("python" ,python-wrapper)))
   (synopsis "opentype text shaping engine")
   (description
    "HarfBuzz is an OpenType text shaping engine.")

M gnu/packages/libevent.scm => gnu/packages/libevent.scm +1 -1
@@ 44,7 44,7 @@

       ;; Dependencies used for the tests and for `event_rpcgen.py'.
       ("which" ,which)
       ("python" ,python)))
       ("python" ,python-wrapper)))
    (arguments
     '(#:patches (list (assoc-ref %build-inputs "patch/dns-tests"))))
    (home-page "http://libevent.org/")

M gnu/packages/netpbm.scm => gnu/packages/netpbm.scm +1 -1
@@ 57,7 57,7 @@
             ("libxml2" ,libxml2)
             ("perl" ,perl)
             ("pkg-config" ,pkg-config)
             ("python" ,python)
             ("python" ,python-wrapper)
             ("zlib" ,zlib)))
   (arguments
    `(#:phases

M gnu/packages/oggvorbis.scm => gnu/packages/oggvorbis.scm +1 -1
@@ 191,7 191,7 @@ meaning that audio is compressed in FLAC without any loss in quality.")
             ("libogg" ,libogg)
             ("libpng" ,libpng)
             ("pkg-config" ,pkg-config)
             ("python" ,python)
             ("python" ,python-wrapper)
             ("zlib" ,zlib)))
   (synopsis "kate, a karaoke and text codec for embedding in ogg")
   (description

M gnu/packages/python.scm => gnu/packages/python.scm +181 -14
@@ 19,19 19,24 @@
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu packages python)
  #:use-module ((guix licenses) #:select (bsd-3 psfl x11))
  #:use-module ((guix licenses) #:select (bsd-3 bsd-style psfl x11))
  #:use-module ((guix licenses) #:select (zlib)
                                #:renamer (symbol-prefix-proc 'license))
  #:use-module (gnu packages)
  #:use-module (gnu packages compression)
  #:use-module (gnu packages gdbm)
  #:use-module (gnu packages readline)
  #:use-module (gnu packages openssl)
  #:use-module (gnu packages patchelf)
  #:use-module (gnu packages sqlite)
  #:use-module (guix packages)
  #:use-module (guix download)
  #:use-module (guix utils)
  #:use-module (guix build-system gnu)
  #:use-module (guix build-system python))
  #:use-module (guix build-system python)
  #:use-module (guix build-system trivial))

(define-public python
(define-public python-2
  (package
    (name "python")
    (version "2.7.5")


@@ 151,8 156,8 @@ packages; exception-based error handling; and very high level dynamic
data types.")
    (license psfl)))

(define-public python-3
  (package (inherit python)
(define-public python
  (package (inherit python-2)
    (version "3.3.2")
    (source
     (origin


@@ 167,9 172,34 @@ data types.")
            (variable "PYTHONPATH")
            (directories '("lib/python3.3/site-packages")))))))

(define-public pytz
(define-public python-wrapper
  (package (inherit python)
    (name "python-wrapper")
    (source #f)
    (build-system trivial-build-system)
    (inputs `(("python" ,python)))
    (arguments
     `(#:modules ((guix build utils))
       #:builder
         (begin
           (use-modules (guix build utils))
           (let ((bin (string-append (assoc-ref %outputs "out") "/bin"))
                 (python (string-append (assoc-ref %build-inputs "python") "/bin/")))
                (mkdir-p bin)
                (for-each
                  (lambda (old new)
                    (symlink (string-append python old)
                             (string-append bin "/" new)))
                  `("python3", "pydoc3", "idle3")
                  `("python",  "pydoc",  "idle"))))))
    (description (string-append (package-description python)
     "\n\nThis wrapper package provides symbolic links to the python binaries
      without version suffix."))))


(define-public python-pytz
  (package
    (name "pytz")
    (name "python-pytz")
    (version "2013b")
    (source
     (origin


@@ 180,6 210,7 @@ data types.")
       (base32
        "19giwgfcrg0nr1gdv49qnmf2jb2ilkcfc7qyqvfpz4dp0p64ksv5"))))
    (build-system python-build-system)
    (arguments `(#:tests? #f)) ; no test target
    (home-page "https://launchpad.net/pytz")
    (synopsis "The Python timezone library.")
    (description


@@ 187,22 218,28 @@ data types.")
using Python 2.4 or higher and provides access to the Olson timezone database.")
    (license x11)))

(define-public babel
(define-public python2-pytz
  (package-with-python2 python-pytz))


(define-public python-babel
  (package
    (name "babel")
    (version "0.9.6")
    (name "python-babel")
    (version "1.3")
    (source
     (origin
      (method url-fetch)
      (uri (string-append "http://ftp.edgewall.com/pub/babel/Babel-"
      (uri (string-append "https://pypi.python.org/packages/source/B/Babel/Babel-"
                          version ".tar.gz"))
      (sha256
       (base32
        "03vmr54jq5vf3qw6kpdv7cdk7x7i2jhzyf1mawv2gk8zrxg0hfja"))))
        "0bnin777lc53nxd1hp3apq410jj5wx92n08h7h4izpl4f4sx00lz"))))
    (build-system python-build-system)
    (inputs
     `(("pytz" ,pytz)))
    (home-page "http://babel.edgewall.org/")
     `(("python-pytz" ,python-pytz)
       ("python-setuptools" ,python-setuptools)))
    (arguments `(#:tests? #f)) ; no test target
    (home-page "http://babel.pocoo.org/")
    (synopsis
     "Tools for internationalizing Python applications")
    (description


@@ 212,3 249,133 @@ using Python 2.4 or higher and provides access to the Olson timezone database.")
access to various locale display names, localized number and date formatting,
etc. ")
    (license bsd-3)))

(define-public python2-babel
  (package-with-python2 python-babel))


(define-public python-setuptools
  (package
    (name "python-setuptools")
    (version "1.1.4")
    (source
     (origin
      (method url-fetch)
      (uri (string-append "https://pypi.python.org/packages/source/s/setuptools/setuptools-"
                          version ".tar.gz"))
      (sha256
       (base32
        "0hl9sa5xr9bi2ifq51wy1bawsjv5nzvpbac7m9z1ciz778874csf"))))
    (build-system python-build-system)
    (arguments
     `(#:tests? #f))
         ;;FIXME: test_sdist_with_utf8_encoded_filename fails in
         ;; /tmp/nix-build-python2-setuptools-1.1.4.drv-0/setuptools-1.1.4/setuptools/tests/test_sdist.py"
         ;; line 354
         ;; The tests pass with Python 2.7.5.
    (home-page "https://pypi.python.org/pypi/setuptools")
    (synopsis
     "Library designed to facilitate packaging Python projects")
    (description
     "Setuptools is a fully-featured, stable library designed to facilitate
packaging Python projects, where packaging includes:
Python package and module definitions,
distribution package metadata,
test hooks,
project installation,
platform-specific details,
Python 3 support.")
    (license psfl)))

(define-public python2-setuptools
  (package-with-python2 python-setuptools))


(define-public python-dateutil
  (package
    (name "python-dateutil")
    (version "1.5") ; last version for python < 3
    (source
     (origin
      (method url-fetch)
      (uri (string-append "http://labix.org/download/python-dateutil/python-dateutil-"
                          version ".tar.gz"))
      (sha256
       (base32
        "0fqfglhy5khbvsipr3x7m6bcaqljh8xl5cw33vbfxy7qhmywm2n0"))))
    (build-system python-build-system)
    (inputs
     `(("python-setuptools" ,python-setuptools)))
    (home-page "http://labix.org/python-dateutil")
    (synopsis
     "Extensions to the standard datetime module, available in Python 2.3+")
    (description
     "The dateutil module provides powerful extensions to the standard
datetime module, available in Python 2.3+.")
    (license psfl)))

(define-public python2-dateutil
  (package-with-python2 python-dateutil))


(define-public python2-pysqlite
  (package
    (name "python2-pysqlite")
    (version "2.6.3")
    (source
     (origin
      (method url-fetch)
      (uri (string-append "http://pysqlite.googlecode.com/files/pysqlite-"
                          version ".tar.gz"))
      (sha256
       (base32
        "0nsqqfp072rgqbls100rdvbzkjkin7li3kprhfxlfqvzf608hlqd"))))
    (build-system python-build-system)
    (inputs
     `(("sqlite" ,sqlite)))
    (arguments
     `(#:python ,python-2 ; incompatible with Python 3
       #:tests? #f)) ; no test target
    (home-page "http://labix.org/python-dateutil")
    (synopsis
     "SQLite bindings for Python.")
    (description
     "Pysqlite provides SQLite bindings for Python that comply to the
Database API 2.0T.")
    (license zlib)))


(define-public python2-mechanize
  (package
    (name "python2-mechanize")
    (version "0.2.5")
    (source
     (origin
      (method url-fetch)
      (uri (string-append "https://pypi.python.org/packages/source/m/mechanize/mechanize-"
                          version ".tar.gz"))
      (sha256
       (base32
        "0rj7r166i1dyrq0ihm5rijfmvhs8a04im28lv05c0c3v206v4rrf"))))
    (build-system python-build-system)
    (inputs
     `(("python2-setuptools" ,python2-setuptools)))
    (arguments
     `(#:python ,python-2 ; apparently incompatible with Python 3
       #:tests? #f))
         ;; test fails with message
         ;; AttributeError: 'module' object has no attribute 'test_pullparser'
         ;; (python-3.3.2) or
         ;; AttributeError: 'module' object has no attribute 'test_urllib2_localnet'
         ;; (python-2.7.5).
         ;; The source code is from March 2011 and probably not up-to-date
         ;; with respect to python unit tests.
    (home-page "http://wwwsearch.sourceforge.net/mechanize/")
    (synopsis
     "Stateful programmatic web browsing in Python")
    (description
     "Mechanize implements stateful programmatic web browsing in Python,
after Andy Lester’s Perl module WWW::Mechanize.")
    (license (bsd-style "file://COPYING"
                        "See COPYING in the distribution."))))


M gnu/packages/qemu.scm => gnu/packages/qemu.scm +1 -1
@@ 94,7 94,7 @@
     `(;; ("mesa" ,mesa)
       ;; ("libaio" ,libaio)
       ("glib" ,glib)
       ("python" ,python)
       ("python" ,python-2) ; incompatible with Python 3 according to error message
       ("ncurses" ,ncurses)
       ("libpng" ,libpng)
       ("libjpeg" ,libjpeg-8)

M gnu/packages/samba.scm => gnu/packages/samba.scm +1 -1
@@ 150,7 150,7 @@ anywhere.")
       ("patchelf" ,patchelf)))                   ; for (guix build rpath)
    (native-inputs                                ; for the test suite
     `(("perl" ,perl)
       ("python" ,python)))
       ("python" ,python-wrapper)))
    (home-page "http://www.samba.org/")
    (synopsis
     "The standard Windows interoperability suite of programs for GNU and Unix")

M gnu/packages/texlive.scm => gnu/packages/texlive.scm +2 -2
@@ 81,7 81,7 @@
             ("pkg-config" ,pkg-config)
             ;; FIXME: Add interpreters fontforge and ruby,
             ;; once they are available.
             ("python" ,python)
             ("python" ,python-2) ; incompatible with Python 3 (print syntax)
             ("tcsh" ,tcsh)
             ("teckit" ,teckit)
             ("t1lib" ,t1lib)


@@ 202,7 202,7 @@ world.")
    (build-system gnu-build-system)
    (arguments '(#:tests? #f))                    ; no `check' target
    (inputs `(("texinfo" ,texinfo)
              ("python" ,python)
              ("python" ,python-2) ; incompatible with Python 3 (print syntax)
              ("which" ,which)))
    (home-page "https://launchpad.net/rubber")
    (synopsis "Rubber, a wrapper for LaTeX and friends")

M gnu/packages/version-control.scm => gnu/packages/version-control.scm +5 -3
@@ 58,7 58,9 @@
     ;; require Zsh.
     `(("gettext" ,guix:gettext)))
    (arguments
     `(#:tests? #f)) ; no test target
     `(#:tests? #f ; no test target
       #:python ,python-2)) ; Python 3 apparently not yet supported, see
                            ; https://answers.launchpad.net/bzr/+question/229048
    (home-page "https://gnu.org/software/bazaar")
    (synopsis "Decentralized revision control system")
    (description


@@ 86,7 88,7 @@ from a command line or use a GUI application.")
      ("gettext" ,guix:gettext)
      ("openssl" ,openssl)
      ("perl" ,perl)
      ("python" ,python) ; CAVEAT: incompatible with python-3 according to INSTALL
      ("python" ,python-2) ; CAVEAT: incompatible with python-3 according to INSTALL
      ("zlib" ,zlib)))
   (arguments
    `(#:make-flags `("V=1") ; more verbose compilation


@@ 126,7 128,7 @@ everything from small to very large projects with speed and efficiency.")
      `(("apr" ,apr)
        ("apr-util" ,apr-util)
        ("perl" ,perl)
        ("python" ,python)
        ("python" ,python-2) ; incompatible with Python 3 (print syntax)
        ("sqlite" ,sqlite)
        ("zlib" ,zlib)))
    (home-page "http://subversion.apache.org/")

M gnu/packages/xml.scm => gnu/packages/xml.scm +2 -2
@@ 66,7 66,7 @@ things the parser might find in the XML document (like start tags).")
    (home-page "http://www.xmlsoft.org/")
    (synopsis "libxml2, a C parser for XML")
    (inputs `(("perl" ,perl)
              ("python" ,python)
              ("python" ,python-2) ; incompatible with Python 3 (print syntax)
              ("zlib" ,zlib)))
    (arguments
     `(#:phases


@@ 102,7 102,7 @@ things the parser might find in the XML document (like start tags).")
    (synopsis "libxslt, a C library for applying XSLT stylesheets to XML documents")
    (inputs `(("libgcrypt" ,libgcrypt)
              ("libxml2" ,libxml2)
              ("python" ,python)
              ("python" ,python-wrapper)
              ("zlib" ,zlib)))
    (description
     "Libxslt is an XSLT C library developed for the GNOME project. It is

M gnu/packages/xorg.scm => gnu/packages/xorg.scm +4 -4
@@ 1857,7 1857,7 @@ tracking.")
            "0ds4qg6slidrzyz6q9ckq0a19hn6blzpnvciy4brh741gn49jpdd"))))
    (build-system gnu-build-system)
    (inputs
      `(("pkg-config" ,pkg-config) ("python" ,python)))
      `(("pkg-config" ,pkg-config) ("python" ,python-wrapper)))
    (home-page "http://www.x.org/wiki/")
    (synopsis "xorg implementation of the X Window System")
    (description "X.org provides an implementation of the X Window System")


@@ 4169,7 4169,7 @@ tracking.")
        ("libxml2" ,libxml2)
        ("makedepend" ,makedepend)
        ("pkg-config" ,pkg-config)
        ("python" ,python)))
        ("python" ,python-2))) ; incompatible with Python 3 (print syntax)
    (arguments
      `(#:configure-flags
         `("--with-gallium-drivers=r600,svga,swrast") ; drop r300 from the default list as it requires llvm


@@ 4215,7 4215,7 @@ emulation to complete hardware acceleration for modern GPUs.")
      `(("xcb-proto" ,xcb-proto)
        ("libxslt" ,libxslt)
        ("pkg-config" ,pkg-config)
        ("python" ,python)))
        ("python" ,python-wrapper)))
    (home-page "http://www.x.org/wiki/")
    (synopsis "xorg implementation of the X Window System")
    (description "X.org provides an implementation of the X Window System")


@@ 4270,7 4270,7 @@ emulation to complete hardware acceleration for modern GPUs.")
        ("mesa" ,mesa)
        ("openssl" ,openssl)
        ("pkg-config" ,pkg-config)
        ("python" ,python)
        ("python" ,python-wrapper)
        ("recordproto" ,recordproto)
        ("resourceproto" ,resourceproto)
        ("scrnsaverproto" ,scrnsaverproto)

M gnu/packages/yasm.scm => gnu/packages/yasm.scm +1 -1
@@ 40,7 40,7 @@
        "0cfg7ji3ia2in628w42wrfvw2ixmmm4rghwmv2k202mraysgm3vn"))))
    (build-system gnu-build-system)
    (inputs
     `(("python" ,python)
     `(("python" ,python-wrapper)
       ("xmlto" ,xmlto)))
    (home-page "http://yasm.tortall.net/")
    (synopsis "Rewrite of the NASM assembler")

M gnu/packages/zip.scm => gnu/packages/zip.scm +2 -1
@@ 120,7 120,8 @@ UnZip recreates the stored directory structure by default.")
    (build-system gnu-build-system)
    (inputs `(("perl" ,perl)     ; for the documentation
              ("pkg-config" ,pkg-config)
              ("python" ,python) ; for the documentation
              ("python" ,python-2) ; for the documentation; Python 3 not supported,
                ; http://forums.gentoo.org/viewtopic-t-863161-start-0.html
              ("zip" ,zip) ; to create test files
              ("zlib" ,zlib)))
    (arguments

M guix/build-system/python.scm => guix/build-system/python.scm +56 -6
@@ 1,5 1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;;
;;; This file is part of GNU Guix.


@@ 25,7 26,9 @@
  #:use-module (guix build-system)
  #:use-module (guix build-system gnu)
  #:use-module (ice-9 match)
  #:export (python-build
  #:use-module (srfi srfi-26)
  #:export (package-with-python2
            python-build
            python-build-system))

;; Commentary:


@@ 39,13 42,60 @@
  "Return the default Python package."
  ;; Lazily resolve the binding to avoid a circular dependency.
  (let ((python (resolve-interface '(gnu packages python))))
    (module-ref python 'python)))
    (module-ref python 'python-wrapper)))

(define (default-python2)
  "Return the default Python 2 package."
  (let ((python (resolve-interface '(gnu packages python))))
    (module-ref python 'python-2)))

(define (package-with-explicit-python p python old-prefix new-prefix)
  "Create a package with the same fields as P, which is assumed to use
PYTHON-BUILD-SYSTEM, such that it is compiled with PYTHON instead.  The
inputs are changed recursively accordingly.  If the name of P starts with
OLD-PREFIX, this is replaced by NEW-PREFIX; otherwise, NEW-PREFIX is
prepended to the name."
  (let* ((build-system (package-build-system p))
         (rewrite-if-package
          (lambda (content)
            ;; CONTENT may be a string (e.g., for patches), in which case it
            ;; is returned, or a package, which is rewritten with the new
            ;; PYTHON and NEW-PREFIX.
            (if (package? content)
                (package-with-explicit-python content python
                                              old-prefix new-prefix)
                content)))
         (rewrite
           (match-lambda
             ((name content . rest)
              (append (list name (rewrite-if-package content)) rest)))))
    (package (inherit p)
      (name
        (let ((name (package-name p)))
          (if (eq? build-system python-build-system)
              (string-append new-prefix
                             (if (string-prefix? old-prefix name)
                                 (substring name (string-length old-prefix))
                                 name))
              name)))
      (arguments
        (let ((arguments (package-arguments p)))
          (if (eq? build-system python-build-system)
              (if (member #:python arguments)
                  (substitute-keyword-arguments arguments ((#:python p) python))
                  (append arguments `(#:python ,python)))
              arguments)))
      (inputs
        (map rewrite (package-inputs p)))
      (native-inputs
        (map rewrite (package-native-inputs p))))))

(define package-with-python2
  (cut package-with-explicit-python <> (default-python2) "python-" "python2-"))

(define* (python-build store name source inputs
                       #:key
                       (python (default-python))
                       (python-version
                        (string-take (package-version (default-python)) 3))
                       (tests? #t)
                       (configure-flags ''())
                       (phases '(@ (guix build python-build-system)


@@ 58,10 108,10 @@
                                           (guix build gnu-build-system)
                                           (guix build utils)))
                       (modules '((guix build python-build-system)
                                  (guix build gnu-build-system)
                                  (guix build utils))))
  "Build SOURCE using PYTHON, and with INPUTS.  This assumes that SOURCE
provides a 'setup.py' file as its build system."

  (define python-search-paths
    (append (package-native-search-paths python)
            (standard-search-paths)))


@@ 77,8 127,8 @@ provides a 'setup.py' file as its build system."
                     #:system ,system
                     #:test-target "test"
                     #:tests? ,tests?
                     #:phases ,phases
                     #:outputs %outputs
                     #:python-version ,python-version
                     #:search-paths ',(map search-path-specification->sexp
                                           (append python-search-paths
                                                   search-paths))

M guix/build/python-build-system.scm => guix/build/python-build-system.scm +49 -22
@@ 1,5 1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;;
;;; This file is part of GNU Guix.


@@ 34,26 35,49 @@
;;
;; Code:

(define* (install #:key outputs (configure-flags '())
                  #:allow-other-keys)
  "Install a given Python package."
  (let ((out (assoc-ref outputs "out")))
    (if (file-exists? "setup.py")
        (let ((args `("setup.py" "install" ,(string-append "--prefix=" out)
                      ,@configure-flags)))
          (format #t "running 'python' with arguments ~s~%" args)
          (zero? (apply system* "python" args)))
        (error "no setup.py found"))))

(define* (check #:key outputs #:allow-other-keys)
  "Run the test suite of a given Python package."
(define (call-setuppy command params)
  (if (file-exists? "setup.py")
      (let ((args `("setup.py" "check")))
        (format #t "running 'python' with arguments ~s~%" args)
        (zero? (apply system* "python" args)))
      (begin
         (format #t "running \"python setup.py\" with command ~s and parameters ~s~%"
                command params)
         (zero? (apply system* "python" "setup.py" command params)))
      (error "no setup.py found")))

(define* (wrap #:key outputs python-version #:allow-other-keys)
(define* (build #:rest empty)
  "Build a given Python package."
  (call-setuppy "build" '()))

(define* (check #:key tests? test-target #:allow-other-keys)
  "Run the test suite of a given Python package."
  (if tests?
    (call-setuppy test-target '())
    #t))

(define (get-python-version python)
  (string-take (string-take-right python 5) 3))

(define* (install #:key outputs inputs (configure-flags '())
                  #:allow-other-keys)
  "Install a given Python package."
  (let* ((out (assoc-ref outputs "out"))
         (params (append (list (string-append "--prefix=" out))
                         configure-flags))
         (python-version (get-python-version (assoc-ref inputs "python")))
         (old-path (getenv "PYTHONPATH"))
         (add-path (string-append out "/lib/python" python-version
                                  "/site-packages/")))
        ;; create the module installation directory and add it to PYTHONPATH
        ;; to make setuptools happy
        (mkdir-p add-path)
        (setenv "PYTHONPATH"
                (string-append (if old-path
                                   (string-append old-path ":")
                                   "")
                               add-path))
        (call-setuppy "install" params)))

(define* (wrap #:key inputs outputs #:allow-other-keys)
  (define (list-of-files dir)
    (map (cut string-append dir "/" <>)
         (or (scandir dir (lambda (f)


@@ 69,9 93,11 @@
                outputs))

  (let* ((out  (assoc-ref outputs "out"))
         (python (assoc-ref inputs "python"))
         (var `("PYTHONPATH" prefix
                ,(cons (string-append out "/lib/python"
                                      python-version "/site-packages")
                                      (get-python-version python)
                                      "/site-packages")
                       (search-path-as-string->list
                        (or (getenv "PYTHONPATH") ""))))))
    (for-each (lambda (dir)


@@ 87,11 113,12 @@
   'install 'wrap
   wrap
   (alist-replace
    'check check
    (alist-replace 'install install
                   (alist-delete 'configure
                                (alist-delete 'build
                                              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)