diff options
author | Ludovic Courtès <ludo@gnu.org> | 2009-05-24 21:02:59 +0000 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2009-05-24 21:02:59 +0000 |
commit | 7c34f5744b63b58a43e20ca628685a7c6d8ff3ac (patch) | |
tree | 2dd6a075b849542b70730c015789eac70654a316 /pkgs/development/python-modules | |
parent | 8d7bf1a11ea9203516c059feca49b2939b78dfa4 (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.nix | 79 |
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 + ''; +} |