Author: brane
Date: Mon Aug 4 09:15:23 2025
New Revision: 1927605
Log:
In the CMake build: Search for most dependencies with pkg-config first,
and find_package if that fails.
* CMakeLists.txt:
- Use pkg-config to look for OpenSSL, zlib, Brotli, GSSAPI and Unbound.
- Write the pkg-config file with dependencies as appropriate.
* build/FindUnbound.cmake: Remove pkg-config related parts.
* build/SerfFindPkgConfig.cmake: New.
Added:
serf/trunk/build/SerfFindPkgConfig.cmake
Modified:
serf/trunk/CMakeLists.txt
serf/trunk/build/FindUnbound.cmake
Modified: serf/trunk/CMakeLists.txt
==============================================================================
--- serf/trunk/CMakeLists.txt Mon Aug 4 08:30:18 2025 (r1927604)
+++ serf/trunk/CMakeLists.txt Mon Aug 4 09:15:23 2025 (r1927605)
@@ -89,6 +89,7 @@ if(NOT CMAKE_BUILD_TYPE)
endif()
include(GNUInstallDirs)
+include(SerfFindPkgConfig)
include(SerfPlatform)
# On the Mac: Use dependencies from Homebrew or MacPorts
@@ -245,11 +246,30 @@ if(EXPAT)
endif(EXPAT)
# Find required dependencies
-find_package(OpenSSL REQUIRED)
-find_package(ZLIB REQUIRED)
find_package(APR REQUIRED)
find_package(APRUtil REQUIRED)
+
+SerfFindPkgConfig(OpenSSL_SSL OPENSSL_ROOT_DIR libssl OpenSSL::SSL)
+SerfFindPkgConfig(OpenSSL_Crypto OPENSSL_ROOT_DIR libcrypto OpenSSL::Crypto)
+if(NOT (OpenSSL_SSL_FOUND AND OpenSSL_Crypto_FOUND))
+ find_package(OpenSSL REQUIRED)
+ if(OpenSSL_FOUND)
+ set(OPENSSL_PC_LIBS ${OPENSSL_LIBRARIES})
+ endif()
+else()
+ set(OpenSSL_FOUND TRUE)
+ set(OPENSSL_INCLUDE_DIR ${OPENSSL_SSL_INCLUDE_DIR})
+ set(OPENSSL_PC_REQUIRES ${OPENSSL_SSL_PC_REQUIRES}
${OPENSSL_CRYPTO_PC_REQUIRES})
+ set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
+endif()
+
+SerfFindPkgConfig(ZLIB ZLIB_ROOT zlib ZLIB::ZLIB)
+if(NOT ZLIB_FOUND)
+ find_package(ZLIB REQUIRED)
+ set(ZLIB_PC_LIBS ${ZLIB_LIBRARIES})
+endif()
+
# We do not want or need OpenSSL's compatibility macros.
list(APPEND SERF_C_DEFINES "OPENSSL_NO_DEPRECATED")
@@ -258,12 +278,24 @@ list(APPEND SERF_C_DEFINES "OPENSSL_NO_S
# Find optional dependencies
if(USE_BROTLI)
- find_package(Brotli)
+ SerfFindPkgConfig(Brotli Brotli_ROOT libbrotlidec Brotli::Decode)
+ if(NOT Brotli_FOUND)
+ find_package(Brotli)
+ if(Brotli_FOUND)
+ set(BROTLI_PC_LIBS ${BROTLI_DECODE_LIBRARY})
+ endif()
+ endif()
endif()
if(NOT SERF_WINDOWS)
if(USE_GSSAPI)
- find_package(GSSAPI)
+ SerfFindPkgConfig(GSSAPI GSSAPI_ROOT krb5-gssapi KRB5::GSSAPI)
+ if(NOT GSSAPI_FOUND)
+ find_package(GSSAPI)
+ if(GSSAPI_FOUND)
+ set(GSSAPI_PC_LIBS ${GSSAPI_LIBRARIES})
+ endif()
+ endif()
endif()
else()
# We use SSPI on Windows and there's no Kerberos/GSSAPI port there.
@@ -272,25 +304,18 @@ else()
message(WARNING "option GSSAPI_ROOT is not implemented on this platform")
endif()
endif()
+
if(USE_UNBOUND)
- find_package(Unbound)
+ SerfFindPkgConfig(Unbound Unbound_ROOT libunbound Unbound::Unbound)
+ if(NOT Unbound_FOUND)
+ find_package(Unbound)
+ if(Unbound_FOUND)
+ set(UNBOUND_PC_LIBS "${UNBOUND_LIBRARY}")
+ endif()
+ endif()
endif()
# Calculate the set of private and public targets
-set(SERF_PRIVATE_TARGETS OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
-if(Brotli_FOUND)
- list(APPEND SERF_PRIVATE_TARGETS Brotli::Decode)
-endif()
-if(GSSAPI_FOUND)
- list(APPEND SERF_C_DEFINES "SERF_HAVE_GSSAPI")
- list(APPEND SERF_PRIVATE_TARGETS KRB5::GSSAPI)
-endif()
-if(Unbound_FOUND)
- list(APPEND SERF_C_DEFINES "SERF_HAVE_ASYNC_RESOLVER=1")
- list(APPEND SERF_C_DEFINES "SERF_HAVE_UNBOUND=1")
- list(APPEND SERF_PRIVATE_TARGETS Unbound::Unbound)
-endif()
-
if(APR_STATIC)
if(SERF_WINDOWS)
list(APPEND SERF_PUBLIC_TARGETS APR::APR_static)
@@ -307,6 +332,20 @@ else(APR_STATIC)
endif()
endif(APR_STATIC)
+list(APPEND SERF_PRIVATE_TARGETS OpenSSL::SSL OpenSSL::Crypto ZLIB::ZLIB)
+if(Brotli_FOUND)
+ list(APPEND SERF_PRIVATE_TARGETS Brotli::Decode)
+endif()
+if(GSSAPI_FOUND)
+ list(APPEND SERF_C_DEFINES "SERF_HAVE_GSSAPI")
+ list(APPEND SERF_PRIVATE_TARGETS KRB5::GSSAPI)
+endif()
+if(Unbound_FOUND)
+ list(APPEND SERF_C_DEFINES "SERF_HAVE_ASYNC_RESOLVER=1")
+ list(APPEND SERF_C_DEFINES "SERF_HAVE_UNBOUND=1")
+ list(APPEND SERF_PRIVATE_TARGETS Unbound::Unbound)
+endif()
+
# Feature tests
include(SerfChecks)
CheckNotFunction("BIO_set_init" "NULL, 0" "SERF_NO_SSL_BIO_WRAPPERS"
@@ -457,11 +496,6 @@ if(NOT SKIP_SHARED)
install(FILES $<TARGET_PDB_FILE:serf_shared>
CONFIGURATIONS Debug RelWithDebinfo
DESTINATION "${SERF_INSTALL_RUNTIME}")
- # string(TOLOWER "${CMAKE_BUILD_TYPE}" config)
- # if(NOT "${config}" STREQUAL "release")
- # install(FILES $<TARGET_PDB_FILE:serf_shared>
- # DESTINATION "${SERF_INSTALL_RUNTIME}")
- # endif()
endif()
endif()
@@ -515,8 +549,10 @@ function(make_pkgconfig)
set(VERSION ${SERF_VERSION})
set(MAJOR ${SERF_MAJOR_VERSION})
set(REQUIRES
- "libssl"
- "libcrypto"
+ ${OPENSSL_PC_REQUIRES}
+ ${ZLIB_PC_REQUIRES}
+ ${BROTLI_PC_REQUIRES}
+ ${GSSAPI_PC_REQUIRES}
${UNBOUND_PC_REQUIRES}
)
set(CFLAGS
@@ -529,10 +565,10 @@ function(make_pkgconfig)
${APRUTIL_LDFLAGS}
${APRUTIL_LIBRARIES}
${APRUTIL_EXTRALIBS}
- ${ZLIB_LIBRARIES}
- ${BROTLI_COMMON_LIBRARY}
- ${BROTLI_DECODE_LIBRARY}
- ${GSSAPI_LIBRARIES}
+ ${OPENSSL_PC_LIBS}
+ ${ZLIB_PC_LIBS}
+ ${BROTLI_PC_LIBS}
+ ${GSSAPI_PC_LIBS}
${UNBOUND_PC_LIBS}
${SERF_STANDARD_LIBRARIES}
)
Modified: serf/trunk/build/FindUnbound.cmake
==============================================================================
--- serf/trunk/build/FindUnbound.cmake Mon Aug 4 08:30:18 2025
(r1927604)
+++ serf/trunk/build/FindUnbound.cmake Mon Aug 4 09:15:23 2025
(r1927605)
@@ -43,13 +43,6 @@ cmake_minimum_required(VERSION 3.12)
# UNBOUND_INCLUDE_DIR - Where to find unbound.h.
# UNBOUND_LIBRARY - Linker switches to use with ld to link the library.
#
-# ::
-#
-# UNBOUND_PC_REQUIRES - The name of the pkg-config module for libunbound;
-# empty if pkg-config was not used to find the
library.
-# UNBOUND_PC_LIBS - The link libraries for pkg-config, if
-# UNBOUND_PC_REQUUIRES is not set.
-#
# Hints
# ^^^^^
#
@@ -57,102 +50,54 @@ cmake_minimum_required(VERSION 3.12)
include(FindPackageHandleStandardArgs)
include(GNUInstallDirs)
-find_package(PkgConfig QUIET)
-
-# Save the PKG_CONFIG_PATH environment variable
-if(PKG_CONFIG_FOUND)
- set(_pkg_config_path $ENV{PKG_CONFIG_PATH})
-endif()
set(Unbound_FOUND FALSE)
if(DEFINED Unbound_ROOT)
# Search in the provided root path
set(_root_search PATHS ${Unbound_ROOT} NO_DEFAULT_PATH)
- list(APPEND _UNBOUND_SEARCHES _root_search)
-
- # Set the PKG_CONFIG_PATH environment variable
- if(PKG_CONFIG_FOUND)
- find_path(_pcfile NAMES "libunbound.pc"
- ${_root_search}
- PATH_SUFFIXES
- "lib/pkgconfig"
- "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
- "share/pkgconfig"
- "${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig")
- if(_pcfile AND EXISTS "${_pcfile}/libunbound.pc")
- set(ENV{PKG_CONFIG_PATH} ${_pcfile})
- endif()
- endif()
+ list(APPEND _unbound_searches _root_search)
endif()
# Search in default paths
set(_default_search)
-list(APPEND _UNBOUND_SEARCHES _default_search)
+list(APPEND _unbound_searches _default_search)
-# Try pkg-config first
-if(PKG_CONFIG_FOUND)
- pkg_search_module(UNBOUND QUIET IMPORTED_TARGET libunbound)
- if(UNBOUND_FOUND)
- find_package_handle_standard_args(Unbound
- REQUIRED_VARS UNBOUND_LINK_LIBRARIES UNBOUND_INCLUDEDIR
- VERSION_VAR UNBOUND_VERSION)
- if(Unbound_FOUND)
- add_library(Unbound::Unbound ALIAS PkgConfig::UNBOUND)
- set(UNBOUND_INCLUDE_DIR ${UNBOUND_INCLUDEDIR})
- set(UNBOUND_LIBRARY ${UNBOUND_LINK_LIBRARIES})
- set(UNBOUND_PC_REQUIRES libunbound)
- set(UNBOUND_PC_LIBS)
+# Try each search configuration
+foreach(search ${_unbound_searches})
+ find_path(UNBOUND_INCLUDE_DIR NAMES "unbound.h" ${${search}}
+ PATH_SUFFIXES "include" "${CMAKE_INSTALL_INCLUDEDIR}")
+ if(UNBOUND_INCLUDE_DIR AND EXISTS "${UNBOUND_INCLUDE_DIR}/unbound.h")
+ # Use the first successful search to find the libraries
+ if(NOT DEFINED libsearch)
+ set(libsearch ${search})
endif()
endif()
-endif()
-
-if(NOT Unbound_FOUND)
- # Try each search configuration
- foreach(search ${_UNBOUND_SEARCHES})
- find_path(UNBOUND_INCLUDE_DIR NAMES "unbound.h" ${${search}}
- PATH_SUFFIXES "include" "${CMAKE_INSTALL_INCLUDEDIR}")
- if(UNBOUND_INCLUDE_DIR AND EXISTS "${UNBOUND_INCLUDE_DIR}/unbound.h")
- # Use the first successful search to find the libraries
- if(NOT DEFINED libsearch)
- set(libsearch ${search})
- endif()
- endif()
- endforeach()
-
- find_library(UNBOUND_LIBRARY NAMES "unbound" NAMES_PER_DIR ${${libsearch}}
- PATH_SUFFIXES "lib" "${CMAKE_INSTALL_LIBDIR}")
+endforeach()
- # Extract the version number from the header
- if(UNBOUND_INCLUDE_DIR AND EXISTS "${UNBOUND_INCLUDE_DIR}/unbound.h")
- file(STRINGS "${UNBOUND_INCLUDE_DIR}/unbound.h" _major
- REGEX "^ *# *define +UNBOUND_VERSION_MAJOR +[0-9]+.*$")
- file(STRINGS "${UNBOUND_INCLUDE_DIR}/unbound.h" _minor
- REGEX "^ *# *define +UNBOUND_VERSION_MINOR +[0-9]+.*$")
- file(STRINGS "${UNBOUND_INCLUDE_DIR}/unbound.h" _micro
- REGEX "^ *# *define +UNBOUND_VERSION_MICRO +[0-9]+.*$")
- string(REGEX REPLACE "^[^0-9]+([0-9]+).*$" "\\1" _major ${_major})
- string(REGEX REPLACE "^[^0-9]+([0-9]+).*$" "\\1" _minor ${_minor})
- string(REGEX REPLACE "^[^0-9]+([0-9]+).*$" "\\1" _micro ${_micro})
- set(UNBOUND_VERSION "${_major}.${_minor}.${_micro}")
- endif()
+find_library(UNBOUND_LIBRARY NAMES "unbound" NAMES_PER_DIR ${${libsearch}}
+ PATH_SUFFIXES "lib" "${CMAKE_INSTALL_LIBDIR}")
- find_package_handle_standard_args(Unbound
- REQUIRED_VARS UNBOUND_LIBRARY UNBOUND_INCLUDE_DIR
- VERSION_VAR UNBOUND_VERSION)
- if(Unbound_FOUND)
- add_library(Unbound::Unbound UNKNOWN IMPORTED)
- set_target_properties(Unbound::Unbound PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${UNBOUND_INCLUDE_DIR}"
- IMPORTED_LOCATION "${UNBOUND_LIBRARY}")
- set(UNBOUND_PC_REQUIRES)
- set(UNBOUND_PC_LIBS "${UNBOUND_LIBRARY}")
- endif()
+# Extract the version number from the header
+if(UNBOUND_INCLUDE_DIR AND EXISTS "${UNBOUND_INCLUDE_DIR}/unbound.h")
+ file(STRINGS "${UNBOUND_INCLUDE_DIR}/unbound.h" _major
+ REGEX "^ *# *define +UNBOUND_VERSION_MAJOR +[0-9]+.*$")
+ file(STRINGS "${UNBOUND_INCLUDE_DIR}/unbound.h" _minor
+ REGEX "^ *# *define +UNBOUND_VERSION_MINOR +[0-9]+.*$")
+ file(STRINGS "${UNBOUND_INCLUDE_DIR}/unbound.h" _micro
+ REGEX "^ *# *define +UNBOUND_VERSION_MICRO +[0-9]+.*$")
+ string(REGEX REPLACE "^[^0-9]+([0-9]+).*$" "\\1" _major ${_major})
+ string(REGEX REPLACE "^[^0-9]+([0-9]+).*$" "\\1" _minor ${_minor})
+ string(REGEX REPLACE "^[^0-9]+([0-9]+).*$" "\\1" _micro ${_micro})
+ set(UNBOUND_VERSION "${_major}.${_minor}.${_micro}")
endif()
-mark_as_advanced(UNBOUND_INCLUDE_DIR)
-mark_as_advanced(UNBOUND_LIBRARY)
-
-# Restore the PKG_CONFIG_PATH environment variable
-if(PKG_CONFIG_FOUND)
- set(ENV{PKG_CONFIG_PATH} ${_pkg_config_path})
+find_package_handle_standard_args(Unbound
+ REQUIRED_VARS UNBOUND_LIBRARY UNBOUND_INCLUDE_DIR
+ VERSION_VAR UNBOUND_VERSION)
+if(Unbound_FOUND)
+ add_library(Unbound::Unbound UNKNOWN IMPORTED)
+ set_target_properties(Unbound::Unbound PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${UNBOUND_INCLUDE_DIR}"
+ IMPORTED_LOCATION "${UNBOUND_LIBRARY}")
+ set(UNBOUND_PC_LIBS "${UNBOUND_LIBRARY}")
endif()
Added: serf/trunk/build/SerfFindPkgConfig.cmake
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ serf/trunk/build/SerfFindPkgConfig.cmake Mon Aug 4 09:15:23 2025
(r1927605)
@@ -0,0 +1,64 @@
+# ===================================================================
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ===================================================================
+
+include(FindPackageHandleStandardArgs)
+include(GNUInstallDirs)
+find_package(PkgConfig QUIET)
+
+# Generate list of symbols to export from shared libraries..
+function(SerfFindPkgConfig name root pkgname target_alias)
+ set(${name}_FOUND FALSE PARENT_SCOPE)
+ if(PKG_CONFIG_FOUND)
+ # Save the PKG_CONFIG_PATH environment variable
+ set(pkg_config_path $ENV{PKG_CONFIG_PATH})
+
+ if(DEFINED ${root})
+ # Set the PKG_CONFIG_PATH environment variable for the search
+ find_path(_${name}_pcdir NAMES "${pkgname}.pc"
+ PATHS ${${root}} NO_DEFAULT_PATH
+ PATH_SUFFIXES
+ "lib/pkgconfig"
+ "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
+ "share/pkgconfig"
+ "${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig")
+ if(_${name}_pcdir AND EXISTS "${_${name}_pcdir}/${pkgname}.pc")
+ set(ENV{PKG_CONFIG_PATH} ${_${name}_pcdir})
+ endif()
+ endif()
+
+ string(TOUPPER "${name}" NAME)
+ pkg_search_module(${NAME} QUIET IMPORTED_TARGET ${pkgname})
+ if(${NAME}_FOUND)
+ find_package_handle_standard_args(${name}
+ REQUIRED_VARS ${NAME}_LINK_LIBRARIES ${NAME}_INCLUDEDIR
+ VERSION_VAR ${NAME}_VERSION)
+ if(${name}_FOUND)
+ add_library(${target_alias} ALIAS PkgConfig::${NAME})
+ set(${name}_FOUND ${${name}_FOUND} PARENT_SCOPE)
+ set(${NAME}_INCLUDE_DIR ${${NAME}_INCLUDEDIR} PARENT_SCOPE)
+ set(${NAME}_LIBRARY ${${NAME}_LINK_LIBRARIES} PARENT_SCOPE)
+ set(${NAME}_VERSION ${${NAME}_VERSION} PARENT_SCOPE)
+ set(${NAME}_PC_REQUIRES ${pkgname} PARENT_SCOPE)
+ endif()
+ endif()
+
+ # Restore the PKG_CONFIG_PATH environment variable
+ set(ENV{PKG_CONFIG_PATH} ${pkg_config_path})
+ endif()
+endfunction(SerfFindPkgConfig)