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 if [ -L "$out/bin" ]; then
40 unlink "$out/bin"
41 fi
42 mkdir -p "$out/bin"
43
44 for path in ${lib.concatStringsSep " " paths}; do
45 if [ -d "$path/bin" ]; then
46 cd "$path/bin"
47 for prg in *; do
48 if [ -f "$prg" ]; then
49 rm -f "$out/bin/$prg"
50 if [ -x "$prg" ]; then
51 makeWrapper "$path/bin/$prg" "$out/bin/$prg" --set NIX_PYTHONPREFIX "$out" --set NIX_PYTHONEXECUTABLE ${pythonExecutable} --set NIX_PYTHONPATH ${pythonPath} ${
52 lib.optionalString (!permitUserSite) ''--set PYTHONNOUSERSITE "true"''
53 } ${lib.concatStringsSep " " makeWrapperArgs}
54 fi
55 fi
56 done
57 fi
58 done
59 ''
60 + postBuild;
61
62 inherit (python) meta;
63
64 passthru = python.passthru // {
65 interpreter = "${env}/bin/${python.executable}";
66 inherit python;
67 env = stdenv.mkDerivation {
68 name = "interactive-${python.name}-environment";
69 nativeBuildInputs = [ env ];
70
71 buildCommand = ''
72 echo >&2 ""
73 echo >&2 "*** Python 'env' attributes are intended for interactive nix-shell sessions, not for building! ***"
74 echo >&2 ""
75 exit 1
76 '';
77 };
78 };
79 };
80in
81env