2019-05-08 16:09:19 +02:00
|
|
|
{ config, lib, stdenv, fetchurl, pkgs, buildPackages, callPackage
|
2019-08-02 03:27:55 +02:00
|
|
|
, enableThreading ? stdenv ? glibc, coreutils, makeWrapper
|
2018-02-28 18:00:03 +01:00
|
|
|
}:
|
2016-02-27 22:04:47 +01:00
|
|
|
|
|
|
|
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";
|
2016-04-14 18:00:39 +02:00
|
|
|
libcInc = lib.getDev libc;
|
|
|
|
libcLib = lib.getLib libc;
|
2017-10-16 04:34:20 +02:00
|
|
|
crossCompiling = stdenv.buildPlatform != stdenv.hostPlatform;
|
2019-04-09 16:49:47 +02:00
|
|
|
|
2019-05-08 16:09:19 +02:00
|
|
|
common = { perl, buildPerl, version, sha256 }: stdenv.mkDerivation (rec {
|
2018-06-27 15:37:36 +02:00
|
|
|
inherit version;
|
|
|
|
|
2016-02-27 22:04:47 +01:00
|
|
|
name = "perl-${version}";
|
|
|
|
|
2018-11-17 18:23:24 +01:00
|
|
|
src = fetchurl {
|
2016-02-27 22:04:47 +01:00
|
|
|
url = "mirror://cpan/src/5.0/${name}.tar.gz";
|
|
|
|
inherit sha256;
|
|
|
|
};
|
|
|
|
|
2016-03-07 22:03:07 +01:00
|
|
|
# TODO: Add a "dev" output containing the header files.
|
2018-02-28 18:00:03 +01:00
|
|
|
outputs = [ "out" "man" "devdoc" ] ++
|
2019-08-02 03:27:55 +02:00
|
|
|
optional crossCompiling "dev";
|
2016-03-07 22:03:07 +01:00
|
|
|
setOutputFlags = false;
|
2016-02-27 22:04:47 +01:00
|
|
|
|
2018-09-23 07:28:23 +02:00
|
|
|
disallowedReferences = [ stdenv.cc ];
|
|
|
|
|
2016-02-27 22:04:47 +01:00
|
|
|
patches =
|
2018-10-03 21:25:44 +02:00
|
|
|
[
|
|
|
|
# Do not look in /usr etc. for dependencies.
|
2019-08-06 11:37:23 +02:00
|
|
|
(if (versionOlder version "5.29.6") then ./no-sys-dirs-5.26.patch
|
|
|
|
else if (versionOlder version "5.31.1") then ./no-sys-dirs-5.29.patch
|
|
|
|
else ./no-sys-dirs-5.31.patch)
|
2019-01-01 19:08:44 +01:00
|
|
|
]
|
|
|
|
++ optional (versionOlder version "5.29.6")
|
2017-12-06 23:20:56 +01:00
|
|
|
# Fix parallel building: https://rt.perl.org/Public/Bug/Display.html?id=132360
|
2018-11-17 18:23:24 +01:00
|
|
|
(fetchurl {
|
2017-12-06 23:20:56 +01:00
|
|
|
url = "https://rt.perl.org/Public/Ticket/Attachment/1502646/807252/0001-Fix-missing-build-dependency-for-pods.patch";
|
|
|
|
sha256 = "1bb4mldfp8kq1scv480wm64n2jdsqa3ar46cjp1mjpby8h5dr2r0";
|
|
|
|
})
|
2016-02-27 22:04:47 +01:00
|
|
|
++ optional stdenv.isSunOS ./ld-shared.patch
|
2018-10-03 22:34:04 +02:00
|
|
|
++ optionals stdenv.isDarwin [ ./cpp-precomp.patch ./sw_vers.patch ]
|
2018-02-28 18:00:03 +01:00
|
|
|
++ optional crossCompiling ./MakeMaker-cross.patch;
|
2016-02-27 22:04:47 +01:00
|
|
|
|
2019-08-02 03:27:55 +02:00
|
|
|
# This is not done for native builds because pwd may need to come from
|
|
|
|
# bootstrap tools when building bootstrap perl.
|
|
|
|
postPatch = (if crossCompiling then ''
|
2016-02-27 22:04:47 +01:00
|
|
|
substituteInPlace dist/PathTools/Cwd.pm \
|
2019-08-02 03:27:55 +02:00
|
|
|
--replace "/bin/pwd" '${coreutils}/bin/pwd'
|
2017-10-16 04:34:20 +02:00
|
|
|
substituteInPlace cnf/configure_tool.sh --replace "cc -E -P" "cc -E"
|
2019-08-02 03:27:55 +02:00
|
|
|
'' else ''
|
|
|
|
substituteInPlace dist/PathTools/Cwd.pm \
|
|
|
|
--replace "/bin/pwd" "$(type -P pwd)"
|
|
|
|
'') +
|
|
|
|
# Perl's build system uses the src variable, and its value may end up in
|
|
|
|
# the output in some cases (when cross-compiling)
|
|
|
|
''
|
|
|
|
unset src
|
2016-02-27 22:04:47 +01:00
|
|
|
'';
|
|
|
|
|
|
|
|
# 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 =
|
2017-10-16 04:34:20 +02:00
|
|
|
(if crossCompiling
|
|
|
|
then [ "-Dlibpth=\"\"" "-Dglibpth=\"\"" ]
|
|
|
|
else [ "-de" "-Dcc=cc" ])
|
|
|
|
++ [
|
2016-02-27 22:04:47 +01:00
|
|
|
"-Uinstallusrbinperl"
|
|
|
|
"-Dinstallstyle=lib/perl5"
|
|
|
|
"-Duseshrplib"
|
2016-03-07 22:03:07 +01:00
|
|
|
"-Dlocincpth=${libcInc}/include"
|
|
|
|
"-Dloclibpth=${libcLib}/lib"
|
2016-02-27 22:04:47 +01:00
|
|
|
]
|
2018-09-25 22:52:31 +02:00
|
|
|
++ optionals ((builtins.match ''5\.[0-9]*[13579]\..+'' version) != null) [ "-Dusedevel" "-Uversiononly" ]
|
2016-02-27 22:04:47 +01:00
|
|
|
++ optional stdenv.isSunOS "-Dcc=gcc"
|
|
|
|
++ optional enableThreading "-Dusethreads";
|
|
|
|
|
2019-08-02 03:27:55 +02:00
|
|
|
configureScript = optionalString (!crossCompiling) "${stdenv.shell} ./Configure";
|
2016-02-27 22:04:47 +01:00
|
|
|
|
2017-10-16 04:34:20 +02:00
|
|
|
dontAddPrefix = !crossCompiling;
|
2016-02-27 22:04:47 +01:00
|
|
|
|
2017-10-16 04:34:20 +02:00
|
|
|
enableParallelBuilding = !crossCompiling;
|
2016-02-27 22:04:47 +01:00
|
|
|
|
2019-02-04 03:36:59 +01:00
|
|
|
preConfigure = ''
|
|
|
|
substituteInPlace ./Configure --replace '`LC_ALL=C; LANGUAGE=C; export LC_ALL; export LANGUAGE; $date 2>&1`' 'Thu Jan 1 00:00:01 UTC 1970'
|
|
|
|
substituteInPlace ./Configure --replace '$uname -a' '$uname --kernel-name --machine --operating-system'
|
|
|
|
'' + optionalString (!crossCompiling) ''
|
2016-02-27 22:04:47 +01:00
|
|
|
configureFlags="$configureFlags -Dprefix=$out -Dman1dir=$out/share/man/man1 -Dman3dir=$out/share/man/man3"
|
treewide: isArm -> isAarch32
Following legacy packing conventions, `isArm` was defined just for
32-bit ARM instruction set. This is confusing to non packagers though,
because Aarch64 is an ARM instruction set.
The official ARM overview for ARMv8[1] is surprisingly not confusing,
given the overall state of affairs for ARM naming conventions, and
offers us a solution. It divides the nomenclature into three levels:
```
ISA: ARMv8 {-A, -R, -M}
/ \
Mode: Aarch32 Aarch64
| / \
Encoding: A64 A32 T32
```
At the top is the overall v8 instruction set archicture. Second are the
two modes, defined by bitwidth but differing in other semantics too, and
buttom are the encodings, (hopefully?) isomorphic if they encode the
same mode.
The 32 bit encodings are mostly backwards compatible with previous
non-Thumb and Thumb encodings, and if so we can pun the mode names to
instead mean "sets of compatable or isomorphic encodings", and then
voilà we have nice names for 32-bit and 64-bit arm instruction sets
which do not use the word ARM so as to not confused either laymen or
experienced ARM packages.
[1]: https://developer.arm.com/products/architecture/a-profile
2018-03-20 03:41:06 +01:00
|
|
|
'' + optionalString (stdenv.isAarch32 || stdenv.isMips) ''
|
2016-07-22 20:22:45 +02:00
|
|
|
configureFlagsArray=(-Dldflags="-lm -lrt")
|
2016-02-27 22:04:47 +01:00
|
|
|
'' + 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
|
|
|
|
'';
|
|
|
|
|
|
|
|
setupHook = ./setup-hook.sh;
|
|
|
|
|
2019-04-09 16:49:47 +02:00
|
|
|
passthru = rec {
|
2019-05-08 16:09:19 +02:00
|
|
|
interpreter = "${perl}/bin/perl";
|
2019-04-09 16:49:47 +02:00
|
|
|
libPrefix = "lib/perl5/site_perl";
|
|
|
|
pkgs = callPackage ../../../top-level/perl-packages.nix {
|
2019-05-08 16:09:19 +02:00
|
|
|
inherit perl buildPerl;
|
2019-04-09 16:49:47 +02:00
|
|
|
overrides = config.perlPackageOverrides or (p: {}); # TODO: (self: super: {}) like in python
|
|
|
|
};
|
|
|
|
buildEnv = callPackage ./wrapper.nix {
|
2019-05-08 16:09:19 +02:00
|
|
|
inherit perl;
|
2019-04-09 16:49:47 +02:00
|
|
|
inherit (pkgs) requiredPerlModules;
|
|
|
|
};
|
|
|
|
withPackages = f: buildEnv.override { extraLibs = f pkgs; };
|
|
|
|
};
|
2016-02-27 22:04:47 +01:00
|
|
|
|
2018-04-25 05:20:18 +02:00
|
|
|
doCheck = false; # some tests fail, expensive
|
|
|
|
|
2017-05-30 18:11:37 +02:00
|
|
|
# TODO: it seems like absolute paths to some coreutils is required.
|
|
|
|
postInstall =
|
|
|
|
''
|
|
|
|
# Remove dependency between "out" and "man" outputs.
|
|
|
|
rm "$out"/lib/perl5/*/*/.packlist
|
|
|
|
|
|
|
|
# Remove dependencies on glibc and gcc
|
|
|
|
sed "/ *libpth =>/c libpth => ' '," \
|
|
|
|
-i "$out"/lib/perl5/*/*/Config.pm
|
|
|
|
# TODO: removing those paths would be cleaner than overwriting with nonsense.
|
|
|
|
substituteInPlace "$out"/lib/perl5/*/*/Config_heavy.pl \
|
|
|
|
--replace "${libcInc}" /no-such-path \
|
|
|
|
--replace "${
|
|
|
|
if stdenv.cc.cc or null != null then stdenv.cc.cc else "/no-such-path"
|
|
|
|
}" /no-such-path \
|
2018-09-23 07:28:23 +02:00
|
|
|
--replace "${stdenv.cc}" /no-such-path \
|
2017-05-30 18:11:37 +02:00
|
|
|
--replace "$man" /no-such-path
|
2019-08-02 03:27:55 +02:00
|
|
|
'' + optionalString crossCompiling
|
2018-02-28 18:00:03 +01:00
|
|
|
''
|
|
|
|
mkdir -p $dev/lib/perl5/cross_perl/${version}
|
|
|
|
for dir in cnf/{stub,cpan}; do
|
|
|
|
cp -r $dir/* $dev/lib/perl5/cross_perl/${version}
|
|
|
|
done
|
|
|
|
|
|
|
|
mkdir -p $dev/bin
|
|
|
|
install -m755 miniperl $dev/bin/perl
|
|
|
|
|
|
|
|
export runtimeArch="$(ls $out/lib/perl5/site_perl/${version})"
|
|
|
|
# wrapProgram should use a runtime-native SHELL by default, but
|
|
|
|
# it actually uses a buildtime-native one. If we ever fix that,
|
|
|
|
# we'll need to fix this to use a buildtime-native one.
|
|
|
|
#
|
|
|
|
# Adding the arch-specific directory is morally incorrect, as
|
|
|
|
# miniperl can't load the native modules there. However, it can
|
|
|
|
# (and sometimes needs to) load and run some of the pure perl
|
|
|
|
# code there, so we add it anyway. When needed, stubs can be put
|
|
|
|
# into $dev/lib/perl5/cross_perl/${version}.
|
|
|
|
wrapProgram $dev/bin/perl --prefix PERL5LIB : \
|
|
|
|
"$dev/lib/perl5/cross_perl/${version}:$out/lib/perl5/${version}:$out/lib/perl5/${version}/$runtimeArch"
|
2017-05-30 18:11:37 +02:00
|
|
|
''; # */
|
2016-03-07 22:03:07 +01:00
|
|
|
|
2016-02-27 22:04:47 +01:00
|
|
|
meta = {
|
|
|
|
homepage = https://www.perl.org/;
|
|
|
|
description = "The standard implementation of the Perl 5 programmming language";
|
2018-08-18 23:11:55 +02:00
|
|
|
license = licenses.artistic1;
|
2016-02-27 22:04:47 +01:00
|
|
|
maintainers = [ maintainers.eelco ];
|
|
|
|
platforms = platforms.all;
|
2019-04-22 17:50:34 +02:00
|
|
|
priority = 6; # in `buildEnv' (including the one inside `perl.withPackages') the library files will have priority over files in `perl`
|
2016-02-27 22:04:47 +01:00
|
|
|
};
|
2019-08-02 03:27:55 +02:00
|
|
|
} // optionalAttrs (stdenv.buildPlatform != stdenv.hostPlatform) rec {
|
2019-11-23 13:39:54 +01:00
|
|
|
crossVersion = "ba90816ef2c24dc06fd6cd2c854abcfa1aae00a3"; # Nov 22, 2019
|
2017-10-16 04:34:20 +02:00
|
|
|
|
2018-11-17 18:23:24 +01:00
|
|
|
perl-cross-src = fetchurl {
|
2018-10-11 23:53:52 +02:00
|
|
|
url = "https://github.com/arsv/perl-cross/archive/${crossVersion}.tar.gz";
|
2019-11-23 13:39:54 +01:00
|
|
|
sha256 = "19jq5fz6l64s0v6j64n5mkk5v2srpyfn9sc09hwbpkp9n74q82j4";
|
2017-10-16 04:34:20 +02:00
|
|
|
};
|
|
|
|
|
2018-02-28 18:00:03 +01:00
|
|
|
depsBuildBuild = [ buildPackages.stdenv.cc makeWrapper ];
|
2017-10-16 04:34:20 +02:00
|
|
|
|
|
|
|
postUnpack = ''
|
|
|
|
unpackFile ${perl-cross-src}
|
|
|
|
cp -R perl-cross-${crossVersion}/* perl-${version}/
|
|
|
|
'';
|
|
|
|
|
|
|
|
configurePlatforms = [ "build" "host" "target" ];
|
2018-02-28 18:00:03 +01:00
|
|
|
|
|
|
|
# TODO merge setup hooks
|
|
|
|
setupHook = ./setup-hook-cross.sh;
|
2017-10-16 04:34:20 +02:00
|
|
|
});
|
2019-05-08 16:09:19 +02:00
|
|
|
in {
|
2019-08-06 11:37:23 +02:00
|
|
|
# Maint version
|
2018-06-25 15:33:09 +02:00
|
|
|
perl528 = common {
|
2019-05-08 16:09:19 +02:00
|
|
|
perl = pkgs.perl528;
|
2019-05-03 12:53:36 +02:00
|
|
|
buildPerl = buildPackages.perl528;
|
2019-04-21 21:55:31 +02:00
|
|
|
version = "5.28.2";
|
|
|
|
sha256 = "1iynpsxdym4h76kgndmn3ykvwxhqz444xvaz8z2irsxkvmnlb5da";
|
2018-06-25 15:33:09 +02:00
|
|
|
};
|
2018-09-25 20:58:01 +02:00
|
|
|
|
2019-08-06 11:37:23 +02:00
|
|
|
# Maint version
|
2019-05-25 07:13:52 +02:00
|
|
|
perl530 = common {
|
|
|
|
perl = pkgs.perl530;
|
|
|
|
buildPerl = buildPackages.perl530;
|
2019-11-23 13:39:54 +01:00
|
|
|
version = "5.30.1";
|
|
|
|
sha256 = "0r7r8a7pkgxp3w5lza559ahxczw6hzpwvhkpc4c99vpi3xbjagdz";
|
2019-05-25 07:13:52 +02:00
|
|
|
};
|
|
|
|
|
2018-09-25 20:58:01 +02:00
|
|
|
# the latest Devel version
|
|
|
|
perldevel = common {
|
2019-05-08 16:09:19 +02:00
|
|
|
perl = pkgs.perldevel;
|
2019-05-03 12:53:36 +02:00
|
|
|
buildPerl = buildPackages.perldevel;
|
2019-11-23 13:39:54 +01:00
|
|
|
version = "5.31.6";
|
|
|
|
sha256 = "08n3c8xm1brxpckqy8i1xgjrpl4afrhcva9bhxswr938n675x71k";
|
2018-09-25 20:58:01 +02:00
|
|
|
};
|
2016-02-27 22:04:47 +01:00
|
|
|
}
|