-cmake_minimum_required(VERSION 3.5.1)
+cmake_minimum_required(VERSION 3.16)
+
+project(ceph
+ VERSION 18.2.4
+ LANGUAGES CXX C ASM)
+
+cmake_policy(SET CMP0028 NEW)
+cmake_policy(SET CMP0046 NEW)
+cmake_policy(SET CMP0048 NEW)
+cmake_policy(SET CMP0051 NEW)
+cmake_policy(SET CMP0054 NEW)
+cmake_policy(SET CMP0056 NEW)
+cmake_policy(SET CMP0065 NEW)
+cmake_policy(SET CMP0074 NEW)
+cmake_policy(SET CMP0075 NEW)
+cmake_policy(SET CMP0093 NEW)
+foreach(policy CMP0127 CMP0135)
+ if(POLICY ${policy})
+ cmake_policy(SET ${policy} NEW)
+ endif()
+endforeach()
-project(ceph CXX C ASM)
-set(VERSION 14.2.4)
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
-if(POLICY CMP0028)
- cmake_policy(SET CMP0028 NEW)
-endif()
-if(POLICY CMP0046)
- cmake_policy(SET CMP0046 NEW)
-endif()
-if(POLICY CMP0054)
- cmake_policy(SET CMP0054 NEW)
-endif()
-if(POLICY CMP0056)
- cmake_policy(SET CMP0056 NEW)
-endif()
-if(POLICY CMP0065)
- cmake_policy(SET CMP0065 NEW)
+if(NOT CMAKE_BUILD_TYPE AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
+ set(default_build_type "Debug")
+ set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
+ STRING "Default BUILD_TYPE is Debug, other options are: RelWithDebInfo, Release, and MinSizeRel." FORCE)
endif()
-if(POLICY CMP0051)
- cmake_policy(SET CMP0051 NEW)
-endif()
-if(POLICY CMP0075)
- cmake_policy(SET CMP0075 NEW)
-endif()
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(LINUX ON)
FIND_PACKAGE(Threads)
endif(CMAKE_SYSTEM_NAME MATCHES "Linux")
-if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
- if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7)
- message(FATAL_ERROR "GCC 7+ required due to C++17 requirements")
- endif()
+if(WIN32)
+ # The Windows headers (e.g. coming from mingw or the Windows SDK) check
+ # the targeted Windows version. The availability of certain functions and
+ # structures will depend on it.
+ set(WIN32_WINNT "0x0A00" CACHE STRING "Targeted Windows version.")
+ # In order to avoid known winpthread issues, we're using the boost
+ # shared mutex implementation.
+ # https://github.com/msys2/MINGW-packages/issues/3319
+ add_definitions(
+ -D_WIN32_WINNT=${WIN32_WINNT}
+ -DBOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN
+ -DBOOST_THREAD_V2_SHARED_MUTEX
+ )
+ set(Boost_THREADAPI "win32")
+endif()
+
+if(MINGW)
+ string(APPEND CMAKE_SHARED_LINKER_FLAGS " -Wl,-allow-multiple-definition")
+ string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,-allow-multiple-definition")
+
+ # By default, cmake generates import libs for executables. The issue is that
+ # for rados and rbd, the executable import lib overrides the library import lib.
+ # For example, for rados.exe, it will end up generating a librados.dll.a import lib.
+ # We're providing custom rules to disable import libs for executables.
+ set(CMAKE_C_LINK_EXECUTABLE
+ "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
+ set(CMAKE_CXX_LINK_EXECUTABLE
+ "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
+
+ link_directories(${MINGW_LINK_DIRECTORIES})
endif()
option(WITH_CCACHE "Build with ccache.")
if(WITH_CCACHE)
- find_program(CCACHE_FOUND ccache)
- if(CCACHE_FOUND)
- message(STATUS "Building with ccache: ${CCACHE_FOUND}, CCACHE_DIR=$ENV{CCACHE_DIR}")
- set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
- # ccache does not accelerate link (ld), but let it handle it. by passing it
- # along with cc to python's distutils, we are able to workaround
- # https://bugs.python.org/issue8027.
- set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
- else(CCACHE_FOUND)
- message(FATAL_ERROR "Can't find ccache. Is it installed?")
- endif(CCACHE_FOUND)
+ if(CMAKE_C_COMPILER_LAUNCHER OR CMAKE_CXX_COMPILER_LAUNCHER)
+ message(WARNING "Compiler launcher already set. stop configuring ccache")
+ else()
+ find_program(CCACHE_EXECUTABLE ccache)
+ if(NOT CCACHE_EXECUTABLE)
+ message(FATAL_ERROR "Can't find ccache. Is it installed?")
+ endif()
+ message(STATUS "Building with ccache: ${CCACHE_EXECUTABLE}, CCACHE_DIR=$ENV{CCACHE_DIR}")
+ set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE})
+ set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE})
+ endif()
endif(WITH_CCACHE)
option(WITH_MANPAGE "Build man pages." ON)
${PROJECT_BINARY_DIR}/src/include
${PROJECT_SOURCE_DIR}/src)
-if(OFED_PREFIX)
- include_directories(SYSTEM ${OFED_PREFIX}/include)
- link_directories(${OFED_PREFIX}/lib)
+if(WIN32)
+ include_directories(
+ ${PROJECT_SOURCE_DIR}/src/include/win32)
+ # Boost complains if winsock2.h (or windows.h) is included before asio.hpp.
+ add_compile_options("SHELL:-include winsock_wrapper.h")
+ # Boost is also defining some of the errno values, we'll have
+ # to avoid mismatches.
+ add_compile_options("SHELL:-include win32_errno.h")
endif()
if(FREEBSD)
list(APPEND CMAKE_REQUIRED_INCLUDES /usr/local/include)
endif(FREEBSD)
-#Check Includes
-include(CheckIncludeFiles)
-include(CheckIncludeFileCXX)
-include(CheckFunctionExists)
#put all the libs and binaries in one place
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
-
-CHECK_FUNCTION_EXISTS(fallocate CEPH_HAVE_FALLOCATE)
-CHECK_FUNCTION_EXISTS(posix_fadvise HAVE_POSIX_FADVISE)
-CHECK_FUNCTION_EXISTS(posix_fallocate HAVE_POSIX_FALLOCATE)
-CHECK_FUNCTION_EXISTS(syncfs HAVE_SYS_SYNCFS)
-CHECK_FUNCTION_EXISTS(sync_file_range HAVE_SYNC_FILE_RANGE)
-CHECK_FUNCTION_EXISTS(pwritev HAVE_PWRITEV)
-CHECK_FUNCTION_EXISTS(splice CEPH_HAVE_SPLICE)
-CHECK_FUNCTION_EXISTS(getgrouplist HAVE_GETGROUPLIST)
-if(NOT APPLE)
- CHECK_FUNCTION_EXISTS(fdatasync HAVE_FDATASYNC)
-endif()
-CHECK_FUNCTION_EXISTS(strerror_r HAVE_Strerror_R)
-CHECK_FUNCTION_EXISTS(name_to_handle_at HAVE_NAME_TO_HANDLE_AT)
-CHECK_FUNCTION_EXISTS(pipe2 HAVE_PIPE2)
-CHECK_FUNCTION_EXISTS(accept4 HAVE_ACCEPT4)
-
-include(CMakePushCheckState)
-cmake_push_check_state(RESET)
-set(CMAKE_REQUIRED_LIBRARIES pthread)
-CHECK_FUNCTION_EXISTS(pthread_spin_init HAVE_PTHREAD_SPINLOCK)
-CHECK_FUNCTION_EXISTS(pthread_set_name_np HAVE_PTHREAD_SET_NAME_NP)
-CHECK_FUNCTION_EXISTS(pthread_get_name_np HAVE_PTHREAD_GET_NAME_NP)
-CHECK_FUNCTION_EXISTS(pthread_setname_np HAVE_PTHREAD_SETNAME_NP)
-CHECK_FUNCTION_EXISTS(pthread_getname_np HAVE_PTHREAD_GETNAME_NP)
-CHECK_FUNCTION_EXISTS(pthread_rwlockattr_setkind_np HAVE_PTHREAD_RWLOCKATTR_SETKIND_NP)
-cmake_pop_check_state()
-
-CHECK_FUNCTION_EXISTS(eventfd HAVE_EVENTFD)
-CHECK_FUNCTION_EXISTS(getprogname HAVE_GETPROGNAME)
-
-CHECK_INCLUDE_FILES("linux/types.h" HAVE_LINUX_TYPES_H)
-CHECK_INCLUDE_FILES("linux/version.h" HAVE_LINUX_VERSION_H)
-CHECK_INCLUDE_FILES("arpa/nameser_compat.h" HAVE_ARPA_NAMESER_COMPAT_H)
-CHECK_INCLUDE_FILES("sys/mount.h" HAVE_SYS_MOUNT_H)
-CHECK_INCLUDE_FILES("sys/param.h" HAVE_SYS_PARAM_H)
-CHECK_INCLUDE_FILES("sys/types.h" HAVE_SYS_TYPES_H)
-CHECK_INCLUDE_FILES("sys/vfs.h" HAVE_SYS_VFS_H)
-CHECK_INCLUDE_FILES("sys/prctl.h" HAVE_SYS_PRCTL_H)
-CHECK_INCLUDE_FILES("execinfo.h" HAVE_EXECINFO_H)
-if(LINUX)
- CHECK_INCLUDE_FILES("sched.h" HAVE_SCHED)
-endif(LINUX)
-CHECK_INCLUDE_FILES("valgrind/helgrind.h" HAVE_VALGRIND_HELGRIND_H)
-
-include(CheckTypeSize)
-set(CMAKE_EXTRA_INCLUDE_FILES "linux/types.h")
-CHECK_TYPE_SIZE(__be16 __BE16)
-CHECK_TYPE_SIZE(__be32 __BE32)
-CHECK_TYPE_SIZE(__be64 __BE64)
-CHECK_TYPE_SIZE(__le16 __LE16)
-CHECK_TYPE_SIZE(__le32 __LE32)
-CHECK_TYPE_SIZE(__le64 __LE64)
-CHECK_TYPE_SIZE(__u8 __U8)
-CHECK_TYPE_SIZE(__u16 __U16)
-CHECK_TYPE_SIZE(__u32 __U32)
-CHECK_TYPE_SIZE(__u64 __U64)
-CHECK_TYPE_SIZE(__s8 __S8)
-CHECK_TYPE_SIZE(__s16 __S16)
-CHECK_TYPE_SIZE(__s32 __S32)
-CHECK_TYPE_SIZE(__s64 __S64)
-unset(CMAKE_EXTRA_INCLUDE_FILES)
-
-include(CheckSymbolExists)
-CHECK_SYMBOL_EXISTS(res_nquery "resolv.h" HAVE_RES_NQUERY)
-CHECK_SYMBOL_EXISTS(F_SETPIPE_SZ "linux/fcntl.h" CEPH_HAVE_SETPIPE_SZ)
-CHECK_SYMBOL_EXISTS(__func__ "" HAVE_FUNC)
-CHECK_SYMBOL_EXISTS(__PRETTY_FUNCTION__ "" HAVE_PRETTY_FUNC)
-CHECK_SYMBOL_EXISTS(getentropy "unistd.h" HAVE_GETENTROPY)
-
-include(CheckCXXSourceCompiles)
-CHECK_CXX_SOURCE_COMPILES("
- #include <string.h>
- int main() { char x = *strerror_r(0, &x, sizeof(x)); return 0; }
- " STRERROR_R_CHAR_P)
-
-include(CheckStructHasMember)
-CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtim.tv_nsec sys/stat.h
- HAVE_STAT_ST_MTIM_TV_NSEC LANGUAGE C)
-CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtimespec.tv_nsec sys/stat.h
- HAVE_STAT_ST_MTIMESPEC_TV_NSEC LANGUAGE C)
+include(GNUInstallDirs)
+include(CephChecks)
+if(CMAKE_GENERATOR MATCHES Ninja)
+ include(LimitJobs)
+endif()
set(CEPH_MAN_DIR "share/man" CACHE STRING "Install location for man pages (relative to prefix).")
option(WITH_STATIC_LIBSTDCXX "Link against libstdc++ statically" OFF)
if(WITH_STATIC_LIBSTDCXX)
- if(CMAKE_COMPILER_IS_GNUCXX)
- set(static_linker_flags "-static-libstdc++ -static-libgcc")
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${static_linker_flags}")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${static_linker_flags}")
- unset(static_linker_flags)
- set(GPERFTOOLS_USE_STATIC_LIBS TRUE)
- else()
+ if(NOT CMAKE_COMPILER_IS_GNUCXX)
message(FATAL_ERROR "Please use GCC to enable WITH_STATIC_LIBSTDCXX")
endif()
+ set(static_linker_flags "-static-libstdc++ -static-libgcc")
+ string(APPEND CMAKE_SHARED_LINKER_FLAGS " ${static_linker_flags}")
+ string(APPEND CMAKE_EXE_LINKER_FLAGS " ${static_linker_flags}")
+ unset(static_linker_flags)
+ set(GPERFTOOLS_USE_STATIC_LIBS TRUE)
endif()
include(CheckCxxAtomic)
if(NOT HAVE_CXX11_ATOMIC)
- set(CMAKE_CXX_STANDARD_LIBRARIES
- "${CMAKE_CXX_STANDARD_LIBRARIES} ${LIBATOMIC_LINK_FLAGS}")
+ string(APPEND CMAKE_CXX_STANDARD_LIBRARIES
+ " ${LIBATOMIC_LINK_FLAGS}")
endif()
option(WITH_RDMA "Enable RDMA in async messenger" ON)
find_package(Backtrace)
+option(WITH_RBD "Enable RADOS Block Device related targets" ON)
+
if(LINUX)
find_package(udev REQUIRED)
set(HAVE_UDEV ${UDEV_FOUND})
find_package(blkid REQUIRED)
set(HAVE_BLKID ${BLKID_FOUND})
+ find_package(keyutils REQUIRED)
+ set(HAVE_KEYUTILS ${KEYUTILS_FOUND})
elseif(FREEBSD)
set(HAVE_UDEV OFF)
set(HAVE_LIBAIO OFF)
+ set(HAVE_LIBDML OFF)
set(HAVE_BLKID OFF)
+ set(HAVE_KEYUTILS OFF)
else()
set(HAVE_UDEV OFF)
- message(STATUS "Not using udev")
set(HAVE_BLKID OFF)
- message(STATUS "Not using BLKID")
endif(LINUX)
option(WITH_OPENLDAP "OPENLDAP is here" ON)
if(WITH_OPENLDAP)
- find_package(OpenLdap REQUIRED)
- set(HAVE_OPENLDAP ${OPENLDAP_FOUND})
+ find_package(OpenLDAP REQUIRED)
+ set(HAVE_OPENLDAP ${OpenLDAP_FOUND})
endif()
option(WITH_GSSAPI "GSSAPI/KRB5 is here" OFF)
option(WITH_FUSE "Fuse is here" ON)
if(WITH_FUSE)
- find_package(fuse)
+ find_package(FUSE REQUIRED)
set(HAVE_LIBFUSE ${FUSE_FOUND})
endif()
+option(WITH_DOKAN "Dokan is here" OFF)
+
option(WITH_XFS "XFS is here" ON)
if(WITH_XFS)
find_package(xfs)
endif()
endif()
-if(CMAKE_SYSTEM_PROCESSOR MATCHES "i386|i686|amd64|x86_64|AMD64|aarch64")
- option(WITH_SPDK "Enable SPDK" ON)
-else()
- option(WITH_SPDK "Enable SPDK" OFF)
+# libcryptsetup is only available on linux
+if(WITH_RBD AND LINUX)
+ find_package(libcryptsetup 2.0.5 REQUIRED)
+ set(HAVE_LIBCRYPTSETUP ${LIBCRYPTSETUP_FOUND})
+endif()
+
+include(CMakeDependentOption)
+
+CMAKE_DEPENDENT_OPTION(WITH_ZBD "Enable libzbd bluestore backend" OFF
+ "WITH_BLUESTORE" OFF)
+if(WITH_ZBD)
+ find_package(zbd REQUIRED)
+ set(HAVE_LIBZBD ${ZBD_FOUND})
endif()
+
+CMAKE_DEPENDENT_OPTION(WITH_LIBURING "Enable io_uring bluestore backend" ON
+ "WITH_BLUESTORE;HAVE_LIBAIO" OFF)
+set(HAVE_LIBURING ${WITH_LIBURING})
+
+CMAKE_DEPENDENT_OPTION(WITH_SYSTEM_LIBURING "Require and build with system liburing" OFF
+ "HAVE_LIBAIO;WITH_BLUESTORE" OFF)
+
+if(WITH_LIBURING)
+ if(WITH_SYSTEM_LIBURING)
+ find_package(uring REQUIRED)
+ else()
+ include(Builduring)
+ build_uring()
+ endif()
+endif()
+
+CMAKE_DEPENDENT_OPTION(WITH_BLUESTORE_PMEM "Enable PMDK libraries" OFF
+ "WITH_BLUESTORE" OFF)
+if(WITH_BLUESTORE_PMEM)
+ find_package(dml)
+ set(HAVE_LIBDML ${DML_FOUND})
+endif()
+
+CMAKE_DEPENDENT_OPTION(WITH_RBD_MIRROR "Enable build for rbd-mirror daemon executable" OFF
+ "WITH_RBD" OFF)
+
+CMAKE_DEPENDENT_OPTION(WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+ "Enable librbd QCOW v1 migration format support" ON
+ "WITH_RBD" OFF)
+
+CMAKE_DEPENDENT_OPTION(WITH_RBD_RWL "Enable librbd persistent write back cache" OFF
+ "WITH_RBD" OFF)
+
+CMAKE_DEPENDENT_OPTION(WITH_RBD_SSD_CACHE "Enable librbd persistent write back cache for SSDs" OFF
+ "WITH_RBD" OFF)
+
+CMAKE_DEPENDENT_OPTION(WITH_SYSTEM_PMDK "Require and build with system PMDK" OFF
+ "WITH_RBD_RWL OR WITH_BLUESTORE_PMEM" OFF)
+
+if(WITH_BLUESTORE_PMEM)
+ set(HAVE_BLUESTORE_PMEM ON)
+endif()
+
+CMAKE_DEPENDENT_OPTION(WITH_SPDK "Enable SPDK" OFF
+ "CMAKE_SYSTEM_PROCESSOR MATCHES i386|i686|amd64|x86_64|AMD64|aarch64" OFF)
if(WITH_SPDK)
if(NOT WITH_BLUESTORE)
message(SEND_ERROR "Please enable WITH_BLUESTORE for using SPDK")
set(HAVE_SPDK TRUE)
endif(WITH_SPDK)
-option(WITH_PMEM "Enable PMEM" OFF)
-if(WITH_PMEM)
- set(HAVE_PMEM ON)
- if(NOT WITH_BLUESTORE)
- message(SEND_ERROR "Please enable WITH_BLUESTORE for using PMEM")
- endif()
-endif()
-
if(WITH_BLUESTORE)
- if(NOT AIO_FOUND AND NOT HAVE_POSIXAIO AND NOT WITH_SPDK AND NOT WITH_PMEM)
+ if(NOT AIO_FOUND AND NOT HAVE_POSIXAIO AND NOT WITH_SPDK AND NOT WITH_BLUESTORE_PMEM)
message(SEND_ERROR "WITH_BLUESTORE is ON, "
"but none of the bluestore backends is enabled. "
- "Please install libaio, or enable WITH_SPDK or WITH_PMEM (experimental)")
+ "Please install libaio, or enable WITH_SPDK or WITH_BLUESTORE_PMEM (experimental)")
endif()
endif()
option(WITH_BLUEFS "libbluefs library" OFF)
+option(WITH_QAT "Enable Qat driver" OFF)
+if(WITH_QAT)
+ find_package(QatDrv REQUIRED COMPONENTS qat_s usdm_drv_s)
+ set(HAVE_QATDRV $(QatDrv_FOUND))
+endif()
+
option(WITH_QATZIP "Enable QATZIP" OFF)
if(WITH_QATZIP)
find_package(qatzip REQUIRED)
- set(HAVE_QATZIP ${QATZIP_FOUND})
+ set(HAVE_QATZIP ${qatzip_FOUND})
endif(WITH_QATZIP)
# needs mds and? XXX
option(WITH_LIBCEPHFS "libcephfs client library" ON)
-# key-value store
-option(WITH_KVS "Key value store is here" ON)
+option(WITH_LIBCEPHSQLITE "libcephsqlite client library" ON)
+if(WITH_LIBCEPHSQLITE)
+ find_package(SQLite3 REQUIRED)
+endif()
-# remote block storage
-option(WITH_RBD "Remote block storage is here" ON)
+# key-value store
+option(WITH_KVS "Key value store is here" OFF)
-# KERNEL remote block storage
-option(WITH_KRBD "Kernel Remote block storage is here" ON)
+option(WITH_KRBD "Enable Linux krbd support of 'rbd' utility" ON)
-if(WITH_KRBD AND WITHOUT_RBD)
- message(FATAL_ERROR "Cannot have WITH_KRBD with WITH_RBD.")
+if(WITH_KRBD AND NOT WITH_RBD)
+ message(FATAL_ERROR "Cannot have WITH_KRBD without WITH_RBD.")
endif()
-
-option(WITH_LEVELDB "LevelDB is here" ON)
-if(WITH_LEVELDB)
- if(LEVELDB_PREFIX)
- include_directories(SYSTEM ${LEVELDB_PREFIX}/include)
- link_directories(${LEVELDB_PREFIX}/lib)
+if(LINUX)
+ if(WITH_LIBCEPHFS OR WITH_KRBD)
+ # keyutils is only used when talking to the Linux Kernel key store
+ find_package(keyutils REQUIRED)
+ set(HAVE_KEYUTILS ${KEYUTILS_FOUND})
endif()
- find_package(leveldb REQUIRED)
- find_file(HAVE_LEVELDB_FILTER_POLICY leveldb/filter_policy.h PATHS ${LEVELDB_INCLUDE_DIR})
-endif(WITH_LEVELDB)
+endif()
find_package(snappy REQUIRED)
set(HAVE_LZ4 ${LZ4_FOUND})
endif(WITH_LZ4)
-option(WITH_CEPH_DEBUG_MUTEX "Use debug ceph::mutex with lockdep" OFF)
+CMAKE_DEPENDENT_OPTION(WITH_CEPH_DEBUG_MUTEX "Use debug ceph::mutex with lockdep" ON
+ "CMAKE_BUILD_TYPE STREQUAL Debug" OFF)
#if allocator is set on command line make sure it matches below strings
set(ALLOCATOR "" CACHE STRING
and then jemalloc. If neither of then is found. use the one in libc.")
if(ALLOCATOR)
if(${ALLOCATOR} MATCHES "tcmalloc(_minimal)?")
- find_package(gperftools REQUIRED)
+ find_package(gperftools 2.6.2 REQUIRED)
+ set(ALLOC_LIBS gperftools::${ALLOCATOR})
set(HAVE_LIBTCMALLOC ON)
elseif(${ALLOCATOR} STREQUAL "jemalloc")
find_package(JeMalloc REQUIRED)
+ set(ALLOC_LIBS JeMalloc::JeMalloc)
set(HAVE_JEMALLOC 1)
elseif(NOT ALLOCATOR STREQUAL "libc")
message(FATAL_ERROR "Unsupported allocator selected: ${ALLOCATOR}")
endif()
else(ALLOCATOR)
- find_package(gperftools)
+ find_package(gperftools 2.6.2)
set(HAVE_LIBTCMALLOC ${gperftools_FOUND})
if(NOT gperftools_FOUND)
find_package(JeMalloc)
endif()
if(gperftools_FOUND)
set(ALLOCATOR tcmalloc)
+ set(ALLOC_LIBS gperftools::tcmalloc)
elseif(JeMalloc_FOUND)
set(ALLOCATOR jemalloc)
+ set(ALLOC_LIBS JeMalloc::JeMalloc)
else()
if(NOT FREEBSD)
# FreeBSD already has jemalloc as its default allocator
set(ALLOCATOR "libc")
endif(gperftools_FOUND)
endif(ALLOCATOR)
+if(NOT ALLOCATOR STREQUAL "libc")
+ add_compile_options(
+ $<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-malloc>
+ $<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-calloc>
+ $<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-realloc>
+ $<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-free>)
+endif()
-if(HAVE_LIBTCMALLOC AND WITH_STATIC_LIBSTDCXX)
+# Mingw generates incorrect entry points when using "-pie".
+if(WIN32 OR (HAVE_LIBTCMALLOC AND WITH_STATIC_LIBSTDCXX))
set(EXE_LINKER_USE_PIE FALSE)
else()
set(EXE_LINKER_USE_PIE ${ENABLE_SHARED})
endif()
-if(WITH_LIBCEPHFS OR WITH_KRBD)
- find_package(keyutils REQUIRED)
+if(NOT WIN32)
+ # require libcurl with good curl_multi_wait(), see https://tracker.ceph.com/issues/15915
+ find_package(CURL 7.32 REQUIRED)
endif()
-find_package(CURL REQUIRED)
-set(CMAKE_REQUIRED_INCLUDES ${CURL_INCLUDE_DIRS})
-set(CMAKE_REQUIRED_LIBRARIES ${CURL_LIBRARIES})
-CHECK_SYMBOL_EXISTS(curl_multi_wait curl/curl.h HAVE_CURL_MULTI_WAIT)
-
-find_package(NSS REQUIRED)
-find_package(NSPR REQUIRED)
find_package(OpenSSL REQUIRED)
-# TODO: use NSS only for validation of the OpenSSL-based implementations
-set(USE_NSS 1)
-set(USE_OPENSSL 1)
-set(CRYPTO_LIBS ${NSS_LIBRARIES} ${NSPR_LIBRARIES} OpenSSL::Crypto)
-
-option(WITH_XIO "Enable XIO messaging" OFF)
-if(WITH_XIO)
- find_package(xio REQUIRED)
- set(HAVE_XIO ${XIO_FOUND})
-endif()
+set(CRYPTO_LIBS OpenSSL::Crypto)
option(WITH_DPDK "Enable DPDK messaging" OFF)
if(WITH_DPDK)
find_package(dpdk)
- if(NOT DPDK_FOUND AND NOT TARGET dpdk-ext)
+ if(NOT DPDK_FOUND)
include(BuildDPDK)
build_dpdk(${CMAKE_BINARY_DIR}/src/dpdk)
endif()
option(WITH_BLKIN "Use blkin to emit LTTng tracepoints for Zipkin" OFF)
if(WITH_BLKIN)
+ find_package(LTTngUST REQUIRED)
set(BLKIN_LIBRARIES blkin ${LTTNGUST_LIBRARIES} lttng-ust-fork)
include_directories(SYSTEM src/blkin/blkin-lib)
endif(WITH_BLKIN)
-option(WITH_BOOST_CONTEXT "Enable boost::asio stackful coroutines" ON)
-if(WITH_BOOST_CONTEXT)
- set(HAVE_BOOST_CONTEXT ON)
+option(WITH_JAEGER "Enable jaegertracing and it's dependent libraries" ON)
+if(WITH_JAEGER)
+ set(HAVE_JAEGER TRUE)
endif()
#option for RGW
option(WITH_RADOSGW "Rados Gateway is enabled" ON)
-option(WITH_RADOSGW_FCGI_FRONTEND "Rados Gateway's FCGI frontend is enabled" OFF)
-option(WITH_RADOSGW_BEAST_FRONTEND "Rados Gateway's Beast frontend is enabled" ON)
option(WITH_RADOSGW_BEAST_OPENSSL "Rados Gateway's Beast frontend uses OpenSSL" ON)
option(WITH_RADOSGW_AMQP_ENDPOINT "Rados Gateway's pubsub support for AMQP push endpoint" ON)
+option(WITH_RADOSGW_KAFKA_ENDPOINT "Rados Gateway's pubsub support for Kafka push endpoint" ON)
+option(WITH_RADOSGW_LUA_PACKAGES "Rados Gateway's support for dynamically adding lua packagess" ON)
+option(WITH_RADOSGW_DBSTORE "DBStore backend for Rados Gateway" ON)
+option(WITH_RADOSGW_MOTR "CORTX-Motr backend for Rados Gateway" OFF)
+option(WITH_RADOSGW_DAOS "DAOS backend for RADOS Gateway" OFF)
+option(WITH_RADOSGW_SELECT_PARQUET "Support for s3 select on parquet objects" ON)
+option(WITH_RADOSGW_ARROW_FLIGHT "Build arrow flight when not using system-provided arrow" OFF)
+option(WITH_RADOSGW_BACKTRACE_LOGGING "Enable backtraces in rgw logs" OFF)
+
+option(WITH_SYSTEM_ARROW "Use system-provided arrow" OFF)
+option(WITH_SYSTEM_UTF8PROC "Use system-provided utf8proc" OFF)
if(WITH_RADOSGW)
find_package(EXPAT REQUIRED)
- if(WITH_RADOSGW_FCGI_FRONTEND)
- find_package(fcgi REQUIRED)
- endif()
- if(WITH_RADOSGW_BEAST_FRONTEND AND NOT WITH_BOOST_CONTEXT)
- message(WARNING "disabling WITH_RADOSGW_BEAST_FRONTEND, which depends on WITH_BOOST_CONTEXT")
- set(WITH_RADOSGW_BEAST_FRONTEND OFF)
- endif()
find_package(OATH REQUIRED)
# https://curl.haxx.se/docs/install.html mentions the
message(WARNING "unable to run curl-config; rgw cannot make ssl requests to external systems reliably")
endif()
- if (WITH_RADOSGW_BEAST_FRONTEND AND WITH_RADOSGW_BEAST_OPENSSL)
- find_package(OpenSSL REQUIRED)
- else()
- find_package(OpenSSL)
+ if (NOT NO_CURL_SSL_LINK)
+ message(STATUS "libcurl is linked with openssl: explicitly setting locks")
+ set(WITH_CURL_OPENSSL ON)
+ endif() # CURL_SSL_LINK
+ execute_process(
+ COMMAND
+ "sh" "-c"
+ "objdump -p ${OPENSSL_SSL_LIBRARY} | sed -n 's/^ SONAME *//p'"
+ OUTPUT_VARIABLE LIBSSL_SONAME
+ ERROR_VARIABLE OBJDUMP_ERRORS
+ RESULT_VARIABLE OBJDUMP_RESULTS
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if (OBJDUMP_RESULTS)
+ message(FATAL_ERROR "can't run objdump: ${OBJDUMP_RESULTS}")
endif()
-
- if (OPENSSL_FOUND)
- if (NOT NO_CURL_SSL_LINK)
- message(STATUS "libcurl is linked with openssl: explicitly setting locks")
- set(WITH_CURL_OPENSSL ON)
- endif() # CURL_SSL_LINK
- execute_process(
- COMMAND
- "sh" "-c"
- "objdump -p ${OPENSSL_SSL_LIBRARY} | sed -n 's/^ SONAME *//p'"
- OUTPUT_VARIABLE LIBSSL_SONAME
- ERROR_VARIABLE OBJDUMP_ERRORS
- RESULT_VARIABLE OBJDUMP_RESULTS
- OUTPUT_STRIP_TRAILING_WHITESPACE)
- if (OBJDUMP_RESULTS)
- message(FATAL_ERROR "can't run objdump: ${OBJDUMP_RESULTS}")
- endif()
- if (NOT OBJDUMP_ERRORS STREQUAL "")
- message(WARNING "message from objdump: ${OBJDUMP_ERRORS}")
- endif()
- execute_process(
- COMMAND
- "sh" "-c"
- "objdump -p ${OPENSSL_CRYPTO_LIBRARY} | sed -n 's/^ SONAME *//p'"
- OUTPUT_VARIABLE LIBCRYPTO_SONAME
- ERROR_VARIABLE OBJDUMP_ERRORS
- RESULT_VARIABLE OBJDUMP_RESULTS
- OUTPUT_STRIP_TRAILING_WHITESPACE)
- if (OBJDUMP_RESULTS)
- message(FATAL_ERROR "can't run objdump: ${OBJDUMP_RESULTS}")
- endif()
- if (NOT OBJDUMP_ERRORS STREQUAL "")
- message(WARNING "message from objdump: ${OBJDUMP_ERRORS}")
- endif()
- message(STATUS "ssl soname: ${LIBSSL_SONAME}")
- message(STATUS "crypto soname: ${LIBCRYPTO_SONAME}")
- else()
- message(WARNING "ssl not found: rgw civetweb may fail to dlopen libssl libcrypto")
- endif() # OPENSSL_FOUND
+ if (NOT OBJDUMP_ERRORS STREQUAL "")
+ message(WARNING "message from objdump: ${OBJDUMP_ERRORS}")
+ endif()
+ execute_process(
+ COMMAND
+ "sh" "-c"
+ "objdump -p ${OPENSSL_CRYPTO_LIBRARY} | sed -n 's/^ SONAME *//p'"
+ OUTPUT_VARIABLE LIBCRYPTO_SONAME
+ ERROR_VARIABLE OBJDUMP_ERRORS
+ RESULT_VARIABLE OBJDUMP_RESULTS
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if (OBJDUMP_RESULTS)
+ message(FATAL_ERROR "can't run objdump: ${OBJDUMP_RESULTS}")
+ endif()
+ if (NOT OBJDUMP_ERRORS STREQUAL "")
+ message(WARNING "message from objdump: ${OBJDUMP_ERRORS}")
+ endif()
+ message(STATUS "ssl soname: ${LIBSSL_SONAME}")
+ message(STATUS "crypto soname: ${LIBCRYPTO_SONAME}")
endif (WITH_RADOSGW)
#option for CephFS
option(WITH_CEPHFS "CephFS is enabled" ON)
-#option for Mgr
+if(NOT WIN32)
+# Please specify 3.[0-7] if you want to build with a certain version of python3.
+set(WITH_PYTHON3 "3" CACHE STRING "build with specified python3 version")
+find_package(Python3 ${WITH_PYTHON3} EXACT REQUIRED
+ COMPONENTS Interpreter Development)
+
option(WITH_MGR "ceph-mgr is enabled" ON)
if(WITH_MGR)
- # Please specify 3 or 3.[0-7] if you want to build with python3 support.
- # FindPyhonInterp and FindPythonLibs think they belong to different families.
- set(MGR_PYTHON_VERSION "2.7" CACHE
- STRING "minimal required version of python runtime for running mgr plugins. ")
- find_package(PythonInterp ${MGR_PYTHON_VERSION} REQUIRED)
- find_package(PythonLibs ${MGR_PYTHON_VERSION} REQUIRED)
- set(MGR_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
- set(MGR_PYTHON_LIBRARIES ${PYTHON_LIBRARIES})
- set(MGR_PYTHON_VERSION_MAJOR ${PYTHON_VERSION_MAJOR})
- set(MGR_PYTHON_VERSION_MINOR ${PYTHON_VERSION_MINOR})
+ set(MGR_PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
+ set(MGR_PYTHON_LIBRARIES ${Python3_LIBRARIES})
+ set(MGR_PYTHON_VERSION_MAJOR ${Python3_VERSION_MAJOR})
+ set(MGR_PYTHON_VERSION_MINOR ${Python3_VERSION_MINOR})
# Boost dependency check deferred to Boost section
endif(WITH_MGR)
+endif(NOT WIN32)
option(WITH_THREAD_SAFE_RES_QUERY "res_query is thread safe" OFF)
if(WITH_THREAD_SAFE_RES_QUERY)
set(HAVE_REENTRANT_STRSIGNAL 1 CACHE INTERNAL "Reentrant strsignal is supported.")
endif()
-set(HAVE_LIBROCKSDB 1)
-
# -lz link into kv
find_package(ZLIB REQUIRED)
#option for EventTrace
-option(WITH_EVENTTRACE "Event tracing support" OFF)
+CMAKE_DEPENDENT_OPTION(
+ WITH_EVENTTRACE "Event tracing support, requires WITH_LTTNG"
+ OFF "USE_LTTNG" OFF)
#option for LTTng
option(WITH_LTTNG "LTTng tracing is enabled" ON)
# fio
option(WITH_FIO "build with fio plugin enabled" OFF)
-option(WITH_SYSTEM_FIO "require and build with system fio" OFF)
-if(WITH_SYSTEM_FIO)
- find_package(fio REQUIRED)
-elseif(WITH_FIO)
- set(FIO_INCLUDE_DIR ${CMAKE_BINARY_DIR}/src/fio)
+if(WITH_FIO)
include(BuildFIO)
build_fio()
endif()
option(WITH_UBSAN "build with UBSAN" OFF)
if(WITH_UBSAN)
- list(APPEND sanitizers "undefined-behavior")
+ list(APPEND sanitizers "undefined_behavior")
endif()
if(sanitizers)
find_package(Sanitizers REQUIRED ${sanitizers})
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${Sanitizers_COMPILE_OPTIONS}")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Sanitizers_COMPILE_OPTIONS}")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${Sanitizers_COMPILE_OPTIONS}")
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${Sanitizers_COMPILE_OPTIONS}")
+ add_compile_options(${Sanitizers_COMPILE_OPTIONS})
+ string(REPLACE ";" " " sanitiers_compile_flags "${Sanitizers_COMPILE_OPTIONS}")
+ string(APPEND CMAKE_EXE_LINKER_FLAGS " ${sanitiers_compile_flags}")
+ string(APPEND CMAKE_SHARED_LINKER_FLAGS " ${sanitiers_compile_flags}")
endif()
# Rocksdb
option(WITH_SYSTEM_ROCKSDB "require and build with system rocksdb" OFF)
if (WITH_SYSTEM_ROCKSDB)
- find_package(RocksDB 5.8 REQUIRED)
+ find_package(RocksDB 5.14 REQUIRED)
endif()
option(WITH_SEASTAR "Build seastar components")
# Boost::thread depends on Boost::atomic, so list it explicitly.
set(BOOST_COMPONENTS
atomic chrono thread system regex random program_options date_time
- iostreams)
+ iostreams context coroutine)
set(BOOST_HEADER_COMPONENTS container)
if(WITH_MGR)
list(APPEND BOOST_COMPONENTS
python${MGR_PYTHON_VERSION_MAJOR}${MGR_PYTHON_VERSION_MINOR})
endif()
-if(WITH_BOOST_CONTEXT)
- list(APPEND BOOST_COMPONENTS context coroutine)
-endif()
if(WITH_SEASTAR)
- list(APPEND BOOST_COMPONENTS filesystem timer)
+ list(APPEND BOOST_COMPONENTS timer)
+endif()
+
+if(WITH_RADOSGW AND WITH_RADOSGW_LUA_PACKAGES)
+ list(APPEND BOOST_COMPONENTS filesystem)
endif()
set(Boost_USE_MULTITHREADED ON)
+
+CMAKE_DEPENDENT_OPTION(WITH_BOOST_VALGRIND "Boost support for valgrind" OFF
+ "NOT WITH_SYSTEM_BOOST" OFF)
# require minimally the bundled version
if(WITH_SYSTEM_BOOST)
if(ENABLE_SHARED)
if(BOOST_ROOT AND CMAKE_LIBRARY_ARCHITECTURE)
set(BOOST_LIBRARYDIR "${BOOST_ROOT}/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
endif()
- find_package(Boost 1.67 COMPONENTS ${BOOST_COMPONENTS} REQUIRED)
+ find_package(Boost 1.79 COMPONENTS ${BOOST_COMPONENTS} REQUIRED)
+ if(NOT ENABLE_SHARED)
+ set_property(TARGET Boost::iostreams APPEND PROPERTY
+ INTERFACE_LINK_LIBRARIES ZLIB::ZLIB)
+ endif()
else()
- set(BOOST_J 1 CACHE STRING
- "max jobs for Boost build") # override w/-DBOOST_J=<n>
+ include(ProcessorCount)
+ ProcessorCount(DEFAULT_BOOST_J)
+ if(DEFAULT_BOOST_J EQUAL 0)
+ set(DEFAULT_BOOST_J 1)
+ endif()
+ set(BOOST_J ${DEFAULT_BOOST_J} CACHE STRING "max jobs for Boost build") # override w/-DBOOST_J=<n>
set(Boost_USE_STATIC_LIBS ON)
include(BuildBoost)
- build_boost(1.67
+ build_boost(1.79
COMPONENTS ${BOOST_COMPONENTS} ${BOOST_HEADER_COMPONENTS})
endif()
include_directories(BEFORE SYSTEM ${Boost_INCLUDE_DIRS})
-set(Boost_USE_MULTITHREADED ON)
# dashboard angular2 frontend
option(WITH_MGR_DASHBOARD_FRONTEND "Build the mgr/dashboard frontend using `npm`" ON)
option(WITH_SYSTEM_NPM "Assume that dashboard build tools already installed through packages" OFF)
if(WITH_SYSTEM_NPM)
- find_program(NPM npm)
- if(NOT NPM)
+ find_program(NPM_EXECUTABLE npm)
+ if(NOT NPM_EXECUTABLE)
message(FATAL_ERROR "Can't find npm.")
endif()
endif()
+set(DASHBOARD_FRONTEND_LANGS "ALL" CACHE STRING
+ "List of comma separated ceph-dashboard frontend languages to build. \
+ Use value `ALL` to build all languages")
+CMAKE_DEPENDENT_OPTION(WITH_MGR_ROOK_CLIENT "Enable the mgr's Rook support" ON
+ "WITH_MGR" OFF)
include_directories(SYSTEM ${PROJECT_BINARY_DIR}/include)
find_package(Threads REQUIRED)
-
+find_package(StdFilesystem REQUIRED)
option(WITH_SELINUX "build SELinux policy" OFF)
if(WITH_SELINUX)
COMMAND ${CMAKE_CTEST_COMMAND}
DEPENDS tests)
+option(WITH_SYSTEMD "build with systemd support" ON)
+
add_subdirectory(src)
+add_subdirectory(qa)
add_subdirectory(doc)
if(WITH_MANPAGE)
add_subdirectory(man)
endif(WITH_MANPAGE)
-option(WITH_SYSTEMD "install systemd target and service files" ON)
if(WITH_SYSTEMD)
add_subdirectory(systemd)
endif()
endif()
option(WITH_GRAFANA "install grafana dashboards" OFF)
-if(WITH_GRAFANA)
- add_subdirectory(monitoring/grafana/dashboards)
-endif()
+add_subdirectory(monitoring/ceph-mixin)
include(CTags)
option(CTAG_EXCLUDES "Exclude files/directories when running ctag.")
SRC_DIR src
TAG_FILE tags
EXCLUDE_OPTS ${CTAG_EXCLUDES}
- EXCLUDES "*.js" "*.css")
+ EXCLUDES "*.js" "*.css" ".tox" "python-common/build")
add_custom_target(tags DEPENDS ctags)