-cmake_minimum_required(VERSION 3.10.2)
-# remove cmake/modules/FindPython* once 3.12 is required
+cmake_minimum_required(VERSION 3.16)
project(ceph
- VERSION 16.0.0
+ VERSION 18.2.4
LANGUAGES CXX C ASM)
-foreach(policy
- CMP0028
- CMP0046
- CMP0048
- CMP0051
- CMP0054
- CMP0056
- CMP0065
- CMP0074
- CMP0075
- CMP0093)
+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()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
+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(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(LINUX ON)
FIND_PACKAGE(Threads)
# the targeted Windows version. The availability of certain functions and
# structures will depend on it.
set(WIN32_WINNT "0x0A00" CACHE STRING "Targeted Windows version.")
- add_definitions(-D_WIN32_WINNT=${WIN32_WINNT})
+ # 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)
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-allow-multiple-definition")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-allow-multiple-definition")
+ 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.
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(NOT CCACHE_FOUND)
- message(FATAL_ERROR "Can't find ccache. Is it installed?")
+ 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()
- 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)
endif(WITH_CCACHE)
option(WITH_MANPAGE "Build man pages." ON)
include_directories(
${PROJECT_SOURCE_DIR}/src/include/win32)
# Boost complains if winsock2.h (or windows.h) is included before asio.hpp.
- add_definitions(-include winsock_wrapper.h)
+ add_compile_options("SHELL:-include winsock_wrapper.h")
# Boost is also defining some of the errno values, we'll have
# to avoid mismatches.
- add_definitions(-include win32_errno.h)
+ add_compile_options("SHELL:-include win32_errno.h")
endif()
if(FREEBSD)
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).")
message(FATAL_ERROR "Please use GCC to enable WITH_STATIC_LIBSTDCXX")
endif()
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}")
+ 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)
elseif(FREEBSD)
set(HAVE_UDEV OFF)
set(HAVE_LIBAIO OFF)
+ set(HAVE_LIBDML OFF)
set(HAVE_BLKID OFF)
set(HAVE_KEYUTILS OFF)
else()
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()
# libcryptsetup is only available on linux
if(WITH_RBD AND LINUX)
- find_package(libcryptsetup REQUIRED)
+ find_package(libcryptsetup 2.0.5 REQUIRED)
set(HAVE_LIBCRYPTSETUP ${LIBCRYPTSETUP_FOUND})
- if(${LIBCRYPTSETUP_VERSION} VERSION_LESS 2.0.5)
- set(LIBCRYPTSETUP_LEGACY_DATA_ALIGNMENT TRUE)
- endif()
endif()
include(CMakeDependentOption)
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
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
endif()
# key-value store
-option(WITH_KVS "Key value store is here" ON)
+option(WITH_KVS "Key value store is here" OFF)
option(WITH_KRBD "Enable Linux krbd support of 'rbd' utility" ON)
endif()
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)
- endif()
- find_package(leveldb REQUIRED)
- find_file(HAVE_LEVELDB_FILTER_POLICY leveldb/filter_policy.h PATHS ${LEVELDB_INCLUDE_DIR})
-endif(WITH_LEVELDB)
-
find_package(snappy REQUIRED)
option(WITH_BROTLI "Brotli compression support" OFF)
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()
# Mingw generates incorrect entry points when using "-pie".
if(WIN32 OR (HAVE_LIBTCMALLOC AND WITH_STATIC_LIBSTDCXX))
set(EXE_LINKER_USE_PIE ${ENABLE_SHARED})
endif()
-if (HAVE_LIBTCMALLOC AND TCMALLOC_VERSION_STRING VERSION_LESS 2.6.2)
- set(LIBTCMALLOC_MISSING_ALIGNED_ALLOC ON)
+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(OpenSSL REQUIRED)
set(CRYPTO_LIBS OpenSSL::Crypto)
include_directories(SYSTEM src/blkin/blkin-lib)
endif(WITH_BLKIN)
-option(WITH_JAEGER "Enable jaegertracing and it's dependent libraries" OFF)
+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()
find_package(OATH REQUIRED)
# https://curl.haxx.se/docs/install.html mentions the
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")
-if(NOT WITH_PYTHON3 STREQUAL "3")
- set(find_python3_exact "EXACT")
-endif()
-find_package(Python3 ${WITH_PYTHON3} ${find_python3_exact} REQUIRED
+find_package(Python3 ${WITH_PYTHON3} EXACT REQUIRED
COMPONENTS Interpreter Development)
-unset(find_python3_exact)
option(WITH_MGR "ceph-mgr is enabled" ON)
if(WITH_MGR)
set(MGR_PYTHON_LIBRARIES ${Python3_LIBRARIES})
set(MGR_PYTHON_VERSION_MAJOR ${Python3_VERSION_MAJOR})
set(MGR_PYTHON_VERSION_MINOR ${Python3_VERSION_MINOR})
- # https://tracker.ceph.com/issues/45147
- if(Python3_VERSION VERSION_GREATER_EQUAL 3.8)
- set(MGR_DISABLED_MODULES "diskprediction_local")
- message(STATUS "mgr module disabled for ${Python3_VERSION}: ${MGR_DISABLED_MODULES}")
- endif()
# Boost dependency check deferred to Boost section
endif(WITH_MGR)
endif(NOT WIN32)
find_package(Sanitizers REQUIRED ${sanitizers})
add_compile_options(${Sanitizers_COMPILE_OPTIONS})
string(REPLACE ";" " " sanitiers_compile_flags "${Sanitizers_COMPILE_OPTIONS}")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${sanitiers_compile_flags}")
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${sanitiers_compile_flags}")
+ string(APPEND CMAKE_EXE_LINKER_FLAGS " ${sanitiers_compile_flags}")
+ string(APPEND CMAKE_SHARED_LINKER_FLAGS " ${sanitiers_compile_flags}")
endif()
# Rocksdb
# Boost::thread depends on Boost::atomic, so list it explicitly.
set(BOOST_COMPONENTS
atomic chrono thread system regex random program_options date_time
- iostreams context coroutine filesystem)
+ iostreams context coroutine)
set(BOOST_HEADER_COMPONENTS container)
if(WITH_MGR)
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.72 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.72
+ build_boost(1.79
COMPONENTS ${BOOST_COMPONENTS} ${BOOST_HEADER_COMPONENTS})
endif()
include_directories(BEFORE SYSTEM ${Boost_INCLUDE_DIRS})
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 "" CACHE STRING
+set(DASHBOARD_FRONTEND_LANGS "ALL" CACHE STRING
"List of comma separated ceph-dashboard frontend languages to build. \
Use value `ALL` to build all languages")
-
-# TODO: make this an option and set it to the same value as WITH_MGR_DASHBOARD_FRONTEND
-set(WITH_MGR_ROOK_CLIENT WITH_MGR_DASHBOARD_FRONTEND)
+CMAKE_DEPENDENT_OPTION(WITH_MGR_ROOK_CLIENT "Enable the mgr's Rook support" ON
+ "WITH_MGR" OFF)
include_directories(SYSTEM ${PROJECT_BINARY_DIR}/include)
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()
-
-CMAKE_DEPENDENT_OPTION(WITH_BOOST_VALGRIND "Boost support for valgrind" OFF
- "NOT WITH_SYSTEM_BOOST" OFF)
+add_subdirectory(monitoring/ceph-mixin)
include(CTags)
option(CTAG_EXCLUDES "Exclude files/directories when running ctag.")
EXCLUDE_OPTS ${CTAG_EXCLUDES}
EXCLUDES "*.js" "*.css" ".tox" "python-common/build")
add_custom_target(tags DEPENDS ctags)
-
-set(VERSION 16.2.2)