Author: rinrab
Date: Tue Jun 10 15:46:58 2025
New Revision: 1926344

URL: http://svn.apache.org/viewvc?rev=1926344&view=rev
Log:
cmake: Support pkg-config library search.

- We are relying on the FindPkgConfig module which does all work of invoking
  pkg-config and creating cmake on its own.

- See: https://cmake.org/cmake/help/latest/module/FindPkgConfig.html

- pkg-config is used only if SVN_USE_PKG_CONFIG is ON. By default, this option
  is set to ON if pkg-config executable is available on the current machine,
  or OFF we not.

* CMakeLists.txt
  (options): Look for pkg-config and define an option to tell cmake to use
   pkg-config dependent on its existence.
  (deps): Ensure pkg-config (and display version).
  (APR, APR-Util, ZLIB, EXPAT, LZ4, UTF8PROC, SQlite3, Serf, GNOME Keyring):
   look for the libraries through pkg_check_modules() if SVN_USE_PKG_CONFIG
   is ON. Otherwise preserve old behavior.
  (summary): Log SVN_USE_PKG_CONFIG into `Build Type` section.

    TODO:

- Httpd doesn't provide pkg-config modules.
- KF5Wallet provides only a `kf5-config` executable (like apr-1-config), which
  cannot be easily handled by existing modules.
- serf-2 (through pkg-config) cannot be easily implemented right now.

Modified:
    subversion/trunk/CMakeLists.txt

Modified: subversion/trunk/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/subversion/trunk/CMakeLists.txt?rev=1926344&r1=1926343&r2=1926344&view=diff
==============================================================================
--- subversion/trunk/CMakeLists.txt (original)
+++ subversion/trunk/CMakeLists.txt Tue Jun 10 15:46:58 2025
@@ -114,6 +114,10 @@ option(SVN_USE_DSO "Defined if svn shoul
 set(SVN_SOVERSION "0" CACHE STRING "Subversion library ABI version")
 mark_as_advanced(SVN_SOVERSION)
 
+# Check whether we have pkg-config executable or not; Silence any messages.
+find_package(PkgConfig QUIET)
+cmake_dependent_option(SVN_USE_PKG_CONFIG "Use pkg-config for the 
dependencies" ON "PKG_CONFIG_FOUND" OFF)
+
 # Dependecies
 option(SVN_USE_INTERNAL_LZ4 "Use internal version of lz4" ON)
 option(SVN_USE_INTERNAL_UTF8PROC "Use internal version of utf8proc" ON)
@@ -247,25 +251,54 @@ endif()
 
 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake")
 
+# Require pkg-config if we are going to use it, to show the `Found PkgConfig`
+# meassge and insure it has actually been found. (yea, this invokes the module
+# for second time, but we are guaranteed to from it to not perform actual look
+# for the path due to the cache. It's fine to include the same modules for
+# multiple times).
+if(SVN_USE_PKG_CONFIG)
+  find_package(PkgConfig REQUIRED)
+endif()
+
 ### APR
 
-find_package(APR REQUIRED)
-add_library(external-apr ALIAS apr::apr)
+if(SVN_USE_PKG_CONFIG)
+  pkg_check_modules(apr-1 REQUIRED IMPORTED_TARGET apr-1)
+  add_library(external-apr ALIAS PkgConfig::apr-1)
+else()
+  find_package(APR REQUIRED)
+  add_library(external-apr ALIAS apr::apr)
+endif()
 
 ### APR-Util
 
-find_package(APRUtil REQUIRED)
-add_library(external-aprutil ALIAS apr::aprutil)
+if(SVN_USE_PKG_CONFIG)
+  pkg_check_modules(aprutil-1 REQUIRED IMPORTED_TARGET apr-util-1)
+  add_library(external-aprutil ALIAS PkgConfig::aprutil-1)
+else()
+  find_package(APRUtil REQUIRED)
+  add_library(external-aprutil ALIAS apr::aprutil)
+endif()
 
 ### ZLIB
 
-find_package(ZLIB REQUIRED)
-add_library(external-zlib ALIAS ZLIB::ZLIB)
+if(SVN_USE_PKG_CONFIG)
+  pkg_check_modules(zlib REQUIRED IMPORTED_TARGET zlib)
+  add_library(external-zlib ALIAS PkgConfig::zlib)
+else()
+  find_package(ZLIB REQUIRED)
+  add_library(external-zlib ALIAS ZLIB::ZLIB)
+endif()
 
 ### EXPAT
 
-find_package(EXPAT REQUIRED)
-add_library(external-xml ALIAS EXPAT::EXPAT)
+if(SVN_USE_PKG_CONFIG)
+  pkg_check_modules(expat REQUIRED IMPORTED_TARGET expat)
+  add_library(external-xml ALIAS PkgConfig::expat)
+else()
+  find_package(EXPAT REQUIRED)
+  add_library(external-xml ALIAS EXPAT::EXPAT)
+endif()
 
 ### LZ4
 
@@ -277,6 +310,9 @@ if(SVN_USE_INTERNAL_LZ4)
     "subversion/libsvn_subr/lz4/lz4internal.h" lz4_VERSION
     LZ4_VERSION_MAJOR LZ4_VERSION_MINOR LZ4_VERSION_RELEASE
   )
+elseif(SVN_USE_PKG_CONFIG)
+  pkg_check_modules(lz4 REQUIRED IMPORTED_TARGET liblz4)
+  add_library(external-lz4 ALIAS PkgConfig::lz4)
 else()
   find_package(lz4 CONFIG REQUIRED)
   add_library(external-lz4 ALIAS lz4::lz4)
@@ -292,6 +328,9 @@ if(SVN_USE_INTERNAL_UTF8PROC)
     "subversion/libsvn_subr/utf8proc/utf8proc_internal.h" UTF8PROC_VERSION
     UTF8PROC_VERSION_MAJOR UTF8PROC_VERSION_MINOR UTF8PROC_VERSION_PATCH
   )
+elseif(SVN_USE_PKG_CONFIG)
+  pkg_check_modules(utf8proc REQUIRED IMPORTED_TARGET libutf8proc)
+  add_library(external-utf8proc ALIAS PkgConfig::utf8proc)
 else()
   find_package(UTF8PROC REQUIRED)
   add_library(external-utf8proc ALIAS UTF8PROC::UTF8PROC)
@@ -302,6 +341,9 @@ endif()
 if(SVN_SQLITE_USE_AMALGAMATION)
   find_package(SQLiteAmalgamation REQUIRED)
   add_library(external-sqlite ALIAS SQLite::SQLite3Amalgamation)
+elseif(SVN_USE_PKG_CONFIG)
+  pkg_check_modules(sqlite3 REQUIRED IMPORTED_TARGET sqlite3)
+  add_library(external-sqlite ALIAS PkgConfig::sqlite3)
 else()
   # It should be not required.
   find_package(SQLite3)
@@ -323,8 +365,14 @@ endif()
 
 ### Serf
 if (SVN_ENABLE_RA_SERF)
-  find_package(Serf REQUIRED)
-  add_library(external-serf ALIAS Serf::Serf)
+  # TODO: serf-2
+  if(SVN_USE_PKG_CONFIG)
+    pkg_check_modules(serf-1 REQUIRED IMPORTED_TARGET serf-1)
+    add_library(external-serf ALIAS PkgConfig::serf-1)
+  else()
+    find_package(Serf REQUIRED)
+    add_library(external-serf ALIAS Serf::Serf)
+  endif()
 endif()
 
 ### Python
@@ -373,9 +421,12 @@ endif()
 if(SVN_ENABLE_AUTH_GNOME_KEYRING)
   add_library(external-gnome-keyring INTERFACE)
 
-  find_package(PkgConfig REQUIRED)
-  pkg_check_modules(libsecret-1 REQUIRED IMPORTED_TARGET libsecret-1)
-  target_link_libraries(external-gnome-keyring INTERFACE 
PkgConfig::libsecret-1)
+  if(SVN_USE_PKG_CONFIG OR PKG_CONFIG_FOUND)
+    pkg_check_modules(libsecret-1 REQUIRED IMPORTED_TARGET libsecret-1)
+    target_link_libraries(external-gnome-keyring INTERFACE 
PkgConfig::libsecret-1)
+  else()
+    message(ERROR "GNOME Keyring requires pkg-config")
+  endif()
 
   add_private_config_definition(
     "Is libsecret support enabled?"
@@ -892,6 +943,7 @@ message(STATUS "  Build type ...........
 message(STATUS "    Build shared libraries ........ : ${BUILD_SHARED_LIBS}")
 message(STATUS "    Build shared FS Modues ........ : ${SVN_BUILD_SHARED_FS}")
 message(STATUS "    Build shared RA Modues ........ : ${SVN_BUILD_SHARED_RA}")
+message(STATUS "    Use pkg-config dependencies ... : ${SVN_USE_PKG_CONFIG}")
 message(STATUS "  FS modules:")
 message(STATUS "    Enable FSFS ................... : ${SVN_ENABLE_FS_FS}")
 message(STATUS "    Enable FSX .................... : ${SVN_ENABLE_FS_X}")


Reply via email to