On Mon, Feb 2, 2026 at 10:49 AM Timofei Zhakov <[email protected]> wrote:

> On Sun, Feb 1, 2026 at 12:17 AM Timofei Zhakov <[email protected]> wrote:
>
>>
>>
>> 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
>>
>
> I lied. There is a better way to check versions.
>
> As it turns out, both find_package() and pkg_search_module() have this
> functionality out-of-the-box. Here is what I would propose:
>
> [[[
> Index: CMakeLists.txt
> ===================================================================
> --- CMakeLists.txt (revision 1931642)
> +++ CMakeLists.txt (working copy)
> @@ -377,18 +377,12 @@ endif()
>  ### Serf
>  if (SVN_ENABLE_RA_SERF)
>    if(SVN_USE_PKG_CONFIG)
> -    pkg_search_module(serf IMPORTED_TARGET REQUIRED serf-2 serf-1)
> +    pkg_search_module(serf IMPORTED_TARGET REQUIRED serf-2 serf-1>=1.3.4)
>      add_library(external-serf ALIAS PkgConfig::serf)
> -    set(DETECTED_SERF_VERSION "${serf_VERSION}")
>    else()
> -    find_package(Serf REQUIRED)
> +    find_package(Serf REQUIRED 1.3.4)
>      add_library(external-serf ALIAS Serf::Serf)
> -    set(DETECTED_SERF_VERSION "${Serf_VERSION}")
>    endif()
> -
> -  if("${DETECTED_SERF_VERSION}" VERSION_LESS 1.3.4)
> -    message(FATAL_ERROR "Serf 1.3.4 or later required, found
> ${DETECTED_SERF_VERSION}")
> -  endif()
>  endif()
>
>  if (SVN_CHECKSUM_BACKEND STREQUAL "apr")
> ]]]
>
> I'm assuming that serf-2 with a lower version is impossible.
>
>
Committed in r1931690.

-- 
Timofei Zhakov

Reply via email to