at master 2.2 kB view raw
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