1{
2 lib,
3 stdenv,
4 buildEnv,
5 makeBinaryWrapper,
6
7 # manually pased
8 python,
9 requiredPythonModules,
10
11 # extra opts
12 extraLibs ? [ ],
13 extraOutputsToInstall ? [ ],
14 postBuild ? "",
15 ignoreCollisions ? false,
16 permitUserSite ? false,
17 # Wrap executables with the given argument.
18 makeWrapperArgs ? [ ],
19}:
20
21# Create a python executable that knows about additional packages.
22let
23 env =
24 let
25 paths = requiredPythonModules (extraLibs ++ [ python ]);
26 pythonPath = "${placeholder "out"}/${python.sitePackages}";
27 pythonExecutable = "${placeholder "out"}/bin/${python.executable}";
28 in
29 buildEnv {
30 name = "${python.name}-env";
31
32 inherit paths;
33 inherit ignoreCollisions;
34 extraOutputsToInstall = [ "out" ] ++ extraOutputsToInstall;
35
36 nativeBuildInputs = [ makeBinaryWrapper ];
37
38 postBuild =
39 ''
40 if [ -L "$out/bin" ]; then
41 unlink "$out/bin"
42 fi
43 mkdir -p "$out/bin"
44
45 for path in ${lib.concatStringsSep " " paths}; do
46 if [ -d "$path/bin" ]; then
47 cd "$path/bin"
48 for prg in *; do
49 if [ -f "$prg" ]; then
50 rm -f "$out/bin/$prg"
51 if [ -x "$prg" ]; then
52 makeWrapper "$path/bin/$prg" "$out/bin/$prg" --set NIX_PYTHONPREFIX "$out" --set NIX_PYTHONEXECUTABLE ${pythonExecutable} --set NIX_PYTHONPATH ${pythonPath} ${
53 lib.optionalString (!permitUserSite) ''--set PYTHONNOUSERSITE "true"''
54 } ${lib.concatStringsSep " " makeWrapperArgs}
55 fi
56 fi
57 done
58 fi
59 done
60 ''
61 + postBuild;
62
63 inherit (python) meta;
64
65 passthru = python.passthru // {
66 interpreter = "${env}/bin/${python.executable}";
67 inherit python;
68 env = stdenv.mkDerivation {
69 name = "interactive-${python.name}-environment";
70 nativeBuildInputs = [ env ];
71
72 buildCommand = ''
73 echo >&2 ""
74 echo >&2 "*** Python 'env' attributes are intended for interactive nix-shell sessions, not for building! ***"
75 echo >&2 ""
76 exit 1
77 '';
78 };
79 };
80 };
81in
82env