Files
Angel J 18bc687d87 subversionClient: fix Perl bindings with SWIG 4.4
Regenerate the Perl XS wrappers instead of mixing SWIG 4.4 runtime support
with release-tarball wrappers generated by an older SWIG. This fixes
SVN::Core and git-svn segfaults.
2026-05-13 21:03:40 -07:00

200 lines
5.7 KiB
Nix

{
bdbSupport ? true, # build support for Berkeley DB repositories
httpServer ? false, # build Apache DAV module
httpSupport ? true, # client must support http
pythonBindings ? false,
perlBindings ? false,
javahlBindings ? false,
saslSupport ? false,
lib,
stdenv,
fetchurl,
fetchpatch,
apr,
aprutil,
zlib,
sqlite,
openssl,
lz4,
utf8proc,
autoconf,
libtool,
apacheHttpd ? null,
expat,
swig ? null,
jdk ? null,
python3 ? null,
py3c ? null,
perl ? null,
sasl ? null,
serf ? null,
nixosTests,
}:
assert bdbSupport -> aprutil.bdbSupport;
assert httpServer -> apacheHttpd != null;
assert pythonBindings -> swig != null && python3 != null && py3c != null;
assert javahlBindings -> jdk != null && perl != null;
let
common =
{
version,
hash,
extraPatches ? [ ],
}:
stdenv.mkDerivation (finalAttrs: {
inherit version;
pname = "subversion${lib.optionalString (!bdbSupport && perlBindings && pythonBindings) "-client"}";
src = fetchurl {
url = "mirror://apache/subversion/subversion-${finalAttrs.version}.tar.bz2";
inherit hash;
};
# Can't do separate $lib and $bin, as libs reference bins
outputs = [
"out"
"dev"
"man"
];
nativeBuildInputs = [
autoconf
libtool
python3
]
++ lib.optional perlBindings perl; # Needed for swig / EXTERN.h
buildInputs = [
zlib
apr
aprutil
sqlite
openssl
lz4
utf8proc
]
++ lib.optional httpSupport serf
++ lib.optionals pythonBindings [
python3
py3c
]
++ lib.optional perlBindings perl
++ lib.optional saslSupport sasl;
strictDeps = true;
patches = [
./apr-1.patch
# swig-4.4 support:
# https://lists.apache.org/thread/7rtyfcmg737bnmnrwf6bjmlxx4wpq2og
(fetchpatch {
name = "swig-4.4.patch";
url = "https://github.com/apache/subversion/commit/bf72420e86059a894fa3aacbbd6e3bee9286e46e.patch";
hash = "sha256-0X9y/0qDDctKo1vu86pKu3k79zIqhOhQU9rvyG4v6jg=";
})
]
++ extraPatches;
# Remove vendored swig-3 files as these will shadow the swig provided
# ones and result in compile errors.
# Also remove the generated Perl wrappers from the release tarball
# so they are rebuilt with the same SWIG runtime as libsvn_swig_perl.
postPatch = ''
rm subversion/bindings/swig/proxy/{perlrun.swg,pyrun.swg,python.swg,rubydef.swg,rubyhead.swg,rubytracking.swg,runtime.swg,swigrun.swg}
''
+ lib.optionalString perlBindings ''
rm subversion/bindings/swig/perl/native/{core.c,svn_*.c}
'';
env = {
# We are hitting the following issue even with APR 1.6.x
# -> https://issues.apache.org/jira/browse/SVN-4813
# "-P" CPPFLAG is needed to build Python bindings and subversionClient
CPPFLAGS = toString [ "-P" ];
}
// lib.optionalAttrs stdenv.hostPlatform.isDarwin {
CXX = "clang++";
CC = "clang";
CPP = "clang -E";
CXXCPP = "clang++ -E";
};
preConfigure = ''
./autogen.sh
'';
configureFlags = [
(lib.withFeature bdbSupport "berkeley-db")
(lib.withFeatureAs httpServer "apxs" "${apacheHttpd.dev}/bin/apxs")
(lib.withFeatureAs (pythonBindings || perlBindings) "swig" swig)
(lib.withFeatureAs saslSupport "sasl" sasl)
(lib.withFeatureAs httpSupport "serf" serf)
"--with-zlib=${zlib.dev}"
"--with-sqlite=${sqlite.dev}"
"--with-apr=${apr.dev}"
"--with-apr-util=${aprutil.dev}"
]
++ lib.optionals javahlBindings [
"--enable-javahl"
"--with-jdk=${jdk}"
];
preBuild = ''
makeFlagsArray=(APACHE_LIBEXECDIR=$out/modules)
'';
postInstall =
lib.optionalString pythonBindings ''
make swig-py swig_pydir=$(toPythonPath $out)/libsvn swig_pydir_extra=$(toPythonPath $out)/svn
make install-swig-py swig_pydir=$(toPythonPath $out)/libsvn swig_pydir_extra=$(toPythonPath $out)/svn
''
+ lib.optionalString perlBindings ''
make install-swig-pl
''
+ ''
mkdir -p $out/share/bash-completion/completions
cp tools/client-side/bash_completion $out/share/bash-completion/completions/subversion
for f in $out/lib/*.la $out/lib/python*/site-packages/*/*.la; do
substituteInPlace $f \
--replace "${expat.dev}/lib" "${expat.out}/lib" \
--replace "${zlib.dev}/lib" "${zlib.out}/lib" \
--replace "${sqlite.dev}/lib" "${sqlite.out}/lib" \
--replace "${openssl.dev}/lib" "${lib.getLib openssl}/lib"
done
'';
inherit perlBindings pythonBindings;
enableParallelBuilding = true;
# Missing install dependencies:
# libtool: error: error: relink 'libsvn_ra_serf-1.la' with the above command before installing it
# make: *** [build-outputs.mk:1316: install-serf-lib] Error 1
enableParallelInstalling = false;
nativeCheckInputs = [ python3 ];
doCheck = false; # fails 10 out of ~2300 tests
passthru.tests = { inherit (nixosTests) svnserve; };
meta = {
description = "Version control system intended to be a compelling replacement for CVS in the open source community";
license = lib.licenses.asl20;
homepage = "https://subversion.apache.org/";
mainProgram = "svn";
maintainers = [ ];
platforms = lib.platforms.linux ++ lib.platforms.darwin;
};
});
in
{
subversion = common {
version = "1.14.5";
hash = "sha256-54op53Zri3s1RJfQj3GlVkGrxTZ1zhh1WEeBquNWRKE=";
};
}