@@ -49,6 +49,11 @@ message(WARNING
4949 "Some features are not supported and the build "
5050 "has not been tested on many supported platforms." )
5151
52+ # Optional dependency options
53+ option (USE_BROTLI "Use the Brotli decoding library if available" ON )
54+ option (USE_GSSAPI "Use GSSAPI authentication if available" ON )
55+ option (USE_UNBOUND "Use the Unbound async resolver if available" ON )
56+
5257# Build options
5358option (DEBUG "Enable debugging info and strict compile warnings" OFF )
5459option (DOT_CLANGD "Generate a .clangd file at the root of the source tree" OFF )
@@ -84,6 +89,7 @@ if(NOT CMAKE_BUILD_TYPE)
8489endif ()
8590
8691include (GNUInstallDirs)
92+ include (SerfFindPkgConfig)
8793include (SerfPlatform)
8894
8995# On the Mac: Use dependencies from Homebrew or MacPorts
@@ -242,21 +248,57 @@ if(EXPAT)
242248endif (EXPAT)
243249
244250# Find required dependencies
245- find_package (OpenSSL REQUIRED)
246- find_package (ZLIB REQUIRED)
247251find_package (APR REQUIRED)
248252find_package (APRUtil REQUIRED)
249253
254+
255+ SerfFindPkgConfig(OpenSSL_SSL OPENSSL_ROOT_DIR libssl OpenSSL::SSL)
256+ SerfFindPkgConfig(OpenSSL_Crypto OPENSSL_ROOT_DIR libcrypto OpenSSL::Crypto)
257+ if (NOT (OpenSSL_SSL_FOUND AND OpenSSL_Crypto_FOUND))
258+ find_package (OpenSSL REQUIRED)
259+ if (OpenSSL_FOUND)
260+ set (OPENSSL_PC_LIBS ${OPENSSL_LIBRARIES} )
261+ endif ()
262+ else ()
263+ set (OpenSSL_FOUND TRUE )
264+ set (OPENSSL_INCLUDE_DIR ${OPENSSL_SSL_INCLUDE_DIR} )
265+ set (OPENSSL_PC_REQUIRES ${OPENSSL_SSL_PC_REQUIRES} ${OPENSSL_CRYPTO_PC_REQUIRES} )
266+ set (OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} )
267+ endif ()
268+
269+ SerfFindPkgConfig(ZLIB ZLIB_ROOT zlib ZLIB::ZLIB)
270+ if (NOT ZLIB_FOUND)
271+ find_package (ZLIB REQUIRED)
272+ set (ZLIB_PC_LIBS ${ZLIB_LIBRARIES} )
273+ endif ()
274+
250275# We do not want or need OpenSSL's compatibility macros.
251276list (APPEND SERF_C_DEFINES "OPENSSL_NO_DEPRECATED" )
252277
253278# Hide OpenSSL's _fp() API.
254279list (APPEND SERF_C_DEFINES "OPENSSL_NO_STDIO" )
255280
256281# Find optional dependencies
257- find_package (Brotli)
282+ if (USE_BROTLI)
283+ SerfFindPkgConfig(Brotli Brotli_ROOT libbrotlidec Brotli::Decode)
284+ if (NOT Brotli_FOUND)
285+ find_package (Brotli)
286+ if (Brotli_FOUND)
287+ set (BROTLI_PC_LIBS ${BROTLI_DECODE_LIBRARY} )
288+ endif ()
289+ endif ()
290+ endif ()
291+
258292if (NOT SERF_WINDOWS)
259- find_package (GSSAPI)
293+ if (USE_GSSAPI)
294+ SerfFindPkgConfig(GSSAPI GSSAPI_ROOT krb5-gssapi KRB5::GSSAPI)
295+ if (NOT GSSAPI_FOUND)
296+ find_package (GSSAPI)
297+ if (GSSAPI_FOUND)
298+ set (GSSAPI_PC_LIBS ${GSSAPI_LIBRARIES} )
299+ endif ()
300+ endif ()
301+ endif ()
260302else ()
261303 # We use SSPI on Windows and there's no Kerberos/GSSAPI port there.
262304 set (GSSAPI_FOUND FALSE )
@@ -265,36 +307,17 @@ else()
265307 endif ()
266308endif ()
267309
268-
269- # FIXME: VERYTEMPORARY, figure out FindUnbound.cmake first.
270- set (Unbound_FOUND FALSE )
271- if (Unbound_FOUND)
272- set (UNBOUND_INCLUDE_DIR "/opt/homebrew/opt/unbound/include" )
273- set (UNBOUND_LIBRARIES "/opt/homebrew/opt/unbound/lib/libunbound.dylib" )
274- # set(UNBOUND_LIBRARIES "/usr/lib/aarch64-linux-gnu/libunbound.so")
275- # set(UNBOUND_LIBRARIES "/usr/lib64/libunbound.so")
276- add_library (Unbound::Unbound UNKNOWN IMPORTED )
277- set_target_properties (Unbound::Unbound PROPERTIES
278- INTERFACE_INCLUDE_DIRECTORIES "${UNBOUND_INCLUDE_DIR} " )
279- set_target_properties (Unbound::Unbound PROPERTIES
280- IMPORTED_LOCATION "${UNBOUND_LIBRARIES} " )
281- endif (Unbound_FOUND)
282-
283- # Calculate the set of private and public targets
284- set (SERF_PRIVATE_TARGETS OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
285- if (Brotli_FOUND)
286- list (APPEND SERF_PRIVATE_TARGETS Brotli::Decode)
287- endif ()
288- if (GSSAPI_FOUND)
289- list (APPEND SERF_C_DEFINES "SERF_HAVE_GSSAPI" )
290- list (APPEND SERF_PRIVATE_TARGETS KRB5::GSSAPI)
291- endif ()
292- if (Unbound_FOUND)
293- list (APPEND SERF_C_DEFINES "SERF_HAVE_ASYNC_RESOLVER=1" )
294- list (APPEND SERF_C_DEFINES "SERF_HAVE_UNBOUND" )
295- list (APPEND SERF_PRIVATE_TARGETS Unbound::Unbound)
310+ if (USE_UNBOUND)
311+ SerfFindPkgConfig(Unbound Unbound_ROOT libunbound Unbound::Unbound)
312+ if (NOT Unbound_FOUND)
313+ find_package (Unbound)
314+ if (Unbound_FOUND)
315+ set (UNBOUND_PC_LIBS "${UNBOUND_LIBRARY} " )
316+ endif ()
317+ endif ()
296318endif ()
297319
320+ # Calculate the set of private and public targets
298321if (APR_STATIC)
299322 if (SERF_WINDOWS)
300323 list (APPEND SERF_PUBLIC_TARGETS APR::APR_static)
@@ -311,6 +334,20 @@ else(APR_STATIC)
311334 endif ()
312335endif (APR_STATIC)
313336
337+ list (APPEND SERF_PRIVATE_TARGETS OpenSSL::SSL OpenSSL::Crypto ZLIB::ZLIB)
338+ if (Brotli_FOUND)
339+ list (APPEND SERF_PRIVATE_TARGETS Brotli::Decode)
340+ endif ()
341+ if (GSSAPI_FOUND)
342+ list (APPEND SERF_C_DEFINES "SERF_HAVE_GSSAPI" )
343+ list (APPEND SERF_PRIVATE_TARGETS KRB5::GSSAPI)
344+ endif ()
345+ if (Unbound_FOUND)
346+ list (APPEND SERF_C_DEFINES "SERF_HAVE_ASYNC_RESOLVER=1" )
347+ list (APPEND SERF_C_DEFINES "SERF_HAVE_UNBOUND=1" )
348+ list (APPEND SERF_PRIVATE_TARGETS Unbound::Unbound)
349+ endif ()
350+
314351# Feature tests
315352include (SerfChecks)
316353CheckNotFunction("BIO_set_init" "NULL, 0" "SERF_NO_SSL_BIO_WRAPPERS"
@@ -458,11 +495,9 @@ if(NOT SKIP_SHARED)
458495 list (APPEND SERF_TARGETS serf_shared)
459496
460497 if (SERF_WINDOWS)
461- string (TOLOWER "${CMAKE_BUILD_TYPE} " config)
462- if (NOT "${config} " STREQUAL "release" )
463- install (FILES $<TARGET_PDB_FILE:serf_shared>
464- DESTINATION "${SERF_INSTALL_RUNTIME} " )
465- endif ()
498+ install (FILES $<TARGET_PDB_FILE:serf_shared>
499+ CONFIGURATIONS Debug RelWithDebinfo
500+ DESTINATION "${SERF_INSTALL_RUNTIME} " )
466501 endif ()
467502endif ()
468503
@@ -498,41 +533,59 @@ install(TARGETS ${SERF_TARGETS}
498533install (FILES ${HEADERS} DESTINATION "${SERF_INSTALL_HEADERS} " )
499534
500535# Generate the pkg-config module file.
501- if (NOT SERF_WINDOWS)
502- set (SERF_PC_FILE "serf-${SERF_MAJOR_VERSION} .pc" )
536+ set (SERF_PC_FILE "serf-${SERF_MAJOR_VERSION} .pc" )
503537
504- # Use a separate variable scope for the substitutions in serf.pc.in.
505- function (make_pkgconfig)
506- # Use a relative prefix to create a relocatable PC file.
538+ # Use a separate variable scope for the substitutions in serf.pc.in.
539+ function (make_pkgconfig)
540+ # Use a relative prefix to create a relocatable PC file.
541+ if (SERF_WINDOWS)
542+ file (RELATIVE_PATH relfragment "X:\\ ${SERF_INSTALL_PKGCONFIG} " "X:\\ " )
543+ else ()
507544 file (RELATIVE_PATH relfragment "/${SERF_INSTALL_PKGCONFIG} " "/" )
508- file (TO_CMAKE_PATH "\$ {pcfiledir}/${relfragment} " relprefix)
509-
510- set (PREFIX ${relprefix} )
511- set (INCLUDE_SUBDIR ${SERF_INCLUDE_SUBDIR} )
512- set (LIBDIR \${prefix} /${SERF_INSTALL_LIBRARIES} )
513- set (VERSION ${SERF_VERSION} )
514- set (MAJOR ${SERF_MAJOR_VERSION} )
515- set (LIBS
516- ${APR_LDFLAGS}
517- ${APR_LIBRARIES}
518- ${APR_EXTRALIBS}
519- ${APRUTIL_LDFLAGS}
520- ${APRUTIL_LIBRARIES}
521- ${APRUTIL_EXTRALIBS}
522- ${BROTLI_COMMON_LIBRARY}
523- ${BROTLI_DECODE_LIBRARY}
524- ${GSSAPI_LIBRARIES}
525- ${ZLIB_LIBRARIES}
526- )
527- list (REMOVE_DUPLICATES LIBS)
528- list (JOIN LIBS " " LIBS)
529- configure_file ("build/serf.pc.in" "${SERF_PC_FILE} " @ONLY)
530- endfunction ()
531-
532- make_pkgconfig()
533- install (FILES "${CMAKE_CURRENT_BINARY_DIR} /${SERF_PC_FILE} "
534- DESTINATION "${SERF_INSTALL_PKGCONFIG} " )
535- endif ()
545+ endif ()
546+ file (TO_CMAKE_PATH "\$ {pcfiledir}/${relfragment} " relprefix)
547+
548+ set (PREFIX ${relprefix} )
549+ set (INCLUDE_SUBDIR ${SERF_INCLUDE_SUBDIR} )
550+ set (LIBDIR \${prefix} /${SERF_INSTALL_LIBRARIES} )
551+ set (VERSION ${SERF_VERSION} )
552+ set (MAJOR ${SERF_MAJOR_VERSION} )
553+ set (REQUIRES
554+ ${OPENSSL_PC_REQUIRES}
555+ ${ZLIB_PC_REQUIRES}
556+ ${BROTLI_PC_REQUIRES}
557+ ${GSSAPI_PC_REQUIRES}
558+ ${UNBOUND_PC_REQUIRES}
559+ )
560+ set (CFLAGS
561+ ${APR_CFLAGS}
562+ )
563+ set (LIBS
564+ ${APR_LDFLAGS}
565+ ${APR_LIBRARIES}
566+ ${APR_EXTRALIBS}
567+ ${APRUTIL_LDFLAGS}
568+ ${APRUTIL_LIBRARIES}
569+ ${APRUTIL_EXTRALIBS}
570+ ${OPENSSL_PC_LIBS}
571+ ${ZLIB_PC_LIBS}
572+ ${BROTLI_PC_LIBS}
573+ ${GSSAPI_PC_LIBS}
574+ ${UNBOUND_PC_LIBS}
575+ ${SERF_STANDARD_LIBRARIES}
576+ )
577+ list (REMOVE_DUPLICATES REQUIRES)
578+ list (JOIN REQUIRES " " REQUIRES)
579+ list (REMOVE_DUPLICATES CFLAGS)
580+ list (JOIN CFLAGS " " CFLAGS)
581+ list (REMOVE_DUPLICATES LIBS)
582+ list (JOIN LIBS " " LIBS)
583+ configure_file ("build/serf.pc.in" "${SERF_PC_FILE} " @ONLY)
584+ endfunction ()
585+
586+ make_pkgconfig()
587+ install (FILES "${CMAKE_CURRENT_BINARY_DIR} /${SERF_PC_FILE} "
588+ DESTINATION "${SERF_INSTALL_PKGCONFIG} " )
536589
537590
538591if (NOT SKIP_TESTS)
@@ -583,7 +636,7 @@ endif()
583636if ("SERF_HAVE_SSPI" IN_LIST SERF_C_DEFINES)
584637 set (_have_sspi ON )
585638endif ()
586- if ("SERF_HAVE_UNBOUND" IN_LIST SERF_C_DEFINES)
639+ if ("SERF_HAVE_UNBOUND=1 " IN_LIST SERF_C_DEFINES)
587640 set (_have_unbound "EXPERIMENTAL" )
588641endif ()
589642
@@ -609,6 +662,5 @@ message(STATUS " headers: ................ : ${SERF_INSTALL_HEADERS}")
609662message (STATUS " libraries: .............. : ${SERF_INSTALL_LIBRARIES} " )
610663if (SERF_WINDOWS)
611664message (STATUS " dynamic libraries: ...... : ${SERF_INSTALL_RUNTIME} " )
612- else ()
613- message (STATUS " pkg-config file: ........ : ${SERF_INSTALL_PKGCONFIG} " )
614665endif ()
666+ message (STATUS " pkg-config file: ........ : ${SERF_INSTALL_PKGCONFIG} " )
0 commit comments