about summary refs log tree commit diff
path: root/pkgs/development/python-modules
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2009-05-24 21:02:59 +0000
committerLudovic Courtès <ludo@gnu.org>2009-05-24 21:02:59 +0000
commit7c34f5744b63b58a43e20ca628685a7c6d8ff3ac (patch)
tree2dd6a075b849542b70730c015789eac70654a316 /pkgs/development/python-modules
parent8d7bf1a11ea9203516c059feca49b2939b78dfa4 (diff)
Add a `buildPythonPackage' function.
svn path=/nixpkgs/trunk/; revision=15706
Diffstat (limited to 'pkgs/development/python-modules')
-rw-r--r--pkgs/development/python-modules/generic/default.nix79
1 files changed, 79 insertions, 0 deletions
diff --git a/pkgs/development/python-modules/generic/default.nix b/pkgs/development/python-modules/generic/default.nix
new file mode 100644
index 0000000000000..9af5312ad07d4
--- /dev/null
+++ b/pkgs/development/python-modules/generic/default.nix
@@ -0,0 +1,79 @@
+/* This function provides a generic Python package builder.  It is
+   intended to work with packages that use `setuptools'
+   (http://pypi.python.org/pypi/setuptools/), which represents a large
+   number of Python packages nowadays.  */
+
+{ python, setuptools, makeWrapper, lib }:
+
+attrs:
+
+let
+    # Return the list of recursively propagated build inputs of PKG.
+    recursiveBuildInputs =
+      pkg:
+        [ pkg ] ++
+        (if pkg ? propagatedBuildInputs
+         then lib.concatLists (map recursiveBuildInputs
+                                   pkg.propagatedBuildInputs)
+         else []);
+
+in
+
+python.stdenv.mkDerivation rec {
+  inherit (attrs) src meta;
+
+  name = "python-" + attrs.name;
+
+  buildInputs = [ python setuptools makeWrapper ] ++
+    (if attrs ? buildInputs then attrs.buildInputs else []);
+
+  propagatedBuildInputs = [ setuptools ] ++
+    (if attrs ? propagatedBuildInputs
+     then attrs.propagatedBuildInputs
+     else []);
+
+  buildPhase = "true";
+
+  doCheck =
+    (if attrs ? doCheck
+     then attrs.doCheck
+     else true);
+
+  # Many packages, but not all, support this.
+  checkPhase = "python setup.py test";
+
+  installPhase = ''
+    ensureDir "$out/lib/${python.libPrefix}/site-packages"
+
+    echo "installing \`${name}' with \`easy_install'..."
+    export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
+    easy_install --prefix="$out" .
+  '';
+
+  postFixup = ''
+    # Wrap scripts that are under `{s,}bin/' so that they get the right
+    # $PYTHONPATH.
+    for i in "$out/bin/"* "$out/sbin/"*
+    do
+      if head -n1 "$i" | grep -q "${python}"
+      then
+          echo "wrapping \`$i'..."
+          wrapProgram "$i"                          \
+            --prefix PYTHONPATH ":"                 \
+            ${lib.concatStringsSep ":"
+               ([ "$out/lib/${python.libPrefix}/site-packages" ] ++
+                (map (path: path + "/lib/${python.libPrefix}/site-packages")
+                     (lib.concatMap recursiveBuildInputs
+                                    propagatedBuildInputs)))}
+      fi
+    done
+
+    # If a user installs a Python package, she probably also wants its
+    # dependencies in the user environment (since Python modules don't
+    # have something like an RPATH, so the only way to find the
+    # dependencies is to have them in the PYTHONPATH variable).
+    if test -e $out/nix-support/propagated-build-inputs; then
+        ln -s $out/nix-support/propagated-build-inputs $out/nix-support/propagated-user-env-packages
+    fi
+  '';
+}