On Sat, Jan 31, 2026 at 9:44 PM Daniel Sahlberg <[email protected]> wrote:
> Den lör 31 jan. 2026 kl 20:39 skrev Timofei Zhakov <[email protected]>: > >> On Fri, Jan 9, 2026 at 3:47 PM Daniel Sahlberg < >> [email protected]> wrote: >> >>> See r1931194 with comments below... >>> >>> Den fre 9 jan. 2026 kl 00:36 skrev Branko Čibej <[email protected]>: >>> >>>> On 8. 1. 26 22:11, Daniel Sahlberg wrote: >>>> >>>> Hi, >>>> >>>> While reviewing Subversion's usage of Serf I stumbled across a few >>>> things I don't quite understand. >>>> >>>> When building using autoconf, configure seems to require Serf 1.3.4 or >>>> later: >>>> >>>> [[[ >>>> configure: WARNING: Serf version too old: need 1.3.4 >>>> checking was serf enabled... no >>>> >>>> An appropriate version of serf could not be found, so libsvn_ra_serf >>>> will not be built. If you want to build libsvn_ra_serf, please >>>> install serf 1.3.4 or newer. >>>> ]]] >>>> >>>> I don't see a similar version check in CMake build. I did a very simple >>>> check like this: >>>> >>>> [[[ >>>> + if(serf_VERSION VERSION_LESS 1.3.4) >>>> + message(FATAL_ERROR "Serf 1.3.4 or later required, found >>>> ${serf_VERSION}") >>>> + endif() >>>> ]]] >>>> >>>> But I'm sure there are more CMake-ish ways of doing it. >>>> >>>> When searching some more through the source, I found the following >>>> check in ra_serf.h: >>>> >>>> [[[ >>>> /* Enforce the minimum version of serf. */ >>>> #if !SERF_VERSION_AT_LEAST(1, 2, 1) >>>> #error Please update your version of serf to at least 1.2.1. >>>> #endif >>>> ]]] >>>> >>>> It seems Subversion started requiring Serf 1.2.1 in r1489114 due to >>>> issues #4274 and #4371, however I can't really find a good reason why this >>>> was later bumped to 1.3.4 in r1572253 ("configure.ac: Raise required >>>> serf version to 1.3.4 (aka break the buildbots)"). >>>> >>>> >>>> Guessing from the commit logs, it was a general removal of support for >>>> old dependencies. It wasn't just Serf, it was also APR/-Util (we dropped >>>> support for 0.9 and made 1.3 the new baseline). >>>> >>>> Lastly, I saw that include/private/svn_dep_compat.h check >>>> if SERF_VERSION_AT_LEAST isn't defined (with a comment "/* Introduced in >>>> Serf 0.1.1 */) and if so defines it same as later Serfs. However the define >>>> isn't enough to build Subversion since ra_serf.h don't include >>>> svn_dep_compat.h... >>>> >>>> >>>> That should be thrown out. Anything that looks like compatibility for >>>> Serf 0.x should have been ripped out ages ago. >>>> >>>> To summarise, I propose a few changes to remove some inconsistencies >>>> and unnecessary code: >>>> - I think CMake should check for a minimum Serf version just as the >>>> autoconf buildsystem does. I could commit my suggestion above but I'm sure >>>> someone else can do it more elegantly. >>>> >>>> >>>> There's no "think" about this. The CMake build must impose the same >>>> requirements as the autotools build. >>>> >>> >>> I did not address this since I'm not too happy about my dirty hack in >>> CMakeLists.txt. Could someone (Timofei or Brane being our CMake experts?) >>> suggest a more elegant solution? >>> >>> >> It's not as dirty of a hack though. It's not a hack at all IMO. The >> VERSION_LESS statement is the suggested way to.. well compare versions >> in cmake. >> >> But it's also important to keep in mind that here serf can be found using >> either pkgconfig or cmake module which means that they both might export >> package versions into different variables. >> >> In the case of pkgconfig it's <YYY>_VERSION [1] (where YYY is >> <prefix>_<module-name> -> serf_serf-1, assuming that I correctly >> understood the documentation (?) ). Were you testing with pkgconfig? If it >> worked, I guess we could stick with serf_VERSION here. Because I don't >> think the variable will be serf_serf-1_VERSION. It's just weird. On the >> other hand, cmake will export it as Serf_VERSION [2]. >> > > Yes, I have tested with pkgconfig and it sets serf_VERSION. > > Good catch regarding the cmake find_package! > > >> I would suggest adding checks that collect the correct version into a >> variable with canonical name. Below is a patch of what I'm talking about. >> >> [[[ >> Index: CMakeLists.txt >> =================================================================== >> --- CMakeLists.txt (revision 1931402) >> +++ CMakeLists.txt (working copy) >> @@ -378,11 +378,18 @@ if (SVN_ENABLE_RA_SERF) >> >> if(serf_FOUND) >> add_library(external-serf ALIAS PkgConfig::serf) >> + set(SVN_SERF_VERSION serf_VERSION) >> + # TODO: figure out how pkg_search_module() actually exports version >> endif() >> else() >> find_package(Serf REQUIRED) >> add_library(external-serf ALIAS Serf::Serf) >> + set(SVN_SERF_VERSION Serf_VERSION) >> endif() >> + >> + if(SVN_SERF_VERSION VERSION_LESS 1.3.4) >> + message(FATAL_ERROR "Serf 1.3.4 or later required, found >> ${SVN_SERF_VERSION}") >> + endif() >> endif() >> ]]] >> >> > +1. Do you want to commit? > Committed in r1931636. (it wasn't shown in the notification, but I updated the log message to mark you as "suggested by" instead of original "reviewed by".) > > >> I just realised that when we're attempting to find a serf via pkgconfig >> but it can't be found, the configuration won't fail right here to >> missing dependency, but probably fail to external-serf not existing later >> on. I would suggest the following fix (that also simplifies it a little >> bit): >> >> [[[ >> @@ -374,11 +374,8 @@ endif() >> ### Serf >> if (SVN_ENABLE_RA_SERF) >> if(SVN_USE_PKG_CONFIG) >> - pkg_search_module(serf IMPORTED_TARGET serf-2 serf-1) >> - >> - if(serf_FOUND) >> - add_library(external-serf ALIAS PkgConfig::serf) >> - endif() >> + pkg_search_module(serf IMPORTED_TARGET REQUIRED serf-2 serf-1) >> + add_library(external-serf ALIAS PkgConfig::serf) >> else() >> find_package(Serf REQUIRED) >> add_library(external-serf ALIAS Serf::Serf) >> ]]] >> > > +1 > Committed in r1931635. -- Timofei Zhakov

