at 23.05-pre 2.0 kB view raw
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