1{ stdenv, python, buildEnv, makeWrapper
2, extraLibs ? []
3, postBuild ? ""
4, ignoreCollisions ? false }:
5
6# Create a python executable that knows about additional packages.
7let
8 recursivePthLoader = import ../../python-modules/recursive-pth-loader/default.nix { stdenv = stdenv; python = python; };
9 env = (
10 let
11 paths = stdenv.lib.filter (x : x ? pythonPath) (stdenv.lib.closePropagation extraLibs) ++ [ python recursivePthLoader ];
12 in buildEnv {
13 name = "${python.name}-env";
14
15 inherit paths;
16 inherit ignoreCollisions;
17
18 postBuild = ''
19 . "${makeWrapper}/nix-support/setup-hook"
20
21 if [ -L "$out/bin" ]; then
22 unlink "$out/bin"
23 fi
24 mkdir -p "$out/bin"
25
26 for path in ${stdenv.lib.concatStringsSep " " paths}; do
27 if [ -d "$path/bin" ]; then
28 cd "$path/bin"
29 for prg in *; do
30 if [ -f "$prg" ]; then
31 rm -f "$out/bin/$prg"
32 makeWrapper "$path/bin/$prg" "$out/bin/$prg" --set PYTHONHOME "$out"
33 fi
34 done
35 fi
36 done
37 '' + postBuild;
38
39 passthru.env = stdenv.mkDerivation {
40 name = "interactive-${python.name}-environment";
41 nativeBuildInputs = [ env ];
42
43 buildCommand = ''
44 echo >&2 ""
45 echo >&2 "*** Python 'env' attributes are intended for interactive nix-shell sessions, not for building! ***"
46 echo >&2 ""
47 exit 1
48 '';
49 };
50 }) // {
51 inherit python;
52 inherit (python) meta;
53 };
54in env