at 25.11-pre 2.3 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 '' 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