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 = let
10 paths = stdenv.lib.closePropagation (extraLibs ++ [ python recursivePthLoader ] ) ;
11 in buildEnv {
12 name = "${python.name}-env";
13
14 inherit paths;
15 inherit ignoreCollisions;
16
17 postBuild = ''
18 . "${makeWrapper}/nix-support/setup-hook"
19
20 if [ -L "$out/bin" ]; then
21 unlink "$out/bin"
22 fi
23 mkdir -p "$out/bin"
24
25 for path in ${stdenv.lib.concatStringsSep " " paths}; do
26 if [ -d "$path/bin" ]; then
27 cd "$path/bin"
28 for prg in *; do
29 if [ -f "$prg" ]; then
30 rm -f "$out/bin/$prg"
31 if [ -x "$prg" ]; then
32 makeWrapper "$path/bin/$prg" "$out/bin/$prg" --set PYTHONHOME "$out" --set PYTHONNOUSERSITE "true"
33 fi
34 fi
35 done
36 fi
37 done
38 '' + postBuild;
39
40 inherit (python) meta;
41
42 passthru = python.passthru // {
43 interpreter = "${env}/bin/${python.executable}";
44 inherit python;
45 env = stdenv.mkDerivation {
46 name = "interactive-${python.name}-environment";
47 nativeBuildInputs = [ env ];
48
49 buildCommand = ''
50 echo >&2 ""
51 echo >&2 "*** Python 'env' attributes are intended for interactive nix-shell sessions, not for building! ***"
52 echo >&2 ""
53 exit 1
54 '';
55 };
56 };
57 };
58in env