about summary refs log tree commit diff
path: root/pkgs/development/python-modules/generic/default.nix
blob: 9af5312ad07d4ee1f7e9f700b414e4ac8af3f89c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
  '';
}