diff --git a/pkgs/development/interpreters/perl/default.nix b/pkgs/development/interpreters/perl/default.nix index e8db13a6474..3c57d8a2b69 100644 --- a/pkgs/development/interpreters/perl/default.nix +++ b/pkgs/development/interpreters/perl/default.nix @@ -1,264 +1,84 @@ -{ config, lib, stdenv, fetchurl, fetchFromGitHub, pkgs, buildPackages -, callPackage -, enableThreading ? true, coreutils, makeWrapper -, enableCrypt ? true, libxcrypt ? null -, zlib -}: - -assert (enableCrypt -> (libxcrypt != null)); - -# Note: this package is used for bootstrapping fetchurl, and thus -# cannot use fetchpatch! All mutable patches (generated by GitHub or -# cgit) that are needed here should be included directly in Nixpkgs as -# files. +{ callPackage }: let + # Common passthru for all perl interpreters. + # copied from lua + passthruFun = + { overrides + , perlOnBuildForBuild + , perlOnBuildForHost + , perlOnBuildForTarget + , perlOnHostForHost + , perlOnTargetForTarget + , perlAttr ? null + , self # is perlOnHostForTarget + }: let + perlPackages = callPackage + # Function that when called + # - imports perl-packages.nix + # - adds spliced package sets to the package set + ({ stdenv, pkgs, perl, callPackage, makeScopeWithSplicing }: let + perlPackagesFun = callPackage ../../../top-level/perl-packages.nix { + # allow 'perlPackages.override { pkgs = pkgs // { imagemagick = imagemagickBig; }; }' like in python3Packages + # most perl packages aren't called with callPackage so it's not possible to override their arguments individually + # the conditional is because the // above won't be applied to __splicedPackages and hopefully no one is doing that when cross-compiling + pkgs = if stdenv.buildPlatform != stdenv.hostPlatform then pkgs.__splicedPackages else pkgs; + inherit stdenv; + perl = self; + }; - libc = if stdenv.cc.libc or null != null then stdenv.cc.libc else "/usr"; - libcInc = lib.getDev libc; - libcLib = lib.getLib libc; - crossCompiling = stdenv.buildPlatform != stdenv.hostPlatform; + otherSplices = { + selfBuildBuild = perlOnBuildForBuild.pkgs; + selfBuildHost = perlOnBuildForHost.pkgs; + selfBuildTarget = perlOnBuildForTarget.pkgs; + selfHostHost = perlOnHostForHost.pkgs; + selfTargetTarget = perlOnTargetForTarget.pkgs or {}; + }; + keep = self: { }; + extra = spliced0: {}; + in makeScopeWithSplicing + otherSplices + keep + extra + perlPackagesFun) + { + perl = self; + }; + in rec { + buildEnv = callPackage ./wrapper.nix { + perl = self; + inherit (pkgs) requiredPerlModules; + }; + withPackages = f: buildEnv.override { extraLibs = f pkgs; }; + pkgs = perlPackages // (overrides pkgs); + interpreter = "${self}/bin/perl"; + libPrefix = "lib/perl5/site_perl"; + perlOnBuild = perlOnBuildForHost.override { inherit overrides; self = perlOnBuild; }; + }; - common = { perl, buildPerl, version, sha256 }: stdenv.mkDerivation (rec { - inherit version; - pname = "perl"; - - src = fetchurl { - url = "mirror://cpan/src/5.0/perl-${version}.tar.gz"; - inherit sha256; - }; - - strictDeps = true; - # TODO: Add a "dev" output containing the header files. - outputs = [ "out" "man" "devdoc" ] ++ - lib.optional crossCompiling "mini"; - setOutputFlags = false; - - # On FreeBSD, if Perl is built with threads support, having - # libxcrypt available will result in a build failure, because - # perl.h will get conflicting definitions of struct crypt_data - # from libc's unistd.h and libxcrypt's crypt.h. - # - # FreeBSD Ports has the same issue building the perl port if - # the libxcrypt port has been installed. - # - # Without libxcrypt, Perl will still find FreeBSD's crypt functions. - propagatedBuildInputs = lib.optional (enableCrypt && !stdenv.isFreeBSD) libxcrypt; - - disallowedReferences = [ stdenv.cc ]; - - patches = - [ - # Do not look in /usr etc. for dependencies. - ./no-sys-dirs-5.31.patch - - # Enable TLS/SSL verification in HTTP::Tiny by default - ./http-tiny-verify-ssl-by-default.patch - ] - ++ lib.optional stdenv.isSunOS ./ld-shared.patch - ++ lib.optionals stdenv.isDarwin [ ./cpp-precomp.patch ./sw_vers.patch ] - ++ lib.optional crossCompiling ./MakeMaker-cross.patch; - - # This is not done for native builds because pwd may need to come from - # bootstrap tools when building bootstrap perl. - postPatch = (if crossCompiling then '' - substituteInPlace dist/PathTools/Cwd.pm \ - --replace "/bin/pwd" '${coreutils}/bin/pwd' - substituteInPlace cnf/configure_tool.sh --replace "cc -E -P" "cc -E" - '' 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 - ''; - - # Build a thread-safe Perl with a dynamic libperl.so. 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 = - (if crossCompiling - then [ "-Dlibpth=\"\"" "-Dglibpth=\"\"" "-Ddefault_inc_excludes_dot" ] - else [ "-de" "-Dcc=cc" ]) - ++ [ - "-Uinstallusrbinperl" - "-Dinstallstyle=lib/perl5" - ] ++ lib.optional (!crossCompiling) "-Duseshrplib" ++ [ - "-Dlocincpth=${libcInc}/include" - "-Dloclibpth=${libcLib}/lib" - ] - ++ lib.optionals ((builtins.match ''5\.[0-9]*[13579]\..+'' version) != null) [ "-Dusedevel" "-Uversiononly" ] - ++ lib.optional stdenv.isSunOS "-Dcc=gcc" - ++ lib.optional enableThreading "-Dusethreads" - ++ lib.optional (!enableCrypt) "-A clear:d_crypt_r" - ++ lib.optional stdenv.hostPlatform.isStatic "--all-static" - ++ lib.optionals (!crossCompiling) [ - "-Dprefix=${placeholder "out"}" - "-Dman1dir=${placeholder "out"}/share/man/man1" - "-Dman3dir=${placeholder "out"}/share/man/man3" - ]; - - configureScript = lib.optionalString (!crossCompiling) "${stdenv.shell} ./Configure"; - - dontAddStaticConfigureFlags = true; - - dontAddPrefix = !crossCompiling; - - enableParallelBuilding = !crossCompiling; - - # perl includes the build date, the uname of the build system and the - # username of the build user in some files. - # We override these to make it build deterministically. - # other distro solutions - # https://github.com/bmwiedemann/openSUSE/blob/master/packages/p/perl/perl-reproducible.patch - # https://github.com/archlinux/svntogit-packages/blob/packages/perl/trunk/config.over - # https://salsa.debian.org/perl-team/interpreter/perl/blob/debian-5.26/debian/config.over - # A ticket has been opened upstream to possibly clean some of this up: https://rt.perl.org/Public/Bug/Display.html?id=133452 - preConfigure = '' - cat > config.over < ./cpan/Compress-Raw-Zlib/config.in </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.hasCC then stdenv.cc.cc else "/no-such-path" - }" /no-such-path \ - --replace "${stdenv.cc}" /no-such-path \ - --replace "$man" /no-such-path - '' + lib.optionalString crossCompiling - '' - mkdir -p $mini/lib/perl5/cross_perl/${version} - for dir in cnf/{stub,cpan}; do - cp -r $dir/* $mini/lib/perl5/cross_perl/${version} - done - - mkdir -p $mini/bin - install -m755 miniperl $mini/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 $mini/lib/perl5/cross_perl/${version}. - wrapProgram $mini/bin/perl --prefix PERL5LIB : \ - "$mini/lib/perl5/cross_perl/${version}:$out/lib/perl5/${version}:$out/lib/perl5/${version}/$runtimeArch" - ''; # */ - - meta = with lib; { - homepage = "https://www.perl.org/"; - description = "The standard implementation of the Perl 5 programmming language"; - license = licenses.artistic1; - maintainers = [ maintainers.eelco ]; - platforms = platforms.all; - priority = 6; # in `buildEnv' (including the one inside `perl.withPackages') the library files will have priority over files in `perl` - }; - } // lib.optionalAttrs (stdenv.buildPlatform != stdenv.hostPlatform) rec { - crossVersion = "c876045741f5159318085d2737b0090f35a842ca"; # June 5, 2022 - - perl-cross-src = fetchFromGitHub { - name = "perl-cross-unstable-${crossVersion}"; - owner = "arsv"; - repo = "perl-cross"; - rev = crossVersion; - sha256 = "sha256-m9UCoTQgXBxSgk9Q1Zv6wl3Qnd0aZm/jEPXkcMKti8U="; - }; - - depsBuildBuild = [ buildPackages.stdenv.cc makeWrapper ]; - - postUnpack = '' - unpackFile ${perl-cross-src} - chmod -R u+w ${perl-cross-src.name} - cp -R ${perl-cross-src.name}/* perl-${version}/ - ''; - - configurePlatforms = [ "build" "host" "target" ]; - - # TODO merge setup hooks - setupHook = ./setup-hook-cross.sh; - }); -in { +in rec { # Maint version - perl534 = common { - perl = pkgs.perl534; - buildPerl = buildPackages.perl534; + perl534 = callPackage ./intepreter.nix { + self = perl534; version = "5.34.1"; sha256 = "sha256-NXlRpJGwuhzjYRJjki/ux4zNWB3dwkpEawM+JazyQqE="; + inherit passthruFun; }; # Maint version - perl536 = common { - perl = pkgs.perl536; - buildPerl = buildPackages.perl536; + perl536 = callPackage ./intepreter.nix { + self = perl536; version = "5.36.0"; sha256 = "sha256-4mCFr4rDlvYq3YpTPDoOqMhJfYNvBok0esWr17ek4Ao="; + inherit passthruFun; }; # the latest Devel version - perldevel = common { - perl = pkgs.perldevel; - buildPerl = buildPackages.perldevel; + perldevel = callPackage ./intepreter.nix { + self = perldevel; + perlAttr = "perldevel"; version = "5.37.0"; sha256 = "sha256-8RQO6gtH+WmghqzRafbqAH1MhKv/vJCcvysi7/+T9XI="; + inherit passthruFun; }; } diff --git a/pkgs/development/interpreters/perl/intepreter.nix b/pkgs/development/interpreters/perl/intepreter.nix new file mode 100644 index 00000000000..70a0914b70a --- /dev/null +++ b/pkgs/development/interpreters/perl/intepreter.nix @@ -0,0 +1,257 @@ +{ stdenv +, fetchurl +, fetchFromGitHub +, buildPackages +, lib +, self +, version +, sha256 +, pkgsBuildBuild +, pkgsBuildHost +, pkgsBuildTarget +, pkgsHostHost +, pkgsTargetTarget +, zlib +, config +, passthruFun +, perlAttr ? "perl${lib.versions.major version}${lib.versions.minor version}" +, enableThreading ? true, coreutils, makeWrapper +, enableCrypt ? true, libxcrypt ? null +, overrides ? config.perlPackageOverrides or (p: {}) # TODO: (self: super: {}) like in python +} @ inputs: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +assert (enableCrypt -> (libxcrypt != null)); + +let + crossCompiling = stdenv.buildPlatform != stdenv.hostPlatform; + libc = if stdenv.cc.libc or null != null then stdenv.cc.libc else "/usr"; + libcInc = lib.getDev libc; + libcLib = lib.getLib libc; +in + +stdenv.mkDerivation (rec { + inherit version; + pname = "perl"; + + src = fetchurl { + url = "mirror://cpan/src/5.0/perl-${version}.tar.gz"; + inherit sha256; + }; + + strictDeps = true; + # TODO: Add a "dev" output containing the header files. + outputs = [ "out" "man" "devdoc" ] ++ + lib.optional crossCompiling "mini"; + setOutputFlags = false; + + # On FreeBSD, if Perl is built with threads support, having + # libxcrypt available will result in a build failure, because + # perl.h will get conflicting definitions of struct crypt_data + # from libc's unistd.h and libxcrypt's crypt.h. + # + # FreeBSD Ports has the same issue building the perl port if + # the libxcrypt port has been installed. + # + # Without libxcrypt, Perl will still find FreeBSD's crypt functions. + propagatedBuildInputs = lib.optional (enableCrypt && !stdenv.isFreeBSD) libxcrypt; + + disallowedReferences = [ stdenv.cc ]; + + patches = + [ + # Do not look in /usr etc. for dependencies. + ./no-sys-dirs-5.31.patch + + # Enable TLS/SSL verification in HTTP::Tiny by default + ./http-tiny-verify-ssl-by-default.patch + ] + ++ lib.optional stdenv.isSunOS ./ld-shared.patch + ++ lib.optionals stdenv.isDarwin [ ./cpp-precomp.patch ./sw_vers.patch ] + ++ lib.optional crossCompiling ./MakeMaker-cross.patch; + + # This is not done for native builds because pwd may need to come from + # bootstrap tools when building bootstrap perl. + postPatch = (if crossCompiling then '' + substituteInPlace dist/PathTools/Cwd.pm \ + --replace "/bin/pwd" '${coreutils}/bin/pwd' + substituteInPlace cnf/configure_tool.sh --replace "cc -E -P" "cc -E" + '' 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 + ''; + + # Build a thread-safe Perl with a dynamic libperl.so. 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 = + (if crossCompiling + then [ "-Dlibpth=\"\"" "-Dglibpth=\"\"" "-Ddefault_inc_excludes_dot" ] + else [ "-de" "-Dcc=cc" ]) + ++ [ + "-Uinstallusrbinperl" + "-Dinstallstyle=lib/perl5" + ] ++ lib.optional (!crossCompiling) "-Duseshrplib" ++ [ + "-Dlocincpth=${libcInc}/include" + "-Dloclibpth=${libcLib}/lib" + ] + ++ lib.optionals ((builtins.match ''5\.[0-9]*[13579]\..+'' version) != null) [ "-Dusedevel" "-Uversiononly" ] + ++ lib.optional stdenv.isSunOS "-Dcc=gcc" + ++ lib.optional enableThreading "-Dusethreads" + ++ lib.optional (!enableCrypt) "-A clear:d_crypt_r" + ++ lib.optional stdenv.hostPlatform.isStatic "--all-static" + ++ lib.optionals (!crossCompiling) [ + "-Dprefix=${placeholder "out"}" + "-Dman1dir=${placeholder "out"}/share/man/man1" + "-Dman3dir=${placeholder "out"}/share/man/man3" + ]; + + configureScript = lib.optionalString (!crossCompiling) "${stdenv.shell} ./Configure"; + + dontAddStaticConfigureFlags = true; + + dontAddPrefix = !crossCompiling; + + enableParallelBuilding = !crossCompiling; + + # perl includes the build date, the uname of the build system and the + # username of the build user in some files. + # We override these to make it build deterministically. + # other distro solutions + # https://github.com/bmwiedemann/openSUSE/blob/master/packages/p/perl/perl-reproducible.patch + # https://github.com/archlinux/svntogit-packages/blob/packages/perl/trunk/config.over + # https://salsa.debian.org/perl-team/interpreter/perl/blob/debian-5.26/debian/config.over + # A ticket has been opened upstream to possibly clean some of this up: https://rt.perl.org/Public/Bug/Display.html?id=133452 + preConfigure = '' + cat > config.over < ./cpan/Compress-Raw-Zlib/config.in </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.hasCC then stdenv.cc.cc else "/no-such-path" + }" /no-such-path \ + --replace "${stdenv.cc}" /no-such-path \ + --replace "$man" /no-such-path + '' + lib.optionalString crossCompiling + '' + mkdir -p $mini/lib/perl5/cross_perl/${version} + for dir in cnf/{stub,cpan}; do + cp -r $dir/* $mini/lib/perl5/cross_perl/${version} + done + + mkdir -p $mini/bin + install -m755 miniperl $mini/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 $mini/lib/perl5/cross_perl/${version}. + wrapProgram $mini/bin/perl --prefix PERL5LIB : \ + "$mini/lib/perl5/cross_perl/${version}:$out/lib/perl5/${version}:$out/lib/perl5/${version}/$runtimeArch" + ''; # */ + + meta = with lib; { + homepage = "https://www.perl.org/"; + description = "The standard implementation of the Perl 5 programmming language"; + license = licenses.artistic1; + maintainers = [ maintainers.eelco ]; + platforms = platforms.all; + priority = 6; # in `buildEnv' (including the one inside `perl.withPackages') the library files will have priority over files in `perl` + }; +} // lib.optionalAttrs (stdenv.buildPlatform != stdenv.hostPlatform) rec { + crossVersion = "c876045741f5159318085d2737b0090f35a842ca"; # June 5, 2022 + + perl-cross-src = fetchFromGitHub { + name = "perl-cross-unstable-${crossVersion}"; + owner = "arsv"; + repo = "perl-cross"; + rev = crossVersion; + sha256 = "sha256-m9UCoTQgXBxSgk9Q1Zv6wl3Qnd0aZm/jEPXkcMKti8U="; + }; + + depsBuildBuild = [ buildPackages.stdenv.cc makeWrapper ]; + + postUnpack = '' + unpackFile ${perl-cross-src} + chmod -R u+w ${perl-cross-src.name} + cp -R ${perl-cross-src.name}/* perl-${version}/ + ''; + + configurePlatforms = [ "build" "host" "target" ]; + + # TODO merge setup hooks + setupHook = ./setup-hook-cross.sh; +}) diff --git a/pkgs/development/perl-modules/generic/default.nix b/pkgs/development/perl-modules/generic/default.nix index 3dca6550ad6..e7afedf5d63 100644 --- a/pkgs/development/perl-modules/generic/default.nix +++ b/pkgs/development/perl-modules/generic/default.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, perl, buildPerl, toPerlModule }: +{ lib, stdenv, perl, toPerlModule }: { buildInputs ? [] , nativeBuildInputs ? [] @@ -43,12 +43,12 @@ lib.throwIf (attrs ? name) "buildPerlPackage: `name` (\"${attrs.name}\") is depr builder = ./builder.sh; buildInputs = buildInputs ++ [ perl ]; - nativeBuildInputs = nativeBuildInputs ++ [ (perl.mini or perl) ]; + nativeBuildInputs = nativeBuildInputs ++ (if stdenv.buildPlatform != stdenv.hostPlatform then [ perl.mini ] else [ perl ]); inherit outputs src doCheck checkTarget enableParallelBuilding; env = { inherit PERL_AUTOINSTALL AUTOMATED_TESTING PERL_USE_UNSAFE_INC; - fullperl = buildPerl; + fullperl = perl.__spliced.buildHost or perl; } // env; meta = defaultMeta // (attrs.meta or { }); diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 84253221932..73594265adf 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -24660,7 +24660,7 @@ with pkgs; ### DEVELOPMENT / PERL MODULES - perlInterpreters = callPackages ../development/interpreters/perl { }; + perlInterpreters = import ../development/interpreters/perl { inherit callPackage; }; inherit (perlInterpreters) perl534 perl536 perldevel; perl534Packages = recurseIntoAttrs perl534.pkgs; diff --git a/pkgs/top-level/perl-packages.nix b/pkgs/top-level/perl-packages.nix index 492e5baf70c..29673bd90f5 100644 --- a/pkgs/top-level/perl-packages.nix +++ b/pkgs/top-level/perl-packages.nix @@ -8,22 +8,23 @@ { config , stdenv, lib, buildPackages, pkgs, darwin , fetchurl, fetchpatch, fetchFromGitHub, fetchFromGitLab -, perl, overrides, buildPerl, shortenPerlShebang +, perl, shortenPerlShebang , nixosTests }: +self: + # cpan2nix assumes that perl-packages.nix will be used only with perl 5.30.3 or above assert lib.versionAtLeast perl.version "5.30.3"; let inherit (lib) maintainers teams; - self = _self // (overrides pkgs); - _self = with self; { + +in +with self; { inherit perl; perlPackages = self; - callPackage = pkgs.newScope self; - # Check whether a derivation provides a perl module. hasPerlModule = drv: drv ? perlModule ; @@ -41,9 +42,7 @@ let }; }); - buildPerlPackage = callPackage ../development/perl-modules/generic { - inherit buildPerl; - }; + buildPerlPackage = callPackage ../development/perl-modules/generic { }; # Helper functions for packages that use Module::Build to build. buildPerlModule = args: @@ -23069,8 +23068,8 @@ let # use native libraries from the host when running build commands postConfigure = lib.optionalString cross (let - host_perl = buildPerl; - host_self = buildPerl.pkgs.TermReadKey; + host_perl = perl.perlOnBuild; + host_self = perl.perlOnBuild.pkgs.TermReadKey; perl_lib = "${host_perl}/lib/perl5/${host_perl.version}"; self_lib = "${host_self}/lib/perl5/site_perl/${host_perl.version}"; in '' @@ -23079,7 +23078,7 @@ let # TermReadKey uses itself in the build process nativeBuildInputs = lib.optionals cross [ - buildPerl.pkgs.TermReadKey + perl.perlOnBuild.pkgs.TermReadKey ]; meta = { description = "A perl module for simple terminal control"; @@ -28025,4 +28024,4 @@ let version = self.Version; Gtk2GladeXML = throw "Gtk2GladeXML has been removed"; # 2022-01-15 -}; in self +}