1{ lib, perl, buildEnv, makeWrapper
2, extraLibs ? []
3, extraOutputsToInstall ? []
4, postBuild ? ""
5, ignoreCollisions ? false
6, requiredPerlModules
7}:
8
9# Create a perl executable that knows about additional packages.
10let
11 env = let
12 paths = requiredPerlModules (extraLibs ++ [ perl ] );
13 in buildEnv {
14 name = "${perl.name}-env";
15
16 inherit paths;
17 inherit ignoreCollisions;
18 extraOutputsToInstall = [ "out" ] ++ extraOutputsToInstall;
19
20 nativeBuildInputs = [ makeWrapper ];
21
22 # we create wrapper for the binaries in the different packages
23 postBuild = ''
24 if [ -L "$out/bin" ]; then
25 unlink "$out/bin"
26 fi
27 mkdir -p "$out/bin"
28
29 # take every binary from perl packages and put them into the env
30 for path in ${lib.concatStringsSep " " paths}; do
31 if [ -d "$path/bin" ]; then
32 cd "$path/bin"
33 for prg in *; do
34 if [ -f "$prg" ]; then
35 rm -f "$out/bin/$prg"
36 if [ -x "$prg" ]; then
37 makeWrapper "$path/bin/$prg" "$out/bin/$prg" --suffix PERL5LIB ':' "$out/${perl.libPrefix}"
38 fi
39 fi
40 done
41 fi
42 done
43 '' + postBuild;
44
45 meta = perl.meta // { outputsToInstall = ["out"]; }; # remove "man" from meta.outputsToInstall. pkgs.buildEnv produces no "man", it puts everything to "out"
46
47 passthru = perl.passthru // {
48 interpreter = "${env}/bin/perl";
49 inherit perl;
50 };
51 };
52in env