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