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 if [ -L "$out/bin" ]; then
36 unlink "$out/bin"
37 fi
38 mkdir -p "$out/bin"
39
40 # take every binary from perl packages and put them into the env
41 for path in ${lib.concatStringsSep " " paths}; do
42 if [ -d "$path/bin" ]; then
43 cd "$path/bin"
44 for prg in *; do
45 if [ -f "$prg" ]; then
46 rm -f "$out/bin/$prg"
47 if [ -x "$prg" ]; then
48 makeWrapper "$path/bin/$prg" "$out/bin/$prg" --suffix PERL5LIB ':' "$out/${perl.libPrefix}"
49 fi
50 fi
51 done
52 fi
53 done
54 ''
55 + postBuild;
56
57 meta = perl.meta // {
58 outputsToInstall = [ "out" ];
59 }; # remove "man" from meta.outputsToInstall. pkgs.buildEnv produces no "man", it puts everything to "out"
60
61 passthru = perl.passthru // {
62 interpreter = "${env}/bin/perl";
63 inherit perl;
64 };
65 };
66in
67env