perlPackages.{various}: fix build (#517349)

This commit is contained in:
Michael Daniels
2026-05-16 18:32:10 +00:00
committed by GitHub
2 changed files with 128 additions and 5 deletions
@@ -0,0 +1,77 @@
--- a/Pari.xs
+++ b/Pari.xs
@@ -1518,21 +1518,63 @@
}
GEN
-callPerlFunction(PerlFunctionArg1 long_ep, ...)
-{
- GEN res;
+callPerlFunction_args(PerlFunctionArg1 long_ep, GEN *args)
+{
entree *ep = toEntreeP(long_ep);
- va_list args;
SV *cv = (SV*) ep->elt_CV;
int numargs = CV_NUMARGS_get(cv);
-
- va_start(args, long_ep);
-/* warn("calling with numargs=%d", numargs); */
- res = callPerlFunction_va_list(G_SCALAR, numargs, cv, args);
-/* warn("ending call"); */
- va_end(args);
-/* warn("ended call"); */
+ GEN res;
+ int i;
+ dSP;
+ int count;
+ pari_sp oldavma = avma;
+ SV *oPariStack = PariStack;
+ SV *sv;
+
+ ENTER;
+ SAVETMPS;
+ SAVEINT(sentinel);
+ sentinel = avma;
+ PUSHMARK(sp);
+ EXTEND(sp, numargs + 1);
+ for (i = 0; i < numargs; i++)
+ PUSHs(pari2mortalsv(args[i], oldavma));
+ PUTBACK;
+ count = perl_call_sv(cv, G_SCALAR);
+
+ SPAGAIN;
+ if (count != 1)
+ croak("Perl function exported into PARI returns unexpected number %d of values (need 1)", count);
+
+ sv = SvREFCNT_inc(POPs);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+
+ if (PariStack != oPariStack)
+ moveoffstack_newer_than(oPariStack);
+ res = sv2pari(sv);
+ res = myforcecopy(res);
+ SvREFCNT_dec(sv);
+
return res;
+}
+
+GEN
+callPerlFunction(PerlFunctionArg1 long_ep, GEN arg0, GEN arg1, GEN arg2, GEN arg3, GEN arg4, GEN arg5, GEN arg6, GEN arg7)
+{
+ GEN args[8];
+
+ args[0] = arg0;
+ args[1] = arg1;
+ args[2] = arg2;
+ args[3] = arg3;
+ args[4] = arg4;
+ args[5] = arg5;
+ args[6] = arg6;
+ args[7] = arg7;
+ return callPerlFunction_args(long_ep, args);
}
entree *
+51 -5
View File
@@ -2416,8 +2416,8 @@ with self;
};
preConfigure = ''
echo "LIB = ${pkgs.db.out}/lib" > config.in
echo "INCLUDE = ${pkgs.db.dev}/include" >> config.in
echo "LIB = ${pkgs.db4.out}/lib" > config.in
echo "INCLUDE = ${pkgs.db4.dev}/include" >> config.in
'';
meta = {
description = "Perl extension for Berkeley DB version 2, 3, 4, 5 or 6";
@@ -2656,6 +2656,34 @@ with self;
# Fix out of memory error on Perl 5.19.4 and later.
../development/perl-modules/boost-geometry-utils-fix-oom.patch
];
postPatch = lib.optionalString stdenv.hostPlatform.isDarwin ''
# Clang on Darwin defaults to a newer C++ mode where the old bundled Boost
# headers no longer compile.
substituteInPlace Build.PL \
--replace-fail "extra_compiler_flags => [qw(-DHAS_BOOL)]" \
"extra_compiler_flags => [qw(-DHAS_BOOL -std=c++14)]"
# Avoid Boost.MPL enum wrappers that modern Clang rejects as out-of-range
# enum constant expressions.
substituteInPlace src/boost/numeric/conversion/detail/int_float_mixture.hpp \
--replace-fail '#include "boost/mpl/integral_c.hpp"' "" \
--replace-fail "mpl::integral_c<int_float_mixture_enum, integral_to_integral>" "int_float_mixture_constant<integral_to_integral>" \
--replace-fail "mpl::integral_c<int_float_mixture_enum, integral_to_float>" "int_float_mixture_constant<integral_to_float>" \
--replace-fail "mpl::integral_c<int_float_mixture_enum, float_to_integral>" "int_float_mixture_constant<float_to_integral>" \
--replace-fail "mpl::integral_c<int_float_mixture_enum, float_to_float>" "int_float_mixture_constant<float_to_float>"
perl -i -pe 'if ($. == 22) { $_ .= " template<int_float_mixture_enum v> struct int_float_mixture_constant { static const int_float_mixture_enum value = v; typedef int_float_mixture_constant type; typedef int_float_mixture_enum value_type; operator int_float_mixture_enum() const { return value; } };\n" }' \
src/boost/numeric/conversion/detail/int_float_mixture.hpp
# Same workaround for the user-defined-type/builtin-type conversion enum.
substituteInPlace src/boost/numeric/conversion/detail/udt_builtin_mixture.hpp \
--replace-fail '#include "boost/mpl/integral_c.hpp"' "" \
--replace-fail "mpl::integral_c<udt_builtin_mixture_enum, builtin_to_builtin>" "udt_builtin_mixture_constant<builtin_to_builtin>" \
--replace-fail "mpl::integral_c<udt_builtin_mixture_enum, builtin_to_udt>" "udt_builtin_mixture_constant<builtin_to_udt>" \
--replace-fail "mpl::integral_c<udt_builtin_mixture_enum, udt_to_builtin>" "udt_builtin_mixture_constant<udt_to_builtin>" \
--replace-fail "mpl::integral_c<udt_builtin_mixture_enum, udt_to_udt>" "udt_builtin_mixture_constant<udt_to_udt>"
perl -i -pe 'if ($. == 21) { $_ .= " template<udt_builtin_mixture_enum v> struct udt_builtin_mixture_constant { static const udt_builtin_mixture_enum value = v; typedef udt_builtin_mixture_constant type; typedef udt_builtin_mixture_enum value_type; operator udt_builtin_mixture_enum() const { return value; } };\n" }' \
src/boost/numeric/conversion/detail/udt_builtin_mixture.hpp
'';
buildInputs = [
ExtUtilsCppGuess
ExtUtilsTypemapsDefault
@@ -7582,6 +7610,9 @@ with self;
];
env.NIX_CFLAGS_COMPILE = "-I${pkgs.openssl.dev}/include";
env.NIX_CFLAGS_LINK = "-L${lib.getLib pkgs.openssl}/lib -lcrypto";
# Needed on Darwin so Crypt::OpenSSL::Guess does not pick /usr/bin/openssl and mix
# system libcrypto with the Nix one (perl aborts: "loading libcrypto in an unsafe way").
env.OPENSSL_PREFIX = pkgs.openssl;
meta = {
description = "Perl wrapper around OpenSSL's AES library";
license = with lib.licenses; [
@@ -18618,6 +18649,8 @@ with self;
hash = "sha256-BGSH8ITBL6HIIq/8X33lbv7ZtIkFpCbmMaa5ScEU2Gw=";
};
outputs = [ "out" ];
# Keep generated XS code stable across rebuilds.
env.PERL_HASH_SEED = "0";
buildInputs = [
pkgs.apacheHttpd
pkgs.apr
@@ -18626,6 +18659,8 @@ with self;
ExtUtilsXSBuilder
];
propagatedBuildInputs = [ (pkgs.apacheHttpdPackages.mod_perl.override { inherit perl; }) ];
# Avoid libtool misdetecting gcc as the linker.
configureFlags = [ "LD=ld" ];
makeMakerFlags = [
"--with-apache2-src=${pkgs.apacheHttpd.dev}"
"--with-apache2-apxs=${pkgs.apacheHttpd.dev}/bin/apxs"
@@ -18635,10 +18670,10 @@ with self;
];
preConfigure = ''
# override broken prereq check
substituteInPlace configure --replace "prereq_check=\"\$PERL \$PERL_OPTS build/version_check.pl\"" "prereq_check=\"echo\""
substituteInPlace configure --replace-fail "prereq_check=\"\$PERL \$PERL_OPTS build/version_check.pl\"" "prereq_check=\"echo\""
'';
preBuild = ''
substituteInPlace apreq2-config --replace "dirname" "${pkgs.coreutils}/bin/dirname"
substituteInPlace apreq2-config --replace-fail "dirname" "${pkgs.coreutils}/bin/dirname"
'';
installPhase = ''
mkdir $out
@@ -18667,6 +18702,8 @@ with self;
rm -r $out/nix
'';
doCheck = false; # test would need to start apache httpd
# Apache::Test resolves localhost while generating glue/perl (Makefile.PL / t/TEST).
__darwinAllowLocalNetworking = true;
meta = {
description = "Wrapper for libapreq2's module/handle API";
license = with lib.licenses; [ asl20 ];
@@ -20926,13 +20963,16 @@ with self;
# Workaround build failure on -fno-common toolchains:
# ld: libPARI/libPARI.a(compat.o):(.bss+0x8): multiple definition of
# `overflow'; Pari.o:(.bss+0x80): first defined here
env.NIX_CFLAGS_COMPILE = "-fcommon -Wno-error=implicit-int -Wno-error=implicit-function-declaration";
env.NIX_CFLAGS_COMPILE = "-std=gnu17 -fcommon -Wno-error=implicit-int -Wno-error=implicit-function-declaration";
preConfigure = "cp ${pari_tgz} pari-${pariversion}.tar.gz";
makeMakerFlags = [ "pari_tgz=pari-${pariversion}.tar.gz" ];
src = fetchurl {
url = "mirror://cpan/authors/id/I/IL/ILYAZ/modules/Math-Pari-2.030528.tar.gz";
hash = "sha256-Z/dNIWxpY1qxxuo+J84ZdQqUorVgrnKIuy1s9xT85sg=";
};
patches = lib.optionals stdenv.hostPlatform.isDarwin [
../development/perl-modules/Math-Pari-darwin-callback-abi.patch
];
meta = {
description = "Perl interface to PARI";
license = with lib.licenses; [
@@ -25928,6 +25968,11 @@ with self;
url = "mirror://cpan/authors/id/R/RU/RURBAN/Net-Ping-2.75.tar.gz";
hash = "sha256-tH3zz9lpLM0Aca05/nRxjrwy9ZcBVWpgT9FaCfCeDXQ=";
};
preCheck = ''
# On Linux these are skipped early ("no echo port"); on Darwin they proceed and
# hit external DNS (www.about.com), which fails in the sandbox.
rm -f t/400_ping_syn.t t/410_syn_host.t
'';
meta = {
description = "Check a remote host for reachability";
license = with lib.licenses; [
@@ -30863,6 +30908,7 @@ with self;
artistic1
gpl1Plus
];
platforms = lib.platforms.linux; # configure probes PF_NETLINK; unavailable on Darwin
};
};