1# Prerequisites for Windows:
2#     This cmake build is for Windows 64-bit only.
3#
4# Prerequisites:
5#     You must have at least Visual Studio 2015 Update 3. Start the Developer Command Prompt window that is a part of Visual Studio installation.
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.
17#        sample command: cmake -G "Visual Studio 15 Win64" -DCMAKE_BUILD_TYPE=Release -DWITH_GFLAGS=1 -DWITH_SNAPPY=1 -DWITH_JEMALLOC=1 -DWITH_JNI=1 ..
18# 4. Then build the project in debug mode (you may want to add /m[:<N>] flag to run msbuild in <N> parallel threads
19#                                          or simply /m to use all avail cores)
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#
30# 1. Install a recent toolchain such as devtoolset-3 if you're on a older distro. C++11 required.
31# 2. mkdir build; cd build
32# 3. cmake ..
33# 4. make -j
34
35cmake_minimum_required(VERSION 3.5.1)
36
37list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/")
38include(ReadVersion)
39get_rocksdb_version(rocksdb_VERSION)
40project(rocksdb
41  VERSION ${rocksdb_VERSION}
42  LANGUAGES CXX C ASM)
43
44if(POLICY CMP0042)
45  cmake_policy(SET CMP0042 NEW)
46endif()
47
48if(NOT CMAKE_BUILD_TYPE)
49  if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
50    set(default_build_type "Debug")
51  else()
52    set(default_build_type "RelWithDebInfo")
53  endif()
54  set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING
55    "Default BUILD_TYPE is ${default_build_type}" FORCE)
56endif()
57
58find_program(CCACHE_FOUND ccache)
59if(CCACHE_FOUND)
60  set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
61  set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
62endif(CCACHE_FOUND)
63
64option(WITH_JEMALLOC "build with JeMalloc" OFF)
65option(WITH_SNAPPY "build with SNAPPY" OFF)
66option(WITH_LZ4 "build with lz4" OFF)
67option(WITH_ZLIB "build with zlib" OFF)
68option(WITH_ZSTD "build with zstd" OFF)
69option(WITH_WINDOWS_UTF8_FILENAMES "use UTF8 as characterset for opening files, regardles of the system code page" OFF)
70if (WITH_WINDOWS_UTF8_FILENAMES)
71  add_definitions(-DROCKSDB_WINDOWS_UTF8_FILENAMES)
72endif()
73# third-party/folly is only validated to work on Linux and Windows for now.
74# So only turn it on there by default.
75if(CMAKE_SYSTEM_NAME MATCHES "Linux|Windows")
76  if(MSVC AND MSVC_VERSION LESS 1910)
77    # Folly does not compile with MSVC older than VS2017
78    option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" OFF)
79  else()
80    option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" ON)
81  endif()
82else()
83  option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" OFF)
84endif()
85
86include(CMakeDependentOption)
87CMAKE_DEPENDENT_OPTION(WITH_GFLAGS "build with GFlags" ON
88  "NOT MSVC;NOT MINGW" OFF)
89
90if(MSVC)
91  option(WITH_XPRESS "build with windows built in compression" OFF)
92  include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc)
93else()
94  if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
95    # FreeBSD has jemalloc as default malloc
96    # but it does not have all the jemalloc files in include/...
97    set(WITH_JEMALLOC ON)
98  else()
99    if(WITH_JEMALLOC)
100      find_package(JeMalloc REQUIRED)
101      add_definitions(-DROCKSDB_JEMALLOC -DJEMALLOC_NO_DEMANGLE)
102      list(APPEND THIRDPARTY_LIBS JeMalloc::JeMalloc)
103    endif()
104  endif()
105
106  # No config file for this
107  if(WITH_GFLAGS)
108    find_package(gflags REQUIRED)
109    add_definitions(-DGFLAGS=1)
110    include_directories(${gflags_INCLUDE_DIR})
111    list(APPEND THIRDPARTY_LIBS gflags::gflags)
112  endif()
113
114  if(WITH_SNAPPY)
115    find_package(snappy REQUIRED)
116    add_definitions(-DSNAPPY)
117    list(APPEND THIRDPARTY_LIBS snappy::snappy)
118  endif()
119
120  if(WITH_ZLIB)
121    find_package(ZLIB REQUIRED)
122    add_definitions(-DZLIB)
123    list(APPEND THIRDPARTY_LIBS ZLIB::ZLIB)
124  endif()
125
126  option(WITH_BZ2 "build with bzip2" OFF)
127  if(WITH_BZ2)
128    find_package(BZip2 REQUIRED)
129    add_definitions(-DBZIP2)
130    if(BZIP2_INCLUDE_DIRS)
131      include_directories(${BZIP2_INCLUDE_DIRS})
132    else()
133      include_directories(${BZIP2_INCLUDE_DIR})
134    endif()
135    list(APPEND THIRDPARTY_LIBS ${BZIP2_LIBRARIES})
136  endif()
137
138  if(WITH_LZ4)
139    find_package(lz4 REQUIRED)
140    add_definitions(-DLZ4)
141    list(APPEND THIRDPARTY_LIBS lz4::lz4)
142  endif()
143
144  if(WITH_ZSTD)
145    find_package(zstd REQUIRED)
146    add_definitions(-DZSTD)
147    include_directories(${ZSTD_INCLUDE_DIR})
148    list(APPEND THIRDPARTY_LIBS zstd::zstd)
149  endif()
150endif()
151
152string(TIMESTAMP TS "%Y/%m/%d %H:%M:%S" UTC)
153set(GIT_DATE_TIME "${TS}" CACHE STRING "the time we first built rocksdb")
154
155find_package(Git)
156
157if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
158  if(WIN32)
159    execute_process(COMMAND $ENV{COMSPEC} /C ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
160  else()
161    execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
162  endif()
163else()
164  set(GIT_SHA 0)
165endif()
166
167string(REGEX REPLACE "[^0-9a-f]+" "" GIT_SHA "${GIT_SHA}")
168
169
170option(WITH_MD_LIBRARY "build with MD" ON)
171if(WIN32 AND MSVC)
172  if(WITH_MD_LIBRARY)
173    set(RUNTIME_LIBRARY "MD")
174  else()
175    set(RUNTIME_LIBRARY "MT")
176  endif()
177endif()
178
179set(BUILD_VERSION_CC ${CMAKE_BINARY_DIR}/build_version.cc)
180configure_file(util/build_version.cc.in ${BUILD_VERSION_CC} @ONLY)
181add_library(build_version OBJECT ${BUILD_VERSION_CC})
182target_include_directories(build_version PRIVATE
183  ${CMAKE_CURRENT_SOURCE_DIR}/util)
184if(MSVC)
185  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /nologo /EHsc /GS /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue")
186  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
187else()
188  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall")
189  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")
190  if(MINGW)
191    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format -fno-asynchronous-unwind-tables")
192    add_definitions(-D_POSIX_C_SOURCE=1)
193  endif()
194  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
195  if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
196    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
197    include(CheckCXXCompilerFlag)
198    CHECK_CXX_COMPILER_FLAG("-momit-leaf-frame-pointer" HAVE_OMIT_LEAF_FRAME_POINTER)
199    if(HAVE_OMIT_LEAF_FRAME_POINTER)
200      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -momit-leaf-frame-pointer")
201    endif()
202  endif()
203endif()
204
205include(CheckCCompilerFlag)
206if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
207  CHECK_C_COMPILER_FLAG("-mcpu=power9" HAS_POWER9)
208  if(HAS_POWER9)
209    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power9 -mtune=power9")
210    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power9 -mtune=power9")
211  else()
212    CHECK_C_COMPILER_FLAG("-mcpu=power8" HAS_POWER8)
213    if(HAS_POWER8)
214      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power8 -mtune=power8")
215      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power8 -mtune=power8")
216    endif(HAS_POWER8)
217  endif(HAS_POWER9)
218  CHECK_C_COMPILER_FLAG("-maltivec" HAS_ALTIVEC)
219  if(HAS_ALTIVEC)
220    message(STATUS " HAS_ALTIVEC yes")
221    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maltivec")
222    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maltivec")
223  endif(HAS_ALTIVEC)
224endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
225
226if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
227        CHECK_C_COMPILER_FLAG("-march=armv8-a+crc+crypto" HAS_ARMV8_CRC)
228  if(HAS_ARMV8_CRC)
229    message(STATUS " HAS_ARMV8_CRC yes")
230    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function")
231    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function")
232  endif(HAS_ARMV8_CRC)
233endif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
234
235option(PORTABLE "build a portable binary" OFF)
236option(FORCE_SSE42 "force building with SSE4.2, even when PORTABLE=ON" OFF)
237if(PORTABLE)
238  # MSVC does not need a separate compiler flag to enable SSE4.2; if nmmintrin.h
239  # is available, it is available by default.
240  if(FORCE_SSE42 AND NOT MSVC)
241    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpclmul")
242  endif()
243else()
244  if(MSVC)
245    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
246  else()
247    if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64" AND NOT HAS_ARMV8_CRC)
248      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
249    endif()
250  endif()
251endif()
252
253include(CheckCXXSourceCompiles)
254if(NOT MSVC)
255  set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
256endif()
257CHECK_CXX_SOURCE_COMPILES("
258#include <cstdint>
259#include <nmmintrin.h>
260#include <wmmintrin.h>
261int main() {
262  volatile uint32_t x = _mm_crc32_u32(0, 0);
263  const auto a = _mm_set_epi64x(0, 0);
264  const auto b = _mm_set_epi64x(0, 0);
265  const auto c = _mm_clmulepi64_si128(a, b, 0x00);
266  auto d = _mm_cvtsi128_si64(c);
267}
268" HAVE_SSE42)
269unset(CMAKE_REQUIRED_FLAGS)
270if(HAVE_SSE42)
271  add_definitions(-DHAVE_SSE42)
272  add_definitions(-DHAVE_PCLMUL)
273elseif(FORCE_SSE42)
274  message(FATAL_ERROR "FORCE_SSE42=ON but unable to compile with SSE4.2 enabled")
275endif()
276
277CHECK_CXX_SOURCE_COMPILES("
278#if defined(_MSC_VER) && !defined(__thread)
279#define __thread __declspec(thread)
280#endif
281int main() {
282  static __thread int tls;
283}
284" HAVE_THREAD_LOCAL)
285if(HAVE_THREAD_LOCAL)
286  add_definitions(-DROCKSDB_SUPPORT_THREAD_LOCAL)
287endif()
288
289option(FAIL_ON_WARNINGS "Treat compile warnings as errors" ON)
290if(FAIL_ON_WARNINGS)
291  if(MSVC)
292    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")
293  else() # assume GCC
294    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
295  endif()
296endif()
297
298option(WITH_ASAN "build with ASAN" OFF)
299if(WITH_ASAN)
300  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
301  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
302  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
303  if(WITH_JEMALLOC)
304    message(FATAL "ASAN does not work well with JeMalloc")
305  endif()
306endif()
307
308option(WITH_TSAN "build with TSAN" OFF)
309if(WITH_TSAN)
310  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread -pie")
311  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fPIC")
312  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fPIC")
313  if(WITH_JEMALLOC)
314    message(FATAL "TSAN does not work well with JeMalloc")
315  endif()
316endif()
317
318option(WITH_UBSAN "build with UBSAN" OFF)
319if(WITH_UBSAN)
320  add_definitions(-DROCKSDB_UBSAN_RUN)
321  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined")
322  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
323  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined")
324  if(WITH_JEMALLOC)
325    message(FATAL "UBSAN does not work well with JeMalloc")
326  endif()
327endif()
328
329option(WITH_NUMA "build with NUMA policy support" OFF)
330if(WITH_NUMA)
331  find_package(NUMA REQUIRED)
332  add_definitions(-DNUMA)
333  include_directories(${NUMA_INCLUDE_DIR})
334  list(APPEND THIRDPARTY_LIBS NUMA::NUMA)
335endif()
336
337option(WITH_TBB "build with Threading Building Blocks (TBB)" OFF)
338if(WITH_TBB)
339  find_package(TBB REQUIRED)
340  add_definitions(-DTBB)
341  list(APPEND THIRDPARTY_LIBS TBB::TBB)
342endif()
343
344# Stall notifications eat some performance from inserts
345option(DISABLE_STALL_NOTIF "Build with stall notifications" OFF)
346if(DISABLE_STALL_NOTIF)
347  add_definitions(-DROCKSDB_DISABLE_STALL_NOTIFICATION)
348endif()
349
350option(WITH_DYNAMIC_EXTENSION "build with dynamic extension support" OFF)
351if(NOT WITH_DYNAMIC_EXTENSION)
352  add_definitions(-DROCKSDB_NO_DYNAMIC_EXTENSION)
353endif()
354
355if(DEFINED USE_RTTI)
356  if(USE_RTTI)
357    message(STATUS "Enabling RTTI")
358    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
359    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DROCKSDB_USE_RTTI")
360  else()
361    if(MSVC)
362      message(STATUS "Disabling RTTI in Release builds. Always on in Debug.")
363      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
364      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
365    else()
366      message(STATUS "Disabling RTTI in Release builds")
367      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-rtti")
368      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti")
369    endif()
370  endif()
371else()
372  message(STATUS "Enabling RTTI in Debug builds only (default)")
373  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
374  if(MSVC)
375     set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
376  else()
377    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti")
378  endif()
379endif()
380
381# Used to run CI build and tests so we can run faster
382option(OPTDBG "Build optimized debug build with MSVC" OFF)
383option(WITH_RUNTIME_DEBUG "build with debug version of runtime library" ON)
384if(MSVC)
385  if(OPTDBG)
386    message(STATUS "Debug optimization is enabled")
387    set(CMAKE_CXX_FLAGS_DEBUG "/Oxt")
388  else()
389    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /RTC1 /Gm")
390  endif()
391  if(WITH_RUNTIME_DEBUG)
392    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}d")
393  else()
394    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}")
395  endif()
396  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
397
398  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
399  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
400endif()
401
402if(CMAKE_COMPILER_IS_GNUCXX)
403  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-memcmp")
404endif()
405
406option(ROCKSDB_LITE "Build RocksDBLite version" OFF)
407if(ROCKSDB_LITE)
408  add_definitions(-DROCKSDB_LITE)
409  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -Os")
410endif()
411
412if(CMAKE_SYSTEM_NAME MATCHES "Cygwin")
413  add_definitions(-fno-builtin-memcmp -DCYGWIN)
414elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
415  add_definitions(-DOS_MACOSX)
416  if(CMAKE_SYSTEM_PROCESSOR MATCHES arm)
417    add_definitions(-DIOS_CROSS_COMPILE -DROCKSDB_LITE)
418    # no debug info for IOS, that will make our library big
419    add_definitions(-DNDEBUG)
420  endif()
421elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
422  add_definitions(-DOS_LINUX)
423elseif(CMAKE_SYSTEM_NAME MATCHES "SunOS")
424  add_definitions(-DOS_SOLARIS)
425elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
426  add_definitions(-DOS_FREEBSD)
427elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
428  add_definitions(-DOS_NETBSD)
429elseif(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
430  add_definitions(-DOS_OPENBSD)
431elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly")
432  add_definitions(-DOS_DRAGONFLYBSD)
433elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
434  add_definitions(-DOS_ANDROID)
435elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
436  add_definitions(-DWIN32 -DOS_WIN -D_MBCS -DWIN64 -DNOMINMAX)
437  if(MINGW)
438    add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_VISTA)
439  endif()
440endif()
441
442if(NOT WIN32)
443  add_definitions(-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX)
444endif()
445
446option(WITH_FALLOCATE "build with fallocate" ON)
447if(WITH_FALLOCATE)
448  CHECK_CXX_SOURCE_COMPILES("
449#include <fcntl.h>
450#include <linux/falloc.h>
451int main() {
452 int fd = open(\"/dev/null\", 0);
453 fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, 1024);
454}
455" HAVE_FALLOCATE)
456  if(HAVE_FALLOCATE)
457    add_definitions(-DROCKSDB_FALLOCATE_PRESENT)
458  endif()
459endif()
460
461CHECK_CXX_SOURCE_COMPILES("
462#include <fcntl.h>
463int main() {
464  int fd = open(\"/dev/null\", 0);
465  sync_file_range(fd, 0, 1024, SYNC_FILE_RANGE_WRITE);
466}
467" HAVE_SYNC_FILE_RANGE_WRITE)
468if(HAVE_SYNC_FILE_RANGE_WRITE)
469  add_definitions(-DROCKSDB_RANGESYNC_PRESENT)
470endif()
471
472CHECK_CXX_SOURCE_COMPILES("
473#include <pthread.h>
474int main() {
475  (void) PTHREAD_MUTEX_ADAPTIVE_NP;
476}
477" HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
478if(HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
479  add_definitions(-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX)
480endif()
481
482include(CheckCXXSymbolExists)
483check_cxx_symbol_exists(malloc_usable_size malloc.h HAVE_MALLOC_USABLE_SIZE)
484if(HAVE_MALLOC_USABLE_SIZE)
485  add_definitions(-DROCKSDB_MALLOC_USABLE_SIZE)
486endif()
487
488check_cxx_symbol_exists(sched_getcpu sched.h HAVE_SCHED_GETCPU)
489if(HAVE_SCHED_GETCPU)
490  add_definitions(-DROCKSDB_SCHED_GETCPU_PRESENT)
491endif()
492
493check_cxx_symbol_exists(getauxval auvx.h HAVE_AUXV_GETAUXVAL)
494if(HAVE_AUXV_GETAUXVAL)
495  add_definitions(-DROCKSDB_AUXV_GETAUXVAL_PRESENT)
496endif()
497
498include_directories(${PROJECT_SOURCE_DIR})
499include_directories(${PROJECT_SOURCE_DIR}/include)
500include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/gtest-1.8.1/fused-src)
501if(WITH_FOLLY_DISTRIBUTED_MUTEX)
502  include_directories(${PROJECT_SOURCE_DIR}/third-party/folly)
503endif()
504find_package(Threads REQUIRED)
505
506# Main library source code
507
508set(SOURCES
509        cache/clock_cache.cc
510        cache/lru_cache.cc
511        cache/sharded_cache.cc
512        db/arena_wrapped_db_iter.cc
513        db/blob/blob_file_addition.cc
514        db/blob/blob_file_garbage.cc
515        db/blob/blob_file_meta.cc
516        db/builder.cc
517        db/c.cc
518        db/column_family.cc
519        db/compacted_db_impl.cc
520        db/compaction/compaction.cc
521        db/compaction/compaction_iterator.cc
522        db/compaction/compaction_picker.cc
523        db/compaction/compaction_job.cc
524        db/compaction/compaction_picker_fifo.cc
525        db/compaction/compaction_picker_level.cc
526        db/compaction/compaction_picker_universal.cc
527        db/convenience.cc
528        db/db_filesnapshot.cc
529        db/db_impl/db_impl.cc
530        db/db_impl/db_impl_write.cc
531        db/db_impl/db_impl_compaction_flush.cc
532        db/db_impl/db_impl_files.cc
533        db/db_impl/db_impl_open.cc
534        db/db_impl/db_impl_debug.cc
535        db/db_impl/db_impl_experimental.cc
536        db/db_impl/db_impl_readonly.cc
537        db/db_impl/db_impl_secondary.cc
538        db/db_info_dumper.cc
539        db/db_iter.cc
540        db/dbformat.cc
541        db/error_handler.cc
542        db/event_helpers.cc
543        db/experimental.cc
544        db/external_sst_file_ingestion_job.cc
545        db/file_indexer.cc
546        db/flush_job.cc
547        db/flush_scheduler.cc
548        db/forward_iterator.cc
549        db/import_column_family_job.cc
550        db/internal_stats.cc
551        db/logs_with_prep_tracker.cc
552        db/log_reader.cc
553        db/log_writer.cc
554        db/malloc_stats.cc
555        db/memtable.cc
556        db/memtable_list.cc
557        db/merge_helper.cc
558        db/merge_operator.cc
559        db/range_del_aggregator.cc
560        db/range_tombstone_fragmenter.cc
561        db/repair.cc
562        db/snapshot_impl.cc
563        db/table_cache.cc
564        db/table_properties_collector.cc
565        db/transaction_log_impl.cc
566        db/trim_history_scheduler.cc
567        db/version_builder.cc
568        db/version_edit.cc
569        db/version_edit_handler.cc
570        db/version_set.cc
571        db/wal_manager.cc
572        db/write_batch.cc
573        db/write_batch_base.cc
574        db/write_controller.cc
575        db/write_thread.cc
576        env/env.cc
577        env/env_chroot.cc
578        env/env_encryption.cc
579        env/env_hdfs.cc
580        env/file_system.cc
581        env/mock_env.cc
582        file/delete_scheduler.cc
583        file/file_prefetch_buffer.cc
584        file/file_util.cc
585        file/filename.cc
586        file/random_access_file_reader.cc
587        file/read_write_util.cc
588        file/readahead_raf.cc
589        file/sequence_file_reader.cc
590        file/sst_file_manager_impl.cc
591        file/writable_file_writer.cc
592        logging/auto_roll_logger.cc
593        logging/event_logger.cc
594        logging/log_buffer.cc
595        memory/arena.cc
596        memory/concurrent_arena.cc
597        memory/jemalloc_nodump_allocator.cc
598        memtable/alloc_tracker.cc
599        memtable/hash_linklist_rep.cc
600        memtable/hash_skiplist_rep.cc
601        memtable/skiplistrep.cc
602        memtable/vectorrep.cc
603        memtable/write_buffer_manager.cc
604        monitoring/histogram.cc
605        monitoring/histogram_windowing.cc
606        monitoring/in_memory_stats_history.cc
607        monitoring/instrumented_mutex.cc
608        monitoring/iostats_context.cc
609        monitoring/perf_context.cc
610        monitoring/perf_level.cc
611        monitoring/persistent_stats_history.cc
612        monitoring/statistics.cc
613        monitoring/thread_status_impl.cc
614        monitoring/thread_status_updater.cc
615        monitoring/thread_status_util.cc
616        monitoring/thread_status_util_debug.cc
617        options/cf_options.cc
618        options/db_options.cc
619        options/options.cc
620        options/options_helper.cc
621        options/options_parser.cc
622        options/options_sanity_check.cc
623        port/stack_trace.cc
624        table/adaptive/adaptive_table_factory.cc
625        table/block_based/binary_search_index_reader.cc
626        table/block_based/block.cc
627        table/block_based/block_based_filter_block.cc
628        table/block_based/block_based_table_builder.cc
629        table/block_based/block_based_table_factory.cc
630        table/block_based/block_based_table_iterator.cc
631        table/block_based/block_based_table_reader.cc
632        table/block_based/block_builder.cc
633        table/block_based/block_prefetcher.cc
634        table/block_based/block_prefix_index.cc
635        table/block_based/data_block_hash_index.cc
636        table/block_based/data_block_footer.cc
637        table/block_based/filter_block_reader_common.cc
638        table/block_based/filter_policy.cc
639        table/block_based/flush_block_policy.cc
640        table/block_based/full_filter_block.cc
641        table/block_based/hash_index_reader.cc
642        table/block_based/index_builder.cc
643        table/block_based/index_reader_common.cc
644        table/block_based/parsed_full_filter_block.cc
645        table/block_based/partitioned_filter_block.cc
646        table/block_based/partitioned_index_iterator.cc
647        table/block_based/partitioned_index_reader.cc
648        table/block_based/reader_common.cc
649        table/block_based/uncompression_dict_reader.cc
650        table/block_fetcher.cc
651        table/cuckoo/cuckoo_table_builder.cc
652        table/cuckoo/cuckoo_table_factory.cc
653        table/cuckoo/cuckoo_table_reader.cc
654        table/format.cc
655        table/get_context.cc
656        table/iterator.cc
657        table/merging_iterator.cc
658        table/meta_blocks.cc
659        table/persistent_cache_helper.cc
660        table/plain/plain_table_bloom.cc
661        table/plain/plain_table_builder.cc
662        table/plain/plain_table_factory.cc
663        table/plain/plain_table_index.cc
664        table/plain/plain_table_key_coding.cc
665        table/plain/plain_table_reader.cc
666        table/sst_file_reader.cc
667        table/sst_file_writer.cc
668        table/table_properties.cc
669        table/two_level_iterator.cc
670        test_util/sync_point.cc
671        test_util/sync_point_impl.cc
672        test_util/testutil.cc
673        test_util/transaction_test_util.cc
674        tools/block_cache_analyzer/block_cache_trace_analyzer.cc
675        tools/dump/db_dump_tool.cc
676        tools/ldb_cmd.cc
677        tools/ldb_tool.cc
678        tools/sst_dump_tool.cc
679        tools/trace_analyzer_tool.cc
680        trace_replay/trace_replay.cc
681        trace_replay/block_cache_tracer.cc
682        util/coding.cc
683        util/compaction_job_stats_impl.cc
684        util/comparator.cc
685        util/compression_context_cache.cc
686        util/concurrent_task_limiter_impl.cc
687        util/crc32c.cc
688        util/dynamic_bloom.cc
689        util/hash.cc
690        util/murmurhash.cc
691        util/random.cc
692        util/rate_limiter.cc
693        util/slice.cc
694        util/file_checksum_helper.cc
695        util/status.cc
696        util/string_util.cc
697        util/thread_local.cc
698        util/threadpool_imp.cc
699        util/xxhash.cc
700        utilities/backupable/backupable_db.cc
701        utilities/blob_db/blob_compaction_filter.cc
702        utilities/blob_db/blob_db.cc
703        utilities/blob_db/blob_db_impl.cc
704        utilities/blob_db/blob_db_impl_filesnapshot.cc
705        utilities/blob_db/blob_dump_tool.cc
706        utilities/blob_db/blob_file.cc
707        utilities/blob_db/blob_log_reader.cc
708        utilities/blob_db/blob_log_writer.cc
709        utilities/blob_db/blob_log_format.cc
710        utilities/cassandra/cassandra_compaction_filter.cc
711        utilities/cassandra/format.cc
712        utilities/cassandra/merge_operator.cc
713        utilities/checkpoint/checkpoint_impl.cc
714        utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc
715        utilities/debug.cc
716        utilities/env_mirror.cc
717        utilities/env_timed.cc
718        utilities/leveldb_options/leveldb_options.cc
719        utilities/memory/memory_util.cc
720        utilities/merge_operators/bytesxor.cc
721        utilities/merge_operators/max.cc
722        utilities/merge_operators/put.cc
723        utilities/merge_operators/sortlist.cc
724        utilities/merge_operators/string_append/stringappend.cc
725        utilities/merge_operators/string_append/stringappend2.cc
726        utilities/merge_operators/uint64add.cc
727        utilities/object_registry.cc
728        utilities/option_change_migration/option_change_migration.cc
729        utilities/options/options_util.cc
730        utilities/persistent_cache/block_cache_tier.cc
731        utilities/persistent_cache/block_cache_tier_file.cc
732        utilities/persistent_cache/block_cache_tier_metadata.cc
733        utilities/persistent_cache/persistent_cache_tier.cc
734        utilities/persistent_cache/volatile_tier_impl.cc
735        utilities/simulator_cache/cache_simulator.cc
736        utilities/simulator_cache/sim_cache.cc
737        utilities/table_properties_collectors/compact_on_deletion_collector.cc
738        utilities/trace/file_trace_reader_writer.cc
739        utilities/transactions/optimistic_transaction_db_impl.cc
740        utilities/transactions/optimistic_transaction.cc
741        utilities/transactions/pessimistic_transaction.cc
742        utilities/transactions/pessimistic_transaction_db.cc
743        utilities/transactions/snapshot_checker.cc
744        utilities/transactions/transaction_base.cc
745        utilities/transactions/transaction_db_mutex_impl.cc
746        utilities/transactions/transaction_lock_mgr.cc
747        utilities/transactions/transaction_util.cc
748        utilities/transactions/write_prepared_txn.cc
749        utilities/transactions/write_prepared_txn_db.cc
750        utilities/transactions/write_unprepared_txn.cc
751        utilities/transactions/write_unprepared_txn_db.cc
752        utilities/ttl/db_ttl_impl.cc
753        utilities/write_batch_with_index/write_batch_with_index.cc
754        utilities/write_batch_with_index/write_batch_with_index_internal.cc
755        $<TARGET_OBJECTS:build_version>)
756
757if(HAVE_SSE42 AND NOT MSVC)
758  set_source_files_properties(
759    util/crc32c.cc
760    PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul")
761endif()
762
763if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
764  list(APPEND SOURCES
765    util/crc32c_ppc.c
766    util/crc32c_ppc_asm.S)
767endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
768
769if(HAS_ARMV8_CRC)
770  list(APPEND SOURCES
771    util/crc32c_arm64.cc)
772endif(HAS_ARMV8_CRC)
773
774if(WIN32)
775  list(APPEND SOURCES
776    port/win/io_win.cc
777    port/win/env_win.cc
778    port/win/env_default.cc
779    port/win/port_win.cc
780    port/win/win_logger.cc
781    port/win/win_thread.cc)
782
783if(WITH_XPRESS)
784  list(APPEND SOURCES
785    port/win/xpress_win.cc)
786endif()
787
788if(WITH_JEMALLOC)
789  list(APPEND SOURCES
790    port/win/win_jemalloc.cc)
791endif()
792
793else()
794  list(APPEND SOURCES
795    port/port_posix.cc
796    env/env_posix.cc
797    env/fs_posix.cc
798    env/io_posix.cc)
799endif()
800
801if(WITH_FOLLY_DISTRIBUTED_MUTEX)
802  list(APPEND SOURCES
803    third-party/folly/folly/detail/Futex.cpp
804    third-party/folly/folly/synchronization/AtomicNotification.cpp
805    third-party/folly/folly/synchronization/DistributedMutex.cpp
806    third-party/folly/folly/synchronization/ParkingLot.cpp
807    third-party/folly/folly/synchronization/WaitOptions.cpp)
808endif()
809
810set(ROCKSDB_STATIC_LIB rocksdb${ARTIFACT_SUFFIX})
811set(ROCKSDB_SHARED_LIB rocksdb-shared${ARTIFACT_SUFFIX})
812
813option(ROCKSDB_BUILD_SHARED "Build shared versions of the RocksDB libraries" ON)
814
815option(WITH_LIBRADOS "Build with librados" OFF)
816if(WITH_LIBRADOS)
817  list(APPEND SOURCES
818    utilities/env_librados.cc)
819  list(APPEND THIRDPARTY_LIBS rados)
820endif()
821
822if(WIN32)
823  set(SYSTEM_LIBS ${SYSTEM_LIBS} shlwapi.lib rpcrt4.lib)
824else()
825  set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
826endif()
827
828add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES})
829target_link_libraries(${ROCKSDB_STATIC_LIB}
830  ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
831
832if(ROCKSDB_BUILD_SHARED)
833  add_library(${ROCKSDB_SHARED_LIB} SHARED ${SOURCES})
834  target_link_libraries(${ROCKSDB_SHARED_LIB}
835    ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
836
837  if(WIN32)
838    set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
839      COMPILE_DEFINITIONS "ROCKSDB_DLL;ROCKSDB_LIBRARY_EXPORTS")
840    if(MSVC)
841      set_target_properties(${ROCKSDB_STATIC_LIB} PROPERTIES
842        COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_STATIC_LIB}.pdb")
843      set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
844        COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_SHARED_LIB}.pdb")
845    endif()
846  else()
847    set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
848                          LINKER_LANGUAGE CXX
849                          VERSION ${rocksdb_VERSION}
850                          SOVERSION ${rocksdb_VERSION_MAJOR}
851                          CXX_STANDARD 11
852                          OUTPUT_NAME "rocksdb")
853  endif()
854endif()
855
856if(ROCKSDB_BUILD_SHARED AND NOT WIN32)
857  set(ROCKSDB_LIB ${ROCKSDB_SHARED_LIB})
858else()
859  set(ROCKSDB_LIB ${ROCKSDB_STATIC_LIB})
860endif()
861
862option(WITH_JNI "build with JNI" OFF)
863if(WITH_JNI OR JNI)
864  message(STATUS "JNI library is enabled")
865  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/java)
866else()
867  message(STATUS "JNI library is disabled")
868endif()
869
870# Installation and packaging
871if(WIN32)
872  option(ROCKSDB_INSTALL_ON_WINDOWS "Enable install target on Windows" OFF)
873endif()
874if(NOT WIN32 OR ROCKSDB_INSTALL_ON_WINDOWS)
875  if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
876    if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
877      # Change default installation prefix on Linux to /usr
878      set(CMAKE_INSTALL_PREFIX /usr CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
879    endif()
880  endif()
881
882  include(GNUInstallDirs)
883  include(CMakePackageConfigHelpers)
884
885  set(package_config_destination ${CMAKE_INSTALL_LIBDIR}/cmake/rocksdb)
886
887  configure_package_config_file(
888    ${CMAKE_CURRENT_LIST_DIR}/cmake/RocksDBConfig.cmake.in RocksDBConfig.cmake
889    INSTALL_DESTINATION ${package_config_destination}
890  )
891
892  write_basic_package_version_file(
893    RocksDBConfigVersion.cmake
894    VERSION ${rocksdb_VERSION}
895    COMPATIBILITY SameMajorVersion
896  )
897
898  install(DIRECTORY include/rocksdb COMPONENT devel DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
899
900  install(
901    TARGETS ${ROCKSDB_STATIC_LIB}
902    EXPORT RocksDBTargets
903    COMPONENT devel
904    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
905    INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
906  )
907
908  if(ROCKSDB_BUILD_SHARED)
909    install(
910      TARGETS ${ROCKSDB_SHARED_LIB}
911      EXPORT RocksDBTargets
912      COMPONENT runtime
913      ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
914      RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
915      LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
916      INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
917    )
918  endif()
919
920  install(
921    EXPORT RocksDBTargets
922    COMPONENT devel
923    DESTINATION ${package_config_destination}
924    NAMESPACE RocksDB::
925  )
926
927  install(
928    FILES
929    ${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfig.cmake
930    ${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfigVersion.cmake
931    COMPONENT devel
932    DESTINATION ${package_config_destination}
933  )
934endif()
935
936# Tests are excluded from Release builds
937CMAKE_DEPENDENT_OPTION(WITH_TESTS "build with tests" ON
938  "CMAKE_BUILD_TYPE STREQUAL Debug" OFF)
939if(WITH_TESTS)
940  add_subdirectory(third-party/gtest-1.8.1/fused-src/gtest)
941  add_library(testharness STATIC
942  test_util/testharness.cc)
943  target_link_libraries(testharness gtest)
944
945  set(TESTS
946        cache/cache_test.cc
947        cache/lru_cache_test.cc
948        db/blob/blob_file_addition_test.cc
949        db/blob/blob_file_garbage_test.cc
950        db/blob/db_blob_index_test.cc
951        db/column_family_test.cc
952        db/compact_files_test.cc
953        db/compaction/compaction_job_stats_test.cc
954        db/compaction/compaction_job_test.cc
955        db/compaction/compaction_iterator_test.cc
956        db/compaction/compaction_picker_test.cc
957        db/comparator_db_test.cc
958        db/corruption_test.cc
959        db/cuckoo_table_db_test.cc
960        db/db_basic_test.cc
961        db/db_with_timestamp_basic_test.cc
962        db/db_block_cache_test.cc
963        db/db_bloom_filter_test.cc
964        db/db_compaction_filter_test.cc
965        db/db_compaction_test.cc
966        db/db_dynamic_level_test.cc
967        db/db_flush_test.cc
968        db/db_inplace_update_test.cc
969        db/db_io_failure_test.cc
970        db/db_iter_test.cc
971        db/db_iter_stress_test.cc
972        db/db_iterator_test.cc
973        db/db_log_iter_test.cc
974        db/db_memtable_test.cc
975        db/db_merge_operator_test.cc
976        db/db_merge_operand_test.cc
977        db/db_options_test.cc
978        db/db_properties_test.cc
979        db/db_range_del_test.cc
980        db/db_impl/db_secondary_test.cc
981        db/db_sst_test.cc
982        db/db_statistics_test.cc
983        db/db_table_properties_test.cc
984        db/db_tailing_iter_test.cc
985        db/db_test.cc
986        db/db_test2.cc
987        db/db_logical_block_size_cache_test.cc
988        db/db_universal_compaction_test.cc
989        db/db_wal_test.cc
990        db/db_write_test.cc
991        db/dbformat_test.cc
992        db/deletefile_test.cc
993        db/error_handler_fs_test.cc
994        db/obsolete_files_test.cc
995        db/external_sst_file_basic_test.cc
996        db/external_sst_file_test.cc
997        db/fault_injection_test.cc
998        db/file_indexer_test.cc
999        db/filename_test.cc
1000        db/flush_job_test.cc
1001        db/listener_test.cc
1002        db/log_test.cc
1003        db/manual_compaction_test.cc
1004        db/memtable_list_test.cc
1005        db/merge_helper_test.cc
1006        db/merge_test.cc
1007        db/options_file_test.cc
1008        db/perf_context_test.cc
1009        db/plain_table_db_test.cc
1010        db/prefix_test.cc
1011        db/range_del_aggregator_test.cc
1012        db/range_tombstone_fragmenter_test.cc
1013        db/repair_test.cc
1014        db/table_properties_collector_test.cc
1015        db/version_builder_test.cc
1016        db/version_edit_test.cc
1017        db/version_set_test.cc
1018        db/wal_manager_test.cc
1019        db/write_batch_test.cc
1020        db/write_callback_test.cc
1021        db/write_controller_test.cc
1022        env/env_basic_test.cc
1023        env/env_test.cc
1024        env/io_posix_test.cc
1025        env/mock_env_test.cc
1026        file/delete_scheduler_test.cc
1027        file/random_access_file_reader_test.cc
1028        logging/auto_roll_logger_test.cc
1029        logging/env_logger_test.cc
1030        logging/event_logger_test.cc
1031        memory/arena_test.cc
1032        memtable/inlineskiplist_test.cc
1033        memtable/skiplist_test.cc
1034        memtable/write_buffer_manager_test.cc
1035        monitoring/histogram_test.cc
1036        monitoring/iostats_context_test.cc
1037        monitoring/statistics_test.cc
1038        monitoring/stats_history_test.cc
1039        options/options_settable_test.cc
1040        options/options_test.cc
1041        table/block_based/block_based_filter_block_test.cc
1042        table/block_based/block_test.cc
1043        table/block_based/data_block_hash_index_test.cc
1044        table/block_based/full_filter_block_test.cc
1045        table/block_based/partitioned_filter_block_test.cc
1046        table/cleanable_test.cc
1047        table/cuckoo/cuckoo_table_builder_test.cc
1048        table/cuckoo/cuckoo_table_reader_test.cc
1049        table/merger_test.cc
1050        table/sst_file_reader_test.cc
1051        table/table_test.cc
1052        tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc
1053        tools/ldb_cmd_test.cc
1054        tools/reduce_levels_test.cc
1055        tools/sst_dump_test.cc
1056        tools/trace_analyzer_test.cc
1057        util/autovector_test.cc
1058        util/bloom_test.cc
1059        util/coding_test.cc
1060        util/crc32c_test.cc
1061        util/defer_test.cc
1062        util/dynamic_bloom_test.cc
1063        util/file_reader_writer_test.cc
1064        util/filelock_test.cc
1065        util/hash_test.cc
1066        util/heap_test.cc
1067        util/random_test.cc
1068        util/rate_limiter_test.cc
1069        util/repeatable_thread_test.cc
1070        util/slice_test.cc
1071        util/slice_transform_test.cc
1072        util/timer_queue_test.cc
1073        util/thread_list_test.cc
1074        util/thread_local_test.cc
1075        utilities/backupable/backupable_db_test.cc
1076        utilities/blob_db/blob_db_test.cc
1077        utilities/cassandra/cassandra_functional_test.cc
1078        utilities/cassandra/cassandra_format_test.cc
1079        utilities/cassandra/cassandra_row_merge_test.cc
1080        utilities/cassandra/cassandra_serialize_test.cc
1081        utilities/checkpoint/checkpoint_test.cc
1082        utilities/memory/memory_test.cc
1083        utilities/merge_operators/string_append/stringappend_test.cc
1084        utilities/object_registry_test.cc
1085        utilities/option_change_migration/option_change_migration_test.cc
1086        utilities/options/options_util_test.cc
1087        utilities/persistent_cache/hash_table_test.cc
1088        utilities/persistent_cache/persistent_cache_test.cc
1089        utilities/simulator_cache/cache_simulator_test.cc
1090        utilities/simulator_cache/sim_cache_test.cc
1091        utilities/table_properties_collectors/compact_on_deletion_collector_test.cc
1092        utilities/transactions/optimistic_transaction_test.cc
1093        utilities/transactions/transaction_test.cc
1094        utilities/transactions/write_prepared_transaction_test.cc
1095        utilities/transactions/write_unprepared_transaction_test.cc
1096        utilities/ttl/ttl_test.cc
1097        utilities/write_batch_with_index/write_batch_with_index_test.cc
1098  )
1099  if(WITH_LIBRADOS)
1100    list(APPEND TESTS utilities/env_librados_test.cc)
1101  endif()
1102
1103  if(WITH_FOLLY_DISTRIBUTED_MUTEX)
1104    list(APPEND TESTS third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp)
1105  endif()
1106
1107  set(TESTUTIL_SOURCE
1108      db/db_test_util.cc
1109      monitoring/thread_status_updater_debug.cc
1110      table/mock_table.cc
1111      test_util/fault_injection_test_env.cc
1112      test_util/fault_injection_test_fs.cc
1113      utilities/cassandra/test_utils.cc
1114  )
1115  enable_testing()
1116  add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
1117  set(TESTUTILLIB testutillib${ARTIFACT_SUFFIX})
1118  add_library(${TESTUTILLIB} STATIC ${TESTUTIL_SOURCE})
1119  target_link_libraries(${TESTUTILLIB} ${ROCKSDB_LIB})
1120  if(MSVC)
1121    set_target_properties(${TESTUTILLIB} PROPERTIES COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/testutillib${ARTIFACT_SUFFIX}.pdb")
1122  endif()
1123  set_target_properties(${TESTUTILLIB}
1124        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
1125        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
1126        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
1127        )
1128
1129  foreach(sourcefile ${TESTS})
1130      get_filename_component(exename ${sourcefile} NAME_WE)
1131      add_executable(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} ${sourcefile})
1132      set_target_properties(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX}
1133        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
1134        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
1135        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
1136        OUTPUT_NAME ${exename}${ARTIFACT_SUFFIX}
1137        )
1138      target_link_libraries(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} testutillib${ARTIFACT_SUFFIX} testharness gtest ${ROCKSDB_LIB})
1139      if(NOT "${exename}" MATCHES "db_sanity_test")
1140        add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
1141        add_dependencies(check ${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX})
1142      endif()
1143  endforeach(sourcefile ${TESTS})
1144
1145  if(WIN32)
1146    # C executables must link to a shared object
1147    if(ROCKSDB_BUILD_SHARED)
1148      set(ROCKSDB_LIB_FOR_C ${ROCKSDB_SHARED_LIB})
1149    else()
1150      set(ROCKSDB_LIB_FOR_C OFF)
1151    endif()
1152  else()
1153    set(ROCKSDB_LIB_FOR_C ${ROCKSDB_LIB})
1154  endif()
1155
1156  if(ROCKSDB_LIB_FOR_C)
1157    set(C_TESTS db/c_test.c)
1158    # C executables must link to a shared object
1159    add_executable(c_test db/c_test.c)
1160    target_link_libraries(c_test ${ROCKSDB_SHARED_LIB} testharness)
1161    add_test(NAME c_test COMMAND c_test${ARTIFACT_SUFFIX})
1162    add_dependencies(check c_test)
1163  endif()
1164endif()
1165
1166option(WITH_BENCHMARK_TOOLS "build with benchmarks" ON)
1167if(WITH_BENCHMARK_TOOLS)
1168  add_executable(db_bench
1169    tools/db_bench.cc
1170    tools/db_bench_tool.cc)
1171  target_link_libraries(db_bench
1172    ${ROCKSDB_LIB})
1173
1174  add_executable(cache_bench
1175    cache/cache_bench.cc)
1176  target_link_libraries(cache_bench
1177    ${ROCKSDB_LIB})
1178
1179  add_executable(memtablerep_bench
1180    memtable/memtablerep_bench.cc)
1181  target_link_libraries(memtablerep_bench
1182    ${ROCKSDB_LIB})
1183
1184  add_executable(range_del_aggregator_bench
1185    db/range_del_aggregator_bench.cc)
1186  target_link_libraries(range_del_aggregator_bench
1187    ${ROCKSDB_LIB})
1188
1189  add_executable(table_reader_bench
1190    table/table_reader_bench.cc)
1191  target_link_libraries(table_reader_bench
1192    ${ROCKSDB_LIB} testharness)
1193
1194  add_executable(filter_bench
1195    util/filter_bench.cc)
1196  target_link_libraries(filter_bench
1197    ${ROCKSDB_LIB})
1198
1199  add_executable(hash_table_bench
1200    utilities/persistent_cache/hash_table_bench.cc)
1201  target_link_libraries(hash_table_bench
1202    ${ROCKSDB_LIB})
1203endif()
1204
1205option(WITH_CORE_TOOLS "build with ldb and sst_dump" ON)
1206option(WITH_TOOLS "build with tools" ON)
1207if(WITH_CORE_TOOLS OR WITH_TOOLS)
1208  add_subdirectory(tools)
1209  add_custom_target(core_tools
1210    DEPENDS ${core_tool_deps})
1211endif()
1212
1213if(WITH_TOOLS)
1214  add_subdirectory(db_stress_tool)
1215  add_custom_target(tools
1216    DEPENDS ${tool_deps})
1217endif()
1218