summary refs log tree commit diff
path: root/pkgs/development/interpreters/perl/default.nix
blob: 1e14d386b138705aa5f75b673fc38d28dece3415 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
{ lib, stdenv, fetchurlBoot, enableThreading ? stdenv ? glibc }:

with lib;

# We can only compile perl with threading on platforms where we have a
# real glibc in the stdenv.
#
# Instead of silently building an unthreaded perl if this is not the
# case, we force callers to disableThreading explicitly, therefore
# documenting the platforms where the perl is not threaded.
#
# In the case of stdenv linux boot stage1 it's not possible to use
# threading because of the simpleness of the bootstrap glibc, so we
# use enableThreading = false there.
assert enableThreading -> (stdenv ? glibc);

let

  libc = if stdenv.cc.libc or null != null then stdenv.cc.libc else "/usr";

  common = { version, sha256 }: stdenv.mkDerivation rec {
    name = "perl-${version}";

    src = fetchurlBoot {
      url = "mirror://cpan/src/5.0/${name}.tar.gz";
      inherit sha256;
    };

    outputs = [ "out" "man" ];

    patches =
      [ # Do not look in /usr etc. for dependencies.
        ./no-sys-dirs.patch
      ]
      ++ optional stdenv.isSunOS ./ld-shared.patch
      ++ optional stdenv.isDarwin [ ./cpp-precomp.patch ];

    # There's an annoying bug on sandboxed Darwin in Perl's Cwd.pm where it looks for pwd
    # in /bin/pwd and /usr/bin/pwd and then falls back on just "pwd" if it can't get them
    # while at the same time erasing the PATH environment variable so it unconditionally
    # fails. The code in question is guarded by a check for Mac OS, but the patch below
    # doesn't have any runtime effect on other platforms.
    postPatch = optional stdenv.isDarwin ''
      pwd="$(type -P pwd)"
      substituteInPlace dist/PathTools/Cwd.pm \
        --replace "/bin/pwd" "$pwd"
    '';

    sandboxProfile = sandbox.allow "ipc-sysv-sem";

    # Build a thread-safe Perl with a dynamic libperls.o.  We need the
    # "installstyle" option to ensure that modules are put under
    # $out/lib/perl5 - this is the general default, but because $out
    # contains the string "perl", Configure would select $out/lib.
    # Miniperl needs -lm. perl needs -lrt.
    configureFlags =
      [ "-de"
        "-Dcc=cc"
        "-Uinstallusrbinperl"
        "-Dinstallstyle=lib/perl5"
        "-Duseshrplib"
        "-Dlocincpth=${libc}/include"
        "-Dloclibpth=${libc}/lib"
      ]
      ++ optional stdenv.isSunOS "-Dcc=gcc"
      ++ optional enableThreading "-Dusethreads";

    configureScript = "${stdenv.shell} ./Configure";

    dontAddPrefix = true;

    enableParallelBuilding = true;

    # FIXME needs gcc 4.9 in bootstrap tools
    hardeningDisable = [ "stackprotector" ];

    preConfigure =
      ''
        configureFlags="$configureFlags -Dprefix=$out -Dman1dir=$out/share/man/man1 -Dman3dir=$out/share/man/man3"

        ${optionalString stdenv.isArm ''
          configureFlagsArray=(-Dldflags="-lm -lrt")
        ''}
      '' + optionalString stdenv.isDarwin ''
        substituteInPlace hints/darwin.sh --replace "env MACOSX_DEPLOYMENT_TARGET=10.3" ""
      '' + optionalString (!enableThreading) ''
        # We need to do this because the bootstrap doesn't have a static libpthread
        sed -i 's,\(libswanted.*\)pthread,\1,g' Configure
      '';

    preBuild = optionalString (!(stdenv ? cc && stdenv.cc.nativeTools))
      ''
        # Make Cwd work on NixOS (where we don't have a /bin/pwd).
        substituteInPlace dist/PathTools/Cwd.pm --replace "'/bin/pwd'" "'$(type -tP pwd)'"
      '';

    # Inspired by nuke-references, which I can't depend on because it uses perl. Perhaps it should just use sed :)
    postInstall = ''
      self=$(echo $out | sed -n "s|^$NIX_STORE/\\([a-z0-9]\{32\}\\)-.*|\1|p")

      sed -i "/$self/b; s|$NIX_STORE/[a-z0-9]\{32\}-|$NIX_STORE/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-|g" "$out"/lib/perl5/*/*/Config.pm
      sed -i "/$self/b; s|$NIX_STORE/[a-z0-9]\{32\}-|$NIX_STORE/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-|g" "$out"/lib/perl5/*/*/Config_heavy.pl
    '';

    setupHook = ./setup-hook.sh;

    passthru.libPrefix = "lib/perl5/site_perl";

    meta = {
      homepage = https://www.perl.org/;
      description = "The standard implementation of the Perl 5 programmming language";
      maintainers = [ maintainers.eelco ];
      platforms = platforms.all;
    };
  };

in rec {

  perl = perl520;

  perl520 = common {
    version = "5.20.3";
    sha256 = "0jlvpd5l5nk7lzfd4akdg1sw6vinbkj6izclyyr0lrbidfky691m";

  };

  perl522 = common {
    version = "5.22.1";
    sha256 = "09wg24w5syyafyv87l6z8pxwz4bjgcdj996bx5844k6m9445sirb";
  };

}