diff --git a/CMakeLists.txt b/CMakeLists.txt index 6846efe8ca9..cc1f69fc9ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,11 +71,9 @@ mongo_bool_setting(ENABLE_EXAMPLES "Build MongoDB C Driver examples") mongo_bool_setting(ENABLE_MAN_PAGES "Build the manual pages" DEFAULT VALUE OFF) mongo_bool_setting(ENABLE_HTML_DOCS "Build the HTML documentation" DEFAULT VALUE OFF) mongo_bool_setting(ENABLE_UNINSTALL "Generate an 'uninstall' script and an 'uninstall' build target") +mongo_bool_setting(ENABLE_SRV "Enable support for mongodb+srv URIs.") # Optional features that are ENABLED when necessary dependencies are found: -mongo_setting(ENABLE_SRV "Enable support for mongodb+srv URIs." - OPTIONS ON OFF AUTO - DEFAULT VALUE AUTO) mongo_setting(ENABLE_SNAPPY "Enable Snappy compression support" OPTIONS ON OFF AUTO DEFAULT VALUE AUTO) diff --git a/build/cmake/CMakeLists.txt b/build/cmake/CMakeLists.txt index 97875a8c1b5..d9c93e81490 100644 --- a/build/cmake/CMakeLists.txt +++ b/build/cmake/CMakeLists.txt @@ -2,7 +2,7 @@ add_subdirectory (make_dist) set (build_cmake_MODULES CheckSchedGetCPU.cmake - FindResSearch.cmake + ResSearch.cmake FindSASL2.cmake FindSnappy.cmake FindSphinx.cmake diff --git a/build/cmake/FindResSearch.cmake b/build/cmake/FindResSearch.cmake deleted file mode 100644 index c96550656bd..00000000000 --- a/build/cmake/FindResSearch.cmake +++ /dev/null @@ -1,73 +0,0 @@ -include (CheckSymbolExists) - -if (ENABLE_SRV STREQUAL ON OR ENABLE_SRV STREQUAL AUTO) - if (WIN32) - set (RESOLV_LIBRARIES Dnsapi) - set (MONGOC_HAVE_DNSAPI 1) - set (MONGOC_HAVE_RES_NSEARCH 0) - set (MONGOC_HAVE_RES_NDESTROY 0) - set (MONGOC_HAVE_RES_NCLOSE 0) - set (MONGOC_HAVE_RES_SEARCH 0) - else () - set (MONGOC_HAVE_DNSAPI 0) - # Thread-safe DNS query function for _mongoc_client_get_srv. - # Could be a macro, not a function, so use check_symbol_exists. - check_symbol_exists (res_nsearch resolv.h MONGOC_HAVE_RES_NSEARCH) - if (MONGOC_HAVE_RES_NSEARCH) - set (RESOLV_LIBRARIES resolv) - set (MONGOC_HAVE_RES_SEARCH 0) - - # We have res_nsearch. Call res_ndestroy (BSD/Mac) or res_nclose (Linux)? - check_symbol_exists (res_ndestroy resolv.h MONGOC_HAVE_RES_NDESTROY) - if (MONGOC_HAVE_RES_NDESTROY) - set (MONGOC_HAVE_RES_NCLOSE 0) - else () - set (MONGOC_HAVE_RES_NDESTROY 0) - check_symbol_exists (res_nclose resolv.h MONGOC_HAVE_RES_NCLOSE) - if (NOT MONGOC_HAVE_RES_NCLOSE) - set (MONGOC_HAVE_RES_NCLOSE 0) - endif () - endif () - elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - # On FreeBSD, the following line does not properly detect res_search, - # which is included in libc on FreeBSD: - # check_symbol_exists (res_search resolv.h MONGOC_HAVE_RES_SEARCH) - # - # Attempting to link with libresolv on FreeBSD will fail with this error: - # ld: error: unable to find library -lresolv - # - # Since res_search has existed since 4.3 BSD (which is the predecessor - # of FreeBSD), it is safe to assume that this function will exist in - # libc on FreeBSD. - set (MONGOC_HAVE_RES_SEARCH 1) - set (MONGOC_HAVE_RES_NSEARCH 0) - set (MONGOC_HAVE_RES_NDESTROY 0) - set (MONGOC_HAVE_RES_NCLOSE 0) - else () - set (MONGOC_HAVE_RES_NSEARCH 0) - set (MONGOC_HAVE_RES_NDESTROY 0) - set (MONGOC_HAVE_RES_NCLOSE 0) - - # Thread-unsafe function. - check_symbol_exists (res_search resolv.h MONGOC_HAVE_RES_SEARCH) - if (MONGOC_HAVE_RES_SEARCH) - set (RESOLV_LIBRARIES resolv) - else () - set (MONGOC_HAVE_RES_SEARCH 0) - endif () - endif () - endif () -else () - # ENABLE_SRV disabled, set default values for defines. - set (MONGOC_HAVE_DNSAPI 0) - set (MONGOC_HAVE_RES_NSEARCH 0) - set (MONGOC_HAVE_RES_NDESTROY 0) - set (MONGOC_HAVE_RES_NCLOSE 0) - set (MONGOC_HAVE_RES_SEARCH 0) -endif () - -if (ENABLE_SRV STREQUAL ON AND NOT RESOLV_LIBRARIES AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - message ( - FATAL_ERROR - "Cannot find libresolv or dnsapi. Try setting ENABLE_SRV=OFF") -endif () diff --git a/build/cmake/ResSearch.cmake b/build/cmake/ResSearch.cmake new file mode 100644 index 00000000000..d82466cd5b3 --- /dev/null +++ b/build/cmake/ResSearch.cmake @@ -0,0 +1,57 @@ +include(CheckSymbolExists) +include(CMakePushCheckState) + +cmake_push_check_state(RESET) + +# The name of the library that performs name resolution, suitable for giving to the "-l" link flag +set(RESOLVE_LIB_NAME) +# If TRUE, then the C runtime provides the name resolution that we need +set(resolve_is_libc FALSE) + +if(WIN32) + set(RESOLVE_LIB_NAME Dnsapi) + set(_MONGOC_HAVE_DNSAPI 1) +else() + # Try to find the search functions for various configurations. + # Headers required by minimum on the strictest system: (Tested on FreeBSD 13) + set(resolve_headers netinet/in.h sys/types.h arpa/nameser.h resolv.h) + set(CMAKE_REQUIRED_LIBRARIES resolv) + check_symbol_exists(res_nsearch "${resolve_headers}" _MONGOC_HAVE_RES_NSEARCH_RESOLV) + check_symbol_exists(res_search "${resolve_headers}" _MONGOC_HAVE_RES_SEARCH_RESOLV) + check_symbol_exists(res_ndestroy "${resolve_headers}" _MONGOC_HAVE_RES_NDESTROY_RESOLV) + check_symbol_exists(res_nclose "${resolve_headers}" _MONGOC_HAVE_RES_NCLOSE_RESOLV) + if((_MONGOC_HAVE_RES_NSEARCH_RESOLV OR _MONGOC_HAVE_RES_SEARCH_RESOLV) + AND (_MONGOC_HAVE_RES_NDESTROY_RESOLV OR _MONGOC_HAVE_RES_NCLOSE_RESOLV)) + set(RESOLVE_LIB_NAME resolv) + else() + # Can we use name resolution with just libc? + unset(CMAKE_REQUIRED_LIBRARIES) + check_symbol_exists(res_nsearch "${resolve_headers}" _MONGOC_HAVE_RES_NSEARCH_NOLINK) + check_symbol_exists(res_search "${resolve_headers}" _MONGOC_HAVE_RES_SEARCH_NOLINK) + check_symbol_exists(res_ndestroy "${resolve_headers}" _MONGOC_HAVE_RES_NDESTROY_NOLINK) + check_symbol_exists(res_nclose "${resolve_headers}" _MONGOC_HAVE_RES_NCLOSE_NOLINK) + if((_MONGOC_HAVE_RES_NSEARCH_NOLINK OR _MONGOC_HAVE_RES_SEARCH_NOLINK) + AND (_MONGOC_HAVE_RES_NDESTROY_NOLINK OR _MONGOC_HAVE_RES_NCLOSE_NOLINK)) + set(resolve_is_libc TRUE) + message(VERBOSE "Name resolution is provided by the C runtime") + endif() + endif() +endif() + +_mongo_pick(MONGOC_HAVE_DNSAPI 1 0 _MONGOC_HAVE_DNSAPI) +_mongo_pick(MONGOC_HAVE_RES_NSEARCH 1 0 [[_MONGOC_HAVE_RES_NSEARCH_NOLINK OR _MONGOC_HAVE_RES_NSEARCH_RESOLV]]) +_mongo_pick(MONGOC_HAVE_RES_SEARCH 1 0 [[_MONGOC_HAVE_RES_SEARCH_NOLINK OR _MONGOC_HAVE_RES_SEARCH_RESOLV]]) +_mongo_pick(MONGOC_HAVE_RES_NDESTROY 1 0 [[_MONGOC_HAVE_RES_NDESTROY_NOLINK OR _MONGOC_HAVE_RES_NDESTROY_RESOLV]]) +_mongo_pick(MONGOC_HAVE_RES_NCLOSE 1 0 [[_MONGOC_HAVE_RES_NCLOSE_NOLINK OR _MONGOC_HAVE_RES_NCLOSE_RESOLV]]) + +if(RESOLVE_LIB_NAME OR resolve_is_libc) + # Define the resolver interface: + add_library(_mongoc-resolve INTERFACE) + add_library(mongo::detail::c_resolve ALIAS _mongoc-resolve) + set_target_properties(_mongoc-resolve PROPERTIES + INTERFACE_LINK_LIBRARIES "${RESOLVE_LIB_NAME}" + EXPORT_NAME detail::c_resolve) + install(TARGETS _mongoc-resolve EXPORT mongoc-targets) +endif() + +cmake_pop_check_state() diff --git a/src/libmongoc/CMakeLists.txt b/src/libmongoc/CMakeLists.txt index aa59f9e4ab6..698f1d827a1 100644 --- a/src/libmongoc/CMakeLists.txt +++ b/src/libmongoc/CMakeLists.txt @@ -29,6 +29,9 @@ set (MONGOC_ENABLE_COMPRESSION_SNAPPY 0) set (MONGOC_ENABLE_COMPRESSION_ZLIB 0) set (MONGOC_ENABLE_COMPRESSION_ZSTD 0) +# Definition for mongoc-config.h: +_mongo_pick(MONGOC_ENABLE_SRV 1 0 ENABLE_SRV) + set (MONGOC_OUTPUT_BASENAME "mongoc" CACHE STRING "Output mongoc library base name") if (NOT ENABLE_ZLIB MATCHES "SYSTEM|AUTO|BUNDLED|OFF") @@ -288,7 +291,9 @@ else () set (MONGOC_SOCKET_ARG3 "int") endif () -include (FindResSearch) +# Find name resolution libaries. Also sets definitions used in configure_file(): +include(ResSearch) + include (CheckSchedGetCPU) function (mongoc_get_accept_args ARG2 ARG3) @@ -701,14 +706,27 @@ if (CMAKE_USE_PTHREADS_INIT) endif () set (LIBRARIES - ${SASL_LIBRARIES} ${SSL_LIBRARIES} ${SHM_LIBRARIES} ${RESOLV_LIBRARIES} + ${SASL_LIBRARIES} ${SSL_LIBRARIES} ${SHM_LIBRARIES} ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} ${MONGOC_ZSTD_LIBRARIES} Threads::Threads ${ICU_LIBRARIES} ${LIBMONGOCRYPT_LIBRARY} ) set (STATIC_LIBRARIES - ${SASL_LIBRARIES} ${SSL_LIBRARIES} ${SSL_STATIC_LIBRARIES} ${SHM_LIBRARIES} ${RESOLV_LIBRARIES} + ${SASL_LIBRARIES} ${SSL_LIBRARIES} ${SSL_STATIC_LIBRARIES} ${SHM_LIBRARIES} ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} ${MONGOC_ZSTD_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${ICU_LIBRARIES} ${LIBMONGOCRYPT_LIBRARY} ) +add_library(_mongoc-dependencies INTERFACE) +add_library(mongo::detail::c_dependencies ALIAS _mongoc-dependencies) +install(TARGETS _mongoc-dependencies EXPORT mongoc-targets) +set_property(TARGET _mongoc-dependencies PROPERTY EXPORT_NAME detail::c_dependencies) + +if(ENABLE_SRV) + # Interface target defined by ResSearch.cmake: + if(NOT TARGET mongo::detail::c_resolve) + message(SEND_ERROR "ENABLE_SRV is “${ENABLE_SRV}”, but we were unable to find a name resolution library") + endif() + target_link_libraries(_mongoc-dependencies INTERFACE mongo::detail::c_resolve) +endif() + if (WIN32) set (LIBRARIES ${LIBRARIES} ws2_32) endif () @@ -733,7 +751,7 @@ endif () add_library (mongoc_shared SHARED ${SOURCES} ${HEADERS} ${HEADERS_FORWARDING}) set_target_properties (mongoc_shared PROPERTIES CMAKE_CXX_VISIBILITY_PRESET hidden) -target_link_libraries (mongoc_shared PRIVATE ${LIBRARIES} PUBLIC ${BSON_LIBRARIES}) +target_link_libraries (mongoc_shared PRIVATE ${LIBRARIES} PUBLIC ${BSON_LIBRARIES} mongo::detail::c_dependencies) target_include_directories (mongoc_shared PRIVATE ${ZLIB_INCLUDE_DIRS}) target_include_directories (mongoc_shared PRIVATE ${LIBMONGOCRYPT_INCLUDE_DIRECTORIES}) if(ENABLE_COVERAGE) @@ -769,8 +787,12 @@ target_include_directories ( $ ) -set_target_properties (mongoc_shared PROPERTIES VERSION 0.0.0 SOVERSION 0) -set_target_properties (mongoc_shared PROPERTIES OUTPUT_NAME "${MONGOC_OUTPUT_BASENAME}-${MONGOC_API_VERSION}") +set_target_properties (mongoc_shared PROPERTIES + OUTPUT_NAME "${MONGOC_OUTPUT_BASENAME}-${MONGOC_API_VERSION}" + VERSION 0.0.0 + SOVERSION 0 + pkg_config_REQUIRES "libbson-1.0" + ) if (MONGOC_ENABLE_STATIC_BUILD) add_library (mongoc_static STATIC ${SOURCES} ${HEADERS} ${HEADERS_FORWARDING}) @@ -778,11 +800,15 @@ if (MONGOC_ENABLE_STATIC_BUILD) target_compile_options(mongoc_static PRIVATE --coverage) target_link_options(mongoc_static PUBLIC --coverage) endif() - target_link_libraries (mongoc_static PUBLIC ${STATIC_LIBRARIES} ${BSON_STATIC_LIBRARIES}) + target_link_libraries (mongoc_static PUBLIC ${STATIC_LIBRARIES} ${BSON_STATIC_LIBRARIES} mongo::detail::c_dependencies) if (NOT WIN32 AND ENABLE_PIC) target_compile_options (mongoc_static PUBLIC -fPIC) message (STATUS "Adding -fPIC to compilation of mongoc_static components") endif () + if(ENABLE_SRV AND RESOLVE_LIB_NAME) + # The static library needs to link to the resolver in pkg-config: + set_property(TARGET mongoc_static APPEND PROPERTY pkg_config_LIBS "-l${RESOLVE_LIB_NAME}") + endif() target_include_directories (mongoc_static PRIVATE ${ZLIB_INCLUDE_DIRS}) target_include_directories (mongoc_static PRIVATE ${LIBMONGOCRYPT_INCLUDE_DIRECTORIES}) if (MONGOC_ENABLE_MONGODB_AWS_AUTH) @@ -810,8 +836,11 @@ if (MONGOC_ENABLE_STATIC_BUILD) $ $ ) - set_target_properties (mongoc_static PROPERTIES VERSION 0.0.0) - set_target_properties (mongoc_static PROPERTIES OUTPUT_NAME "${MONGOC_OUTPUT_BASENAME}-static-${MONGOC_API_VERSION}") + set_target_properties (mongoc_static PROPERTIES + VERSION 0.0.0 + OUTPUT_NAME "${MONGOC_OUTPUT_BASENAME}-static-${MONGOC_API_VERSION}" + pkg_config_REQUIRES "libbson-static-1.0" + ) endif () if (ENABLE_APPLE_FRAMEWORK) @@ -1176,44 +1205,109 @@ set (VERSION "${MONGOC_VERSION}") set (prefix "${CMAKE_INSTALL_PREFIX}") set (libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}") -foreach ( - FLAG - ${SASL_LIBRARIES} ${SSL_LIBRARIES} ${SHM_LIBRARIES} ${RESOLV_LIBRARIES} - ${THREAD_LIB} ${ZLIB_LIBRARIES} ${SNAPPY_LIBRARIES} ${MONGOC_ZSTD_LIBRARIES} ${ICU_LIBRARIES} +# Collect link items for the static library to be inserted into the pkg-config +if(TARGET mongoc_static) + set(link_options + ${SASL_LIBRARIES} ${SSL_LIBRARIES} ${SHM_LIBRARIES} ${THREAD_LIB} ${ZLIB_LIBRARIES} + ${SNAPPY_LIBRARIES} ${MONGOC_ZSTD_LIBRARIES} ${ICU_LIBRARIES} ${LIBMONGOCRYPT_LIBRARY}) + # Replace all absolute paths with search-dir link-file options: + list(TRANSFORM link_options + REPLACE "^(.+)/lib([^/\\.]+)\\..+$" + "-L\\1;-l\\2" + REGEX "^/") + # Prepend "-l" to all bare names: + list(TRANSFORM link_options PREPEND "-l" REGEX "^[^-]") + list(REMOVE_DUPLICATES link_options) + message(DEBUG "Computed static library link options: ${link_options}") + set_property(TARGET mongoc_static APPEND PROPERTY pkg_config_LIBS ${link_options}) +endif() - if (IS_ABSOLUTE "${FLAG}") - get_filename_component (FLAG_DIR "${FLAG}" DIRECTORY) - get_filename_component (FLAG_FILE "${FLAG}" NAME_WE) - STRING (REGEX REPLACE "^lib" "" FLAG_FILE "${FLAG_FILE}") - set (MONGOC_LIBRARIES "${MONGOC_LIBRARIES} -L${FLAG_DIR} -l${FLAG_FILE}") - elseif (FLAG MATCHES "^-.*") - # Flag starts with dash, add it as-is. - set (MONGOC_LIBRARIES "${MONGOC_LIBRARIES} ${FLAG}") - else () - # Flag doesn't start with dash, add it with a dash. - set (MONGOC_LIBRARIES "${MONGOC_LIBRARIES} -l${FLAG}") - endif () -endforeach () +# More pkg-config properties: +set_target_properties(${TARGETS_TO_INSTALL} PROPERTIES + pkg_config_NAME "libmongoc" + pkg_config_DESCRIPTION "The libmongoc MongoDB client library." + pkg_config_VERSION "${VERSION}") +# Relative include-path will be given the install prefix: +set_property(TARGET ${TARGETS_TO_INSTALL} APPEND PROPERTY pkg_config_INCLUDE_DIRECTORIES "${MONGOC_HEADER_INSTALL_DIR}") + +#[[ +Utility for configuring a file and then evaluating generator expressions on it. +The content of the file has a tiny templating DSL for writing generator +expressions. Expansion takes place as follows: + 1. Delete any content starting at hash-tilde "#~" until the next newline + 2. Search for any lines of the form "%define foo bar". For each instance, + replace "foo" with "bar" in the remainder of the file. The "%define foo bar" + line is deleted. + 3. If a tilde "~" appears adjacent to any of "$,<:>@", delete the tilde and + all adjacent whitespace. + 4. Run string(CONFIGURE ... @ONLY) on the result to replace variable + references. Special replacements @space@, @newline@, and @empty@ are also + available for adjusting whitespace after ~ trimming. + 5. Run file(GENERATE). +]] +function(_mongoc_configure_and_generate_file input output) + set(CMAKE_MESSAGE_CONTEXT _mongoc_configure_and_generate_file) + # If given a relative input path, make it relative to the current source dir: + get_filename_component(abs_in "${input}" ABSOLUTE) + file(READ "${input}" content) + # Some convenience values for @expansion@ in the file: + set(space " ") + set(newline "\n") + set(empty "") + # Delete "#~" comments: + string(REGEX REPLACE "#~[^\n]*" "" content "${content}") + # Replace our simple "%define " macros: + while(content MATCHES "(.*)\n *%define +([a-zA-Z_\\$<>:-]+) *([^\n]*)\n(.*)") + set(before "${CMAKE_MATCH_1}") + set(after "${CMAKE_MATCH_4}") + set(def "${CMAKE_MATCH_2}") + set(val "${CMAKE_MATCH_3}") + message(TRACE "Replace “${def}” with “${val}”") + # Only perform the replacement on the remainder of the file following that + # line: + string(REPLACE "${def}" "${val}" after "${after}") + # Splice the results: + set(content "${before}\n${after}") + endwhile() + # Whitespace trimming. right-trim when tilde is to the right of special chars: + string(REGEX REPLACE "([,><:@])~[ \n\t]*" "\\1" content "${content}") + # Same thing, but on the left-hand side: + string(REGEX REPLACE "[ \n\t]*~([^ \t\n])" "\\1" content "${content}") + # Replace @variables@: + string(CONFIGURE "${content}" content @ONLY) + # If given a relative output path, make it relative to the current binary dir: + if(NOT IS_ABSOLUTE "${output}") + get_filename_component(output "${CMAKE_CURRENT_BINARY_DIR}/${output}" ABSOLUTE) + endif() + message(DEBUG "Configure+generate file [${input}] -> [${output}]") + message(TRACE "Content:\n${content}") + # Generate it: + file(GENERATE OUTPUT "${output}" CONTENT "${content}" ${ARGN}) +endfunction() + +# Generate pkg-config for mongoc_shared +if(TARGET mongoc_shared) + set(GENERATE_TARGET mongoc_shared) + _mongoc_configure_and_generate_file( + src/libmongoc.pc.in + src/libmongoc-1.0.pc) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-1.0.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +endif() + +# Now one for mongoc_static: +if(TARGET mongoc_static) + set(GENERATE_TARGET mongoc_static) + _mongoc_configure_and_generate_file( + src/libmongoc.pc.in + src/libmongoc-static-1.0.pc) + if(MONGOC_ENABLE_STATIC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-static-1.0.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + endif() +endif() -configure_file ( - ${CMAKE_CURRENT_SOURCE_DIR}/src/libmongoc-1.0.pc.in - ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-1.0.pc -@ONLY) -install ( - FILES ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-1.0.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig -) -if (MONGOC_ENABLE_STATIC_INSTALL) - configure_file ( - ${CMAKE_CURRENT_SOURCE_DIR}/src/libmongoc-static-1.0.pc.in - ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-static-1.0.pc - @ONLY) - install ( - FILES ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-static-1.0.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig - ) -endif () # Deprecated alias for libmongoc-1.0.pc, see CDRIVER-2086. if (MONGOC_ENABLE_SSL) configure_file ( diff --git a/src/libmongoc/build/cmake/libmongoc-1.0-config.cmake.in b/src/libmongoc/build/cmake/libmongoc-1.0-config.cmake.in index feeca0259e9..27a0af45f4e 100644 --- a/src/libmongoc/build/cmake/libmongoc-1.0-config.cmake.in +++ b/src/libmongoc/build/cmake/libmongoc-1.0-config.cmake.in @@ -38,7 +38,7 @@ set (MONGOC_LIBRARIES ${MONGOC_LIBRARY} ${BSON_LIBRARIES}) # like "-framework CoreFoundation;-framework Security". set (IS_FRAMEWORK_VAR 0) foreach (LIB - @SASL_LIBRARIES@ @SSL_LIBRARIES@ @SHM_LIBRARIES@ @RESOLV_LIBRARIES@ + @SASL_LIBRARIES@ @SSL_LIBRARIES@ @SHM_LIBRARIES@ @RESOLVE_LIB_NAME@ @SNAPPY_LIBRARIES@ @ICU_LIBRARIES@ @MONGOC_ZSTD_LIBRARIES@ @LIBMONGOCRYPT_LIBRARY@ ) if (LIB STREQUAL "-framework") diff --git a/src/libmongoc/build/cmake/libmongoc-static-1.0-config.cmake.in b/src/libmongoc/build/cmake/libmongoc-static-1.0-config.cmake.in index 6f05b0c18c4..21ea717472c 100644 --- a/src/libmongoc/build/cmake/libmongoc-static-1.0-config.cmake.in +++ b/src/libmongoc/build/cmake/libmongoc-static-1.0-config.cmake.in @@ -42,8 +42,8 @@ set (MONGOC_STATIC_LIBRARIES ${MONGOC_STATIC_LIBRARY} ${ZLIB_STATIC_LIBRARY} ${B # "-framework CoreFoundation -framework Security". Split into a CMake array # like "-framework CoreFoundation;-framework Security". set (IS_FRAMEWORK_VAR 0) -foreach (LIB @SASL_LIBRARIES@ @SSL_LIBRARIES@ @SHM_LIBRARIES@ @ZLIB_LIBRARIES@ - @SNAPPY_LIBRARIES@ @RESOLV_LIBRARIES@ @ICU_LIBRARIES@ @MONGOC_ZSTD_LIBRARIES@ @LIBMONGOCRYPT_LIBRARY@ +foreach (LIB @SASL_LIBRARIES@ @SSL_LIBRARIES@ @SHM_LIBRARIES@ @ZLIB_LIBRARIES@ @RESOLVE_LIB_NAME@ + @SNAPPY_LIBRARIES@ @ICU_LIBRARIES@ @MONGOC_ZSTD_LIBRARIES@ @LIBMONGOCRYPT_LIBRARY@ ) if (LIB STREQUAL "-framework") set (IS_FRAMEWORK_VAR 1) diff --git a/src/libmongoc/examples/parse_handshake_cfg.py b/src/libmongoc/examples/parse_handshake_cfg.py index 4d70b039db0..e1da7d70ca4 100644 --- a/src/libmongoc/examples/parse_handshake_cfg.py +++ b/src/libmongoc/examples/parse_handshake_cfg.py @@ -37,7 +37,8 @@ "MONGOC_MD_FLAG_TRACE", "MONGOC_MD_FLAG_ENABLE_ICU", "MONGOC_MD_FLAG_ENABLE_CLIENT_SIDE_ENCRYPTION", - "MONGOC_MD_FLAG_ENABLE_MONGODB_AWS_AUTH" + "MONGOC_MD_FLAG_ENABLE_MONGODB_AWS_AUTH", + "MONGOC_MD_FLAG_ENABLE_SRV", ] def main(): diff --git a/src/libmongoc/src/CMakeLists.txt b/src/libmongoc/src/CMakeLists.txt index 9fcc323a444..fabfeac41a4 100644 --- a/src/libmongoc/src/CMakeLists.txt +++ b/src/libmongoc/src/CMakeLists.txt @@ -2,9 +2,8 @@ add_subdirectory (mongoc) set_local_dist (src_libmongoc_src_DIST_local CMakeLists.txt - libmongoc-1.0.pc.in + libmongoc.pc.in libmongoc-ssl-1.0.pc.in - libmongoc-static-1.0.pc.in mongoc-config.cmake ) diff --git a/src/libmongoc/src/libmongoc-1.0.pc.in b/src/libmongoc/src/libmongoc-1.0.pc.in deleted file mode 100644 index 1b489d86ce7..00000000000 --- a/src/libmongoc/src/libmongoc-1.0.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=${prefix} -libdir=@libdir@ -includedir=${exec_prefix}/include - -Name: libmongoc -Description: The libmongoc MongoDB client library. -Version: @VERSION@ -Requires: libbson-1.0 -Libs: -L${libdir} -lmongoc-1.0 -Cflags: -I${includedir}/libmongoc-@MONGOC_API_VERSION@ diff --git a/src/libmongoc/src/libmongoc-static-1.0.pc.in b/src/libmongoc/src/libmongoc-static-1.0.pc.in deleted file mode 100644 index d59ee64478e..00000000000 --- a/src/libmongoc/src/libmongoc-static-1.0.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=${prefix} -libdir=@libdir@ -includedir=${exec_prefix}/include - -Name: libmongoc -Description: The libmongoc MongoDB client library. -Version: @VERSION@ -Requires: libbson-static-1.0 -Libs: -L${libdir} -lmongoc-static-1.0 @MONGOC_LIBRARIES@ -Cflags: -I${includedir}/libmongoc-@MONGOC_API_VERSION@ -DMONGOC_STATIC diff --git a/src/libmongoc/src/libmongoc.pc.in b/src/libmongoc/src/libmongoc.pc.in new file mode 100644 index 00000000000..d4db5b61b76 --- /dev/null +++ b/src/libmongoc/src/libmongoc.pc.in @@ -0,0 +1,62 @@ +prefix=@prefix@ +exec_prefix=${prefix} +libdir=@libdir@ + +Name: $ +Description: $ +Version: $ + +%define $ +#~ Conditional: Only expand a first "\nRequires: " if Requires is non-empty: +%define has_requires $<> +~$ +#~ The rest: +~$ + +~@newline@~ + +#~ Link options: +Libs: -L${libdir} -l$ ~@space@~ + #~ Join each "Libs" item with spaces. This could be more robust, but it suits our purposes: + %define libs_prop $ + #~ Remove duplicate items, which will usually be redundant link paths: + %define libs $ + $~ + + #~ Add link options. Don't remove duplicates, because they may be important + %define link_opts $ + $<$<>:@space@$> + +~@newline@~ + +#~ Compile-flags: +%define cflags_prop $ +Cflags: $ ~@space@~ + + #~ Options: + %define opts_prop $ + %define opts $ + $~ + + #~ Preprocessor definitions: + %define defs_prop $ + %define defs $ + $<$<>: -D>~ + $~ + + #~ Inclusions: + %define inc_prop $ + %define incs $ + #~ Absolute path includes are kept absolute: + %define abs_includes $ + $<$<>: -I>~ + $~ + #~ Relative includes are made relative to ${prefix} + %define relative_includes $ + $<$<>: -I${prefix}/>~ + $ diff --git a/src/libmongoc/src/mongoc/mongoc-client.c b/src/libmongoc/src/mongoc/mongoc-client.c index 35f972e3d40..d032ddcbca9 100644 --- a/src/libmongoc/src/mongoc/mongoc-client.c +++ b/src/libmongoc/src/mongoc/mongoc-client.c @@ -101,7 +101,11 @@ _mongoc_client_killcursors_command (mongoc_cluster_t *cluster, } while (0) -#ifdef MONGOC_HAVE_DNSAPI +#if MONGOC_ENABLE_SRV == 0 // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ENABLE_SRV disabled + +/* SRV support is disabled */ + +#elif defined(MONGOC_HAVE_DNSAPI) // ↑↑↑ ENABLE_SRV disabled / Win32 Dnsapi ↓↓↓↓ typedef bool (*mongoc_rr_callback_t) (const char *hostname, PDNS_RECORD pdns, @@ -291,7 +295,9 @@ _mongoc_get_rr_dnsapi (const char *hostname, RETURN (dns_success && callback_success); } -#elif (defined(MONGOC_HAVE_RES_NSEARCH) || defined(MONGOC_HAVE_RES_SEARCH)) +#elif ( \ + defined(MONGOC_HAVE_RES_NSEARCH) || \ + defined(MONGOC_HAVE_RES_SEARCH)) // ↑↑↑↑↑↑↑ Win32 Dnsapi / resolv ↓↓↓↓↓↓↓↓ typedef bool (*mongoc_rr_callback_t) (const char *hostname, ns_msg *ns_answer, @@ -569,7 +575,7 @@ _mongoc_get_rr_search (const char *hostname, #endif RETURN (dns_success && callback_success); } -#endif +#endif // ↑↑↑↑↑↑↑↑↑↑↑↑↑ resolv /* *-------------------------------------------------------------------------- @@ -605,17 +611,20 @@ _mongoc_client_get_rr (const char *hostname, { BSON_ASSERT (rr_data); -#ifdef MONGOC_HAVE_DNSAPI - return _mongoc_get_rr_dnsapi (hostname, rr_type, rr_data, error); -#elif (defined(MONGOC_HAVE_RES_NSEARCH) || defined(MONGOC_HAVE_RES_SEARCH)) - return _mongoc_get_rr_search ( - hostname, rr_type, rr_data, initial_buffer_size, error); -#else +#if MONGOC_ENABLE_SRV == 0 + // Disabled bson_set_error (error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "libresolv unavailable, cannot use mongodb+srv URI"); return false; +#elif defined(MONGOC_HAVE_DNSAPI) + return _mongoc_get_rr_dnsapi (hostname, rr_type, rr_data, error); +#elif (defined(MONGOC_HAVE_RES_NSEARCH) || defined(MONGOC_HAVE_RES_SEARCH)) + return _mongoc_get_rr_search ( + hostname, rr_type, rr_data, initial_buffer_size, error); +#else +#error No SRV library is available, but ENABLE_SRV is true! #endif } diff --git a/src/libmongoc/src/mongoc/mongoc-config.h.in b/src/libmongoc/src/mongoc/mongoc-config.h.in index 29882211c96..ac4413389f8 100644 --- a/src/libmongoc/src/mongoc/mongoc-config.h.in +++ b/src/libmongoc/src/mongoc/mongoc-config.h.in @@ -226,6 +226,10 @@ # undef MONGOC_HAVE_SOCKLEN #endif +/** + * @brief Defined to 0/1 for whether we were configured with ENABLE_SRV + */ +#define MONGOC_ENABLE_SRV @MONGOC_ENABLE_SRV@ /* * MONGOC_HAVE_DNSAPI is set from configure to determine if we should use the @@ -368,16 +372,6 @@ */ #define MONGOC_TRACE @MONGOC_TRACE@ -enum { - /** - * @brief Compile-time constant determining whether the mongoc library was - * compiled with tracing enabled. - * - * Can be controlled with the 'ENABLE_TRACING" configure-time boolean option - */ - MONGOC_TRACE_ENABLED = MONGOC_TRACE -}; - /* * Set if we have ICU support. */ @@ -387,7 +381,6 @@ enum { # undef MONGOC_ENABLE_ICU #endif - /* * Set if we have Client Side Encryption support. */ @@ -418,6 +411,23 @@ enum { # undef MONGOC_ENABLE_MONGODB_AWS_AUTH #endif +enum { + /** + * @brief Compile-time constant determining whether the mongoc library was + * compiled with tracing enabled. + * + * Can be controlled with the “ENABLE_TRACING” configure-time boolean option + */ + MONGOC_TRACE_ENABLED = MONGOC_TRACE, + /** + * @brief Compile-time constant indicating whether the mongoc library was + * compiled with SRV server discovery support. + * + * Can be controled with the “ENABLE_SRV” configure-time boolean option. + */ + MONGOC_SRV_ENABLED = MONGOC_ENABLE_SRV, +}; + /* clang-format on */ #endif /* MONGOC_CONFIG_H */ diff --git a/src/libmongoc/src/mongoc/mongoc-handshake-private.h b/src/libmongoc/src/mongoc/mongoc-handshake-private.h index 8da55ebc360..70a141d607b 100644 --- a/src/libmongoc/src/mongoc/mongoc-handshake-private.h +++ b/src/libmongoc/src/mongoc/mongoc-handshake-private.h @@ -81,6 +81,7 @@ typedef enum { MONGOC_MD_FLAG_ENABLE_ICU, MONGOC_MD_FLAG_ENABLE_CLIENT_SIDE_ENCRYPTION, MONGOC_MD_FLAG_ENABLE_MONGODB_AWS_AUTH, + MONGOC_MD_FLAG_ENABLE_SRV, /* Add additional config flags here, above LAST_MONGOC_MD_FLAG. */ LAST_MONGOC_MD_FLAG } mongoc_handshake_config_flag_bit_t; diff --git a/src/libmongoc/src/mongoc/mongoc-handshake.c b/src/libmongoc/src/mongoc/mongoc-handshake.c index dd2f2dd51f0..80bff6ad091 100644 --- a/src/libmongoc/src/mongoc/mongoc-handshake.c +++ b/src/libmongoc/src/mongoc/mongoc-handshake.c @@ -196,6 +196,10 @@ _mongoc_handshake_get_config_hex_string (void) _set_bit (bf, byte_count, MONGOC_MD_FLAG_ENABLE_MONGODB_AWS_AUTH); #endif + if (MONGOC_SRV_ENABLED) { + _set_bit (bf, byte_count, MONGOC_MD_FLAG_ENABLE_SRV); + } + bson_string_t *const str = bson_string_new ("0x"); for (uint32_t i = 0u; i < byte_count; i++) { bson_string_append_printf (str, "%02x", bf[i]); diff --git a/src/libmongoc/tests/test-mongoc-handshake.c b/src/libmongoc/tests/test-mongoc-handshake.c index 6fef3e48cb2..2b090be0e1b 100644 --- a/src/libmongoc/tests/test-mongoc-handshake.c +++ b/src/libmongoc/tests/test-mongoc-handshake.c @@ -871,6 +871,9 @@ test_handshake_platform_config (void) BSON_ASSERT (_get_bit (config_str, MONGOC_MD_FLAG_HAVE_SCHED_GETCPU)); #endif + BSON_ASSERT (_get_bit (config_str, MONGOC_MD_FLAG_ENABLE_SRV) == + MONGOC_SRV_ENABLED); + #ifdef MONGOC_ENABLE_SHM_COUNTERS BSON_ASSERT (_get_bit (config_str, MONGOC_MD_FLAG_ENABLE_SHM_COUNTERS)); #endif