Author: brane Date: Sat Aug 2 22:23:57 2025 New Revision: 1927587 Log: Improve the CMake build: add options to disable optional dependencies even when they're available and found in the configuration step. Also, always include the pkg-config file, including on Windows, where it's now expected to be available at least with vcpkg dependencies.
* CMakeLists.txt: Always install the pkg-config file, and move the dependency on libssl.pc and libcrypto.pc to the CMake file. (USE_BROTLI, USE_GSSAPI, USE_UNBOUND): New configuration options. On by default, use them to decide when to search for these optional dependencies. * SConstruct (PC_REQUIRES): Add libssl and libcrypto. * build/serf.pc.in (Requires.private): Remove default libssl and libcrypto. Modified: serf/trunk/CMakeLists.txt serf/trunk/SConstruct serf/trunk/build/serf.pc.in Modified: serf/trunk/CMakeLists.txt ============================================================================== --- serf/trunk/CMakeLists.txt Sat Aug 2 13:10:15 2025 (r1927586) +++ serf/trunk/CMakeLists.txt Sat Aug 2 22:23:57 2025 (r1927587) @@ -49,6 +49,11 @@ message(WARNING "Some features are not supported and the build " "has not been tested on many supported platforms.") +# Optional dependency options +option(USE_BROTLI "Use the Brotli decoding library if available" ON) +option(USE_GSSAPI "Use GSSAPI authentication if available" ON) +option(USE_UNBOUND "Use the Unbound async resolver if available" ON) + # Build options option(DEBUG "Enable debugging info and strict compile warnings" OFF) option(DOT_CLANGD "Generate a .clangd file at the root of the source tree" OFF) @@ -252,9 +257,14 @@ list(APPEND SERF_C_DEFINES "OPENSSL_NO_D list(APPEND SERF_C_DEFINES "OPENSSL_NO_STDIO") # Find optional dependencies -find_package(Brotli) +if(USE_BROTLI) + find_package(Brotli) +endif() + if(NOT SERF_WINDOWS) - find_package(GSSAPI) + if(USE_GSSAPI) + find_package(GSSAPI) + endif() else() # We use SSPI on Windows and there's no Kerberos/GSSAPI port there. set(GSSAPI_FOUND FALSE) @@ -262,7 +272,9 @@ else() message(WARNING "option GSSAPI_ROOT is not implemented on this platform") endif() endif() -find_package(Unbound) +if(USE_UNBOUND) + find_package(Unbound) +endif() # Calculate the set of private and public targets set(SERF_PRIVATE_TARGETS OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB) @@ -482,45 +494,51 @@ install(TARGETS ${SERF_TARGETS} install(FILES ${HEADERS} DESTINATION "${SERF_INSTALL_HEADERS}") # Generate the pkg-config module file. -if(NOT SERF_WINDOWS) - set(SERF_PC_FILE "serf-${SERF_MAJOR_VERSION}.pc") +set(SERF_PC_FILE "serf-${SERF_MAJOR_VERSION}.pc") - # Use a separate variable scope for the substitutions in serf.pc.in. - function(make_pkgconfig) - # Use a relative prefix to create a relocatable PC file. +# Use a separate variable scope for the substitutions in serf.pc.in. +function(make_pkgconfig) + # Use a relative prefix to create a relocatable PC file. + if(SERF_WINDOWS) + file(RELATIVE_PATH relfragment "X:\\${SERF_INSTALL_PKGCONFIG}" "X:\\") + else() file(RELATIVE_PATH relfragment "/${SERF_INSTALL_PKGCONFIG}" "/") - file(TO_CMAKE_PATH "\${pcfiledir}/${relfragment}" relprefix) + endif() + file(TO_CMAKE_PATH "\${pcfiledir}/${relfragment}" relprefix) - set(PREFIX ${relprefix}) - set(INCLUDE_SUBDIR ${SERF_INCLUDE_SUBDIR}) - 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} - ${APR_EXTRALIBS} - ${APRUTIL_LDFLAGS} - ${APRUTIL_LIBRARIES} - ${APRUTIL_EXTRALIBS} - ${BROTLI_COMMON_LIBRARY} - ${BROTLI_DECODE_LIBRARY} - ${GSSAPI_LIBRARIES} - ${UNBOUND_PC_LIBS} - ${ZLIB_LIBRARIES} - ) - list(REMOVE_DUPLICATES LIBS) - list(JOIN LIBS " " LIBS) - configure_file("build/serf.pc.in" "${SERF_PC_FILE}" @ONLY) - endfunction() - - make_pkgconfig() - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${SERF_PC_FILE}" - DESTINATION "${SERF_INSTALL_PKGCONFIG}") -endif() + set(PREFIX ${relprefix}) + set(INCLUDE_SUBDIR ${SERF_INCLUDE_SUBDIR}) + set(LIBDIR \${prefix}/${SERF_INSTALL_LIBRARIES}) + set(VERSION ${SERF_VERSION}) + set(MAJOR ${SERF_MAJOR_VERSION}) + set(PC_REQUIRES + "libssl" + "libcrypto" + ${UNBOUND_PC_REQUIRES} + ) + set(LIBS + ${APR_LDFLAGS} + ${APR_LIBRARIES} + ${APR_EXTRALIBS} + ${APRUTIL_LDFLAGS} + ${APRUTIL_LIBRARIES} + ${APRUTIL_EXTRALIBS} + ${BROTLI_COMMON_LIBRARY} + ${BROTLI_DECODE_LIBRARY} + ${GSSAPI_LIBRARIES} + ${UNBOUND_PC_LIBS} + ${ZLIB_LIBRARIES} + ) + list(REMOVE_DUPLICATES PC_REQUIRES) + list(JOIN PC_REQUIRES " " PC_REQUIRES) + list(REMOVE_DUPLICATES LIBS) + list(JOIN LIBS " " LIBS) + configure_file("build/serf.pc.in" "${SERF_PC_FILE}" @ONLY) +endfunction() + +make_pkgconfig() +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${SERF_PC_FILE}" + DESTINATION "${SERF_INSTALL_PKGCONFIG}") if(NOT SKIP_TESTS) Modified: serf/trunk/SConstruct ============================================================================== --- serf/trunk/SConstruct Sat Aug 2 13:10:15 2025 (r1927586) +++ serf/trunk/SConstruct Sat Aug 2 22:23:57 2025 (r1927587) @@ -695,7 +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 +PC_REQUIRES = ['libssl', 'libcrypto'] # TODO: Add dependency 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,), Modified: serf/trunk/build/serf.pc.in ============================================================================== --- serf/trunk/build/serf.pc.in Sat Aug 2 13:10:15 2025 (r1927586) +++ serf/trunk/build/serf.pc.in Sat Aug 2 22:23:57 2025 (r1927587) @@ -7,7 +7,7 @@ includedir=${prefix}/include/@INCLUDE_SU Name: serf Description: HTTP client library Version: @VERSION@ -Requires.private: libssl libcrypto @PC_REQUIRES@ +Requires.private: @PC_REQUIRES@ Libs: -L${libdir} -lserf-${SERF_MAJOR_VERSION} Libs.private: @LIBS@ Cflags: -I${includedir}