summary refs log tree commit diff
path: root/pkgs/development/python2-packages/generic/default.nix
blob: 458a30116ae83d2b12fb6f2c26720d86cd076889 (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/* 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 }:

{ name, namePrefix ? "python-", src, meta, patches ? []
, doCheck ? true, checkPhase ? "python setup.py test"
, postInstall ? ""
, ... } @ attrs:

let
    # Return the list of recursively propagated build inputs of PKG.
    recursiveBuildInputs =
      pkg:
        [ pkg ] ++
        (if pkg ? propagatedBuildNativeInputs
         then lib.concatLists (map recursiveBuildInputs
                                   pkg.propagatedBuildNativeInputs)
         else []);

in

python.stdenv.mkDerivation (
  # Keep extra attributes from ATTR, e.g., `patchPhase', etc.
  attrs

  //

  (rec {
  inherit src meta patches doCheck checkPhase;

  name = namePrefix + attrs.name;

  buildInputs = [ python setuptools makeWrapper ] ++
    (if attrs ? buildInputs then attrs.buildInputs else []);

  propagatedBuildInputs = [ setuptools ] ++
    (if attrs ? propagatedBuildInputs
     then attrs.propagatedBuildInputs
     else []);

  buildPhase = "true";

  # XXX: Should we run `easy_install --always-unzip'?  It doesn't seem
  # to have a noticeable impact on small scripts.
  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" .

    ${postInstall}
  '';

  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'..."

          # Compute a $PATH prefix for the program.
          program_PATH=""
          ${lib.concatStrings
            (map (path:
                  ''if [ -d "${path}/bin" ]
                    then
                        program_PATH="${path}/bin'' + "\$" + ''{program_PATH:+:}$program_PATH"
                    fi
                   '')
                 (lib.concatMap recursiveBuildInputs propagatedBuildInputs))}

          wrapProgram "$i"                          \
            --prefix PYTHONPATH ":"                 \
            ${lib.concatStringsSep ":"
               ([ "$out/lib/${python.libPrefix}/site-packages" ] ++
                (map (path: path + "/lib/${python.libPrefix}/site-packages")
                     (lib.concatMap recursiveBuildInputs
                                    propagatedBuildInputs)))} \
            --prefix PATH ":" "$program_PATH"

      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
  '';
}))