]> git.proxmox.com Git - ceph.git/blob - ceph/src/CMakeLists.txt
bump version to 18.2.2-pve1
[ceph.git] / ceph / src / CMakeLists.txt
1 include(GetGitRevisionDescription)
2 include(CheckCXXCompilerFlag)
3
4 # for erasure and compressor plugins
5 set(CEPH_INSTALL_PKGLIBDIR ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME})
6 set(CEPH_INSTALL_FULL_PKGLIBDIR ${CMAKE_INSTALL_FULL_LIBDIR}/${PROJECT_NAME})
7 # for mgr plugins
8 set(CEPH_INSTALL_DATADIR ${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME})
9 # so libceph-common can be found
10 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
11 if(NOT CMAKE_INSTALL_RPATH)
12 set(CMAKE_INSTALL_RPATH "${CEPH_INSTALL_FULL_PKGLIBDIR}")
13 endif()
14
15 # to be compatible with configure_files shared with autoconfig
16 set(bindir ${CMAKE_INSTALL_FULL_BINDIR})
17 set(sbindir ${CMAKE_INSTALL_FULL_SBINDIR})
18 set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
19 set(sysconfdir ${CMAKE_INSTALL_FULL_SYSCONFDIR})
20 set(libexecdir ${CMAKE_INSTALL_FULL_LIBEXECDIR})
21 set(pkgdatadir ${CMAKE_INSTALL_FULL_DATADIR})
22 set(datadir ${CEPH_INSTALL_DATADIR})
23 set(prefix ${CMAKE_INSTALL_PREFIX})
24
25 configure_file(${CMAKE_SOURCE_DIR}/src/init-ceph.in
26 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/init-ceph @ONLY)
27
28 configure_file(ceph-post-file.in
29 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-post-file @ONLY)
30
31 configure_file(ceph-crash.in
32 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-crash @ONLY)
33
34 # the src/.git_version file may be written out by make-dist; otherwise
35 # we pull the git version from .git
36 option(ENABLE_GIT_VERSION "build Ceph with git version string" ON)
37 if(ENABLE_GIT_VERSION)
38 get_git_head_revision(GIT_REFSPEC CEPH_GIT_VER)
39 git_describe(CEPH_GIT_NICE_VER_WITH_V --always)
40 # remove leading 'v'
41 string(SUBSTRING ${CEPH_GIT_NICE_VER_WITH_V} 1 -1 CEPH_GIT_NICE_VER)
42 #if building from a source tarball via make-dist
43 if(${CEPH_GIT_VER} STREQUAL "GITDIR-NOTFOUND")
44 message(STATUS "Ceph/.git directory not found, parsing ${CMAKE_CURRENT_SOURCE_DIR}/.git_version for CEPH_GIT_VER and CEPH_GIT_NICE_VER")
45 file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/.git_version CEPH_GIT_SHA_AND_TAG)
46 list(GET CEPH_GIT_SHA_AND_TAG 0 CEPH_GIT_VER)
47 list(GET CEPH_GIT_SHA_AND_TAG 1 CEPH_GIT_NICE_VER)
48 endif(${CEPH_GIT_VER} STREQUAL "GITDIR-NOTFOUND")
49 else(ENABLE_GIT_VERSION)
50 set(CEPH_GIT_VER "no_version")
51 set(CEPH_GIT_NICE_VER "Development")
52 endif(ENABLE_GIT_VERSION)
53
54 # the src/ceph_release file is 3 lines,
55 # <release number, e.g. '12' for luminous>
56 # <release name, e.g. 'luminous'>
57 # <release type: 'dev' for x.0.z, 'rc' or x.1.z, or 'stable' or x.2.z>
58 # note that the release name is semi-redundant and must match CEPH_RELEASE_*
59 # definitions in include/rados.h and common/ceph_strings.c.
60 file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/ceph_release CEPH_RELEASE_FILE)
61 list(GET CEPH_RELEASE_FILE 0 CEPH_RELEASE)
62 list(GET CEPH_RELEASE_FILE 1 CEPH_RELEASE_NAME)
63 list(GET CEPH_RELEASE_FILE 2 CEPH_RELEASE_TYPE)
64
65 configure_file(${CMAKE_SOURCE_DIR}/src/ceph.in
66 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph @ONLY)
67
68 # Common infrastructure
69 configure_file(
70 ${CMAKE_SOURCE_DIR}/src/ceph_ver.h.in.cmake
71 ${CMAKE_BINARY_DIR}/src/include/ceph_ver.h
72 @ONLY)
73
74 add_definitions(
75 -DHAVE_CONFIG_H
76 -D__CEPH__
77 -D_REENTRANT
78 -D_THREAD_SAFE
79 -D__STDC_FORMAT_MACROS
80 -D_FILE_OFFSET_BITS=64
81 -DBOOST_ASIO_DISABLE_THREAD_KEYWORD_EXTENSION)
82 if(Boost_VERSION VERSION_GREATER_EQUAL 1.74)
83 add_definitions(-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
84 endif()
85
86 if(LINUX)
87 add_definitions("-D_GNU_SOURCE")
88 endif()
89
90 add_compile_options(
91 -Wall
92 -fno-strict-aliasing
93 -fsigned-char)
94
95 if(NOT MSVC)
96 add_compile_options(
97 -Wtype-limits
98 -Wignored-qualifiers
99 -Wpointer-arith
100 -Werror=format-security
101 -Winit-self
102 -Wno-unknown-pragmas)
103 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wnon-virtual-dtor>)
104 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wno-ignored-qualifiers>)
105 endif()
106
107 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-ftemplate-depth-1024>)
108
109 CHECK_CXX_COMPILER_FLAG("-Wpessimizing-move" COMPILER_SUPPORTS_PESSIMIZING_MOVE)
110 if(COMPILER_SUPPORTS_PESSIMIZING_MOVE)
111 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wpessimizing-move>)
112 endif()
113 CHECK_CXX_COMPILER_FLAG("-Wredundant-move" COMPILER_SUPPORTS_REDUNDANT_MOVE)
114 if(COMPILER_SUPPORTS_REDUNDANT_MOVE)
115 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wredundant-move>)
116 endif()
117 if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
118 if(WIN32)
119 # require >= gcc-10 for compiling the windows port
120 set(minimum_gcc_version 10)
121 else()
122 # require >= gcc-11 for compiling the whole tree
123 set(minimum_gcc_version 11)
124 endif()
125 if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS minimum_gcc_version)
126 message(FATAL_ERROR "C++20 support requires a minimum GCC version of ${minimum_gcc_version}.")
127 endif()
128 if(MINGW)
129 # The MINGW headers are missing some "const" qualifiers.
130 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fpermissive>)
131 else()
132 string(APPEND CMAKE_EXE_LINKER_FLAGS " -rdynamic")
133 endif()
134 string(PREPEND CMAKE_CXX_FLAGS_DEBUG "-Og ")
135 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wstrict-null-sentinel>)
136 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Woverloaded-virtual>)
137 # cmake does not add '-pie' for executables even if
138 # CMAKE_POSITION_INDEPENDENT_CODE is TRUE.
139 if(EXE_LINKER_USE_PIE)
140 if (NOT WITH_OSD_INSTRUMENT_FUNCTIONS AND NOT HAVE_SEASTAR)
141 string(APPEND CMAKE_EXE_LINKER_FLAGS " -pie")
142 endif()
143 endif()
144 elseif(CMAKE_CXX_COMPILER_ID STREQUAL Clang)
145 if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12) # require >= clang-12
146 message(FATAL_ERROR "C++20 support requires a minimum Clang version of 12.")
147 endif()
148 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_EXPORTS_C_FLAG}")
149 string(APPEND CMAKE_LINKER_FLAGS " -rdynamic -export-dynamic ${CMAKE_EXE_EXPORTS_C_FLAG}")
150 string(PREPEND CMAKE_CXX_FLAGS_DEBUG "-g ")
151 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wno-inconsistent-missing-override>)
152 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wno-mismatched-tags>)
153 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wno-unused-private-field>)
154 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wno-address-of-packed-member>)
155 add_compile_options(
156 -Wno-unused-function
157 -Wno-unused-local-typedef
158 -Wno-varargs
159 -Wno-gnu-designator
160 -Wno-missing-braces
161 -Wno-parentheses
162 -Wno-deprecated-register)
163 if(FREEBSD)
164 # Need to use the GNU binutils linker to get versioning right.
165 string(APPEND CMAKE_EXE_LINKER_FLAGS " -fuse-ld=/usr/local/bin/ld -Wno-unused-command-line-argument")
166 string(APPEND CMAKE_SHARED_LINKER_FLAGS " -fuse-ld=/usr/local/bin/ld -Wno-unused-command-line-argument")
167 endif()
168 if(APPLE)
169 string(APPEND CMAKE_SHARED_LINKER_FLAGS " -undefined dynamic_lookup")
170 endif()
171 endif(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
172
173 if(WITH_CEPH_DEBUG_MUTEX)
174 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-DCEPH_DEBUG_MUTEX>)
175 endif()
176
177 include(CheckCCompilerFlag)
178 if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
179 CHECK_C_COMPILER_FLAG("-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2" HAS_FORTIFY_SOURCE)
180 if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
181 if(HAS_FORTIFY_SOURCE)
182 add_definitions(
183 -U_FORTIFY_SOURCE
184 -D_FORTIFY_SOURCE=2)
185 endif()
186 endif()
187 CHECK_C_COMPILER_FLAG(-fstack-protector-strong HAS_STACK_PROTECT)
188 if (HAS_STACK_PROTECT)
189 add_compile_options(-fstack-protector-strong)
190 if(WIN32)
191 add_link_options(-fstack-protector-strong)
192 endif(WIN32)
193 endif()
194 endif(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
195
196 CHECK_C_COMPILER_FLAG("-D_GLIBCXX_ASSERTIONS" HAS_GLIBCXX_ASSERTIONS)
197 if(HAS_GLIBCXX_ASSERTIONS AND CMAKE_BUILD_TYPE STREQUAL Debug)
198 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-D_GLIBCXX_ASSERTIONS>)
199 endif()
200
201 include(SIMDExt)
202 if(HAVE_INTEL)
203 if(APPLE)
204 set(object_format "macho64")
205 else()
206 set(object_format "elf64")
207 endif()
208 set(CMAKE_ASM_FLAGS "-f ${object_format}")
209 set(CMAKE_ASM_COMPILER ${PROJECT_SOURCE_DIR}/src/nasm-wrapper)
210 if(NOT WIN32)
211 # The native tools might be located even when cross compiling, which
212 # might not work in this case (especially when targeting Windows).
213 include(CheckNasm)
214 check_nasm_support(${object_format}
215 HAVE_NASM_X64
216 HAVE_NASM_X64_AVX2
217 HAVE_NASM_X64_AVX512)
218 endif()
219 endif()
220
221 # require c++20
222 set(CMAKE_CXX_STANDARD 20)
223 set(CMAKE_CXX_EXTENSIONS OFF)
224 set(CMAKE_CXX_STANDARD_REQUIRED ON)
225 set(CMAKE_C_STANDARD 99)
226 # we use `asm()` to inline assembly, so enable the GNU extension
227 set(CMAKE_C_EXTENSIONS ON)
228 set(C_STANDARD_REQUIRED ON)
229
230 include(CheckCXXSourceCompiles)
231 CHECK_CXX_SOURCE_COMPILES("
232 #include <map>
233 using Map = std::map<int, int>;
234 int main() {
235 Map m;
236 m.merge(Map{});
237 }
238 " HAVE_STDLIB_MAP_SPLICING)
239
240 ## Handle diagnostics color if compiler supports them.
241 CHECK_C_COMPILER_FLAG("-fdiagnostics-color=always"
242 COMPILER_SUPPORTS_DIAGNOSTICS_COLOR)
243
244 set(DIAGNOSTICS_COLOR "auto"
245 CACHE STRING "Used if the C/C++ compiler supports the -fdiagnostics-color option. May have one of three values -- 'auto' (default), 'always', or 'never'. If set to 'always' and the compiler supports the option, 'make [...] | less -R' will make visible diagnostics colorization of compiler output.")
246
247 if(COMPILER_SUPPORTS_DIAGNOSTICS_COLOR)
248 add_compile_options(
249 "$<$<COMPILE_LANGUAGE:C>:-fdiagnostics-color=${DIAGNOSTICS_COLOR}>"
250 "$<$<COMPILE_LANGUAGE:CXX>:-fdiagnostics-color=${DIAGNOSTICS_COLOR}>")
251 endif()
252
253 if(MINGW)
254 # Fedora and RHEL set CMAKE_DL_LIBS on MINGW, which we must un-set here.
255 # Details at https://bugzilla.redhat.com/show_bug.cgi?id=2127529
256 set(CMAKE_DL_LIBS "")
257 endif()
258
259 set(EXTRALIBS ${CMAKE_DL_LIBS})
260 if(HAVE_POSIX_TIMERS)
261 list(APPEND EXTRALIBS ${RT_LIBRARY})
262 endif()
263 if(LINUX OR APPLE)
264 set(LIB_RESOLV resolv)
265 list(APPEND EXTRALIBS ${LIB_RESOLV})
266 endif()
267
268 if(${ENABLE_COVERAGE})
269 find_program(HAVE_GCOV gcov)
270 if(NOT HAVE_GCOV)
271 message(FATAL_ERROR "Coverage Enabled but gcov Not Found")
272 endif()
273 add_compile_options(
274 -fprofile-arcs
275 -ftest-coverage
276 -O0)
277 list(APPEND EXTRALIBS gcov)
278 endif(${ENABLE_COVERAGE})
279
280 if(WITH_TESTS)
281 set(GCOV_PREFIX_STRIP 4)
282 configure_file(${CMAKE_SOURCE_DIR}/src/ceph-coverage.in
283 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-coverage @ONLY)
284 configure_file(${CMAKE_SOURCE_DIR}/src/ceph-debugpack.in
285 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-debugpack @ONLY)
286 endif()
287
288 option(WITH_OCF "build OCF-compliant cluster resource agent" OFF)
289 if(WITH_OCF)
290 add_subdirectory(ocf)
291 endif()
292
293 option(WITH_CEPHFS_JAVA "build libcephfs Java bindings" OFF)
294 if(WITH_CEPHFS_JAVA)
295 add_subdirectory(java)
296 endif()
297
298 if (WITH_BLKIN)
299 add_subdirectory(blkin/blkin-lib)
300 endif(WITH_BLKIN)
301
302 set(mds_files)
303 list(APPEND mds_files
304 mds/MDSMap.cc
305 mds/FSMap.cc
306 mds/FSMapUser.cc
307 mds/inode_backtrace.cc
308 mds/mdstypes.cc
309 mds/flock.cc
310 mds/cephfs_features.cc)
311
312 add_subdirectory(json_spirit)
313
314 include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/src/xxHash")
315
316 # use the rapidjson headers from s3select's submodule
317 if(NOT TARGET RapidJSON::RapidJSON)
318 add_library(RapidJSON::RapidJSON INTERFACE IMPORTED)
319 set_target_properties(RapidJSON::RapidJSON PROPERTIES
320 INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/s3select/rapidjson/include")
321 endif()
322
323 option(WITH_FMT_HEADER_ONLY "use header-only version of fmt library" OFF)
324 set(WITH_FMT_VERSION "8.1.1" CACHE
325 STRING "build with fmt version")
326 find_package(fmt ${WITH_FMT_VERSION} QUIET)
327 if(fmt_FOUND)
328 include_directories(SYSTEM "${fmt_INCLUDE_DIR}")
329 else()
330 message(STATUS "Could not find fmt, will build it")
331 set(old_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
332 set(BUILD_SHARED_LIBS FALSE)
333 add_subdirectory(fmt)
334 set(BUILD_SHARED_LIBS ${old_BUILD_SHARED_LIBS})
335 unset(old_BUILD_SHARED_LIBS)
336 target_compile_definitions(fmt PUBLIC
337 $<$<BOOL:${WIN32}>:FMT_USE_TZSET=0>)
338 include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/src/fmt/include")
339 endif()
340
341 # in osd/PeeringState.h, the number of elements in PeeringState::Active::reactions
342 # is now 21 which exceeds the default value of BOOST_MPL_LIMIT_VECTOR_SIZE, which
343 # is 20. so we need to override it. see
344 # https://www.boost.org/doc/libs/1_74_0/libs/mpl/doc/refmanual/limit-list-size.html
345 # link with this library, if your code includes osd/PeeringState.h (indirectly)
346 add_library(Boost::MPL INTERFACE IMPORTED)
347 set_target_properties(Boost::MPL PROPERTIES
348 INTERFACE_COMPILE_DEFINITIONS
349 "BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS;BOOST_MPL_LIMIT_LIST_SIZE=30")
350
351 if(WITH_SEASTAR)
352 find_package(c-ares 1.13.0 QUIET)
353 if(NOT c-ares_FOUND)
354 message(STATUS "Could not find c-ares, will build it")
355 include(Buildc-ares)
356 build_c_ares()
357 endif()
358 macro(find_package name)
359 if(NOT TARGET ${name})
360 _find_package(${ARGV})
361 endif()
362 endmacro ()
363 set(Seastar_API_LEVEL "6" CACHE STRING "" FORCE)
364 set(Seastar_HWLOC OFF CACHE BOOL "" FORCE)
365 set(Seastar_STD_OPTIONAL_VARIANT_STRINGVIEW ON CACHE BOOL "" FORCE)
366 if(Seastar_DPDK)
367 find_package(dpdk QUIET)
368 if(NOT DPDK_FOUND)
369 include(BuildDPDK)
370 build_dpdk(${CMAKE_BINARY_DIR}/src/dpdk)
371 endif()
372 endif()
373 list(APPEND Seastar_CXX_FLAGS
374 "-DSEASTAR_NO_EXCEPTION_HACK"
375 "-Wno-error"
376 "-Wno-sign-compare"
377 "-Wno-attributes"
378 "-Wno-pessimizing-move"
379 "-Wno-address-of-packed-member"
380 "-Wno-non-virtual-dtor")
381 set(Seastar_CXX_FLAGS "${Seastar_CXX_FLAGS}" CACHE STRING "" FORCE)
382 add_subdirectory(seastar)
383 # create the directory so cmake won't complain when looking at the imported
384 # target: Seastar exports this directory created at build-time
385 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/seastar/gen/include")
386 add_subdirectory(crimson)
387 endif()
388
389 include(CheckTypeSize)
390 set(CMAKE_EXTRA_INCLUDE_FILES "sys/time.h")
391 CHECK_TYPE_SIZE(suseconds_t SUSECONDS_T)
392 unset(CMAKE_EXTRA_INCLUDE_FILES)
393
394 set(libcommon_files
395 ${CMAKE_BINARY_DIR}/src/include/ceph_ver.h
396 ceph_ver.c
397 global/global_context.cc
398 xxHash/xxhash.c
399 common/error_code.cc
400 common/tracer.cc
401 log/Log.cc
402 mon/MonCap.cc
403 mon/MonClient.cc
404 mon/MonMap.cc
405 mon/MonSub.cc
406 mon/error_code.cc
407 mgr/MgrClient.cc
408 mon/PGMap.cc
409 mgr/ServiceMap.cc
410 osd/ECMsgTypes.cc
411 osd/HitSet.cc
412 osd/OSDMap.cc
413 osd/OSDMapMapping.cc
414 osd/osd_types.cc
415 osd/error_code.cc
416 osd/PGPeeringEvent.cc
417 osd/OpRequest.cc
418 osd/ClassHandler.cc
419 osd/osd_op_util.cc
420 osdc/Striper.cc
421 osdc/Objecter.cc
422 osdc/error_code.cc
423 librbd/Features.cc
424 librbd/io/IoOperations.cc
425 ${mds_files})
426
427 set_source_files_properties(ceph_ver.c
428 APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/src/include/ceph_ver.h)
429 add_library(common-objs OBJECT ${libcommon_files})
430 target_compile_definitions(common-objs PRIVATE
431 $<TARGET_PROPERTY:fmt::fmt,INTERFACE_COMPILE_DEFINITIONS>)
432 add_dependencies(common-objs legacy-option-headers)
433
434 if(WITH_JAEGER)
435 find_package(thrift 0.13.0 REQUIRED)
436 include(BuildOpentelemetry)
437 build_opentelemetry()
438 add_library(jaeger_base INTERFACE)
439 target_link_libraries(jaeger_base INTERFACE opentelemetry::libopentelemetry
440 thrift::libthrift)
441 add_dependencies(common-objs jaeger_base)
442 target_link_libraries(common-objs jaeger_base)
443 endif()
444
445 CHECK_C_COMPILER_FLAG("-fvar-tracking-assignments" HAS_VTA)
446 add_subdirectory(auth)
447 add_subdirectory(common)
448 add_subdirectory(crush)
449 add_subdirectory(msg)
450 add_subdirectory(arch)
451 add_subdirectory(extblkdev)
452
453 set(ceph_common_objs
454 $<TARGET_OBJECTS:common-auth-objs>
455 $<TARGET_OBJECTS:common-common-objs>
456 $<TARGET_OBJECTS:common-options-objs>
457 $<TARGET_OBJECTS:common-msg-objs>
458 $<TARGET_OBJECTS:common_buffer_obj>
459 $<TARGET_OBJECTS:common_texttable_obj>
460 $<TARGET_OBJECTS:compressor_objs>
461 $<TARGET_OBJECTS:common-objs>
462 $<TARGET_OBJECTS:common_mountcephfs_objs>
463 $<TARGET_OBJECTS:crush_objs>)
464 set(ceph_common_deps
465 json_spirit erasure_code extblkdev arch crc32
466 ${LIB_RESOLV}
467 Boost::thread
468 Boost::system
469 Boost::random
470 Boost::program_options
471 Boost::date_time
472 Boost::iostreams
473 StdFilesystem::filesystem
474 fmt::fmt
475 ${BLKID_LIBRARIES}
476 ${Backtrace_LIBRARIES}
477 ${BLKIN_LIBRARIES}
478 ${CRYPTO_LIBS}
479 ${GSSAPI_LIBRARIES}
480 ${CMAKE_THREAD_LIBS_INIT}
481 ${CMAKE_DL_LIBS})
482 if(HAVE_UDEV)
483 list(APPEND ceph_common_deps ${UDEV_LIBRARIES})
484 endif()
485
486 if(HAVE_VERBS)
487 list(APPEND ceph_common_deps IBVerbs::verbs)
488 endif()
489
490 if(HAVE_RDMACM)
491 list(APPEND ceph_common_deps RDMA::RDMAcm)
492 endif()
493
494 if(NOT WITH_SYSTEM_BOOST)
495 list(APPEND ceph_common_deps ${ZLIB_LIBRARIES})
496 endif()
497
498 if(HAVE_QATZIP)
499 list(APPEND ceph_common_deps ${qatzip_LIBRARIES})
500 endif()
501
502 if(WITH_DPDK)
503 list(APPEND ceph_common_deps common_async_dpdk)
504 endif()
505
506 if(WITH_JAEGER)
507 list(APPEND ceph_common_deps jaeger_base)
508 endif()
509
510 if(WIN32)
511 list(APPEND ceph_common_deps ws2_32 mswsock iphlpapi bcrypt)
512 list(APPEND ceph_common_deps dlfcn_win32)
513 endif()
514
515 if(WITH_BLUESTORE_PMEM OR WITH_RBD_RWL)
516 if(WITH_SYSTEM_PMDK)
517 set(pmdk_COMPONENTS)
518 if(WITH_BLUESTORE_PMEM)
519 list(APPEND pmdk_COMPONENTS pmem)
520 endif()
521 if(WITH_RBD_RWL)
522 list(APPEND pmdk_COMPONENTS pmemobj)
523 endif()
524 find_package(pmdk 1.8 REQUIRED COMPONENTS ${pmdk_COMPONENTS})
525 else()
526 include(Buildpmdk)
527 if(WITH_BLUESTORE_PMEM)
528 set(enable_ndctl ON)
529 find_package(ndctl 63 REQUIRED)
530 find_package(daxctl 63 REQUIRED)
531 else()
532 set(enable_ndctl OFF)
533 endif()
534 build_pmdk(${enable_ndctl})
535 endif()
536 endif()
537
538 add_library(common STATIC ${ceph_common_objs})
539 target_link_libraries(common ${ceph_common_deps})
540 add_dependencies(common legacy-option-headers)
541 if(WITH_JAEGER)
542 add_dependencies(common jaeger_base)
543 endif()
544
545 if (WIN32)
546 # Statically building ceph-common on Windows fails. We're temporarily
547 # reverting this: 22fefb2338cfc4fcb03ece3cbf77aa964a7f17f2
548 add_library(ceph-common SHARED ${ceph_common_objs})
549 else()
550 add_library(ceph-common ${CEPH_SHARED} ${ceph_common_objs})
551 endif()
552
553 target_link_libraries(ceph-common ${ceph_common_deps})
554 if(ENABLE_COVERAGE)
555 target_link_libraries(ceph-common gcov)
556 endif(ENABLE_COVERAGE)
557
558 add_dependencies(ceph-common legacy-option-headers)
559
560 if(WITH_JAEGER)
561 add_dependencies(ceph-common jaeger_base)
562 endif()
563
564 # appease dpkg-shlibdeps
565 set_target_properties(ceph-common PROPERTIES
566 SOVERSION 2
567 SKIP_RPATH TRUE)
568 if(NOT APPLE AND NOT FREEBSD)
569 # Apple uses Mach-O, not ELF. so this option does not apply to APPLE.
570 #
571 # prefer the local symbol definitions when binding references to global
572 # symbols. otherwise we could reference the symbols defined by the application
573 # with the same name, instead of using the one defined in libceph-common.
574 # in other words, we require libceph-common to use local symbols, even if redefined
575 # in application".
576 set_property(
577 TARGET ceph-common
578 APPEND APPEND_STRING
579 PROPERTY LINK_FLAGS "-Wl,-Bsymbolic -Wl,-Bsymbolic-functions")
580 endif()
581
582 if(MINGW)
583 install(
584 TARGETS ceph-common
585 RUNTIME
586 DESTINATION ${CEPH_INSTALL_PKGLIBDIR})
587 else()
588 install(
589 TARGETS ceph-common
590 LIBRARY
591 DESTINATION ${CEPH_INSTALL_PKGLIBDIR}
592 NAMELINK_SKIP)
593 endif()
594
595 if(${WITH_LTTNG})
596 add_subdirectory(tracing)
597 add_dependencies(common-objs oprequest-tp)
598 endif(${WITH_LTTNG})
599
600 add_subdirectory(global)
601
602 # RGW also support Lua scripting
603 if(WITH_CEPHFS OR WITH_RADOSGW)
604 find_package(Lua 5.3 REQUIRED)
605 endif()
606
607 # rados object classes
608 add_subdirectory(cls)
609
610 # RADOS client/library
611 add_subdirectory(osdc)
612
613 # heal_profiler
614 add_subdirectory(perfglue)
615
616 add_library(rados_snap_set_diff_obj OBJECT librados/snap_set_diff.cc)
617
618 option(WITH_LIBRADOSSTRIPER "build with libradosstriper support" ON)
619
620 add_subdirectory(include)
621 add_subdirectory(librados)
622 add_subdirectory(neorados)
623
624 if(WITH_LIBRADOSSTRIPER)
625 add_subdirectory(libradosstriper)
626 endif()
627
628 # make rocksdb statically
629
630 if(NOT WITH_SYSTEM_ROCKSDB)
631 include(BuildRocksDB)
632 build_rocksdb()
633 endif(NOT WITH_SYSTEM_ROCKSDB)
634
635 if(WITH_MGR)
636 add_subdirectory(mgr)
637 add_subdirectory(exporter)
638 endif()
639
640 set(librados_config_srcs
641 librados-config.cc)
642 add_executable(librados-config ${librados_config_srcs})
643 target_link_libraries(librados-config librados Boost::program_options)
644
645 install(TARGETS librados-config DESTINATION bin)
646
647 # virtualenv base directory for ceph-disk and ceph-detect-init
648 set(CEPH_BUILD_VIRTUALENV $ENV{TMPDIR})
649 if(NOT CEPH_BUILD_VIRTUALENV)
650 set(CEPH_BUILD_VIRTUALENV ${CMAKE_BINARY_DIR})
651 endif()
652
653 if(NOT WIN32)
654 add_subdirectory(pybind)
655 add_subdirectory(ceph-volume)
656 add_subdirectory(python-common)
657 add_subdirectory(cephadm)
658 endif(NOT WIN32)
659
660 # Monitor
661 add_subdirectory(mon)
662 set(ceph_mon_srcs
663 ceph_mon.cc)
664 add_executable(ceph-mon ${ceph_mon_srcs}
665 $<TARGET_OBJECTS:common_texttable_obj>)
666 add_dependencies(ceph-mon erasure_code_plugins)
667 target_link_libraries(ceph-mon mon os global-static ceph-common
668 ${ALLOC_LIBS}
669 ${EXTRALIBS}
670 ${CMAKE_DL_LIBS}
671 ${GSSAPI_LIBRARIES})
672 install(TARGETS ceph-mon DESTINATION bin)
673
674 # OSD/ObjectStore
675
676 include(TestBigEndian)
677 test_big_endian(CEPH_BIG_ENDIAN)
678 if(NOT CEPH_BIG_ENDIAN)
679 set(CEPH_LITTLE_ENDIAN 1)
680 endif()
681
682 add_subdirectory(kv)
683 add_subdirectory(os)
684
685 if(NOT WIN32)
686 add_subdirectory(blk)
687 add_subdirectory(osd)
688
689 set(ceph_osd_srcs
690 # Link the Object Class API implementation directly as intermediary
691 # static library (like libosd.a) nullifies the effect of `-rdynamic`.
692 osd/objclass.cc
693 objclass/class_api.cc
694 ceph_osd.cc)
695
696 add_executable(ceph-osd ${ceph_osd_srcs})
697 add_dependencies(ceph-osd erasure_code_plugins extblkdev_plugins)
698 target_link_libraries(ceph-osd osd os global-static common
699 ${ALLOC_LIBS}
700 ${BLKID_LIBRARIES})
701 if(WITH_FUSE)
702 target_link_libraries(ceph-osd FUSE::FUSE)
703 endif()
704 set_target_properties(ceph-osd PROPERTIES
705 POSITION_INDEPENDENT_CODE ${EXE_LINKER_USE_PIE}
706 INSTALL_RPATH "")
707 install(TARGETS ceph-osd DESTINATION bin)
708
709 endif(NOT WIN32)
710
711 if (WITH_CEPHFS)
712 add_subdirectory(mds)
713 set(ceph_mds_srcs
714 ceph_mds.cc)
715 add_executable(ceph-mds ${ceph_mds_srcs})
716 target_link_libraries(ceph-mds mds ${CMAKE_DL_LIBS} global-static ceph-common
717 Boost::thread
718 ${ALLOC_LIBS})
719 install(TARGETS ceph-mds DESTINATION bin)
720 endif()
721
722 add_subdirectory(erasure-code)
723
724 # Support/Tools
725 if(WITH_TESTS)
726 option(WITH_SYSTEM_GTEST "require and build with system gtest and gmock" OFF)
727 if(WITH_SYSTEM_GTEST)
728 find_package(GTest REQUIRED)
729 find_package(GMock REQUIRED)
730 else()
731 set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
732 add_subdirectory(googletest)
733 add_library(GMock::GMock ALIAS gmock)
734 add_library(GMock::Main ALIAS gmock_main)
735 target_include_directories(gmock INTERFACE
736 $<TARGET_PROPERTY:gtest,INTERFACE_INCLUDE_DIRECTORIES>)
737 target_include_directories(gmock_main INTERFACE
738 $<TARGET_PROPERTY:gtest,INTERFACE_INCLUDE_DIRECTORIES>)
739 add_library(GTest::GTest ALIAS gtest)
740 add_library(GTest::Main ALIAS gtest_main)
741 endif()
742 endif(WITH_TESTS)
743
744 # dmClock (after gmock)
745 option(WITH_DMCLOCK_TESTS
746 "enable the build of dmclock-tests and dmclock-data-struct tests binaries"
747 OFF)
748 if(WITH_TESTS AND WITH_DMCLOCK_TESTS)
749 # note: add_test is not being called, so dmclock tests aren't part
750 # of ceph tests
751 set(dmclock_TEST ON CACHE BOOL "" FORCE)
752 endif()
753 add_subdirectory(dmclock)
754
755 add_subdirectory(compressor)
756
757 add_subdirectory(tools)
758
759 if(WITH_TESTS)
760 add_subdirectory(test)
761 endif()
762
763 add_subdirectory(crypto)
764
765 if(WITH_TESTS)
766 install(PROGRAMS
767 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-debugpack
768 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-coverage
769 DESTINATION bin)
770 endif()
771
772 install(PROGRAMS
773 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph
774 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-post-file
775 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-crash
776 ceph-run
777 ceph-clsinfo
778 DESTINATION bin)
779 install(PROGRAMS
780 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/init-ceph
781 DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/init.d
782 RENAME ceph)
783
784 install(FILES
785 ${CMAKE_SOURCE_DIR}/share/id_rsa_drop.ceph.com
786 ${CMAKE_SOURCE_DIR}/share/id_rsa_drop.ceph.com.pub
787 ${CMAKE_SOURCE_DIR}/share/known_hosts_drop.ceph.com
788 DESTINATION ${CMAKE_INSTALL_DATADIR}/ceph)
789
790 install(PROGRAMS
791 ceph_common.sh
792 ceph-osd-prestart.sh
793 DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/ceph)
794
795 install(PROGRAMS
796 ceph-create-keys
797 DESTINATION sbin)
798
799 add_subdirectory(bash_completion)
800 add_subdirectory(client)
801
802 if(WITH_LIBCEPHFS)
803 set(libcephfs_srcs libcephfs.cc)
804 add_library(cephfs ${CEPH_SHARED} ${libcephfs_srcs})
805 target_link_libraries(cephfs PRIVATE client ceph-common
806 ${CRYPTO_LIBS} ${EXTRALIBS})
807 if(ENABLE_SHARED)
808 set_target_properties(cephfs PROPERTIES
809 OUTPUT_NAME cephfs
810 VERSION 2.0.0
811 SOVERSION 2)
812 if(NOT APPLE)
813 foreach(name ceph-common client osdc)
814 set_property(TARGET cephfs APPEND_STRING PROPERTY
815 LINK_FLAGS " -Wl,--exclude-libs,lib${name}.a")
816 endforeach()
817 endif()
818 endif(ENABLE_SHARED)
819 install(TARGETS cephfs DESTINATION ${CMAKE_INSTALL_LIBDIR})
820 install(DIRECTORY
821 "include/cephfs"
822 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
823 set(ceph_syn_srcs
824 ceph_syn.cc
825 client/SyntheticClient.cc)
826 add_executable(ceph-syn ${ceph_syn_srcs})
827 target_link_libraries(ceph-syn client global-static ceph-common)
828 install(TARGETS ceph-syn DESTINATION bin)
829 if(LINUX)
830 add_subdirectory(mount)
831 endif()
832 endif(WITH_LIBCEPHFS)
833
834 if(WITH_LIBCEPHSQLITE)
835 set(cephsqlite_srcs libcephsqlite.cc SimpleRADOSStriper.cc)
836 add_library(cephsqlite ${CEPH_SHARED} ${cephsqlite_srcs})
837 target_link_libraries(cephsqlite PRIVATE cls_lock_client librados ceph-common SQLite3::SQLite3 ${EXTRALIBS})
838 set_target_properties(cephsqlite PROPERTIES
839 CXX_VISIBILITY_PRESET hidden
840 VISIBILITY_INLINES_HIDDEN ON)
841 if(NOT APPLE AND NOT WIN32)
842 set_property(TARGET cephsqlite APPEND_STRING PROPERTY
843 LINK_FLAGS " -Wl,--exclude-libs,ALL")
844 endif()
845 install(TARGETS cephsqlite DESTINATION ${CMAKE_INSTALL_LIBDIR})
846 endif(WITH_LIBCEPHSQLITE)
847
848 if(WITH_FUSE)
849 set(ceph_fuse_srcs
850 ceph_fuse.cc
851 client/fuse_ll.cc)
852 add_executable(ceph-fuse ${ceph_fuse_srcs})
853 target_link_libraries(ceph-fuse FUSE::FUSE
854 ${GSSAPI_LIBRARIES} client ceph-common global-static ${EXTRALIBS})
855 set_target_properties(ceph-fuse PROPERTIES
856 POSITION_INDEPENDENT_CODE ${EXE_LINKER_USE_PIE})
857 install(TARGETS ceph-fuse DESTINATION bin)
858 install(PROGRAMS mount.fuse.ceph DESTINATION ${CMAKE_INSTALL_SBINDIR})
859 endif(WITH_FUSE)
860
861 if(WITH_DOKAN)
862 add_subdirectory(dokan)
863 endif(WITH_DOKAN)
864
865 add_subdirectory(journal)
866
867 if(WITH_RBD)
868 if(WITH_KRBD)
869 add_library(krbd STATIC krbd.cc
870 $<TARGET_OBJECTS:parse_secret_objs>)
871 target_link_libraries(krbd keyutils::keyutils)
872 endif()
873 add_subdirectory(librbd)
874 if(WITH_FUSE)
875 add_subdirectory(rbd_fuse)
876 endif()
877
878 install(PROGRAMS
879 ceph-rbdnamer
880 rbd-replay-many
881 rbdmap
882 DESTINATION ${CMAKE_INSTALL_BINDIR})
883 add_subdirectory(rbd_replay)
884 endif(WITH_RBD)
885
886 set(SPAWN_BUILD_TESTS OFF CACHE INTERNAL "disable building of spawn unit tests")
887 set(SPAWN_INSTALL OFF CACHE INTERNAL "disable installation of spawn headers")
888 add_subdirectory(spawn)
889
890 # RadosGW
891 if(WITH_KVS)
892 add_subdirectory(key_value_store)
893 endif(WITH_KVS)
894
895 if(WITH_RADOSGW)
896 if(WITH_RADOSGW_SELECT_PARQUET OR WITH_RADOSGW_ARROW_FLIGHT)
897 if(WITH_SYSTEM_ARROW)
898 find_package(Arrow 4 REQUIRED QUIET)
899 find_package(Parquet 4 REQUIRED QUIET)
900 else()
901 # find arrow's dependencies
902 if (WITH_SYSTEM_UTF8PROC)
903 find_package(utf8proc 2.2.0 REQUIRED)
904 else()
905 include(BuildUtf8proc)
906 build_utf8proc()
907 endif()
908 find_package(thrift 0.13 REQUIRED)
909
910 include(BuildArrow)
911 build_arrow()
912 endif(WITH_SYSTEM_ARROW)
913 endif(WITH_RADOSGW_SELECT_PARQUET OR WITH_RADOSGW_ARROW_FLIGHT)
914
915 add_subdirectory(libkmip)
916 add_subdirectory(rgw)
917 endif(WITH_RADOSGW)
918
919 install(FILES
920 sample.ceph.conf
921 DESTINATION ${CMAKE_INSTALL_DOCDIR})
922
923 # Now create a usable config.h
924 configure_file(
925 ${CMAKE_SOURCE_DIR}/src/include/config-h.in.cmake
926 ${CMAKE_BINARY_DIR}/include/acconfig.h
927 )
928
929 # Everything you need to spin up a cluster with vstart.sh
930 add_custom_target(vstart-base DEPENDS
931 ceph-osd
932 ceph-mon
933 ceph-authtool
934 ceph-conf
935 monmaptool
936 crushtool
937 rados)
938 if(NOT WIN32)
939 # WIN32 port does not build python bindings
940 # TODO: introduce an option for enabling python binding
941 add_dependencies(vstart-base
942 cython_rados)
943 endif()
944
945 if (WITH_MGR)
946 add_dependencies(vstart-base ceph-mgr)
947 add_dependencies(vstart-base ceph-exporter)
948 endif()
949
950 add_custom_target(vstart DEPENDS vstart-base)
951 if(WITH_RBD AND NOT WIN32)
952 add_dependencies(vstart cython_rbd)
953 endif()
954 if (WITH_CEPHFS)
955 add_dependencies(vstart ceph-mds cephfs cython_cephfs)
956 endif()
957 if(WITH_RADOSGW)
958 add_dependencies(vstart radosgw radosgw-admin)
959 endif()
960
961 if(WITH_LTTNG)
962 add_dependencies(vstart tracepoint_libraries)
963 endif(WITH_LTTNG)
964
965 if(WITH_MGR AND WITH_MGR_DASHBOARD_FRONTEND AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64")
966 add_dependencies(vstart mgr-dashboard-frontend-build)
967 endif()
968
969 if(WITH_MGR)
970 add_dependencies(vstart ceph-volume-venv-setup)
971 endif()
972
973 if(WITH_MGR)
974 add_dependencies(vstart cephadm)
975 endif()
976
977 # Everything you need to run CephFS tests
978 add_custom_target(cephfs_testing DEPENDS
979 vstart
980 rados
981 cython_modules
982 cephfs
983 cls_cephfs
984 ceph-fuse
985 ceph-dencoder
986 ceph-dencoder-modules
987 cephfs-journal-tool
988 cephfs-meta-injection
989 cephfs-data-scan
990 cephfs-table-tool)
991
992 if (IS_DIRECTORY "${PROJECT_SOURCE_DIR}/.git")
993 add_custom_target(
994 git-update
995 COMMAND git submodule sync
996 COMMAND git submodule update --force --init --recursive
997 WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
998 endif()
999
1000 add_subdirectory(script)
1001
1002 # add doxygen target
1003 find_package(Doxygen)
1004 if(DOXYGEN_FOUND)
1005 set(DOXYGEN_FILE_PATTERNS *.cc *.c *.cpp *.C *.cxx *.c++ *.CC *.H *.h *.hh *.hpp)
1006 set(DOXYGEN_SOURCE_BROWSER YES)
1007 set(DOXYGEN_WARN_IF_UNDOCUMENTED NO)
1008 # enabling clang slows down doxygen significantly
1009 set(DOXYGEN_CLANG_ASSISTED_PARSING NO)
1010 set(DOXYGEN_CLANG_DATABASE_PATH "${PROJECT_BINARY_DIR}")
1011 set(DOXYGEN_BUILTIN_STL_SUPPORT YES)
1012 set(DOXYGEN_RECURSIVE YES)
1013 set(DOXYGEN_QUIET YES)
1014 set(DOXYGEN_GENERATE_LATEX NO)
1015 set(DOXYGEN_GENERATE_XML NO)
1016 set(DOXYGEN_GENERATE_HTML YES)
1017 set(DOXYGEN_PROJECT_NAME Ceph)
1018 set(DOXYGEN_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/build-doc/doxygen")
1019 set(DOXYGEN_STRIP_FROM_PATH "src/")
1020 set(DOXYGEN_STRIP_FROM_INC_PATH "src/include")
1021 set(DOXYGEN_JAVADOC_AUTOBRIEF YES)
1022 set(DOXYGEN_HAVE_DOT NO)
1023 set(DOXYGEN_VERBATIM_HEADERS YES)
1024 doxygen_add_docs(doxygen
1025 auth
1026 client
1027 cls
1028 common
1029 compressor
1030 crimson
1031 crush
1032 crypto
1033 erasure-code
1034 global
1035 include
1036 journal
1037 json_spirit
1038 key_value_store
1039 kv
1040 librados
1041 libradosstriper
1042 librbd
1043 log
1044 mds
1045 messages
1046 mgr
1047 mon
1048 mount
1049 msg
1050 objclass
1051 objsync
1052 os
1053 osd
1054 osdc
1055 perfglue
1056 rbd_fuse
1057 rbd_replay
1058 rgw
1059 COMMENT "Generate C++ documentation")
1060 endif()