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