|
cmake_minimum_required (VERSION 3.1)
|
|
|
|
# Used in MaintainerFlags.cmake to silence errors while testing configs.
|
|
set (MESSAGES_ENABLED 1)
|
|
|
|
function (message)
|
|
list (GET ARGV 0 MessageType)
|
|
if (MESSAGES_ENABLED)
|
|
list (REMOVE_AT ARGV 0)
|
|
_message (${MessageType} "${ARGV}")
|
|
endif ()
|
|
endfunction ()
|
|
|
|
set (ENABLE_SSL AUTO CACHE STRING
|
|
"Enable TLS connections and SCRAM-SHA-1 authentication. Options are
|
|
\"DARWIN\" to use Apple's Secure Transport, \"WINDOWS\" to use Windows
|
|
Secure Channel, \"OPENSSL\", \"LIBRESSL\", \"AUTO\",\ or \"OFF\". These options are
|
|
case-sensitive. The default is \"AUTO\". Note\ that SCRAM-SHA-1 is
|
|
required for authenticating to MongoDB 3.0 and later.")
|
|
|
|
set (ENABLE_SASL AUTO CACHE STRING
|
|
"Enable SASL authentication (Kerberos). Options are \"CYRUS\" to use Cyrus
|
|
SASL, \"SSPI\" to use Windows Native SSPI, \"GSSAPI\" to use macOS Native GSS,
|
|
\"AUTO\",\ or \"OFF\". These options are case-sensitive.")
|
|
|
|
set (ENABLE_STATIC AUTO CACHE STRING "Build static libmongoc. Set to ON/AUTO/OFF, default AUTO.")
|
|
option (ENABLE_TESTS "Build MongoDB C Driver tests." ON)
|
|
option (ENABLE_EXAMPLES "Build MongoDB C Driver examples." ON)
|
|
set (ENABLE_SRV AUTO CACHE STRING "Support mongodb+srv URIs. Set to ON/AUTO/OFF, default AUTO.")
|
|
option (ENABLE_MAINTAINER_FLAGS "Use strict compiler checks" OFF)
|
|
option (ENABLE_AUTOMATIC_INIT_AND_CLEANUP "Enable automatic init and cleanup (GCC only)" ON)
|
|
option (ENABLE_CRYPTO_SYSTEM_PROFILE "Use system crypto profile (OpenSSL only)" OFF)
|
|
option (ENABLE_TRACING "Turn on verbose debug output" OFF)
|
|
option (ENABLE_COVERAGE "Turn on compile options for lcov" OFF)
|
|
set (ENABLE_SHM_COUNTERS AUTO CACHE STRING "Enable memory performance counters that use shared memory on Linux. Set to ON/AUTO/OFF, default AUTO.")
|
|
set (ENABLE_MONGOC ON CACHE STRING "Whether to build libmongoc. Set to ON/OFF, default ON.")
|
|
set (ENABLE_BSON AUTO CACHE STRING "Whether to build libbson. Set to ON/AUTO/SYSTEM, default AUTO.")
|
|
set (ENABLE_SNAPPY AUTO CACHE STRING "Enable snappy support. Set to ON/AUTO/OFF, default AUTO.")
|
|
set (ENABLE_ZLIB AUTO CACHE STRING "Enable zlib support")
|
|
option (ENABLE_MAN_PAGES "Build MongoDB C Driver manual pages." OFF)
|
|
option (ENABLE_HTML_DOCS "Build MongoDB C Driver HTML documentation." OFF)
|
|
option (ENABLE_EXTRA_ALIGNMENT
|
|
"Turn on extra alignment of libbson types. Set to ON/OFF, default ON.\
|
|
Required for the 1.0 ABI but better disabled."
|
|
ON
|
|
)
|
|
option (ENABLE_RDTSCP
|
|
"Fast performance counters on Intel using the RDTSCP instruction"
|
|
OFF
|
|
)
|
|
option (ENABLE_APPLE_FRAMEWORK "Build libraries as frameworks on darwin platforms" OFF)
|
|
set (ENABLE_ICU AUTO CACHE STRING "Enable ICU support, necessary to use non-ASCII usernames or passwords, default AUTO.")
|
|
option (ENABLE_UNINSTALL "Enable creation of uninstall script and associate uninstall build target." ON)
|
|
|
|
project (mongo-c-driver C)
|
|
|
|
if (NOT CMAKE_BUILD_TYPE)
|
|
set (CMAKE_BUILD_TYPE "RelWithDebInfo")
|
|
message (
|
|
STATUS "No CMAKE_BUILD_TYPE selected, defaulting to ${CMAKE_BUILD_TYPE}"
|
|
)
|
|
endif ()
|
|
|
|
set (CMAKE_MODULE_PATH
|
|
${CMAKE_MODULE_PATH}
|
|
${PROJECT_SOURCE_DIR}/build/cmake
|
|
${PROJECT_SOURCE_DIR}/build/cmake/make_dist
|
|
)
|
|
|
|
include (InstallRequiredSystemLibraries)
|
|
include (GNUInstallDirs)
|
|
|
|
# Set MONGOC_MAJOR_VERSION, MONGOC_MINOR_VERSION, etc.
|
|
include (LoadVersion)
|
|
LoadVersion (${PROJECT_SOURCE_DIR}/VERSION_CURRENT MONGOC)
|
|
LoadVersion (${PROJECT_SOURCE_DIR}/VERSION_RELEASED MONGOC_RELEASED)
|
|
|
|
include (MaintainerFlags)
|
|
|
|
if ( (ENABLE_BUILD_DEPENDECIES STREQUAL OFF) AND (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) )
|
|
set (ENABLE_BUILD_DEPENDECIES ON)
|
|
endif ()
|
|
|
|
if (ENABLE_EXTRA_ALIGNMENT STREQUAL ON)
|
|
set (BSON_EXTRA_ALIGN 1)
|
|
else ()
|
|
set (BSON_EXTRA_ALIGN 0)
|
|
endif ()
|
|
|
|
if (ENABLE_RDTSCP)
|
|
set (MONGOC_ENABLE_RDTSCP 1)
|
|
else ()
|
|
set (MONGOC_ENABLE_RDTSCP 0)
|
|
endif ()
|
|
|
|
if (NOT ENABLE_MONGOC MATCHES "ON|OFF")
|
|
message (FATAL_ERROR "ENABLE_MONGOC option must be ON or OFF")
|
|
endif ()
|
|
|
|
if (NOT ENABLE_BSON MATCHES "ON|AUTO|SYSTEM")
|
|
message (FATAL_ERROR "ENABLE_BSON option must be ON, AUTO, or SYSTEM")
|
|
endif ()
|
|
|
|
if (ENABLE_BSON STREQUAL SYSTEM)
|
|
# The input variable BSON_ROOT_DIR is respected for backwards compatibility,
|
|
# but you should use the standard CMAKE_PREFIX_PATH instead.
|
|
message (STATUS "Searching for libbson CMake packages")
|
|
find_package (libbson-1.0
|
|
"${MONGOC_MAJOR_VERSION}.${MONGOC_MINOR_VERSION}.${MONGOC_MICRO_VERSION}"
|
|
HINTS
|
|
${BSON_ROOT_DIR})
|
|
|
|
if (ENABLE_BSON STREQUAL SYSTEM AND NOT BSON_LIBRARIES)
|
|
message (FATAL_ERROR "System libbson not found")
|
|
endif ()
|
|
|
|
if (BSON_LIBRARIES)
|
|
message ("-- libbson found version \"${BSON_VERSION}\"")
|
|
message ("-- libbson include path \"${BSON_INCLUDE_DIRS}\"")
|
|
message ("-- libbson libraries \"${BSON_LIBRARIES}\"")
|
|
message ("-- disabling test-libmongoc since using system libbson")
|
|
SET (ENABLE_TESTS OFF)
|
|
|
|
if (ENABLE_STATIC MATCHES "ON|AUTO")
|
|
find_package (libbson-static-1.0
|
|
"${MONGOC_MAJOR_VERSION}.${MONGOC_MINOR_VERSION}.${MONGOC_MICRO_VERSION}"
|
|
HINTS
|
|
${BSON_ROOT_DIR})
|
|
|
|
if (ENABLE_STATIC STREQUAL ON AND NOT BSON_STATIC_LIBRARY)
|
|
message (FATAL_ERROR "Static libbson not found. Pass -DENABLE_STATIC=OFF")
|
|
endif ()
|
|
|
|
if (BSON_STATIC_LIBRARY)
|
|
set (MONGOC_ENABLE_STATIC ON)
|
|
endif ()
|
|
|
|
message ("-- libbson-static found version \"${BSON_STATIC_VERSION}\"")
|
|
message ("-- libbson-static include path \"${BSON_STATIC_INCLUDE_DIRS}\"")
|
|
message ("-- libbson-static libraries \"${BSON_STATIC_LIBRARIES}\"")
|
|
endif ()
|
|
endif ()
|
|
endif ()
|
|
|
|
unset (dist_generated CACHE)
|
|
unset (dist_generated_depends CACHE)
|
|
|
|
set (BUILD_SOURCE_DIR ${CMAKE_BINARY_DIR})
|
|
|
|
include (MakeDistFiles)
|
|
|
|
# Ensure the default behavior: don't ignore RPATH settings.
|
|
set (CMAKE_SKIP_BUILD_RPATH OFF)
|
|
|
|
# Ensure the default behavior: don't use the final install destination as the
|
|
# temporary RPATH for executables (ensure we can run tests and programs from
|
|
# the build directory).
|
|
set (CMAKE_BUILD_WITH_INSTALL_RPATH OFF)
|
|
|
|
# Include any custom library paths in the final RPATH.
|
|
set (CMAKE_INSTALL_RPATH_USE_LINK_PATH ON)
|
|
|
|
# Install libs with names like @rpath/libmongoc-1.0.0.dylib, not bare names.
|
|
set (CMAKE_MACOSX_RPATH ON)
|
|
|
|
# https://cmake.org/cmake/help/v3.11/policy/CMP0042.html
|
|
# Enable a CMake 3.0+ policy that sets CMAKE_MACOSX_RPATH by default, and
|
|
# silence a CMake 3.11 warning that the old behavior is deprecated.
|
|
cmake_policy (SET CMP0042 NEW)
|
|
|
|
if (NOT BSON_LIBRARIES)
|
|
message (" -- Using bundled libbson")
|
|
if (ENABLE_STATIC MATCHES "ON|AUTO")
|
|
set (MONGOC_ENABLE_STATIC ON)
|
|
endif ()
|
|
add_subdirectory (src/libbson)
|
|
# Defined in src/libbson/CMakeLists.txt
|
|
set (BSON_STATIC_LIBRARIES bson_static)
|
|
set (BSON_LIBRARIES bson_shared)
|
|
set (BSON_STATIC_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src/libbson/src" "${PROJECT_BINARY_DIR}/src/libbson/src")
|
|
set (BSON_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src/libbson/src" "${PROJECT_BINARY_DIR}/src/libbson/src")
|
|
set (BSON_STATIC_DEFINITIONS "BSON_STATIC")
|
|
endif ()
|
|
|
|
if (MSVC)
|
|
add_definitions (-D_CRT_SECURE_NO_WARNINGS)
|
|
endif ()
|
|
|
|
add_definitions (-D_GNU_SOURCE)
|
|
add_definitions (-D_BSD_SOURCE)
|
|
add_definitions (-D_DEFAULT_SOURCE)
|
|
|
|
if (ENABLE_MONGOC)
|
|
|
|
if (ENABLE_TESTS AND NOT MONGOC_ENABLE_STATIC)
|
|
message (FATAL_ERROR "ENABLE_TESTS requires ENABLE_STATIC")
|
|
endif ()
|
|
|
|
if (NOT ENABLE_SSL MATCHES "DARWIN|WINDOWS|OPENSSL|LIBRESSL|AUTO|OFF")
|
|
message (FATAL_ERROR
|
|
"ENABLE_SSL option must be DARWIN, WINDOWS, OPENSSL, LIBRESSL, AUTO, or OFF")
|
|
endif ()
|
|
|
|
set (SOURCE_DIR "${PROJECT_SOURCE_DIR}/")
|
|
|
|
set (ZLIB_SOURCES
|
|
${SOURCE_DIR}/src/zlib-1.2.11/adler32.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/crc32.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/deflate.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/infback.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/inffast.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/inflate.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/inftrees.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/trees.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/zutil.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/compress.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/uncompr.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/gzclose.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/gzlib.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/gzread.c
|
|
${SOURCE_DIR}/src/zlib-1.2.11/gzwrite.c
|
|
)
|
|
|
|
set (MONGOC_ENABLE_ICU 0)
|
|
|
|
set (CPACK_RESOURCE_FILE_LICENSE "${SOURCE_DIR}/COPYING")
|
|
|
|
include (CPack)
|
|
|
|
# Ensure the default behavior: don't ignore RPATH settings.
|
|
set (CMAKE_SKIP_BUILD_RPATH OFF)
|
|
|
|
if (APPLE)
|
|
# Until CDRIVER-520.
|
|
add_definitions (-Wno-deprecated-declarations)
|
|
endif ()
|
|
|
|
add_subdirectory (src/libmongoc)
|
|
|
|
if (ENABLE_MAN_PAGES STREQUAL ON OR ENABLE_HTML_DOCS STREQUAL ON)
|
|
find_package (Sphinx REQUIRED)
|
|
add_custom_target (doc
|
|
ALL
|
|
DEPENDS
|
|
$<$<STREQUAL:"${ENABLE_BSON}","ON">:bson-doc>
|
|
$<$<STREQUAL:"${ENABLE_MONGOC}","ON">:mongoc-doc>
|
|
)
|
|
endif ()
|
|
|
|
# Implement 'dist' and 'distcheck' targets
|
|
#
|
|
# CMake does not implement anything like 'dist' and 'distcheck' from autotools.
|
|
# This implementation is based on the one in GnuCash.
|
|
|
|
add_subdirectory (build)
|
|
# sub-directory 'doc' was already included above
|
|
add_subdirectory (orchestration_configs)
|
|
add_subdirectory (src)
|
|
# 'src/libbson' was already included, so 'src' will not include it directly
|
|
# 'src/libmongoc' was already included, so 'src' will not include it directly
|
|
|
|
set (PACKAGE_PREFIX "mongo-c-driver-${MONGOC_VERSION}")
|
|
set (DIST_FILE "${PACKAGE_PREFIX}.tar.gz")
|
|
|
|
set (top_DIST_local
|
|
CMakeLists.txt
|
|
CONTRIBUTING.md
|
|
COPYING
|
|
NEWS
|
|
README.rst
|
|
THIRD_PARTY_NOTICES
|
|
VERSION_CURRENT
|
|
VERSION_RELEASED
|
|
# This sub-directory is added later, so manually include here
|
|
generate_uninstall/CMakeLists.txt
|
|
)
|
|
|
|
set_local_dist (top_DIST ${top_DIST_local})
|
|
|
|
set (ALL_DIST
|
|
${top_DIST}
|
|
${build_DIST}
|
|
${orchestration_configs_DIST}
|
|
${src_DIST}
|
|
${src_libbson_DIST}
|
|
${src_libmongoc_DIST}
|
|
)
|
|
|
|
# Write a dist manifest
|
|
string (REPLACE ";" "\n" ALL_DIST_LINES "${ALL_DIST}")
|
|
file (WRITE ${CMAKE_BINARY_DIR}/dist_manifest.txt ${ALL_DIST_LINES})
|
|
|
|
# This is the command that produces the distribution tarball
|
|
add_custom_command (OUTPUT ${DIST_FILE}
|
|
COMMAND ${CMAKE_COMMAND}
|
|
-D CMAKE_MODULE_PATH=${PROJECT_SOURCE_DIR}/build/cmake/make_dist
|
|
-D PACKAGE_PREFIX=${PACKAGE_PREFIX}
|
|
-D MONGOC_SOURCE_DIR=${CMAKE_SOURCE_DIR}
|
|
-D BUILD_SOURCE_DIR=${BUILD_SOURCE_DIR}
|
|
-D SHELL=${SHELL}
|
|
"-Ddist_generated=\"${dist_generated}\""
|
|
-P ${PROJECT_SOURCE_DIR}/build/cmake/make_dist/MakeDist.cmake
|
|
|
|
DEPENDS
|
|
${ALL_DIST} ${dist_generated_depends}
|
|
)
|
|
|
|
if (ENABLE_BSON MATCHES "ON|AUTO" AND ENABLE_MAN_PAGES STREQUAL ON AND ENABLE_HTML_DOCS STREQUAL ON)
|
|
# Since our 'dist' implementation does not add top-level targets for every
|
|
# file to be included, we declare a dependency on the 'mongo-doc' target so
|
|
# that documentation is built before the distribution tarball is generated.
|
|
add_custom_target (dist DEPENDS doc ${DIST_FILE})
|
|
|
|
add_custom_target (distcheck DEPENDS dist
|
|
COMMAND ${CMAKE_COMMAND}
|
|
-D CMAKE_MODULE_PATH=${PROJECT_SOURCE_DIR}/build/cmake/make_dist
|
|
-D CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
|
|
-D PACKAGE_PREFIX=${PACKAGE_PREFIX}
|
|
-D CMAKE_C_FLAGS=${CMAKE_C_FLAGS}
|
|
-D CMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
|
|
-P ${PROJECT_SOURCE_DIR}/build/cmake/make_dist/MakeDistCheck.cmake
|
|
)
|
|
else ()
|
|
string (CONCAT DISTERRMSG
|
|
"The dist and distcheck targets disabled. Set ENABLE_BSON=ON, "
|
|
"ENABLE_MAN_PAGES=ON, and ENABLE_HTML_DOCS=ON to enable."
|
|
)
|
|
|
|
add_custom_target (dist
|
|
COMMAND ${CMAKE_COMMAND} -E echo "${DISTERRMSG}"
|
|
)
|
|
|
|
add_custom_target (distcheck
|
|
COMMAND ${CMAKE_COMMAND} -E echo "${DISTERRMSG}"
|
|
)
|
|
endif ()
|
|
|
|
endif ()
|
|
|
|
if (ENABLE_UNINSTALL)
|
|
if (WIN32)
|
|
if (ENABLE_MONGOC)
|
|
set (UNINSTALL_PROG "uninstall.cmd")
|
|
else ()
|
|
set (UNINSTALL_PROG "uninstall-bson.cmd")
|
|
endif ()
|
|
else ()
|
|
if (ENABLE_MONGOC)
|
|
set (UNINSTALL_PROG "uninstall.sh")
|
|
else ()
|
|
set (UNINSTALL_PROG "uninstall-bson.sh")
|
|
endif ()
|
|
endif ()
|
|
set (UNINSTALL_PROG_DIR "${CMAKE_INSTALL_DATADIR}/mongo-c-driver")
|
|
|
|
# Create uninstall program and associated uninstall target
|
|
#
|
|
# This needs to be last (after all other add_subdirectory calls) to ensure that
|
|
# the generated uninstall program is complete and correct
|
|
add_subdirectory (generate_uninstall)
|
|
endif ()
|