CMakeLists.txt 38.7 KB
Newer Older
1 2
# Prerequisites for Windows:
#     This cmake build is for Windows 64-bit only.
D
Dmitri Smirnov 已提交
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.
D
Dmitri Smirnov 已提交
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.
D
Dmitri Smirnov 已提交
8 9
#
# To build Rocksdb for Windows is as easy as 1-2-3-4-5:
A
agiardullo 已提交
10
#
11
# 1. Update paths to third-party libraries in thirdparty.inc file
D
Dmitri Smirnov 已提交
12 13 14
# 2. Create a new directory for build artifacts
#        mkdir build
#        cd build
15 16
# 3. Run cmake to generate project files for Windows, add more options to enable required third-party libraries.
#    See thirdparty.inc for more information.
17
#        sample command: cmake -G "Visual Studio 15 Win64" -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 21 22 23 24
#        msbuild rocksdb.sln
#
#        rocksdb.sln build features exclusions of test only code in Release. If you build ALL_BUILD then everything
#        will be attempted but test only code does not build in Release mode.
#
25
# 5. And release mode (/m[:<N>] is also supported)
26
#        msbuild rocksdb.sln /p:Configuration=Release
D
Dmitri Smirnov 已提交
27
#
28 29 30 31 32 33
# Linux:
#
# 1. Install a recent toolchain such as devtoolset-3 if you're on a older distro. C++11 required.
# 2. mkdir build; cd build
# 3. cmake ..
# 4. make -j
D
Dmitri Smirnov 已提交
34

35 36 37 38 39 40 41 42
cmake_minimum_required(VERSION 3.5.1)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/")
include(ReadVersion)
get_rocksdb_version(rocksdb_VERSION)
project(rocksdb
  VERSION ${rocksdb_VERSION}
  LANGUAGES CXX C ASM)
D
Dmitri Smirnov 已提交
43

44 45 46 47
if(POLICY CMP0042)
  cmake_policy(SET CMP0042 NEW)
endif()

48 49 50 51 52 53
find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
  set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
  set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)

54
option(WITH_JEMALLOC "build with JeMalloc" OFF)
55 56 57
option(WITH_SNAPPY "build with SNAPPY" OFF)
option(WITH_LZ4 "build with lz4" OFF)
option(WITH_ZLIB "build with zlib" OFF)
58
option(WITH_ZSTD "build with zstd" OFF)
59 60 61 62
option(WITH_WINDOWS_UTF8_FILENAMES "use UTF8 as characterset for opening files, regardles of the system code page" OFF)
if (WITH_WINDOWS_UTF8_FILENAMES)
  add_definitions(-DROCKSDB_WINDOWS_UTF8_FILENAMES)
endif()
63 64 65 66 67 68 69
# third-party/folly is only validated to work on Linux and Windows for now.
# So only turn it on there by default.
if(CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Windows")
  option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" ON)
else()
  option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" OFF)
endif()
T
Tamir Duberstein 已提交
70
if(MSVC)
71 72 73 74
  # Defaults currently different for GFLAGS.
  #  We will address find_package work a little later
  option(WITH_GFLAGS "build with GFlags" OFF)
  option(WITH_XPRESS "build with windows built in compression" OFF)
75 76
  include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc)
else()
T
Tamir Duberstein 已提交
77
  if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
78
    # FreeBSD has jemalloc as default malloc
79
    # but it does not have all the jemalloc files in include/...
T
Tamir Duberstein 已提交
80
    set(WITH_JEMALLOC ON)
81 82 83 84
  else()
    if(WITH_JEMALLOC)
      find_package(JeMalloc REQUIRED)
      add_definitions(-DROCKSDB_JEMALLOC -DJEMALLOC_NO_DEMANGLE)
85
      list(APPEND THIRDPARTY_LIBS JeMalloc::JeMalloc)
86
    endif()
T
Tamir Duberstein 已提交
87
  endif()
88

89 90 91 92 93 94 95 96 97 98
  # No config file for this
  option(WITH_GFLAGS "build with GFlags" ON)
  if(WITH_GFLAGS)
    find_package(gflags)
    if(gflags_FOUND)
      add_definitions(-DGFLAGS=1)
      include_directories(${gflags_INCLUDE_DIR})
      list(APPEND THIRDPARTY_LIBS ${gflags_LIBRARIES})
    endif()
  endif()
J
Jay 已提交
99

100 101 102
  if(WITH_SNAPPY)
    find_package(snappy REQUIRED)
    add_definitions(-DSNAPPY)
103
    list(APPEND THIRDPARTY_LIBS snappy::snappy)
104
  endif()
J
Jay 已提交
105 106

  if(WITH_ZLIB)
107
    find_package(ZLIB REQUIRED)
J
Jay 已提交
108
    add_definitions(-DZLIB)
109
    list(APPEND THIRDPARTY_LIBS ZLIB::ZLIB)
J
Jay 已提交
110 111 112 113
  endif()

  option(WITH_BZ2 "build with bzip2" OFF)
  if(WITH_BZ2)
114
    find_package(BZip2 REQUIRED)
J
Jay 已提交
115
    add_definitions(-DBZIP2)
116 117 118 119 120
    if(BZIP2_INCLUDE_DIRS)
      include_directories(${BZIP2_INCLUDE_DIRS})
    else()
      include_directories(${BZIP2_INCLUDE_DIR})
    endif()
J
Jay 已提交
121 122 123 124 125 126
    list(APPEND THIRDPARTY_LIBS ${BZIP2_LIBRARIES})
  endif()

  if(WITH_LZ4)
    find_package(lz4 REQUIRED)
    add_definitions(-DLZ4)
127
    list(APPEND THIRDPARTY_LIBS lz4::lz4)
J
Jay 已提交
128 129 130 131 132 133
  endif()

  if(WITH_ZSTD)
    find_package(zstd REQUIRED)
    add_definitions(-DZSTD)
    include_directories(${ZSTD_INCLUDE_DIR})
134
    list(APPEND THIRDPARTY_LIBS zstd::zstd)
J
Jay 已提交
135
  endif()
136 137
endif()

138 139
string(TIMESTAMP TS "%Y/%m/%d %H:%M:%S" UTC)
set(GIT_DATE_TIME "${TS}" CACHE STRING "the time we first built rocksdb")
D
Dmitri Smirnov 已提交
140

141 142
find_package(Git)

T
Tamir Duberstein 已提交
143
if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
144
  if(WIN32)
145
    execute_process(COMMAND $ENV{COMSPEC} /C ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
146 147 148
  else()
    execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
  endif()
149
else()
150
  set(GIT_SHA 0)
151 152
endif()

153
string(REGEX REPLACE "[^0-9a-f]+" "" GIT_SHA "${GIT_SHA}")
D
Dmitri Smirnov 已提交
154

155

156 157 158 159 160 161
option(WITH_MD_LIBRARY "build with MD" ON)
if(WIN32 AND MSVC)
  if(WITH_MD_LIBRARY)
    set(RUNTIME_LIBRARY "MD")
  else()
    set(RUNTIME_LIBRARY "MT")
T
Tamir Duberstein 已提交
162
  endif()
163
endif()
T
Tomas Kolda 已提交
164

165 166 167 168 169 170 171
set(BUILD_VERSION_CC ${CMAKE_BINARY_DIR}/build_version.cc)
configure_file(util/build_version.cc.in ${BUILD_VERSION_CC} @ONLY)
add_library(build_version OBJECT ${BUILD_VERSION_CC})
target_include_directories(build_version PRIVATE
  ${CMAKE_CURRENT_SOURCE_DIR}/util)
if(MSVC)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /nologo /EHsc /GS /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue")
172
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
173 174
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall")
O
Orgad Shaneh 已提交
175
  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")
176 177
  if(MINGW)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format")
178
    add_definitions(-D_POSIX_C_SOURCE=1)
179 180 181
  endif()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
T
Tamir Duberstein 已提交
182
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
183 184 185 186 187 188 189 190
    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("-momit-leaf-frame-pointer" HAVE_OMIT_LEAF_FRAME_POINTER)
    if(HAVE_OMIT_LEAF_FRAME_POINTER)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -momit-leaf-frame-pointer")
    endif()
  endif()
endif()

191 192 193 194 195 196 197 198 199 200 201 202
include(CheckCCompilerFlag)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le")
  CHECK_C_COMPILER_FLAG("-maltivec" HAS_ALTIVEC)
  if(HAS_ALTIVEC)
    message(STATUS " HAS_ALTIVEC yes")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maltivec")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maltivec")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power8")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power8")
  endif(HAS_ALTIVEC)
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le")

203
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
204
        CHECK_C_COMPILER_FLAG("-march=armv8-a+crc+crypto" HAS_ARMV8_CRC)
205 206
  if(HAS_ARMV8_CRC)
    message(STATUS " HAS_ARMV8_CRC yes")
207 208
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function")
209 210 211
  endif(HAS_ARMV8_CRC)
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")

212 213 214 215 216 217
option(PORTABLE "build a portable binary" OFF)
option(FORCE_SSE42 "force building with SSE4.2, even when PORTABLE=ON" OFF)
if(PORTABLE)
  # MSVC does not need a separate compiler flag to enable SSE4.2; if nmmintrin.h
  # is available, it is available by default.
  if(FORCE_SSE42 AND NOT MSVC)
218
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpclmul")
T
Tomas Kolda 已提交
219
  endif()
T
Tamir Duberstein 已提交
220
else()
221 222 223
  if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
  else()
224
    if(NOT HAVE_POWER8 AND NOT HAS_ARMV8_CRC)
225 226
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
    endif()
T
Tamir Duberstein 已提交
227
  endif()
T
Tamir Duberstein 已提交
228 229
endif()

230
include(CheckCXXSourceCompiles)
231
if(NOT MSVC)
232
  set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
233
endif()
234 235 236
CHECK_CXX_SOURCE_COMPILES("
#include <cstdint>
#include <nmmintrin.h>
237
#include <wmmintrin.h>
238 239
int main() {
  volatile uint32_t x = _mm_crc32_u32(0, 0);
240 241 242 243
  const auto a = _mm_set_epi64x(0, 0);
  const auto b = _mm_set_epi64x(0, 0);
  const auto c = _mm_clmulepi64_si128(a, b, 0x00);
  auto d = _mm_cvtsi128_si64(c);
244 245
}
" HAVE_SSE42)
246
unset(CMAKE_REQUIRED_FLAGS)
247 248
if(HAVE_SSE42)
  add_definitions(-DHAVE_SSE42)
249
  add_definitions(-DHAVE_PCLMUL)
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
elseif(FORCE_SSE42)
  message(FATAL_ERROR "FORCE_SSE42=ON but unable to compile with SSE4.2 enabled")
endif()

CHECK_CXX_SOURCE_COMPILES("
#if defined(_MSC_VER) && !defined(__thread)
#define __thread __declspec(thread)
#endif
int main() {
  static __thread int tls;
}
" HAVE_THREAD_LOCAL)
if(HAVE_THREAD_LOCAL)
  add_definitions(-DROCKSDB_SUPPORT_THREAD_LOCAL)
endif()

266 267 268 269 270 271 272 273 274
option(FAIL_ON_WARNINGS "Treat compile warnings as errors" ON)
if(FAIL_ON_WARNINGS)
  if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")
  else() # assume GCC
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
  endif()
endif()

275 276 277 278 279 280 281 282 283
option(WITH_ASAN "build with ASAN" OFF)
if(WITH_ASAN)
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
  if(WITH_JEMALLOC)
    message(FATAL "ASAN does not work well with JeMalloc")
  endif()
endif()
D
Dmitri Smirnov 已提交
284

285 286 287 288 289 290 291 292 293
option(WITH_TSAN "build with TSAN" OFF)
if(WITH_TSAN)
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread -pie")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fPIC")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fPIC")
  if(WITH_JEMALLOC)
    message(FATAL "TSAN does not work well with JeMalloc")
  endif()
endif()
294

295 296
option(WITH_UBSAN "build with UBSAN" OFF)
if(WITH_UBSAN)
297
  add_definitions(-DROCKSDB_UBSAN_RUN)
298 299 300 301 302 303 304
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined")
  if(WITH_JEMALLOC)
    message(FATAL "UBSAN does not work well with JeMalloc")
  endif()
endif()
D
Dmitri Smirnov 已提交
305

306 307 308
option(WITH_NUMA "build with NUMA policy support" OFF)
if(WITH_NUMA)
  find_package(NUMA REQUIRED)
309 310
  add_definitions(-DNUMA)
  include_directories(${NUMA_INCLUDE_DIR})
311
  list(APPEND THIRDPARTY_LIBS NUMA::NUMA)
312 313
endif()

314 315 316
option(WITH_TBB "build with Threading Building Blocks (TBB)" OFF)
if(WITH_TBB)
  find_package(TBB REQUIRED)
317
  add_definitions(-DTBB)
318
  list(APPEND THIRDPARTY_LIBS TBB::TBB)
319 320
endif()

321 322 323 324 325 326
# Stall notifications eat some performance from inserts
option(DISABLE_STALL_NOTIF "Build with stall notifications" OFF)
if(DISABLE_STALL_NOTIF)
  add_definitions(-DROCKSDB_DISABLE_STALL_NOTIFICATION)
endif()

327 328 329 330
option(WITH_DYNAMIC_EXTENSION "build with dynamic extension support" OFF)
if(NOT WITH_DYNAMIC_EXTENSION)
  add_definitions(-DROCKSDB_NO_DYNAMIC_EXTENSION)
endif()
331

332 333 334 335 336 337
if(DEFINED USE_RTTI)
  if(USE_RTTI)
    message(STATUS "Enabling RTTI")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DROCKSDB_USE_RTTI")
  else()
338 339 340 341 342 343 344 345 346
    if(MSVC)
      message(STATUS "Disabling RTTI in Release builds. Always on in Debug.")
      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
    else()
      message(STATUS "Disabling RTTI in Release builds")
      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-rtti")
      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti")
    endif()
347
  endif()
348 349 350
else()
  message(STATUS "Enabling RTTI in Debug builds only (default)")
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
351 352 353 354 355
  if(MSVC)
     set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
  else()
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti")
  endif()
356 357
endif()

358 359
# Used to run CI build and tests so we can run faster
option(OPTDBG "Build optimized debug build with MSVC" OFF)
360
option(WITH_RUNTIME_DEBUG "build with debug version of runtime library" ON)
O
Orgad Shaneh 已提交
361
if(MSVC)
362
  if(OPTDBG)
363
    message(STATUS "Debug optimization is enabled")
364
    set(CMAKE_CXX_FLAGS_DEBUG "/Oxt")
365
  else()
366 367 368 369 370 371
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /RTC1 /Gm")
  endif()
  if(WITH_RUNTIME_DEBUG)
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}d")
  else()
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}")
372
  endif()
T
Tomas Kolda 已提交
373
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
374 375 376

  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
377 378
endif()

379 380 381
if(CMAKE_COMPILER_IS_GNUCXX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-memcmp")
endif()
D
Dmitri Smirnov 已提交
382

383 384 385
option(ROCKSDB_LITE "Build RocksDBLite version" OFF)
if(ROCKSDB_LITE)
  add_definitions(-DROCKSDB_LITE)
Y
Yi Wu 已提交
386
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -Os")
387
endif()
D
Dmitri Smirnov 已提交
388

389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
if(CMAKE_SYSTEM_NAME MATCHES "Cygwin")
  add_definitions(-fno-builtin-memcmp -DCYGWIN)
elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
  add_definitions(-DOS_MACOSX)
  if(CMAKE_SYSTEM_PROCESSOR MATCHES arm)
    add_definitions(-DIOS_CROSS_COMPILE -DROCKSDB_LITE)
    # no debug info for IOS, that will make our library big
    add_definitions(-DNDEBUG)
  endif()
elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
  add_definitions(-DOS_LINUX)
elseif(CMAKE_SYSTEM_NAME MATCHES "SunOS")
  add_definitions(-DOS_SOLARIS)
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  add_definitions(-DOS_FREEBSD)
elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
  add_definitions(-DOS_NETBSD)
elseif(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
  add_definitions(-DOS_OPENBSD)
elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly")
  add_definitions(-DOS_DRAGONFLYBSD)
elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
  add_definitions(-DOS_ANDROID)
elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
  add_definitions(-DWIN32 -DOS_WIN -D_MBCS -DWIN64 -DNOMINMAX)
O
Orgad Shaneh 已提交
414 415 416
  if(MINGW)
    add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_VISTA)
  endif()
417 418 419 420 421 422 423 424
endif()

if(NOT WIN32)
  add_definitions(-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX)
endif()

option(WITH_FALLOCATE "build with fallocate" ON)
if(WITH_FALLOCATE)
425
  CHECK_CXX_SOURCE_COMPILES("
426 427 428 429
#include <fcntl.h>
#include <linux/falloc.h>
int main() {
 int fd = open(\"/dev/null\", 0);
430
 fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, 1024);
431 432 433 434 435 436 437
}
" HAVE_FALLOCATE)
  if(HAVE_FALLOCATE)
    add_definitions(-DROCKSDB_FALLOCATE_PRESENT)
  endif()
endif()

438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
CHECK_CXX_SOURCE_COMPILES("
#include <fcntl.h>
int main() {
  int fd = open(\"/dev/null\", 0);
  sync_file_range(fd, 0, 1024, SYNC_FILE_RANGE_WRITE);
}
" HAVE_SYNC_FILE_RANGE_WRITE)
if(HAVE_SYNC_FILE_RANGE_WRITE)
  add_definitions(-DROCKSDB_RANGESYNC_PRESENT)
endif()

CHECK_CXX_SOURCE_COMPILES("
#include <pthread.h>
int main() {
  (void) PTHREAD_MUTEX_ADAPTIVE_NP;
}
" HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
if(HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
  add_definitions(-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX)
endif()

include(CheckCXXSymbolExists)
check_cxx_symbol_exists(malloc_usable_size malloc.h HAVE_MALLOC_USABLE_SIZE)
461 462 463
if(HAVE_MALLOC_USABLE_SIZE)
  add_definitions(-DROCKSDB_MALLOC_USABLE_SIZE)
endif()
D
Dmitri Smirnov 已提交
464

465 466 467 468 469
check_cxx_symbol_exists(sched_getcpu sched.h HAVE_SCHED_GETCPU)
if(HAVE_SCHED_GETCPU)
  add_definitions(-DROCKSDB_SCHED_GETCPU_PRESENT)
endif()

D
Dmitri Smirnov 已提交
470 471
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/include)
472
include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/gtest-1.8.1/fused-src)
473 474 475
if(WITH_FOLLY_DISTRIBUTED_MUTEX)
  include_directories(${PROJECT_SOURCE_DIR}/third-party/folly)
endif()
476
find_package(Threads REQUIRED)
D
Dmitri Smirnov 已提交
477

478
# Main library source code
479

D
Dmitri Smirnov 已提交
480
set(SOURCES
481 482 483
        cache/clock_cache.cc
        cache/lru_cache.cc
        cache/sharded_cache.cc
484
        db/arena_wrapped_db_iter.cc
D
Dmitri Smirnov 已提交
485 486 487
        db/builder.cc
        db/c.cc
        db/column_family.cc
488
        db/compacted_db_impl.cc
489 490
        db/compaction/compaction.cc
        db/compaction/compaction_iterator.cc
491
        db/compaction/compaction_picker.cc
492 493 494 495
        db/compaction/compaction_job.cc
        db/compaction/compaction_picker_fifo.cc
        db/compaction/compaction_picker_level.cc
        db/compaction/compaction_picker_universal.cc
A
agiardullo 已提交
496
        db/convenience.cc
D
Dmitri Smirnov 已提交
497
        db/db_filesnapshot.cc
498 499 500 501 502 503 504 505 506
        db/db_impl/db_impl.cc
        db/db_impl/db_impl_write.cc
        db/db_impl/db_impl_compaction_flush.cc
        db/db_impl/db_impl_files.cc
        db/db_impl/db_impl_open.cc
        db/db_impl/db_impl_debug.cc
        db/db_impl/db_impl_experimental.cc
        db/db_impl/db_impl_readonly.cc
        db/db_impl/db_impl_secondary.cc
507
        db/db_info_dumper.cc
D
Dmitri Smirnov 已提交
508
        db/db_iter.cc
509
        db/dbformat.cc
510
        db/error_handler.cc
D
Dmitri Smirnov 已提交
511 512
        db/event_helpers.cc
        db/experimental.cc
513
        db/external_sst_file_ingestion_job.cc
D
Dmitri Smirnov 已提交
514 515 516 517
        db/file_indexer.cc
        db/flush_job.cc
        db/flush_scheduler.cc
        db/forward_iterator.cc
518
        db/import_column_family_job.cc
D
Dmitri Smirnov 已提交
519
        db/internal_stats.cc
S
Siying Dong 已提交
520
        db/logs_with_prep_tracker.cc
D
Dmitri Smirnov 已提交
521 522
        db/log_reader.cc
        db/log_writer.cc
523
        db/malloc_stats.cc
D
Dmitri Smirnov 已提交
524 525 526 527
        db/memtable.cc
        db/memtable_list.cc
        db/merge_helper.cc
        db/merge_operator.cc
528
        db/range_del_aggregator.cc
529
        db/range_tombstone_fragmenter.cc
D
Dmitri Smirnov 已提交
530
        db/repair.cc
531
        db/snapshot_impl.cc
D
Dmitri Smirnov 已提交
532 533 534
        db/table_cache.cc
        db/table_properties_collector.cc
        db/transaction_log_impl.cc
535
        db/trim_history_scheduler.cc
D
Dmitri Smirnov 已提交
536 537 538 539 540 541 542 543
        db/version_builder.cc
        db/version_edit.cc
        db/version_set.cc
        db/wal_manager.cc
        db/write_batch.cc
        db/write_batch_base.cc
        db/write_controller.cc
        db/write_thread.cc
544 545
        env/env.cc
        env/env_chroot.cc
E
Ewout Prangsma 已提交
546
        env/env_encryption.cc
547
        env/env_hdfs.cc
548
        env/mock_env.cc
549
        file/delete_scheduler.cc
550
        file/file_prefetch_buffer.cc
551 552
        file/file_util.cc
        file/filename.cc
553 554 555 556
        file/random_access_file_reader.cc
        file/read_write_util.cc
        file/readahead_raf.cc
        file/sequence_file_reader.cc
557
        file/sst_file_manager_impl.cc
558
        file/writable_file_writer.cc
559 560 561
        logging/auto_roll_logger.cc
        logging/event_logger.cc
        logging/log_buffer.cc
562 563 564
        memory/arena.cc
        memory/concurrent_arena.cc
        memory/jemalloc_nodump_allocator.cc
565
        memtable/alloc_tracker.cc
566 567
        memtable/hash_linklist_rep.cc
        memtable/hash_skiplist_rep.cc
568 569
        memtable/skiplistrep.cc
        memtable/vectorrep.cc
570
        memtable/write_buffer_manager.cc
571 572
        monitoring/histogram.cc
        monitoring/histogram_windowing.cc
573
        monitoring/in_memory_stats_history.cc
574 575 576 577
        monitoring/instrumented_mutex.cc
        monitoring/iostats_context.cc
        monitoring/perf_context.cc
        monitoring/perf_level.cc
578
        monitoring/persistent_stats_history.cc
579 580 581 582 583 584 585 586 587 588 589
        monitoring/statistics.cc
        monitoring/thread_status_impl.cc
        monitoring/thread_status_updater.cc
        monitoring/thread_status_util.cc
        monitoring/thread_status_util_debug.cc
        options/cf_options.cc
        options/db_options.cc
        options/options.cc
        options/options_helper.cc
        options/options_parser.cc
        options/options_sanity_check.cc
D
Dmitri Smirnov 已提交
590
        port/stack_trace.cc
591 592 593 594 595 596 597 598 599 600
        table/adaptive/adaptive_table_factory.cc
        table/block_based/block.cc
        table/block_based/block_based_filter_block.cc
        table/block_based/block_based_table_builder.cc
        table/block_based/block_based_table_factory.cc
        table/block_based/block_based_table_reader.cc
        table/block_based/block_builder.cc
        table/block_based/block_prefix_index.cc
        table/block_based/data_block_hash_index.cc
        table/block_based/data_block_footer.cc
601
        table/block_based/filter_block_reader_common.cc
602 603 604
        table/block_based/flush_block_policy.cc
        table/block_based/full_filter_block.cc
        table/block_based/index_builder.cc
605
        table/block_based/parsed_full_filter_block.cc
606
        table/block_based/partitioned_filter_block.cc
607
        table/block_based/uncompression_dict_reader.cc
S
Siying Dong 已提交
608
        table/block_fetcher.cc
609 610 611
        table/cuckoo/cuckoo_table_builder.cc
        table/cuckoo/cuckoo_table_factory.cc
        table/cuckoo/cuckoo_table_reader.cc
D
Dmitri Smirnov 已提交
612 613 614
        table/format.cc
        table/get_context.cc
        table/iterator.cc
615
        table/merging_iterator.cc
D
Dmitri Smirnov 已提交
616
        table/meta_blocks.cc
617
        table/persistent_cache_helper.cc
618
        table/plain/plain_table_bloom.cc
619 620 621 622 623
        table/plain/plain_table_builder.cc
        table/plain/plain_table_factory.cc
        table/plain/plain_table_index.cc
        table/plain/plain_table_key_coding.cc
        table/plain/plain_table_reader.cc
624
        table/sst_file_reader.cc
625
        table/sst_file_writer.cc
D
Dmitri Smirnov 已提交
626 627
        table/table_properties.cc
        table/two_level_iterator.cc
628 629 630 631
        test_util/sync_point.cc
        test_util/sync_point_impl.cc
        test_util/testutil.cc
        test_util/transaction_test_util.cc
632
        tools/block_cache_analyzer/block_cache_trace_analyzer.cc
633
        tools/db_bench_tool.cc
634
        tools/dump/db_dump_tool.cc
635 636 637
        tools/ldb_cmd.cc
        tools/ldb_tool.cc
        tools/sst_dump_tool.cc
Z
Zhichao Cao 已提交
638
        tools/trace_analyzer_tool.cc
639
        trace_replay/trace_replay.cc
H
haoyuhuang 已提交
640
        trace_replay/block_cache_tracer.cc
D
Dmitri Smirnov 已提交
641 642 643 644
        util/bloom.cc
        util/coding.cc
        util/compaction_job_stats_impl.cc
        util/comparator.cc
645
        util/compression_context_cache.cc
646
        util/concurrent_task_limiter_impl.cc
D
Dmitri Smirnov 已提交
647 648 649 650
        util/crc32c.cc
        util/dynamic_bloom.cc
        util/hash.cc
        util/murmurhash.cc
651
        util/random.cc
D
Dmitri Smirnov 已提交
652 653 654 655 656
        util/rate_limiter.cc
        util/slice.cc
        util/status.cc
        util/string_util.cc
        util/thread_local.cc
657
        util/threadpool_imp.cc
D
Dmitri Smirnov 已提交
658 659
        util/xxhash.cc
        utilities/backupable/backupable_db.cc
Y
Yi Wu 已提交
660
        utilities/blob_db/blob_compaction_filter.cc
661
        utilities/blob_db/blob_db.cc
A
Anirban Rahut 已提交
662
        utilities/blob_db/blob_db_impl.cc
663
        utilities/blob_db/blob_db_impl_filesnapshot.cc
Y
Yi Wu 已提交
664
        utilities/blob_db/blob_dump_tool.cc
665
        utilities/blob_db/blob_file.cc
A
Anirban Rahut 已提交
666 667 668
        utilities/blob_db/blob_log_reader.cc
        utilities/blob_db/blob_log_writer.cc
        utilities/blob_db/blob_log_format.cc
669 670 671
        utilities/cassandra/cassandra_compaction_filter.cc
        utilities/cassandra/format.cc
        utilities/cassandra/merge_operator.cc
672
        utilities/checkpoint/checkpoint_impl.cc
673
        utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc
A
Andrew Kryczka 已提交
674
        utilities/debug.cc
D
Dmitri Smirnov 已提交
675
        utilities/env_mirror.cc
A
Andrew Kryczka 已提交
676
        utilities/env_timed.cc
D
Dmitri Smirnov 已提交
677
        utilities/leveldb_options/leveldb_options.cc
678
        utilities/memory/memory_util.cc
P
Pooya Shareghi 已提交
679
        utilities/merge_operators/bytesxor.cc
680 681
        utilities/merge_operators/max.cc
        utilities/merge_operators/put.cc
682
        utilities/merge_operators/sortlist.cc
D
Dmitri Smirnov 已提交
683 684 685
        utilities/merge_operators/string_append/stringappend.cc
        utilities/merge_operators/string_append/stringappend2.cc
        utilities/merge_operators/uint64add.cc
686
        utilities/object_registry.cc
687
        utilities/option_change_migration/option_change_migration.cc
688
        utilities/options/options_util.cc
689 690 691
        utilities/persistent_cache/block_cache_tier.cc
        utilities/persistent_cache/block_cache_tier_file.cc
        utilities/persistent_cache/block_cache_tier_metadata.cc
692
        utilities/persistent_cache/persistent_cache_tier.cc
693
        utilities/persistent_cache/volatile_tier_impl.cc
694
        utilities/simulator_cache/cache_simulator.cc
695
        utilities/simulator_cache/sim_cache.cc
696
        utilities/table_properties_collectors/compact_on_deletion_collector.cc
697
        utilities/trace/file_trace_reader_writer.cc
D
Dmitri Smirnov 已提交
698
        utilities/transactions/optimistic_transaction_db_impl.cc
699
        utilities/transactions/optimistic_transaction.cc
Y
Yi Wu 已提交
700
        utilities/transactions/pessimistic_transaction.cc
M
Maysam Yabandeh 已提交
701
        utilities/transactions/pessimistic_transaction_db.cc
Y
Yi Wu 已提交
702 703
        utilities/transactions/snapshot_checker.cc
        utilities/transactions/transaction_base.cc
A
agiardullo 已提交
704
        utilities/transactions/transaction_db_mutex_impl.cc
A
agiardullo 已提交
705 706
        utilities/transactions/transaction_lock_mgr.cc
        utilities/transactions/transaction_util.cc
707
        utilities/transactions/write_prepared_txn.cc
708
        utilities/transactions/write_prepared_txn_db.cc
709 710
        utilities/transactions/write_unprepared_txn.cc
        utilities/transactions/write_unprepared_txn_db.cc
D
Dmitri Smirnov 已提交
711 712 713
        utilities/ttl/db_ttl_impl.cc
        utilities/write_batch_with_index/write_batch_with_index.cc
        utilities/write_batch_with_index/write_batch_with_index_internal.cc
714 715
        $<TARGET_OBJECTS:build_version>)

H
Huachao Huang 已提交
716 717 718 719
if(HAVE_SSE42 AND NOT MSVC)
  set_source_files_properties(
    util/crc32c.cc
    PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul")
720 721
endif()

722 723 724 725 726 727
if(HAVE_POWER8)
  list(APPEND SOURCES
    util/crc32c_ppc.c
    util/crc32c_ppc_asm.S)
endif(HAVE_POWER8)

728 729 730 731 732
if(HAS_ARMV8_CRC)
  list(APPEND SOURCES
    util/crc32c_arm64.cc)
endif(HAS_ARMV8_CRC)

733 734 735 736 737 738 739
if(WIN32)
  list(APPEND SOURCES
    port/win/io_win.cc
    port/win/env_win.cc
    port/win/env_default.cc
    port/win/port_win.cc
    port/win/win_logger.cc
740 741 742 743
    port/win/win_thread.cc)

if(WITH_XPRESS)
  list(APPEND SOURCES
744
    port/win/xpress_win.cc)
745
endif()
746

747 748 749 750
if(WITH_JEMALLOC)
  list(APPEND SOURCES
    port/win/win_jemalloc.cc)
endif()
751

752 753 754
else()
  list(APPEND SOURCES
    port/port_posix.cc
755 756
    env/env_posix.cc
    env/io_posix.cc)
757
endif()
D
Dmitri Smirnov 已提交
758

759 760 761 762 763 764 765 766 767
if(WITH_FOLLY_DISTRIBUTED_MUTEX)
  list(APPEND SOURCES
    third-party/folly/folly/detail/Futex.cpp
    third-party/folly/folly/synchronization/AtomicNotification.cpp
    third-party/folly/folly/synchronization/DistributedMutex.cpp
    third-party/folly/folly/synchronization/ParkingLot.cpp
    third-party/folly/folly/synchronization/WaitOptions.cpp)
endif()

768 769 770
set(ROCKSDB_STATIC_LIB rocksdb${ARTIFACT_SUFFIX})
set(ROCKSDB_SHARED_LIB rocksdb-shared${ARTIFACT_SUFFIX})
set(ROCKSDB_IMPORT_LIB ${ROCKSDB_SHARED_LIB})
771 772 773 774 775 776 777 778

option(WITH_LIBRADOS "Build with librados" OFF)
if(WITH_LIBRADOS)
  list(APPEND SOURCES
    utilities/env_librados.cc)
  list(APPEND THIRDPARTY_LIBS rados)
endif()

779 780 781 782
if(WIN32)
  set(SYSTEM_LIBS ${SYSTEM_LIBS} Shlwapi.lib Rpcrt4.lib)
  set(LIBS ${ROCKSDB_STATIC_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
else()
783
  set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
784 785 786 787 788 789 790
  set(LIBS ${ROCKSDB_SHARED_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})

  add_library(${ROCKSDB_SHARED_LIB} SHARED ${SOURCES})
  target_link_libraries(${ROCKSDB_SHARED_LIB}
    ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
  set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
                        LINKER_LANGUAGE CXX
791 792
                        VERSION ${rocksdb_VERSION}
                        SOVERSION ${rocksdb_VERSION_MAJOR}
793 794 795 796 797 798
                        CXX_STANDARD 11
                        OUTPUT_NAME "rocksdb")
endif()

add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES})
target_link_libraries(${ROCKSDB_STATIC_LIB}
799 800 801
  ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})

if(WIN32)
802 803 804 805
  add_library(${ROCKSDB_IMPORT_LIB} SHARED ${SOURCES})
  target_link_libraries(${ROCKSDB_IMPORT_LIB}
    ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
  set_target_properties(${ROCKSDB_IMPORT_LIB} PROPERTIES
O
Orgad Shaneh 已提交
806 807 808 809 810 811 812
    COMPILE_DEFINITIONS "ROCKSDB_DLL;ROCKSDB_LIBRARY_EXPORTS")
  if(MSVC)
    set_target_properties(${ROCKSDB_STATIC_LIB} PROPERTIES
      COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_STATIC_LIB}.pdb")
    set_target_properties(${ROCKSDB_IMPORT_LIB} PROPERTIES
      COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_IMPORT_LIB}.pdb")
  endif()
813 814 815 816 817 818
endif()

option(WITH_JNI "build with JNI" OFF)
if(WITH_JNI OR JNI)
  message(STATUS "JNI library is enabled")
  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/java)
819 820 821 822
else()
  message(STATUS "JNI library is disabled")
endif()

P
Paweł Bylica 已提交
823 824 825 826 827 828 829 830 831 832 833 834 835
# Installation and packaging
if(WIN32)
  option(ROCKSDB_INSTALL_ON_WINDOWS "Enable install target on Windows" OFF)
endif()
if(NOT WIN32 OR ROCKSDB_INSTALL_ON_WINDOWS)
  if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
      # Change default installation prefix on Linux to /usr
      set(CMAKE_INSTALL_PREFIX /usr CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
    endif()
  endif()

  include(GNUInstallDirs)
836 837 838 839 840
  include(CMakePackageConfigHelpers)

  set(package_config_destination ${CMAKE_INSTALL_LIBDIR}/cmake/rocksdb)

  configure_package_config_file(
B
Bartek Wrona 已提交
841
    ${CMAKE_CURRENT_LIST_DIR}/cmake/RocksDBConfig.cmake.in RocksDBConfig.cmake
842 843 844 845 846
    INSTALL_DESTINATION ${package_config_destination}
  )

  write_basic_package_version_file(
    RocksDBConfigVersion.cmake
847
    VERSION ${rocksdb_VERSION}
848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864
    COMPATIBILITY SameMajorVersion
  )

  install(DIRECTORY include/rocksdb COMPONENT devel DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")

  install(
    TARGETS ${ROCKSDB_STATIC_LIB}
    EXPORT RocksDBTargets
    COMPONENT devel
    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
    INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
  )

  install(
    TARGETS ${ROCKSDB_SHARED_LIB}
    EXPORT RocksDBTargets
    COMPONENT runtime
865
    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884
    RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
    LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
    INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
  )

  install(
    EXPORT RocksDBTargets
    COMPONENT devel
    DESTINATION ${package_config_destination}
    NAMESPACE RocksDB::
  )

  install(
    FILES
    ${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfig.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfigVersion.cmake
    COMPONENT devel
    DESTINATION ${package_config_destination}
  )
P
Paweł Bylica 已提交
885 886 887 888
endif()

option(WITH_TESTS "build with tests" ON)
if(WITH_TESTS)
889
  add_subdirectory(third-party/gtest-1.8.1/fused-src/gtest)
P
Paweł Bylica 已提交
890
  set(TESTS
891 892
        cache/cache_test.cc
        cache/lru_cache_test.cc
D
Dmitri Smirnov 已提交
893 894
        db/column_family_test.cc
        db/compact_files_test.cc
895 896 897 898
        db/compaction/compaction_job_stats_test.cc
        db/compaction/compaction_job_test.cc
        db/compaction/compaction_iterator_test.cc
        db/compaction/compaction_picker_test.cc
D
Dmitri Smirnov 已提交
899 900 901
        db/comparator_db_test.cc
        db/corruption_test.cc
        db/cuckoo_table_db_test.cc
902
        db/db_basic_test.cc
Y
Yi Wu 已提交
903
        db/db_blob_index_test.cc
904 905
        db/db_block_cache_test.cc
        db/db_bloom_filter_test.cc
906
        db/db_compaction_filter_test.cc
907
        db/db_compaction_test.cc
908
        db/db_dynamic_level_test.cc
909
        db/db_flush_test.cc
910
        db/db_inplace_update_test.cc
911
        db/db_io_failure_test.cc
912
        db/db_iter_test.cc
913
        db/db_iter_stress_test.cc
914
        db/db_iterator_test.cc
915
        db/db_log_iter_test.cc
916
        db/db_memtable_test.cc
917
        db/db_merge_operator_test.cc
918
        db/db_merge_operand_test.cc
919
        db/db_options_test.cc
920
        db/db_properties_test.cc
921
        db/db_range_del_test.cc
922
        db/db_impl/db_secondary_test.cc
923
        db/db_sst_test.cc
924
        db/db_statistics_test.cc
925 926 927
        db/db_table_properties_test.cc
        db/db_tailing_iter_test.cc
        db/db_test.cc
928
        db/db_test2.cc
929
        db/db_universal_compaction_test.cc
S
sdong 已提交
930
        db/db_wal_test.cc
Y
Yi Wu 已提交
931
        db/db_write_test.cc
D
Dmitri Smirnov 已提交
932 933
        db/dbformat_test.cc
        db/deletefile_test.cc
934
        db/error_handler_test.cc
935
        db/obsolete_files_test.cc
936 937
        db/external_sst_file_basic_test.cc
        db/external_sst_file_test.cc
D
Dmitri Smirnov 已提交
938 939 940 941 942 943
        db/fault_injection_test.cc
        db/file_indexer_test.cc
        db/filename_test.cc
        db/flush_job_test.cc
        db/listener_test.cc
        db/log_test.cc
944
        db/manual_compaction_test.cc
D
Dmitri Smirnov 已提交
945
        db/memtable_list_test.cc
946
        db/merge_helper_test.cc
947
        db/merge_test.cc
948
        db/options_file_test.cc
D
Dmitri Smirnov 已提交
949 950 951
        db/perf_context_test.cc
        db/plain_table_db_test.cc
        db/prefix_test.cc
952 953
        db/range_del_aggregator_test.cc
        db/range_tombstone_fragmenter_test.cc
A
Andrew Kryczka 已提交
954
        db/repair_test.cc
D
Dmitri Smirnov 已提交
955 956 957 958 959 960 961 962
        db/table_properties_collector_test.cc
        db/version_builder_test.cc
        db/version_edit_test.cc
        db/version_set_test.cc
        db/wal_manager_test.cc
        db/write_batch_test.cc
        db/write_callback_test.cc
        db/write_controller_test.cc
963 964 965
        env/env_basic_test.cc
        env/env_test.cc
        env/mock_env_test.cc
966
        file/delete_scheduler_test.cc
967
        logging/auto_roll_logger_test.cc
968
        logging/env_logger_test.cc
969
        logging/event_logger_test.cc
970
        memory/arena_test.cc
971 972
        memtable/inlineskiplist_test.cc
        memtable/skiplist_test.cc
973
        memtable/write_buffer_manager_test.cc
974 975 976
        monitoring/histogram_test.cc
        monitoring/iostats_context_test.cc
        monitoring/statistics_test.cc
977
        monitoring/stats_history_test.cc
978 979
        options/options_settable_test.cc
        options/options_test.cc
980 981 982 983
        table/block_based/block_based_filter_block_test.cc
        table/block_based/block_test.cc
        table/block_based/data_block_hash_index_test.cc
        table/block_based/full_filter_block_test.cc
984
        table/block_based/partitioned_filter_block_test.cc
Y
Yi Wu 已提交
985
        table/cleanable_test.cc
986 987
        table/cuckoo/cuckoo_table_builder_test.cc
        table/cuckoo/cuckoo_table_reader_test.cc
D
Dmitri Smirnov 已提交
988
        table/merger_test.cc
989
        table/sst_file_reader_test.cc
D
Dmitri Smirnov 已提交
990
        table/table_test.cc
991
        tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc
992
        tools/ldb_cmd_test.cc
D
Dmitri Smirnov 已提交
993
        tools/reduce_levels_test.cc
994
        tools/sst_dump_test.cc
Z
Zhichao Cao 已提交
995
        tools/trace_analyzer_test.cc
D
Dmitri Smirnov 已提交
996 997 998 999 1000
        util/autovector_test.cc
        util/bloom_test.cc
        util/coding_test.cc
        util/crc32c_test.cc
        util/dynamic_bloom_test.cc
1001
        util/file_reader_writer_test.cc
1002
        util/filelock_test.cc
1003
        util/hash_test.cc
1004
        util/heap_test.cc
D
Dmitri Smirnov 已提交
1005
        util/rate_limiter_test.cc
1006
        util/repeatable_thread_test.cc
D
Dmitri Smirnov 已提交
1007
        util/slice_transform_test.cc
A
Anirban Rahut 已提交
1008
        util/timer_queue_test.cc
D
Dmitri Smirnov 已提交
1009 1010 1011
        util/thread_list_test.cc
        util/thread_local_test.cc
        utilities/backupable/backupable_db_test.cc
Y
Yi Wu 已提交
1012
        utilities/blob_db/blob_db_test.cc
1013 1014 1015 1016
        utilities/cassandra/cassandra_functional_test.cc
        utilities/cassandra/cassandra_format_test.cc
        utilities/cassandra/cassandra_row_merge_test.cc
        utilities/cassandra/cassandra_serialize_test.cc
D
Dmitri Smirnov 已提交
1017
        utilities/checkpoint/checkpoint_test.cc
1018
        utilities/memory/memory_test.cc
D
Dmitri Smirnov 已提交
1019
        utilities/merge_operators/string_append/stringappend_test.cc
1020
        utilities/object_registry_test.cc
1021
        utilities/option_change_migration/option_change_migration_test.cc
Y
yuslepukhin 已提交
1022
        utilities/options/options_util_test.cc
1023
        utilities/persistent_cache/hash_table_test.cc
1024
        utilities/persistent_cache/persistent_cache_test.cc
1025
        utilities/simulator_cache/cache_simulator_test.cc
1026
        utilities/simulator_cache/sim_cache_test.cc
1027
        utilities/table_properties_collectors/compact_on_deletion_collector_test.cc
D
Dmitri Smirnov 已提交
1028
        utilities/transactions/optimistic_transaction_test.cc
A
agiardullo 已提交
1029
        utilities/transactions/transaction_test.cc
1030
        utilities/transactions/write_prepared_transaction_test.cc
1031
        utilities/transactions/write_unprepared_transaction_test.cc
D
Dmitri Smirnov 已提交
1032 1033
        utilities/ttl/ttl_test.cc
        utilities/write_batch_with_index/write_batch_with_index_test.cc
P
Paweł Bylica 已提交
1034 1035 1036 1037
  )
  if(WITH_LIBRADOS)
    list(APPEND TESTS utilities/env_librados_test.cc)
  endif()
1038

1039 1040 1041 1042
  if(WITH_FOLLY_DISTRIBUTED_MUTEX)
    list(APPEND TESTS third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp)
  endif()

P
Paweł Bylica 已提交
1043 1044 1045
  set(BENCHMARKS
    cache/cache_bench.cc
    memtable/memtablerep_bench.cc
1046
    db/range_del_aggregator_bench.cc
P
Paweł Bylica 已提交
1047 1048
    tools/db_bench.cc
    table/table_reader_bench.cc
1049
    util/filter_bench.cc
P
Paweł Bylica 已提交
1050
    utilities/persistent_cache/hash_table_bench.cc)
1051
  add_library(testharness OBJECT test_util/testharness.cc)
P
Paweł Bylica 已提交
1052
  foreach(sourcefile ${BENCHMARKS})
1053 1054 1055
    get_filename_component(exename ${sourcefile} NAME_WE)
    add_executable(${exename}${ARTIFACT_SUFFIX} ${sourcefile}
      $<TARGET_OBJECTS:testharness>)
P
Paweł Bylica 已提交
1056 1057 1058 1059 1060 1061 1062 1063 1064
    target_link_libraries(${exename}${ARTIFACT_SUFFIX} gtest ${LIBS})
  endforeach(sourcefile ${BENCHMARKS})

  # For test util library that is build only in DEBUG mode
  # and linked to tests. Add test only code that is not #ifdefed for Release here.
  set(TESTUTIL_SOURCE
      db/db_test_util.cc
      monitoring/thread_status_updater_debug.cc
      table/mock_table.cc
1065
      test_util/fault_injection_test_env.cc
P
Paweł Bylica 已提交
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086
      utilities/cassandra/test_utils.cc
  )
  # test utilities are only build in debug
  enable_testing()
  add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
  set(TESTUTILLIB testutillib${ARTIFACT_SUFFIX})
  add_library(${TESTUTILLIB} STATIC ${TESTUTIL_SOURCE})
  if(MSVC)
    set_target_properties(${TESTUTILLIB} PROPERTIES COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/testutillib${ARTIFACT_SUFFIX}.pdb")
  endif()
  set_target_properties(${TESTUTILLIB}
        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
        )

  # Tests are excluded from Release builds
  set(TEST_EXES ${TESTS})

  foreach(sourcefile ${TEST_EXES})
      get_filename_component(exename ${sourcefile} NAME_WE)
B
Bartek Wrona 已提交
1087
      add_executable(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} ${sourcefile}
P
Paweł Bylica 已提交
1088
        $<TARGET_OBJECTS:testharness>)
B
Bartek Wrona 已提交
1089
      set_target_properties(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX}
P
Paweł Bylica 已提交
1090 1091 1092
        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
B
Bartek Wrona 已提交
1093
        OUTPUT_NAME ${exename}${ARTIFACT_SUFFIX}
P
Paweł Bylica 已提交
1094
        )
B
Bartek Wrona 已提交
1095
      target_link_libraries(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} testutillib${ARTIFACT_SUFFIX} gtest ${LIBS})
P
Paweł Bylica 已提交
1096 1097
      if(NOT "${exename}" MATCHES "db_sanity_test")
        add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
B
Bartek Wrona 已提交
1098
        add_dependencies(check ${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX})
P
Paweł Bylica 已提交
1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
      endif()
  endforeach(sourcefile ${TEST_EXES})

  # C executables must link to a shared object
  set(C_TESTS db/c_test.c)
  set(C_TEST_EXES ${C_TESTS})

  foreach(sourcefile ${C_TEST_EXES})
      string(REPLACE ".c" "" exename ${sourcefile})
      string(REGEX REPLACE "^((.+)/)+" "" exename ${exename})
      add_executable(${exename}${ARTIFACT_SUFFIX} ${sourcefile})
      set_target_properties(${exename}${ARTIFACT_SUFFIX}
        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
        )
      target_link_libraries(${exename}${ARTIFACT_SUFFIX} ${ROCKSDB_IMPORT_LIB} testutillib${ARTIFACT_SUFFIX})
1116 1117
      add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
      add_dependencies(check ${exename}${ARTIFACT_SUFFIX})
P
Paweł Bylica 已提交
1118
  endforeach(sourcefile ${C_TEST_EXES})
P
Paweł Bylica 已提交
1119
endif()
A
Arun Sharma 已提交
1120

P
Paweł Bylica 已提交
1121 1122 1123
option(WITH_TOOLS "build with tools" ON)
if(WITH_TOOLS)
  add_subdirectory(tools)
A
Arun Sharma 已提交
1124
endif()