]> git.proxmox.com Git - ceph.git/blame - ceph/src/rocksdb/CMakeLists.txt
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / rocksdb / CMakeLists.txt
CommitLineData
7c673cae
FG
1# Prerequisites for Windows:
2# This cmake build is for Windows 64-bit only.
3#
4# Prerequisites:
1e59de90 5# You must have at least Visual Studio 2019. Start the Developer Command Prompt window that is a part of Visual Studio installation.
7c673cae
FG
6# Run the build commands from within the Developer Command Prompt window to have paths to the compiler and runtime libraries set.
7# You must have git.exe in your %PATH% environment variable.
8#
9# To build Rocksdb for Windows is as easy as 1-2-3-4-5:
10#
11# 1. Update paths to third-party libraries in thirdparty.inc file
12# 2. Create a new directory for build artifacts
13# mkdir build
14# cd build
15# 3. Run cmake to generate project files for Windows, add more options to enable required third-party libraries.
16# See thirdparty.inc for more information.
1e59de90 17# sample command: cmake -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Release -DWITH_GFLAGS=1 -DWITH_SNAPPY=1 -DWITH_JEMALLOC=1 -DWITH_JNI=1 ..
7c673cae 18# 4. Then build the project in debug mode (you may want to add /m[:<N>] flag to run msbuild in <N> parallel threads
11fdf7f2 19# or simply /m to use all avail cores)
7c673cae
FG
20# msbuild rocksdb.sln
21#
22# rocksdb.sln build features exclusions of test only code in Release. If you build ALL_BUILD then everything
23# will be attempted but test only code does not build in Release mode.
24#
25# 5. And release mode (/m[:<N>] is also supported)
26# msbuild rocksdb.sln /p:Configuration=Release
27#
28# Linux:
29#
1e59de90 30# 1. Install a recent toolchain if you're on a older distro. C++17 required (GCC >= 7, Clang >= 5)
7c673cae
FG
31# 2. mkdir build; cd build
32# 3. cmake ..
33# 4. make -j
34
1e59de90 35cmake_minimum_required(VERSION 3.10)
f67539c2
TL
36
37list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/")
38include(ReadVersion)
1e59de90 39include(GoogleTest)
f67539c2
TL
40get_rocksdb_version(rocksdb_VERSION)
41project(rocksdb
42 VERSION ${rocksdb_VERSION}
1e59de90
TL
43 DESCRIPTION "An embeddable persistent key-value store for fast storage"
44 HOMEPAGE_URL https://rocksdb.org/
f67539c2 45 LANGUAGES CXX C ASM)
7c673cae
FG
46
47if(POLICY CMP0042)
48 cmake_policy(SET CMP0042 NEW)
49endif()
50
f67539c2
TL
51if(NOT CMAKE_BUILD_TYPE)
52 if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
53 set(default_build_type "Debug")
54 else()
55 set(default_build_type "RelWithDebInfo")
56 endif()
57 set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING
58 "Default BUILD_TYPE is ${default_build_type}" FORCE)
59endif()
60
61find_program(CCACHE_FOUND ccache)
62if(CCACHE_FOUND)
63 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
64 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
65endif(CCACHE_FOUND)
7c673cae 66
11fdf7f2 67option(WITH_JEMALLOC "build with JeMalloc" OFF)
1e59de90 68option(WITH_LIBURING "build with liburing" ON)
11fdf7f2
TL
69option(WITH_SNAPPY "build with SNAPPY" OFF)
70option(WITH_LZ4 "build with lz4" OFF)
71option(WITH_ZLIB "build with zlib" OFF)
72option(WITH_ZSTD "build with zstd" OFF)
494da23a
TL
73option(WITH_WINDOWS_UTF8_FILENAMES "use UTF8 as characterset for opening files, regardles of the system code page" OFF)
74if (WITH_WINDOWS_UTF8_FILENAMES)
75 add_definitions(-DROCKSDB_WINDOWS_UTF8_FILENAMES)
76endif()
1e59de90
TL
77option(ROCKSDB_BUILD_SHARED "Build shared versions of the RocksDB libraries" ON)
78
79if ($ENV{CIRCLECI})
80 message(STATUS "Build for CircieCI env, a few tests may be disabled")
81 add_definitions(-DCIRCLECI)
f67539c2
TL
82endif()
83
20effc67 84if( NOT DEFINED CMAKE_CXX_STANDARD )
1e59de90 85 set(CMAKE_CXX_STANDARD 17)
20effc67
TL
86endif()
87
f67539c2 88include(CMakeDependentOption)
f67539c2 89
7c673cae 90if(MSVC)
1e59de90 91 option(WITH_GFLAGS "build with GFlags" OFF)
11fdf7f2 92 option(WITH_XPRESS "build with windows built in compression" OFF)
1e59de90
TL
93 option(ROCKSDB_SKIP_THIRDPARTY "skip thirdparty.inc" OFF)
94
95 if(NOT ROCKSDB_SKIP_THIRDPARTY)
96 include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc)
97 endif()
7c673cae 98else()
20effc67 99 if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND NOT CMAKE_SYSTEM_NAME MATCHES "kFreeBSD")
11fdf7f2 100 # FreeBSD has jemalloc as default malloc
7c673cae
FG
101 # but it does not have all the jemalloc files in include/...
102 set(WITH_JEMALLOC ON)
103 else()
104 if(WITH_JEMALLOC)
105 find_package(JeMalloc REQUIRED)
106 add_definitions(-DROCKSDB_JEMALLOC -DJEMALLOC_NO_DEMANGLE)
f67539c2 107 list(APPEND THIRDPARTY_LIBS JeMalloc::JeMalloc)
7c673cae
FG
108 endif()
109 endif()
11fdf7f2 110
1e59de90
TL
111 if(MINGW)
112 option(WITH_GFLAGS "build with GFlags" OFF)
113 else()
114 option(WITH_GFLAGS "build with GFlags" ON)
115 endif()
20effc67 116 set(GFLAGS_LIB)
11fdf7f2 117 if(WITH_GFLAGS)
20effc67
TL
118 # Config with namespace available since gflags 2.2.2
119 option(GFLAGS_USE_TARGET_NAMESPACE "Use gflags import target with namespace." ON)
120 find_package(gflags CONFIG)
121 if(gflags_FOUND)
122 if(TARGET ${GFLAGS_TARGET})
123 # Config with GFLAGS_TARGET available since gflags 2.2.0
124 set(GFLAGS_LIB ${GFLAGS_TARGET})
125 else()
126 # Config with GFLAGS_LIBRARIES available since gflags 2.1.0
1e59de90 127 set(GFLAGS_LIB ${gflags_LIBRARIES})
20effc67
TL
128 endif()
129 else()
130 find_package(gflags REQUIRED)
1e59de90 131 set(GFLAGS_LIB gflags::gflags)
20effc67
TL
132 endif()
133 include_directories(${GFLAGS_INCLUDE_DIR})
134 list(APPEND THIRDPARTY_LIBS ${GFLAGS_LIB})
f67539c2 135 add_definitions(-DGFLAGS=1)
11fdf7f2
TL
136 endif()
137
7c673cae 138 if(WITH_SNAPPY)
20effc67
TL
139 find_package(Snappy CONFIG)
140 if(NOT Snappy_FOUND)
141 find_package(Snappy REQUIRED)
142 endif()
7c673cae 143 add_definitions(-DSNAPPY)
20effc67 144 list(APPEND THIRDPARTY_LIBS Snappy::snappy)
7c673cae 145 endif()
7c673cae 146
11fdf7f2 147 if(WITH_ZLIB)
494da23a 148 find_package(ZLIB REQUIRED)
11fdf7f2 149 add_definitions(-DZLIB)
f67539c2 150 list(APPEND THIRDPARTY_LIBS ZLIB::ZLIB)
11fdf7f2
TL
151 endif()
152
153 option(WITH_BZ2 "build with bzip2" OFF)
154 if(WITH_BZ2)
f67539c2 155 find_package(BZip2 REQUIRED)
11fdf7f2 156 add_definitions(-DBZIP2)
f67539c2
TL
157 if(BZIP2_INCLUDE_DIRS)
158 include_directories(${BZIP2_INCLUDE_DIRS})
159 else()
160 include_directories(${BZIP2_INCLUDE_DIR})
161 endif()
11fdf7f2
TL
162 list(APPEND THIRDPARTY_LIBS ${BZIP2_LIBRARIES})
163 endif()
164
165 if(WITH_LZ4)
166 find_package(lz4 REQUIRED)
167 add_definitions(-DLZ4)
f67539c2 168 list(APPEND THIRDPARTY_LIBS lz4::lz4)
11fdf7f2
TL
169 endif()
170
171 if(WITH_ZSTD)
172 find_package(zstd REQUIRED)
173 add_definitions(-DZSTD)
174 include_directories(${ZSTD_INCLUDE_DIR})
f67539c2 175 list(APPEND THIRDPARTY_LIBS zstd::zstd)
11fdf7f2 176 endif()
7c673cae
FG
177endif()
178
11fdf7f2
TL
179option(WITH_MD_LIBRARY "build with MD" ON)
180if(WIN32 AND MSVC)
181 if(WITH_MD_LIBRARY)
182 set(RUNTIME_LIBRARY "MD")
183 else()
184 set(RUNTIME_LIBRARY "MT")
7c673cae
FG
185 endif()
186endif()
187
7c673cae
FG
188if(MSVC)
189 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /nologo /EHsc /GS /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue")
11fdf7f2 190 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
7c673cae 191else()
1e59de90
TL
192 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall -pthread")
193 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare -Wshadow -Wno-unused-parameter -Wno-unused-variable -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers -Wno-strict-aliasing -Wno-invalid-offsetof")
194 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
195 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-prototypes")
196 endif()
7c673cae 197 if(MINGW)
1e59de90 198 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format")
f67539c2 199 add_definitions(-D_POSIX_C_SOURCE=1)
7c673cae 200 endif()
7c673cae 201 if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
11fdf7f2 202 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
7c673cae
FG
203 include(CheckCXXCompilerFlag)
204 CHECK_CXX_COMPILER_FLAG("-momit-leaf-frame-pointer" HAVE_OMIT_LEAF_FRAME_POINTER)
205 if(HAVE_OMIT_LEAF_FRAME_POINTER)
206 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -momit-leaf-frame-pointer")
207 endif()
208 endif()
209endif()
210
11fdf7f2 211include(CheckCCompilerFlag)
20effc67
TL
212if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
213 CHECK_C_COMPILER_FLAG("-mcpu=power9" HAS_POWER9)
214 if(HAS_POWER9)
215 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power9 -mtune=power9")
216 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power9 -mtune=power9")
217 else()
218 CHECK_C_COMPILER_FLAG("-mcpu=power8" HAS_POWER8)
219 if(HAS_POWER8)
220 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power8 -mtune=power8")
221 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power8 -mtune=power8")
222 endif(HAS_POWER8)
223 endif(HAS_POWER9)
11fdf7f2
TL
224 CHECK_C_COMPILER_FLAG("-maltivec" HAS_ALTIVEC)
225 if(HAS_ALTIVEC)
226 message(STATUS " HAS_ALTIVEC yes")
227 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maltivec")
228 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maltivec")
11fdf7f2 229 endif(HAS_ALTIVEC)
20effc67 230endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
11fdf7f2 231
1e59de90 232if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64|AARCH64")
f67539c2
TL
233 CHECK_C_COMPILER_FLAG("-march=armv8-a+crc+crypto" HAS_ARMV8_CRC)
234 if(HAS_ARMV8_CRC)
235 message(STATUS " HAS_ARMV8_CRC yes")
236 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function")
237 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function")
238 endif(HAS_ARMV8_CRC)
1e59de90
TL
239endif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64|AARCH64")
240
241if(CMAKE_SYSTEM_PROCESSOR MATCHES "s390x")
242 CHECK_C_COMPILER_FLAG("-march=native" HAS_S390X_MARCH_NATIVE)
243 if(HAS_S390X_MARCH_NATIVE)
244 message(STATUS " HAS_S390X_MARCH_NATIVE yes")
245 endif(HAS_S390X_MARCH_NATIVE)
246endif(CMAKE_SYSTEM_PROCESSOR MATCHES "s390x")
f67539c2 247
11fdf7f2
TL
248option(PORTABLE "build a portable binary" OFF)
249option(FORCE_SSE42 "force building with SSE4.2, even when PORTABLE=ON" OFF)
20effc67
TL
250option(FORCE_AVX "force building with AVX, even when PORTABLE=ON" OFF)
251option(FORCE_AVX2 "force building with AVX2, even when PORTABLE=ON" OFF)
11fdf7f2 252if(PORTABLE)
1e59de90
TL
253 add_definitions(-DROCKSDB_PORTABLE)
254
11fdf7f2
TL
255 # MSVC does not need a separate compiler flag to enable SSE4.2; if nmmintrin.h
256 # is available, it is available by default.
257 if(FORCE_SSE42 AND NOT MSVC)
258 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpclmul")
259 endif()
20effc67
TL
260 if(MSVC)
261 if(FORCE_AVX)
262 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX")
263 endif()
264 # MSVC automatically enables BMI / lzcnt with AVX2.
265 if(FORCE_AVX2)
266 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
267 endif()
268 else()
269 if(FORCE_AVX)
270 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx")
271 endif()
272 if(FORCE_AVX2)
273 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mbmi -mlzcnt")
274 endif()
1e59de90
TL
275 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^s390x")
276 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=z196")
277 endif()
20effc67 278 endif()
11fdf7f2
TL
279else()
280 if(MSVC)
281 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
282 else()
1e59de90
TL
283 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^s390x" AND NOT HAS_S390X_MARCH_NATIVE)
284 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=z196")
285 elseif(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64" AND NOT HAS_ARMV8_CRC)
11fdf7f2
TL
286 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
287 endif()
288 endif()
289endif()
290
94b18763 291include(CheckCXXSourceCompiles)
1e59de90 292set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
94b18763 293if(NOT MSVC)
11fdf7f2 294 set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
94b18763 295endif()
20effc67 296
94b18763
FG
297CHECK_CXX_SOURCE_COMPILES("
298#include <cstdint>
299#include <nmmintrin.h>
11fdf7f2 300#include <wmmintrin.h>
94b18763
FG
301int main() {
302 volatile uint32_t x = _mm_crc32_u32(0, 0);
11fdf7f2
TL
303 const auto a = _mm_set_epi64x(0, 0);
304 const auto b = _mm_set_epi64x(0, 0);
305 const auto c = _mm_clmulepi64_si128(a, b, 0x00);
306 auto d = _mm_cvtsi128_si64(c);
94b18763
FG
307}
308" HAVE_SSE42)
11fdf7f2
TL
309if(HAVE_SSE42)
310 add_definitions(-DHAVE_SSE42)
311 add_definitions(-DHAVE_PCLMUL)
312elseif(FORCE_SSE42)
313 message(FATAL_ERROR "FORCE_SSE42=ON but unable to compile with SSE4.2 enabled")
314endif()
315
1e59de90
TL
316# Check if -latomic is required or not
317if (NOT MSVC)
318 set(CMAKE_REQUIRED_FLAGS "--std=c++17")
319 CHECK_CXX_SOURCE_COMPILES("
320#include <atomic>
321std::atomic<uint64_t> x(0);
11fdf7f2 322int main() {
1e59de90
TL
323 uint64_t i = x.load(std::memory_order_relaxed);
324 bool b = x.is_lock_free();
325 return 0;
11fdf7f2 326}
1e59de90
TL
327" BUILTIN_ATOMIC)
328 if (NOT BUILTIN_ATOMIC)
329 #TODO: Check if -latomic exists
330 list(APPEND THIRDPARTY_LIBS atomic)
331 endif()
332endif()
333
334if (WITH_LIBURING)
335 find_package(uring)
336 if (uring_FOUND)
337 add_definitions(-DROCKSDB_IOURING_PRESENT)
338 list(APPEND THIRDPARTY_LIBS uring::uring)
339 endif()
340endif()
341
342# Reset the required flags
343set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
344
345option(WITH_IOSTATS_CONTEXT "Enable IO stats context" ON)
346if (NOT WITH_IOSTATS_CONTEXT)
347 add_definitions(-DNIOSTATS_CONTEXT)
348endif()
349
350option(WITH_PERF_CONTEXT "Enable perf context" ON)
351if (NOT WITH_PERF_CONTEXT)
352 add_definitions(-DNPERF_CONTEXT)
94b18763
FG
353endif()
354
7c673cae
FG
355option(FAIL_ON_WARNINGS "Treat compile warnings as errors" ON)
356if(FAIL_ON_WARNINGS)
357 if(MSVC)
358 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")
359 else() # assume GCC
360 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
361 endif()
362endif()
363
364option(WITH_ASAN "build with ASAN" OFF)
365if(WITH_ASAN)
7c673cae
FG
366 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
367 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
368 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
369 if(WITH_JEMALLOC)
370 message(FATAL "ASAN does not work well with JeMalloc")
371 endif()
372endif()
373
374option(WITH_TSAN "build with TSAN" OFF)
375if(WITH_TSAN)
1e59de90 376 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread -Wl,-pie")
7c673cae
FG
377 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fPIC")
378 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fPIC")
379 if(WITH_JEMALLOC)
380 message(FATAL "TSAN does not work well with JeMalloc")
381 endif()
382endif()
383
384option(WITH_UBSAN "build with UBSAN" OFF)
385if(WITH_UBSAN)
11fdf7f2 386 add_definitions(-DROCKSDB_UBSAN_RUN)
7c673cae
FG
387 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined")
388 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
389 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined")
390 if(WITH_JEMALLOC)
391 message(FATAL "UBSAN does not work well with JeMalloc")
392 endif()
393endif()
394
11fdf7f2
TL
395option(WITH_NUMA "build with NUMA policy support" OFF)
396if(WITH_NUMA)
397 find_package(NUMA REQUIRED)
398 add_definitions(-DNUMA)
399 include_directories(${NUMA_INCLUDE_DIR})
f67539c2 400 list(APPEND THIRDPARTY_LIBS NUMA::NUMA)
11fdf7f2 401endif()
7c673cae 402
11fdf7f2
TL
403option(WITH_TBB "build with Threading Building Blocks (TBB)" OFF)
404if(WITH_TBB)
405 find_package(TBB REQUIRED)
406 add_definitions(-DTBB)
f67539c2 407 list(APPEND THIRDPARTY_LIBS TBB::TBB)
11fdf7f2
TL
408endif()
409
410# Stall notifications eat some performance from inserts
411option(DISABLE_STALL_NOTIF "Build with stall notifications" OFF)
412if(DISABLE_STALL_NOTIF)
413 add_definitions(-DROCKSDB_DISABLE_STALL_NOTIFICATION)
414endif()
415
f67539c2
TL
416option(WITH_DYNAMIC_EXTENSION "build with dynamic extension support" OFF)
417if(NOT WITH_DYNAMIC_EXTENSION)
418 add_definitions(-DROCKSDB_NO_DYNAMIC_EXTENSION)
419endif()
11fdf7f2 420
20effc67
TL
421option(ASSERT_STATUS_CHECKED "build with assert status checked" OFF)
422if (ASSERT_STATUS_CHECKED)
423 message(STATUS "Build with assert status checked")
424 add_definitions(-DROCKSDB_ASSERT_STATUS_CHECKED)
425endif()
426
1e59de90
TL
427
428# RTTI is by default AUTO which enables it in debug and disables it in release.
429set(USE_RTTI AUTO CACHE STRING "Enable RTTI in builds")
430set_property(CACHE USE_RTTI PROPERTY STRINGS AUTO ON OFF)
431if(USE_RTTI STREQUAL "AUTO")
432 message(STATUS "Enabling RTTI in Debug builds only (default)")
433 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
434 if(MSVC)
435 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
11fdf7f2 436 else()
1e59de90 437 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti")
11fdf7f2 438 endif()
1e59de90
TL
439elseif(USE_RTTI)
440 message(STATUS "Enabling RTTI in all builds")
11fdf7f2 441 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
1e59de90
TL
442 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DROCKSDB_USE_RTTI")
443else()
11fdf7f2 444 if(MSVC)
1e59de90
TL
445 message(STATUS "Disabling RTTI in Release builds. Always on in Debug.")
446 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
447 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
11fdf7f2 448 else()
1e59de90
TL
449 message(STATUS "Disabling RTTI in all builds")
450 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-rtti")
11fdf7f2
TL
451 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti")
452 endif()
7c673cae
FG
453endif()
454
11fdf7f2
TL
455# Used to run CI build and tests so we can run faster
456option(OPTDBG "Build optimized debug build with MSVC" OFF)
457option(WITH_RUNTIME_DEBUG "build with debug version of runtime library" ON)
7c673cae 458if(MSVC)
11fdf7f2 459 if(OPTDBG)
7c673cae 460 message(STATUS "Debug optimization is enabled")
11fdf7f2
TL
461 set(CMAKE_CXX_FLAGS_DEBUG "/Oxt")
462 else()
20effc67
TL
463 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /RTC1")
464
465 # Minimal Build is deprecated after MSVC 2015
466 if( MSVC_VERSION GREATER 1900 )
467 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Gm-")
468 else()
469 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Gm")
470 endif()
471
11fdf7f2
TL
472 endif()
473 if(WITH_RUNTIME_DEBUG)
474 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}d")
7c673cae 475 else()
11fdf7f2 476 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}")
7c673cae
FG
477 endif()
478 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
479
480 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
481 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
482endif()
483
484if(CMAKE_COMPILER_IS_GNUCXX)
485 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-memcmp")
486endif()
487
488option(ROCKSDB_LITE "Build RocksDBLite version" OFF)
489if(ROCKSDB_LITE)
490 add_definitions(-DROCKSDB_LITE)
494da23a 491 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -Os")
7c673cae
FG
492endif()
493
494if(CMAKE_SYSTEM_NAME MATCHES "Cygwin")
495 add_definitions(-fno-builtin-memcmp -DCYGWIN)
496elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
497 add_definitions(-DOS_MACOSX)
7c673cae
FG
498elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
499 add_definitions(-DOS_LINUX)
500elseif(CMAKE_SYSTEM_NAME MATCHES "SunOS")
501 add_definitions(-DOS_SOLARIS)
20effc67
TL
502elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD")
503 add_definitions(-DOS_GNU_KFREEBSD)
7c673cae
FG
504elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
505 add_definitions(-DOS_FREEBSD)
506elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
507 add_definitions(-DOS_NETBSD)
508elseif(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
509 add_definitions(-DOS_OPENBSD)
510elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly")
511 add_definitions(-DOS_DRAGONFLYBSD)
512elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
513 add_definitions(-DOS_ANDROID)
514elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
515 add_definitions(-DWIN32 -DOS_WIN -D_MBCS -DWIN64 -DNOMINMAX)
516 if(MINGW)
517 add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_VISTA)
518 endif()
519endif()
520
521if(NOT WIN32)
522 add_definitions(-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX)
523endif()
524
525option(WITH_FALLOCATE "build with fallocate" ON)
7c673cae 526if(WITH_FALLOCATE)
11fdf7f2 527 CHECK_CXX_SOURCE_COMPILES("
7c673cae
FG
528#include <fcntl.h>
529#include <linux/falloc.h>
530int main() {
531 int fd = open(\"/dev/null\", 0);
494da23a 532 fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, 1024);
7c673cae
FG
533}
534" HAVE_FALLOCATE)
535 if(HAVE_FALLOCATE)
536 add_definitions(-DROCKSDB_FALLOCATE_PRESENT)
537 endif()
538endif()
539
11fdf7f2
TL
540CHECK_CXX_SOURCE_COMPILES("
541#include <fcntl.h>
542int main() {
543 int fd = open(\"/dev/null\", 0);
544 sync_file_range(fd, 0, 1024, SYNC_FILE_RANGE_WRITE);
545}
546" HAVE_SYNC_FILE_RANGE_WRITE)
547if(HAVE_SYNC_FILE_RANGE_WRITE)
548 add_definitions(-DROCKSDB_RANGESYNC_PRESENT)
549endif()
550
551CHECK_CXX_SOURCE_COMPILES("
552#include <pthread.h>
553int main() {
554 (void) PTHREAD_MUTEX_ADAPTIVE_NP;
555}
556" HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
557if(HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
558 add_definitions(-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX)
559endif()
560
561include(CheckCXXSymbolExists)
20effc67
TL
562if(CMAKE_SYSTEM_NAME MATCHES "^FreeBSD")
563 check_cxx_symbol_exists(malloc_usable_size malloc_np.h HAVE_MALLOC_USABLE_SIZE)
564else()
565 check_cxx_symbol_exists(malloc_usable_size malloc.h HAVE_MALLOC_USABLE_SIZE)
566endif()
7c673cae
FG
567if(HAVE_MALLOC_USABLE_SIZE)
568 add_definitions(-DROCKSDB_MALLOC_USABLE_SIZE)
569endif()
570
11fdf7f2
TL
571check_cxx_symbol_exists(sched_getcpu sched.h HAVE_SCHED_GETCPU)
572if(HAVE_SCHED_GETCPU)
573 add_definitions(-DROCKSDB_SCHED_GETCPU_PRESENT)
574endif()
575
b3b6e05e
TL
576check_cxx_symbol_exists(getauxval auvx.h HAVE_AUXV_GETAUXVAL)
577if(HAVE_AUXV_GETAUXVAL)
578 add_definitions(-DROCKSDB_AUXV_GETAUXVAL_PRESENT)
579endif()
580
1e59de90
TL
581check_cxx_symbol_exists(F_FULLFSYNC "fcntl.h" HAVE_FULLFSYNC)
582if(HAVE_FULLFSYNC)
583 add_definitions(-DHAVE_FULLFSYNC)
584endif()
585
7c673cae
FG
586include_directories(${PROJECT_SOURCE_DIR})
587include_directories(${PROJECT_SOURCE_DIR}/include)
1e59de90
TL
588
589if(USE_COROUTINES)
590 if(USE_FOLLY OR USE_FOLLY_LITE)
591 message(FATAL_ERROR "Please specify exactly one of USE_COROUTINES,"
592 " USE_FOLLY, and USE_FOLLY_LITE")
593 endif()
594 set(CMAKE_CXX_STANDARD 20)
595 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines -Wno-maybe-uninitialized")
596 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated")
597 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-redundant-move")
598 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-invalid-memory-model")
599 add_compile_definitions(USE_COROUTINES)
600 set(USE_FOLLY 1)
601endif()
602
603if(USE_FOLLY)
604 if(USE_FOLLY_LITE)
605 message(FATAL_ERROR "Please specify one of USE_FOLLY or USE_FOLLY_LITE")
606 endif()
607 if(ROCKSDB_BUILD_SHARED)
608 message(FATAL_ERROR "Cannot build RocksDB shared library with folly")
609 endif()
610 set(ROCKSDB_BUILD_SHARED OFF)
611 set(GFLAGS_SHARED FALSE)
612 find_package(folly)
613 # If cmake could not find the folly-config.cmake file, fall back
614 # to looking in third-party/folly for folly and its dependencies
615 if(NOT FOLLY_LIBRARIES)
616 exec_program(python3 ${PROJECT_SOURCE_DIR}/third-party/folly ARGS
617 build/fbcode_builder/getdeps.py show-inst-dir OUTPUT_VARIABLE
618 FOLLY_INST_PATH)
619 exec_program(ls ARGS -d ${FOLLY_INST_PATH}/../boost* OUTPUT_VARIABLE
620 BOOST_INST_PATH)
621 exec_program(ls ARGS -d ${FOLLY_INST_PATH}/../fmt* OUTPUT_VARIABLE
622 FMT_INST_PATH)
623 exec_program(ls ARGS -d ${FOLLY_INST_PATH}/../gflags* OUTPUT_VARIABLE
624 GFLAGS_INST_PATH)
625 set(Boost_DIR ${BOOST_INST_PATH}/lib/cmake/Boost-1.78.0)
626 if(EXISTS ${FMT_INST_PATH}/lib64)
627 set(fmt_DIR ${FMT_INST_PATH}/lib64/cmake/fmt)
628 else()
629 set(fmt_DIR ${FMT_INST_PATH}/lib/cmake/fmt)
630 endif()
631 set(gflags_DIR ${GFLAGS_INST_PATH}/lib/cmake/gflags)
632
633 exec_program(sed ARGS -i 's/gflags_shared//g'
634 ${FOLLY_INST_PATH}/lib/cmake/folly/folly-targets.cmake)
635
636 include(${FOLLY_INST_PATH}/lib/cmake/folly/folly-config.cmake)
637 endif()
638
639 add_compile_definitions(USE_FOLLY FOLLY_NO_CONFIG HAVE_CXX11_ATOMIC)
640 list(APPEND THIRDPARTY_LIBS Folly::folly)
641 set(FOLLY_LIBS Folly::folly)
642 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--copy-dt-needed-entries")
f67539c2 643endif()
7c673cae
FG
644find_package(Threads REQUIRED)
645
7c673cae
FG
646# Main library source code
647
648set(SOURCES
20effc67 649 cache/cache.cc
1e59de90
TL
650 cache/cache_entry_roles.cc
651 cache/cache_key.cc
652 cache/cache_reservation_manager.cc
653 cache/charged_cache.cc
7c673cae 654 cache/clock_cache.cc
1e59de90 655 cache/compressed_secondary_cache.cc
7c673cae 656 cache/lru_cache.cc
1e59de90 657 cache/secondary_cache.cc
7c673cae 658 cache/sharded_cache.cc
f67539c2 659 db/arena_wrapped_db_iter.cc
1e59de90
TL
660 db/blob/blob_contents.cc
661 db/blob/blob_fetcher.cc
20effc67
TL
662 db/blob/blob_file_addition.cc
663 db/blob/blob_file_builder.cc
664 db/blob/blob_file_cache.cc
665 db/blob/blob_file_garbage.cc
666 db/blob/blob_file_meta.cc
667 db/blob/blob_file_reader.cc
1e59de90 668 db/blob/blob_garbage_meter.cc
20effc67
TL
669 db/blob/blob_log_format.cc
670 db/blob/blob_log_sequential_reader.cc
671 db/blob/blob_log_writer.cc
1e59de90
TL
672 db/blob/blob_source.cc
673 db/blob/prefetch_buffer_collection.cc
7c673cae
FG
674 db/builder.cc
675 db/c.cc
676 db/column_family.cc
f67539c2
TL
677 db/compaction/compaction.cc
678 db/compaction/compaction_iterator.cc
679 db/compaction/compaction_picker.cc
680 db/compaction/compaction_job.cc
681 db/compaction/compaction_picker_fifo.cc
682 db/compaction/compaction_picker_level.cc
683 db/compaction/compaction_picker_universal.cc
1e59de90
TL
684 db/compaction/compaction_service_job.cc
685 db/compaction/compaction_state.cc
686 db/compaction/compaction_outputs.cc
20effc67 687 db/compaction/sst_partitioner.cc
1e59de90 688 db/compaction/subcompaction_state.cc
7c673cae
FG
689 db/convenience.cc
690 db/db_filesnapshot.cc
1e59de90 691 db/db_impl/compacted_db_impl.cc
f67539c2
TL
692 db/db_impl/db_impl.cc
693 db/db_impl/db_impl_write.cc
694 db/db_impl/db_impl_compaction_flush.cc
695 db/db_impl/db_impl_files.cc
696 db/db_impl/db_impl_open.cc
697 db/db_impl/db_impl_debug.cc
698 db/db_impl/db_impl_experimental.cc
699 db/db_impl/db_impl_readonly.cc
700 db/db_impl/db_impl_secondary.cc
7c673cae
FG
701 db/db_info_dumper.cc
702 db/db_iter.cc
703 db/dbformat.cc
11fdf7f2 704 db/error_handler.cc
7c673cae
FG
705 db/event_helpers.cc
706 db/experimental.cc
707 db/external_sst_file_ingestion_job.cc
708 db/file_indexer.cc
709 db/flush_job.cc
710 db/flush_scheduler.cc
711 db/forward_iterator.cc
f67539c2 712 db/import_column_family_job.cc
7c673cae 713 db/internal_stats.cc
11fdf7f2 714 db/logs_with_prep_tracker.cc
7c673cae
FG
715 db/log_reader.cc
716 db/log_writer.cc
11fdf7f2 717 db/malloc_stats.cc
7c673cae
FG
718 db/memtable.cc
719 db/memtable_list.cc
720 db/merge_helper.cc
721 db/merge_operator.cc
20effc67 722 db/output_validator.cc
1e59de90 723 db/periodic_task_scheduler.cc
7c673cae 724 db/range_del_aggregator.cc
494da23a 725 db/range_tombstone_fragmenter.cc
7c673cae 726 db/repair.cc
1e59de90 727 db/seqno_to_time_mapping.cc
7c673cae
FG
728 db/snapshot_impl.cc
729 db/table_cache.cc
730 db/table_properties_collector.cc
731 db/transaction_log_impl.cc
f67539c2 732 db/trim_history_scheduler.cc
7c673cae
FG
733 db/version_builder.cc
734 db/version_edit.cc
20effc67 735 db/version_edit_handler.cc
7c673cae 736 db/version_set.cc
20effc67 737 db/wal_edit.cc
7c673cae 738 db/wal_manager.cc
1e59de90
TL
739 db/wide/wide_column_serialization.cc
740 db/wide/wide_columns.cc
7c673cae
FG
741 db/write_batch.cc
742 db/write_batch_base.cc
743 db/write_controller.cc
744 db/write_thread.cc
1e59de90 745 env/composite_env.cc
7c673cae
FG
746 env/env.cc
747 env/env_chroot.cc
11fdf7f2 748 env/env_encryption.cc
f67539c2 749 env/file_system.cc
20effc67 750 env/file_system_tracer.cc
1e59de90 751 env/fs_remap.cc
11fdf7f2 752 env/mock_env.cc
1e59de90 753 env/unique_id_gen.cc
f67539c2
TL
754 file/delete_scheduler.cc
755 file/file_prefetch_buffer.cc
756 file/file_util.cc
757 file/filename.cc
1e59de90 758 file/line_file_reader.cc
f67539c2
TL
759 file/random_access_file_reader.cc
760 file/read_write_util.cc
761 file/readahead_raf.cc
762 file/sequence_file_reader.cc
763 file/sst_file_manager_impl.cc
764 file/writable_file_writer.cc
765 logging/auto_roll_logger.cc
766 logging/event_logger.cc
767 logging/log_buffer.cc
768 memory/arena.cc
769 memory/concurrent_arena.cc
770 memory/jemalloc_nodump_allocator.cc
20effc67 771 memory/memkind_kmem_allocator.cc
1e59de90 772 memory/memory_allocator.cc
11fdf7f2 773 memtable/alloc_tracker.cc
7c673cae
FG
774 memtable/hash_linklist_rep.cc
775 memtable/hash_skiplist_rep.cc
7c673cae
FG
776 memtable/skiplistrep.cc
777 memtable/vectorrep.cc
11fdf7f2 778 memtable/write_buffer_manager.cc
7c673cae
FG
779 monitoring/histogram.cc
780 monitoring/histogram_windowing.cc
f67539c2 781 monitoring/in_memory_stats_history.cc
7c673cae
FG
782 monitoring/instrumented_mutex.cc
783 monitoring/iostats_context.cc
784 monitoring/perf_context.cc
785 monitoring/perf_level.cc
f67539c2 786 monitoring/persistent_stats_history.cc
7c673cae
FG
787 monitoring/statistics.cc
788 monitoring/thread_status_impl.cc
789 monitoring/thread_status_updater.cc
790 monitoring/thread_status_util.cc
791 monitoring/thread_status_util_debug.cc
792 options/cf_options.cc
20effc67
TL
793 options/configurable.cc
794 options/customizable.cc
7c673cae
FG
795 options/db_options.cc
796 options/options.cc
797 options/options_helper.cc
798 options/options_parser.cc
7c673cae 799 port/stack_trace.cc
f67539c2 800 table/adaptive/adaptive_table_factory.cc
20effc67 801 table/block_based/binary_search_index_reader.cc
f67539c2 802 table/block_based/block.cc
f67539c2
TL
803 table/block_based/block_based_table_builder.cc
804 table/block_based/block_based_table_factory.cc
20effc67 805 table/block_based/block_based_table_iterator.cc
f67539c2
TL
806 table/block_based/block_based_table_reader.cc
807 table/block_based/block_builder.cc
20effc67 808 table/block_based/block_prefetcher.cc
f67539c2
TL
809 table/block_based/block_prefix_index.cc
810 table/block_based/data_block_hash_index.cc
811 table/block_based/data_block_footer.cc
812 table/block_based/filter_block_reader_common.cc
813 table/block_based/filter_policy.cc
814 table/block_based/flush_block_policy.cc
815 table/block_based/full_filter_block.cc
20effc67 816 table/block_based/hash_index_reader.cc
f67539c2 817 table/block_based/index_builder.cc
20effc67 818 table/block_based/index_reader_common.cc
f67539c2
TL
819 table/block_based/parsed_full_filter_block.cc
820 table/block_based/partitioned_filter_block.cc
20effc67
TL
821 table/block_based/partitioned_index_iterator.cc
822 table/block_based/partitioned_index_reader.cc
823 table/block_based/reader_common.cc
f67539c2 824 table/block_based/uncompression_dict_reader.cc
11fdf7f2 825 table/block_fetcher.cc
f67539c2
TL
826 table/cuckoo/cuckoo_table_builder.cc
827 table/cuckoo/cuckoo_table_factory.cc
828 table/cuckoo/cuckoo_table_reader.cc
7c673cae 829 table/format.cc
7c673cae 830 table/get_context.cc
7c673cae
FG
831 table/iterator.cc
832 table/merging_iterator.cc
833 table/meta_blocks.cc
7c673cae 834 table/persistent_cache_helper.cc
f67539c2
TL
835 table/plain/plain_table_bloom.cc
836 table/plain/plain_table_builder.cc
837 table/plain/plain_table_factory.cc
838 table/plain/plain_table_index.cc
839 table/plain/plain_table_key_coding.cc
840 table/plain/plain_table_reader.cc
20effc67 841 table/sst_file_dumper.cc
494da23a 842 table/sst_file_reader.cc
7c673cae 843 table/sst_file_writer.cc
20effc67 844 table/table_factory.cc
7c673cae
FG
845 table/table_properties.cc
846 table/two_level_iterator.cc
1e59de90 847 table/unique_id.cc
f67539c2
TL
848 test_util/sync_point.cc
849 test_util/sync_point_impl.cc
850 test_util/testutil.cc
851 test_util/transaction_test_util.cc
852 tools/block_cache_analyzer/block_cache_trace_analyzer.cc
7c673cae 853 tools/dump/db_dump_tool.cc
20effc67 854 tools/io_tracer_parser_tool.cc
7c673cae
FG
855 tools/ldb_cmd.cc
856 tools/ldb_tool.cc
857 tools/sst_dump_tool.cc
11fdf7f2 858 tools/trace_analyzer_tool.cc
f67539c2 859 trace_replay/block_cache_tracer.cc
20effc67 860 trace_replay/io_tracer.cc
1e59de90
TL
861 trace_replay/trace_record_handler.cc
862 trace_replay/trace_record_result.cc
863 trace_replay/trace_record.cc
864 trace_replay/trace_replay.cc
865 util/async_file_reader.cc
866 util/cleanable.cc
7c673cae
FG
867 util/coding.cc
868 util/compaction_job_stats_impl.cc
869 util/comparator.cc
1e59de90 870 util/compression.cc
11fdf7f2 871 util/compression_context_cache.cc
494da23a 872 util/concurrent_task_limiter_impl.cc
7c673cae 873 util/crc32c.cc
7c673cae 874 util/dynamic_bloom.cc
7c673cae 875 util/hash.cc
7c673cae
FG
876 util/murmurhash.cc
877 util/random.cc
878 util/rate_limiter.cc
1e59de90 879 util/ribbon_config.cc
7c673cae 880 util/slice.cc
f67539c2 881 util/file_checksum_helper.cc
7c673cae 882 util/status.cc
1e59de90 883 util/stderr_logger.cc
7c673cae 884 util/string_util.cc
7c673cae
FG
885 util/thread_local.cc
886 util/threadpool_imp.cc
7c673cae 887 util/xxhash.cc
1e59de90
TL
888 utilities/agg_merge/agg_merge.cc
889 utilities/backup/backup_engine.cc
11fdf7f2 890 utilities/blob_db/blob_compaction_filter.cc
7c673cae 891 utilities/blob_db/blob_db.cc
11fdf7f2
TL
892 utilities/blob_db/blob_db_impl.cc
893 utilities/blob_db/blob_db_impl_filesnapshot.cc
894 utilities/blob_db/blob_dump_tool.cc
895 utilities/blob_db/blob_file.cc
1e59de90
TL
896 utilities/cache_dump_load.cc
897 utilities/cache_dump_load_impl.cc
11fdf7f2
TL
898 utilities/cassandra/cassandra_compaction_filter.cc
899 utilities/cassandra/format.cc
900 utilities/cassandra/merge_operator.cc
7c673cae 901 utilities/checkpoint/checkpoint_impl.cc
1e59de90 902 utilities/compaction_filters.cc
7c673cae 903 utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc
1e59de90 904 utilities/counted_fs.cc
11fdf7f2 905 utilities/debug.cc
7c673cae
FG
906 utilities/env_mirror.cc
907 utilities/env_timed.cc
20effc67
TL
908 utilities/fault_injection_env.cc
909 utilities/fault_injection_fs.cc
1e59de90 910 utilities/fault_injection_secondary_cache.cc
7c673cae 911 utilities/leveldb_options/leveldb_options.cc
7c673cae 912 utilities/memory/memory_util.cc
1e59de90 913 utilities/merge_operators.cc
11fdf7f2 914 utilities/merge_operators/bytesxor.cc
7c673cae
FG
915 utilities/merge_operators/max.cc
916 utilities/merge_operators/put.cc
f67539c2 917 utilities/merge_operators/sortlist.cc
7c673cae
FG
918 utilities/merge_operators/string_append/stringappend.cc
919 utilities/merge_operators/string_append/stringappend2.cc
920 utilities/merge_operators/uint64add.cc
f67539c2 921 utilities/object_registry.cc
7c673cae
FG
922 utilities/option_change_migration/option_change_migration.cc
923 utilities/options/options_util.cc
924 utilities/persistent_cache/block_cache_tier.cc
925 utilities/persistent_cache/block_cache_tier_file.cc
926 utilities/persistent_cache/block_cache_tier_metadata.cc
927 utilities/persistent_cache/persistent_cache_tier.cc
928 utilities/persistent_cache/volatile_tier_impl.cc
f67539c2 929 utilities/simulator_cache/cache_simulator.cc
7c673cae 930 utilities/simulator_cache/sim_cache.cc
7c673cae 931 utilities/table_properties_collectors/compact_on_deletion_collector.cc
11fdf7f2 932 utilities/trace/file_trace_reader_writer.cc
1e59de90 933 utilities/trace/replayer_impl.cc
20effc67
TL
934 utilities/transactions/lock/lock_manager.cc
935 utilities/transactions/lock/point/point_lock_tracker.cc
936 utilities/transactions/lock/point/point_lock_manager.cc
1e59de90
TL
937 utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc
938 utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc
7c673cae 939 utilities/transactions/optimistic_transaction_db_impl.cc
11fdf7f2
TL
940 utilities/transactions/optimistic_transaction.cc
941 utilities/transactions/pessimistic_transaction.cc
942 utilities/transactions/pessimistic_transaction_db.cc
943 utilities/transactions/snapshot_checker.cc
7c673cae 944 utilities/transactions/transaction_base.cc
7c673cae 945 utilities/transactions/transaction_db_mutex_impl.cc
7c673cae 946 utilities/transactions/transaction_util.cc
11fdf7f2
TL
947 utilities/transactions/write_prepared_txn.cc
948 utilities/transactions/write_prepared_txn_db.cc
949 utilities/transactions/write_unprepared_txn.cc
950 utilities/transactions/write_unprepared_txn_db.cc
7c673cae 951 utilities/ttl/db_ttl_impl.cc
1e59de90 952 utilities/wal_filter.cc
7c673cae 953 utilities/write_batch_with_index/write_batch_with_index.cc
1e59de90
TL
954 utilities/write_batch_with_index/write_batch_with_index_internal.cc)
955
956list(APPEND SOURCES
957 utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc
958 utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc
959 utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc
960 utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc
961 utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc
962 utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc
963 utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc
964 utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc
965 utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc
966 utilities/transactions/lock/range/range_tree/lib/standalone_port.cc
967 utilities/transactions/lock/range/range_tree/lib/util/dbt.cc
968 utilities/transactions/lock/range/range_tree/lib/util/memarena.cc)
969
970message(STATUS "ROCKSDB_PLUGINS: ${ROCKSDB_PLUGINS}")
971if ( ROCKSDB_PLUGINS )
972 string(REPLACE " " ";" PLUGINS ${ROCKSDB_PLUGINS})
973 foreach (plugin ${PLUGINS})
974 add_subdirectory("plugin/${plugin}")
975 foreach (src ${${plugin}_SOURCES})
976 list(APPEND SOURCES plugin/${plugin}/${src})
977 set_source_files_properties(
978 plugin/${plugin}/${src}
979 PROPERTIES COMPILE_FLAGS "${${plugin}_COMPILE_FLAGS}")
980 endforeach()
981 foreach (path ${${plugin}_INCLUDE_PATHS})
982 include_directories(${path})
983 endforeach()
984 foreach (lib ${${plugin}_LIBS})
985 list(APPEND THIRDPARTY_LIBS ${lib})
986 endforeach()
987 foreach (link_path ${${plugin}_LINK_PATHS})
988 link_directories(AFTER ${link_path})
989 endforeach()
990 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${${plugin}_CMAKE_SHARED_LINKER_FLAGS}")
991 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${${plugin}_CMAKE_EXE_LINKER_FLAGS}")
992 endforeach()
993endif()
7c673cae 994
494da23a
TL
995if(HAVE_SSE42 AND NOT MSVC)
996 set_source_files_properties(
997 util/crc32c.cc
998 PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul")
11fdf7f2
TL
999endif()
1000
20effc67 1001if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
11fdf7f2
TL
1002 list(APPEND SOURCES
1003 util/crc32c_ppc.c
1004 util/crc32c_ppc_asm.S)
20effc67 1005endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
11fdf7f2 1006
f67539c2
TL
1007if(HAS_ARMV8_CRC)
1008 list(APPEND SOURCES
1009 util/crc32c_arm64.cc)
1010endif(HAS_ARMV8_CRC)
1011
7c673cae
FG
1012if(WIN32)
1013 list(APPEND SOURCES
1014 port/win/io_win.cc
1015 port/win/env_win.cc
1016 port/win/env_default.cc
1017 port/win/port_win.cc
1e59de90
TL
1018 port/win/win_logger.cc
1019 port/win/win_thread.cc)
11fdf7f2
TL
1020if(WITH_XPRESS)
1021 list(APPEND SOURCES
7c673cae 1022 port/win/xpress_win.cc)
11fdf7f2
TL
1023endif()
1024
1025if(WITH_JEMALLOC)
1026 list(APPEND SOURCES
1027 port/win/win_jemalloc.cc)
1028endif()
1029
7c673cae
FG
1030else()
1031 list(APPEND SOURCES
1032 port/port_posix.cc
1033 env/env_posix.cc
f67539c2 1034 env/fs_posix.cc
7c673cae
FG
1035 env/io_posix.cc)
1036endif()
1037
1e59de90 1038if(USE_FOLLY_LITE)
f67539c2 1039 list(APPEND SOURCES
1e59de90 1040 third-party/folly/folly/container/detail/F14Table.cpp
f67539c2 1041 third-party/folly/folly/detail/Futex.cpp
1e59de90
TL
1042 third-party/folly/folly/lang/SafeAssert.cpp
1043 third-party/folly/folly/lang/ToAscii.cpp
1044 third-party/folly/folly/ScopeGuard.cpp
f67539c2
TL
1045 third-party/folly/folly/synchronization/AtomicNotification.cpp
1046 third-party/folly/folly/synchronization/DistributedMutex.cpp
1e59de90
TL
1047 third-party/folly/folly/synchronization/ParkingLot.cpp)
1048 include_directories(${PROJECT_SOURCE_DIR}/third-party/folly)
1049 add_definitions(-DUSE_FOLLY -DFOLLY_NO_CONFIG)
1050 list(APPEND THIRDPARTY_LIBS glog)
f67539c2
TL
1051endif()
1052
11fdf7f2
TL
1053set(ROCKSDB_STATIC_LIB rocksdb${ARTIFACT_SUFFIX})
1054set(ROCKSDB_SHARED_LIB rocksdb-shared${ARTIFACT_SUFFIX})
f67539c2 1055
11fdf7f2 1056
7c673cae 1057if(WIN32)
f67539c2 1058 set(SYSTEM_LIBS ${SYSTEM_LIBS} shlwapi.lib rpcrt4.lib)
7c673cae 1059else()
11fdf7f2 1060 set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
7c673cae
FG
1061endif()
1062
1e59de90
TL
1063set(ROCKSDB_PLUGIN_EXTERNS "")
1064set(ROCKSDB_PLUGIN_BUILTINS "")
1065message(STATUS "ROCKSDB PLUGINS TO BUILD ${ROCKSDB_PLUGINS}")
1066foreach(PLUGIN IN LISTS PLUGINS)
1067 set(PLUGIN_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/plugin/${PLUGIN}/")
1068 message(STATUS "PLUGIN ${PLUGIN} including rocksb plugin ${PLUGIN_ROOT}")
1069 set(PLUGINMKFILE "${PLUGIN_ROOT}${PLUGIN}.mk")
1070 if (NOT EXISTS ${PLUGINMKFILE})
1071 message(FATAL_ERROR "PLUGIN ${PLUGIN} Missing plugin makefile: ${PLUGINMKFILE}")
1072 endif()
1073 file(READ ${PLUGINMKFILE} PLUGINMK)
1074
1075 string(REGEX MATCH "SOURCES = ([^\n]*)" FOO ${PLUGINMK})
1076 set(MK_SOURCES ${CMAKE_MATCH_1})
1077 separate_arguments(MK_SOURCES)
1078 foreach(MK_FILE IN LISTS MK_SOURCES)
1079 list(APPEND SOURCES "${PLUGIN_ROOT}${MK_FILE}")
1080 message(STATUS "PLUGIN ${PLUGIN} Appending ${PLUGIN_ROOT}${MK_FILE} to SOURCES")
1081 endforeach()
1082
1083 string(REGEX MATCH "_FUNC = ([^\n]*)" FOO ${PLUGINMK})
1084 if (NOT ${CMAKE_MATCH_1} STREQUAL "")
1085 string(APPEND ROCKSDB_PLUGIN_BUILTINS "{\"${PLUGIN}\", " ${CMAKE_MATCH_1} "},")
1086 string(APPEND ROCKSDB_PLUGIN_EXTERNS "int " ${CMAKE_MATCH_1} "(ROCKSDB_NAMESPACE::ObjectLibrary&, const std::string&); ")
1087 endif()
1088
1089 string(REGEX MATCH "_LIBS = ([^\n]*)" FOO ${PLUGINMK})
1090 separate_arguments(CMAKE_MATCH_1)
1091 foreach(MK_LIB IN LISTS CMAKE_MATCH_1)
1092 list(APPEND THIRDPARTY_LIBS "${MK_LIB}")
1093 endforeach()
1094 message(STATUS "PLUGIN ${PLUGIN} THIRDPARTY_LIBS=${THIRDPARTY_LIBS}")
1095
1096 #TODO: We need to set any compile/link-time flags and add any link libraries
1097endforeach()
1098
1099string(TIMESTAMP TS "%Y-%m-%d %H:%M:%S" UTC)
1100set(BUILD_DATE "${TS}" CACHE STRING "the time we first built rocksdb")
1101
1102find_package(Git)
1103
1104if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
1105 execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_SHA COMMAND "${GIT_EXECUTABLE}" rev-parse HEAD )
1106 execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" RESULT_VARIABLE GIT_MOD COMMAND "${GIT_EXECUTABLE}" diff-index HEAD --quiet)
1107 execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_DATE COMMAND "${GIT_EXECUTABLE}" log -1 --date=format:"%Y-%m-%d %T" --format="%ad")
1108 execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_TAG RESULT_VARIABLE rv COMMAND "${GIT_EXECUTABLE}" symbolic-ref -q --short HEAD OUTPUT_STRIP_TRAILING_WHITESPACE)
1109 if (rv AND NOT rv EQUAL 0)
1110 execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_TAG COMMAND "${GIT_EXECUTABLE}" describe --tags --exact-match OUTPUT_STRIP_TRAILING_WHITESPACE)
1111 endif()
1112else()
1113 set(GIT_SHA 0)
1114 set(GIT_MOD 1)
1115endif()
1116string(REGEX REPLACE "[^0-9a-fA-F]+" "" GIT_SHA "${GIT_SHA}")
1117string(REGEX REPLACE "[^0-9: /-]+" "" GIT_DATE "${GIT_DATE}")
1118
1119set(BUILD_VERSION_CC ${CMAKE_BINARY_DIR}/build_version.cc)
1120configure_file(util/build_version.cc.in ${BUILD_VERSION_CC} @ONLY)
1121
1122add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES} ${BUILD_VERSION_CC})
20effc67 1123target_link_libraries(${ROCKSDB_STATIC_LIB} PRIVATE
7c673cae
FG
1124 ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
1125
f67539c2 1126if(ROCKSDB_BUILD_SHARED)
1e59de90 1127 add_library(${ROCKSDB_SHARED_LIB} SHARED ${SOURCES} ${BUILD_VERSION_CC})
20effc67 1128 target_link_libraries(${ROCKSDB_SHARED_LIB} PRIVATE
7c673cae 1129 ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
f67539c2
TL
1130
1131 if(WIN32)
1132 set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
1133 COMPILE_DEFINITIONS "ROCKSDB_DLL;ROCKSDB_LIBRARY_EXPORTS")
1134 if(MSVC)
1135 set_target_properties(${ROCKSDB_STATIC_LIB} PROPERTIES
1136 COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_STATIC_LIB}.pdb")
1137 set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
1138 COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_SHARED_LIB}.pdb")
1139 endif()
1140 else()
1141 set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
1142 LINKER_LANGUAGE CXX
1143 VERSION ${rocksdb_VERSION}
1144 SOVERSION ${rocksdb_VERSION_MAJOR}
1e59de90 1145 OUTPUT_NAME "rocksdb${ARTIFACT_SUFFIX}")
7c673cae
FG
1146 endif()
1147endif()
1148
f67539c2
TL
1149if(ROCKSDB_BUILD_SHARED AND NOT WIN32)
1150 set(ROCKSDB_LIB ${ROCKSDB_SHARED_LIB})
1151else()
1152 set(ROCKSDB_LIB ${ROCKSDB_STATIC_LIB})
1153endif()
1154
7c673cae 1155option(WITH_JNI "build with JNI" OFF)
20effc67
TL
1156# Tests are excluded from Release builds
1157CMAKE_DEPENDENT_OPTION(WITH_TESTS "build with tests" ON
1158 "CMAKE_BUILD_TYPE STREQUAL Debug" OFF)
1159option(WITH_BENCHMARK_TOOLS "build with benchmarks" ON)
1160option(WITH_CORE_TOOLS "build with ldb and sst_dump" ON)
1161option(WITH_TOOLS "build with tools" ON)
1162
1163if(WITH_TESTS OR WITH_BENCHMARK_TOOLS OR WITH_TOOLS OR WITH_JNI OR JNI)
1164 include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/gtest-1.8.1/fused-src)
1165endif()
7c673cae
FG
1166if(WITH_JNI OR JNI)
1167 message(STATUS "JNI library is enabled")
1168 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/java)
1169else()
1170 message(STATUS "JNI library is disabled")
1171endif()
1172
11fdf7f2
TL
1173# Installation and packaging
1174if(WIN32)
1175 option(ROCKSDB_INSTALL_ON_WINDOWS "Enable install target on Windows" OFF)
1176endif()
1177if(NOT WIN32 OR ROCKSDB_INSTALL_ON_WINDOWS)
1178 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
1179 if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
1180 # Change default installation prefix on Linux to /usr
1181 set(CMAKE_INSTALL_PREFIX /usr CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
1182 endif()
1183 endif()
1184
1185 include(GNUInstallDirs)
1186 include(CMakePackageConfigHelpers)
1187
1188 set(package_config_destination ${CMAKE_INSTALL_LIBDIR}/cmake/rocksdb)
1189
1190 configure_package_config_file(
1191 ${CMAKE_CURRENT_LIST_DIR}/cmake/RocksDBConfig.cmake.in RocksDBConfig.cmake
1192 INSTALL_DESTINATION ${package_config_destination}
1193 )
1194
1195 write_basic_package_version_file(
1196 RocksDBConfigVersion.cmake
f67539c2 1197 VERSION ${rocksdb_VERSION}
11fdf7f2
TL
1198 COMPATIBILITY SameMajorVersion
1199 )
1200
1e59de90
TL
1201 configure_file(
1202 ${PROJECT_NAME}.pc.in
1203 ${PROJECT_NAME}.pc
1204 @ONLY
1205 )
1206
11fdf7f2
TL
1207 install(DIRECTORY include/rocksdb COMPONENT devel DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
1208
1e59de90
TL
1209 foreach (plugin ${PLUGINS})
1210 foreach (header ${${plugin}_HEADERS})
1211 install(FILES plugin/${plugin}/${header} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/rocksdb/plugin/${plugin})
1212 endforeach()
1213 endforeach()
1214
20effc67
TL
1215 install(DIRECTORY "${PROJECT_SOURCE_DIR}/cmake/modules" COMPONENT devel DESTINATION ${package_config_destination})
1216
11fdf7f2
TL
1217 install(
1218 TARGETS ${ROCKSDB_STATIC_LIB}
1219 EXPORT RocksDBTargets
1220 COMPONENT devel
1221 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
1222 INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
1223 )
1224
f67539c2
TL
1225 if(ROCKSDB_BUILD_SHARED)
1226 install(
1227 TARGETS ${ROCKSDB_SHARED_LIB}
1228 EXPORT RocksDBTargets
1229 COMPONENT runtime
1230 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
1231 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
1232 LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
1233 INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
1234 )
1235 endif()
11fdf7f2
TL
1236
1237 install(
1238 EXPORT RocksDBTargets
1239 COMPONENT devel
1240 DESTINATION ${package_config_destination}
1241 NAMESPACE RocksDB::
1242 )
1243
1244 install(
1245 FILES
1246 ${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfig.cmake
1247 ${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfigVersion.cmake
1248 COMPONENT devel
1249 DESTINATION ${package_config_destination}
1250 )
1e59de90
TL
1251
1252 install(
1253 FILES
1254 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
1255 COMPONENT devel
1256 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
1257 )
11fdf7f2
TL
1258endif()
1259
20effc67
TL
1260option(WITH_ALL_TESTS "Build all test, rather than a small subset" ON)
1261
1262if(WITH_TESTS OR WITH_BENCHMARK_TOOLS)
f67539c2
TL
1263 add_subdirectory(third-party/gtest-1.8.1/fused-src/gtest)
1264 add_library(testharness STATIC
20effc67 1265 test_util/mock_time_env.cc
f67539c2
TL
1266 test_util/testharness.cc)
1267 target_link_libraries(testharness gtest)
20effc67 1268endif()
f67539c2 1269
20effc67 1270if(WITH_TESTS)
11fdf7f2 1271 set(TESTS
20effc67
TL
1272 db/db_basic_test.cc
1273 env/env_basic_test.cc
1274 )
1275 if(WITH_ALL_TESTS)
1276 list(APPEND TESTS
1e59de90 1277 cache/cache_reservation_manager_test.cc
7c673cae 1278 cache/cache_test.cc
1e59de90 1279 cache/compressed_secondary_cache_test.cc
7c673cae 1280 cache/lru_cache_test.cc
1e59de90 1281 db/blob/blob_counting_iterator_test.cc
20effc67
TL
1282 db/blob/blob_file_addition_test.cc
1283 db/blob/blob_file_builder_test.cc
1284 db/blob/blob_file_cache_test.cc
1285 db/blob/blob_file_garbage_test.cc
1286 db/blob/blob_file_reader_test.cc
1e59de90
TL
1287 db/blob/blob_garbage_meter_test.cc
1288 db/blob/blob_source_test.cc
20effc67 1289 db/blob/db_blob_basic_test.cc
1e59de90
TL
1290 db/blob/db_blob_compaction_test.cc
1291 db/blob/db_blob_corruption_test.cc
20effc67 1292 db/blob/db_blob_index_test.cc
7c673cae
FG
1293 db/column_family_test.cc
1294 db/compact_files_test.cc
1e59de90 1295 db/compaction/clipping_iterator_test.cc
f67539c2
TL
1296 db/compaction/compaction_job_stats_test.cc
1297 db/compaction/compaction_job_test.cc
1298 db/compaction/compaction_iterator_test.cc
1299 db/compaction/compaction_picker_test.cc
1e59de90
TL
1300 db/compaction/compaction_service_test.cc
1301 db/compaction/tiered_compaction_test.cc
7c673cae
FG
1302 db/comparator_db_test.cc
1303 db/corruption_test.cc
1304 db/cuckoo_table_db_test.cc
1e59de90 1305 db/db_readonly_with_timestamp_test.cc
20effc67 1306 db/db_with_timestamp_basic_test.cc
7c673cae
FG
1307 db/db_block_cache_test.cc
1308 db/db_bloom_filter_test.cc
1309 db/db_compaction_filter_test.cc
1310 db/db_compaction_test.cc
1311 db/db_dynamic_level_test.cc
1e59de90 1312 db/db_encryption_test.cc
7c673cae
FG
1313 db/db_flush_test.cc
1314 db/db_inplace_update_test.cc
1315 db/db_io_failure_test.cc
1316 db/db_iter_test.cc
11fdf7f2 1317 db/db_iter_stress_test.cc
7c673cae 1318 db/db_iterator_test.cc
1e59de90 1319 db/db_kv_checksum_test.cc
7c673cae
FG
1320 db/db_log_iter_test.cc
1321 db/db_memtable_test.cc
1322 db/db_merge_operator_test.cc
f67539c2 1323 db/db_merge_operand_test.cc
7c673cae
FG
1324 db/db_options_test.cc
1325 db/db_properties_test.cc
1326 db/db_range_del_test.cc
1e59de90
TL
1327 db/db_rate_limiter_test.cc
1328 db/db_secondary_test.cc
7c673cae
FG
1329 db/db_sst_test.cc
1330 db/db_statistics_test.cc
1331 db/db_table_properties_test.cc
1332 db/db_tailing_iter_test.cc
1333 db/db_test.cc
1334 db/db_test2.cc
20effc67 1335 db/db_logical_block_size_cache_test.cc
7c673cae
FG
1336 db/db_universal_compaction_test.cc
1337 db/db_wal_test.cc
20effc67 1338 db/db_with_timestamp_compaction_test.cc
1e59de90 1339 db/db_write_buffer_manager_test.cc
11fdf7f2 1340 db/db_write_test.cc
7c673cae
FG
1341 db/dbformat_test.cc
1342 db/deletefile_test.cc
20effc67 1343 db/error_handler_fs_test.cc
11fdf7f2 1344 db/obsolete_files_test.cc
7c673cae
FG
1345 db/external_sst_file_basic_test.cc
1346 db/external_sst_file_test.cc
1347 db/fault_injection_test.cc
1348 db/file_indexer_test.cc
1349 db/filename_test.cc
1350 db/flush_job_test.cc
1e59de90 1351 db/import_column_family_test.cc
7c673cae
FG
1352 db/listener_test.cc
1353 db/log_test.cc
1354 db/manual_compaction_test.cc
1355 db/memtable_list_test.cc
1356 db/merge_helper_test.cc
1357 db/merge_test.cc
1358 db/options_file_test.cc
1359 db/perf_context_test.cc
1e59de90 1360 db/periodic_task_scheduler_test.cc
7c673cae 1361 db/plain_table_db_test.cc
1e59de90 1362 db/seqno_time_test.cc
7c673cae 1363 db/prefix_test.cc
494da23a
TL
1364 db/range_del_aggregator_test.cc
1365 db/range_tombstone_fragmenter_test.cc
7c673cae
FG
1366 db/repair_test.cc
1367 db/table_properties_collector_test.cc
1368 db/version_builder_test.cc
1369 db/version_edit_test.cc
1370 db/version_set_test.cc
1371 db/wal_manager_test.cc
20effc67 1372 db/wal_edit_test.cc
1e59de90
TL
1373 db/wide/db_wide_basic_test.cc
1374 db/wide/wide_column_serialization_test.cc
7c673cae
FG
1375 db/write_batch_test.cc
1376 db/write_callback_test.cc
1377 db/write_controller_test.cc
7c673cae 1378 env/env_test.cc
20effc67 1379 env/io_posix_test.cc
7c673cae 1380 env/mock_env_test.cc
f67539c2 1381 file/delete_scheduler_test.cc
20effc67
TL
1382 file/prefetch_test.cc
1383 file/random_access_file_reader_test.cc
f67539c2
TL
1384 logging/auto_roll_logger_test.cc
1385 logging/env_logger_test.cc
1386 logging/event_logger_test.cc
1387 memory/arena_test.cc
1e59de90 1388 memory/memory_allocator_test.cc
7c673cae
FG
1389 memtable/inlineskiplist_test.cc
1390 memtable/skiplist_test.cc
11fdf7f2 1391 memtable/write_buffer_manager_test.cc
7c673cae
FG
1392 monitoring/histogram_test.cc
1393 monitoring/iostats_context_test.cc
1394 monitoring/statistics_test.cc
f67539c2 1395 monitoring/stats_history_test.cc
20effc67
TL
1396 options/configurable_test.cc
1397 options/customizable_test.cc
7c673cae
FG
1398 options/options_settable_test.cc
1399 options/options_test.cc
20effc67 1400 table/block_based/block_based_table_reader_test.cc
f67539c2
TL
1401 table/block_based/block_test.cc
1402 table/block_based/data_block_hash_index_test.cc
1403 table/block_based/full_filter_block_test.cc
1404 table/block_based/partitioned_filter_block_test.cc
11fdf7f2 1405 table/cleanable_test.cc
f67539c2
TL
1406 table/cuckoo/cuckoo_table_builder_test.cc
1407 table/cuckoo/cuckoo_table_reader_test.cc
7c673cae 1408 table/merger_test.cc
494da23a 1409 table/sst_file_reader_test.cc
7c673cae 1410 table/table_test.cc
20effc67
TL
1411 table/block_fetcher_test.cc
1412 test_util/testutil_test.cc
1e59de90 1413 trace_replay/block_cache_tracer_test.cc
20effc67 1414 trace_replay/io_tracer_test.cc
f67539c2 1415 tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc
20effc67 1416 tools/io_tracer_parser_test.cc
7c673cae
FG
1417 tools/ldb_cmd_test.cc
1418 tools/reduce_levels_test.cc
1419 tools/sst_dump_test.cc
11fdf7f2 1420 tools/trace_analyzer_test.cc
7c673cae
FG
1421 util/autovector_test.cc
1422 util/bloom_test.cc
1423 util/coding_test.cc
1424 util/crc32c_test.cc
f67539c2 1425 util/defer_test.cc
7c673cae 1426 util/dynamic_bloom_test.cc
7c673cae
FG
1427 util/file_reader_writer_test.cc
1428 util/filelock_test.cc
11fdf7f2 1429 util/hash_test.cc
7c673cae 1430 util/heap_test.cc
f67539c2 1431 util/random_test.cc
7c673cae 1432 util/rate_limiter_test.cc
11fdf7f2 1433 util/repeatable_thread_test.cc
20effc67 1434 util/ribbon_test.cc
f67539c2 1435 util/slice_test.cc
7c673cae 1436 util/slice_transform_test.cc
11fdf7f2 1437 util/timer_queue_test.cc
20effc67 1438 util/timer_test.cc
7c673cae
FG
1439 util/thread_list_test.cc
1440 util/thread_local_test.cc
20effc67 1441 util/work_queue_test.cc
1e59de90
TL
1442 utilities/agg_merge/agg_merge_test.cc
1443 utilities/backup/backup_engine_test.cc
7c673cae 1444 utilities/blob_db/blob_db_test.cc
11fdf7f2
TL
1445 utilities/cassandra/cassandra_functional_test.cc
1446 utilities/cassandra/cassandra_format_test.cc
1447 utilities/cassandra/cassandra_row_merge_test.cc
1448 utilities/cassandra/cassandra_serialize_test.cc
7c673cae 1449 utilities/checkpoint/checkpoint_test.cc
1e59de90 1450 utilities/env_timed_test.cc
7c673cae
FG
1451 utilities/memory/memory_test.cc
1452 utilities/merge_operators/string_append/stringappend_test.cc
1453 utilities/object_registry_test.cc
1454 utilities/option_change_migration/option_change_migration_test.cc
1455 utilities/options/options_util_test.cc
1456 utilities/persistent_cache/hash_table_test.cc
1457 utilities/persistent_cache/persistent_cache_test.cc
f67539c2 1458 utilities/simulator_cache/cache_simulator_test.cc
11fdf7f2 1459 utilities/simulator_cache/sim_cache_test.cc
7c673cae
FG
1460 utilities/table_properties_collectors/compact_on_deletion_collector_test.cc
1461 utilities/transactions/optimistic_transaction_test.cc
1462 utilities/transactions/transaction_test.cc
20effc67 1463 utilities/transactions/lock/point/point_lock_manager_test.cc
1e59de90 1464 utilities/transactions/write_committed_transaction_ts_test.cc
11fdf7f2
TL
1465 utilities/transactions/write_prepared_transaction_test.cc
1466 utilities/transactions/write_unprepared_transaction_test.cc
1e59de90
TL
1467 utilities/transactions/lock/range/range_locking_test.cc
1468 utilities/transactions/timestamped_snapshot_test.cc
7c673cae 1469 utilities/ttl/ttl_test.cc
1e59de90 1470 utilities/util_merge_operators_test.cc
7c673cae 1471 utilities/write_batch_with_index/write_batch_with_index_test.cc
20effc67
TL
1472 )
1473 endif()
f67539c2 1474
11fdf7f2
TL
1475 set(TESTUTIL_SOURCE
1476 db/db_test_util.cc
1e59de90 1477 db/db_with_timestamp_test_util.cc
11fdf7f2
TL
1478 monitoring/thread_status_updater_debug.cc
1479 table/mock_table.cc
1e59de90 1480 utilities/agg_merge/test_agg_merge.cc
11fdf7f2
TL
1481 utilities/cassandra/test_utils.cc
1482 )
11fdf7f2
TL
1483 enable_testing()
1484 add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
1485 set(TESTUTILLIB testutillib${ARTIFACT_SUFFIX})
1486 add_library(${TESTUTILLIB} STATIC ${TESTUTIL_SOURCE})
1e59de90 1487 target_link_libraries(${TESTUTILLIB} ${ROCKSDB_LIB} ${FOLLY_LIBS})
11fdf7f2
TL
1488 if(MSVC)
1489 set_target_properties(${TESTUTILLIB} PROPERTIES COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/testutillib${ARTIFACT_SUFFIX}.pdb")
1490 endif()
1491 set_target_properties(${TESTUTILLIB}
1492 PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
1493 EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
1494 EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
20effc67 1495 )
11fdf7f2 1496
f67539c2 1497 foreach(sourcefile ${TESTS})
11fdf7f2 1498 get_filename_component(exename ${sourcefile} NAME_WE)
1e59de90
TL
1499 add_executable(${exename}${ARTIFACT_SUFFIX} ${sourcefile})
1500 set_target_properties(${exename}${ARTIFACT_SUFFIX}
11fdf7f2
TL
1501 PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
1502 EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
1503 EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
1504 OUTPUT_NAME ${exename}${ARTIFACT_SUFFIX}
20effc67 1505 )
1e59de90 1506 target_link_libraries(${exename}${ARTIFACT_SUFFIX} testutillib${ARTIFACT_SUFFIX} testharness gtest ${THIRDPARTY_LIBS} ${ROCKSDB_LIB})
11fdf7f2 1507 if(NOT "${exename}" MATCHES "db_sanity_test")
1e59de90
TL
1508 gtest_discover_tests(${exename} DISCOVERY_TIMEOUT 120)
1509 add_dependencies(check ${exename}${ARTIFACT_SUFFIX})
20effc67 1510 endif()
f67539c2 1511 endforeach(sourcefile ${TESTS})
11fdf7f2 1512
f67539c2
TL
1513 if(WIN32)
1514 # C executables must link to a shared object
1515 if(ROCKSDB_BUILD_SHARED)
1516 set(ROCKSDB_LIB_FOR_C ${ROCKSDB_SHARED_LIB})
1517 else()
1518 set(ROCKSDB_LIB_FOR_C OFF)
1519 endif()
1520 else()
1521 set(ROCKSDB_LIB_FOR_C ${ROCKSDB_LIB})
1522 endif()
11fdf7f2 1523
f67539c2
TL
1524 if(ROCKSDB_LIB_FOR_C)
1525 set(C_TESTS db/c_test.c)
f67539c2 1526 add_executable(c_test db/c_test.c)
20effc67 1527 target_link_libraries(c_test ${ROCKSDB_LIB_FOR_C} testharness)
f67539c2
TL
1528 add_test(NAME c_test COMMAND c_test${ARTIFACT_SUFFIX})
1529 add_dependencies(check c_test)
1530 endif()
1531endif()
1532
f67539c2 1533if(WITH_BENCHMARK_TOOLS)
1e59de90
TL
1534 add_executable(db_bench${ARTIFACT_SUFFIX}
1535 tools/simulated_hybrid_file_system.cc
f67539c2
TL
1536 tools/db_bench.cc
1537 tools/db_bench_tool.cc)
1e59de90 1538 target_link_libraries(db_bench${ARTIFACT_SUFFIX}
20effc67 1539 ${ROCKSDB_LIB} ${THIRDPARTY_LIBS})
f67539c2 1540
1e59de90
TL
1541 add_executable(cache_bench${ARTIFACT_SUFFIX}
1542 cache/cache_bench.cc
1543 cache/cache_bench_tool.cc)
1544 target_link_libraries(cache_bench${ARTIFACT_SUFFIX}
1545 ${ROCKSDB_LIB} ${GFLAGS_LIB} ${FOLLY_LIBS})
f67539c2 1546
1e59de90 1547 add_executable(memtablerep_bench${ARTIFACT_SUFFIX}
f67539c2 1548 memtable/memtablerep_bench.cc)
1e59de90
TL
1549 target_link_libraries(memtablerep_bench${ARTIFACT_SUFFIX}
1550 ${ROCKSDB_LIB} ${GFLAGS_LIB} ${FOLLY_LIBS})
f67539c2 1551
1e59de90 1552 add_executable(range_del_aggregator_bench${ARTIFACT_SUFFIX}
f67539c2 1553 db/range_del_aggregator_bench.cc)
1e59de90
TL
1554 target_link_libraries(range_del_aggregator_bench${ARTIFACT_SUFFIX}
1555 ${ROCKSDB_LIB} ${GFLAGS_LIB} ${FOLLY_LIBS})
f67539c2 1556
1e59de90 1557 add_executable(table_reader_bench${ARTIFACT_SUFFIX}
f67539c2 1558 table/table_reader_bench.cc)
1e59de90
TL
1559 target_link_libraries(table_reader_bench${ARTIFACT_SUFFIX}
1560 ${ROCKSDB_LIB} testharness ${GFLAGS_LIB} ${FOLLY_LIBS})
f67539c2 1561
1e59de90 1562 add_executable(filter_bench${ARTIFACT_SUFFIX}
f67539c2 1563 util/filter_bench.cc)
1e59de90
TL
1564 target_link_libraries(filter_bench${ARTIFACT_SUFFIX}
1565 ${ROCKSDB_LIB} ${GFLAGS_LIB} ${FOLLY_LIBS})
f67539c2 1566
1e59de90 1567 add_executable(hash_table_bench${ARTIFACT_SUFFIX}
f67539c2 1568 utilities/persistent_cache/hash_table_bench.cc)
1e59de90
TL
1569 target_link_libraries(hash_table_bench${ARTIFACT_SUFFIX}
1570 ${ROCKSDB_LIB} ${GFLAGS_LIB} ${FOLLY_LIBS})
1571endif()
1572
1573option(WITH_TRACE_TOOLS "build with trace tools" ON)
1574if(WITH_TRACE_TOOLS)
1575 add_executable(block_cache_trace_analyzer${ARTIFACT_SUFFIX}
1576 tools/block_cache_analyzer/block_cache_trace_analyzer_tool.cc)
1577 target_link_libraries(block_cache_trace_analyzer${ARTIFACT_SUFFIX}
1578 ${ROCKSDB_LIB} ${GFLAGS_LIB} ${FOLLY_LIBS})
1579
1580 add_executable(trace_analyzer${ARTIFACT_SUFFIX}
1581 tools/trace_analyzer.cc)
1582 target_link_libraries(trace_analyzer${ARTIFACT_SUFFIX}
1583 ${ROCKSDB_LIB} ${GFLAGS_LIB} ${FOLLY_LIBS})
1584
11fdf7f2
TL
1585endif()
1586
f67539c2 1587if(WITH_CORE_TOOLS OR WITH_TOOLS)
11fdf7f2 1588 add_subdirectory(tools)
f67539c2
TL
1589 add_custom_target(core_tools
1590 DEPENDS ${core_tool_deps})
1591endif()
1592
1593if(WITH_TOOLS)
1594 add_subdirectory(db_stress_tool)
1595 add_custom_target(tools
1596 DEPENDS ${tool_deps})
7c673cae 1597endif()
20effc67
TL
1598
1599option(WITH_EXAMPLES "build with examples" OFF)
1600if(WITH_EXAMPLES)
1601 add_subdirectory(examples)
1602endif()
1e59de90
TL
1603
1604option(WITH_BENCHMARK "build benchmark tests" OFF)
1605if(WITH_BENCHMARK)
1606 add_subdirectory(${PROJECT_SOURCE_DIR}/microbench/)
1607endif()