Author: brane
Date: Sat Aug 2 12:02:09 2025
New Revision: 1927582
Log:
In the CMake build, look for Unbound. The SCons build doesn't support this
yet, it only handles the new addition to the pkg-config file template.
* CMakeLists.txt:
- Find Unbound.
- Remove the temporary hack for using Unbound in the build.
- Use the new variables from FindUnbound to generate the pkg-config file.
* SConstruct
(PC_REQUIRES): New variable, substitute it into the pkg-config file.
* build/FindUnbound.cmake: New; Find Unbound, either through pkg-config
or the old-fashioned way.
* build/SerfMacOS.cmake: Find "unbound" in Homebrew or MacPorts.
* build/serf.pc.in: Add the @PC_REQUIRES@ substitution for private
dependencies that are available through pkg-config.
Added:
serf/trunk/build/FindUnbound.cmake
Modified:
serf/trunk/CMakeLists.txt
serf/trunk/SConstruct
serf/trunk/build/SerfMacOS.cmake
serf/trunk/build/serf.pc.in
Modified: serf/trunk/CMakeLists.txt
==============================================================================
--- serf/trunk/CMakeLists.txt Sat Aug 2 11:06:03 2025 (r1927581)
+++ serf/trunk/CMakeLists.txt Sat Aug 2 12:02:09 2025 (r1927582)
@@ -262,21 +262,7 @@ else()
message(WARNING "option GSSAPI_ROOT is not implemented on this platform")
endif()
endif()
-
-
-# FIXME: VERYTEMPORARY, figure out FindUnbound.cmake first.
-set(Unbound_FOUND FALSE)
-if (Unbound_FOUND)
- set(UNBOUND_INCLUDE_DIR "/opt/homebrew/opt/unbound/include")
- set(UNBOUND_LIBRARIES "/opt/homebrew/opt/unbound/lib/libunbound.dylib")
- # set(UNBOUND_LIBRARIES "/usr/lib/aarch64-linux-gnu/libunbound.so")
- # set(UNBOUND_LIBRARIES "/usr/lib64/libunbound.so")
- add_library(Unbound::Unbound UNKNOWN IMPORTED)
- set_target_properties(Unbound::Unbound PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${UNBOUND_INCLUDE_DIR}")
- set_target_properties(Unbound::Unbound PROPERTIES
- IMPORTED_LOCATION "${UNBOUND_LIBRARIES}")
-endif(Unbound_FOUND)
+find_package(Unbound)
# Calculate the set of private and public targets
set(SERF_PRIVATE_TARGETS OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
@@ -289,7 +275,7 @@ if(GSSAPI_FOUND)
endif()
if(Unbound_FOUND)
list(APPEND SERF_C_DEFINES "SERF_HAVE_ASYNC_RESOLVER=1")
- list(APPEND SERF_C_DEFINES "SERF_HAVE_UNBOUND")
+ list(APPEND SERF_C_DEFINES "SERF_HAVE_UNBOUND=1")
list(APPEND SERF_PRIVATE_TARGETS Unbound::Unbound)
endif()
@@ -510,6 +496,9 @@ if(NOT SERF_WINDOWS)
set(LIBDIR \${prefix}/${SERF_INSTALL_LIBRARIES})
set(VERSION ${SERF_VERSION})
set(MAJOR ${SERF_MAJOR_VERSION})
+ set(PC_REQUIRES
+ ${UNBOUND_PC_REQUIRES}
+ )
set(LIBS
${APR_LDFLAGS}
${APR_LIBRARIES}
@@ -520,6 +509,7 @@ if(NOT SERF_WINDOWS)
${BROTLI_COMMON_LIBRARY}
${BROTLI_DECODE_LIBRARY}
${GSSAPI_LIBRARIES}
+ ${UNBOUND_PC_LIBS}
${ZLIB_LIBRARIES}
)
list(REMOVE_DUPLICATES LIBS)
@@ -581,7 +571,7 @@ endif()
if("SERF_HAVE_SSPI" IN_LIST SERF_C_DEFINES)
set(_have_sspi ON)
endif()
-if ("SERF_HAVE_UNBOUND" IN_LIST SERF_C_DEFINES)
+if ("SERF_HAVE_UNBOUND=1" IN_LIST SERF_C_DEFINES)
set(_have_unbound "EXPERIMENTAL")
endif()
Modified: serf/trunk/SConstruct
==============================================================================
--- serf/trunk/SConstruct Sat Aug 2 11:06:03 2025 (r1927581)
+++ serf/trunk/SConstruct Sat Aug 2 12:02:09 2025 (r1927582)
@@ -695,6 +695,7 @@ for d in env['LIBPATH']:
env.Append(RPATH=[':'+d])
# Set up the construction of serf-*.pc
+PC_REQUIRES = [] # TODO: Add dependency pkg-config modules
pkgprefix = os.path.relpath(env.subst('$PREFIX'),
env.subst('$LIBDIR/pkgconfig'))
pkglibdir = os.path.relpath(env.subst('$LIBDIR'), env.subst('$PREFIX'))
pkgconfig = env.Textfile('serf-%d.pc' % (MAJOR,),
@@ -704,6 +705,7 @@ pkgconfig = env.Textfile('serf-%d.pc' %
'@PREFIX@': unsubstable('${pcfiledir}/' +
pkgprefix),
'@LIBDIR@': unsubstable('${prefix}/' + pkglibdir),
'@INCLUDE_SUBDIR@': 'serf-%d' % (MAJOR,),
+ '@PC_REQUIRES@': ' '.join(PC_REQUIRES),
'@VERSION@': '%d.%d.%d' % (MAJOR, MINOR, PATCH),
'@LIBS@': '%s %s %s %s -lz' % (apu_libs, apr_libs,
env.get('GSSAPI_LIBS', ''),
Added: serf/trunk/build/FindUnbound.cmake
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ serf/trunk/build/FindUnbound.cmake Sat Aug 2 12:02:09 2025
(r1927582)
@@ -0,0 +1,158 @@
+# ===================================================================
+# 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.
+# ===================================================================
+
+cmake_minimum_required(VERSION 3.12)
+
+#.rst:
+# FindUnbound
+# -----------
+#
+# Find the Unbound library and headers.
+#
+# IMPORTED Targets
+# ^^^^^^^^^^^^^^^^
+#
+# This module defines :prop_tgt:`IMPORTED` target ``Unbound::Unbound``, if
+# libunbound has been found.
+#
+# Result Variables
+# ^^^^^^^^^^^^^^^^
+#
+# This module defines the following variables:
+#
+# ::
+#
+# Unbound_FOUND - True if libunbound was found.
+# UNBOUND_VERSION - The version of libunbound found (x.y.z).
+# 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
+# ^^^^^
+#
+# A user may set ``Unbound_ROOT`` to tell this module where to look.
+
+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()
+endif()
+
+# Search in default paths
+set(_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)
+ 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}")
+
+ # 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_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()
+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})
+endif()
Modified: serf/trunk/build/SerfMacOS.cmake
==============================================================================
--- serf/trunk/build/SerfMacOS.cmake Sat Aug 2 11:06:03 2025
(r1927581)
+++ serf/trunk/build/SerfMacOS.cmake Sat Aug 2 12:02:09 2025
(r1927582)
@@ -52,6 +52,7 @@ function(serf_macos_find_packages)
endif()
_serf_macos__find_package("brotli" Brotli_ROOT "Path to Brotli's install
area")
_serf_macos__find_package("gssapi" GSSAPI_ROOT "Path to GSSAPI's install
area")
+ _serf_macos__find_package("unbound" Unbound_ROOT "Path to Unbound's install
area")
endfunction()
#
Modified: serf/trunk/build/serf.pc.in
==============================================================================
--- serf/trunk/build/serf.pc.in Sat Aug 2 11:06:03 2025 (r1927581)
+++ serf/trunk/build/serf.pc.in Sat Aug 2 12:02:09 2025 (r1927582)
@@ -7,7 +7,7 @@ includedir=${prefix}/include/@INCLUDE_SU
Name: serf
Description: HTTP client library
Version: @VERSION@
-Requires.private: libssl libcrypto
+Requires.private: libssl libcrypto @PC_REQUIRES@
Libs: -L${libdir} -lserf-${SERF_MAJOR_VERSION}
Libs.private: @LIBS@
Cflags: -I${includedir}