CMakeLists.txt 35.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
cmake_minimum_required(VERSION 2.8.12)
D
Dmitri Smirnov 已提交
36
project(rocksdb)
37 38 39
enable_language(CXX)
enable_language(C)
enable_language(ASM)
D
Dmitri Smirnov 已提交
40

41 42 43 44
if(POLICY CMP0042)
  cmake_policy(SET CMP0042 NEW)
endif()

B
Bartek Wrona 已提交
45
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/")
46

47
option(WITH_JEMALLOC "build with JeMalloc" OFF)
48 49 50
option(WITH_SNAPPY "build with SNAPPY" OFF)
option(WITH_LZ4 "build with lz4" OFF)
option(WITH_ZLIB "build with zlib" OFF)
T
Tamir Duberstein 已提交
51
if(MSVC)
52 53 54 55
  # 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)
56 57
  include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc)
else()
T
Tamir Duberstein 已提交
58
  if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
59
    # FreeBSD has jemalloc as default malloc
60
    # but it does not have all the jemalloc files in include/...
T
Tamir Duberstein 已提交
61
    set(WITH_JEMALLOC ON)
62 63 64 65 66
  else()
    if(WITH_JEMALLOC)
      find_package(JeMalloc REQUIRED)
      add_definitions(-DROCKSDB_JEMALLOC -DJEMALLOC_NO_DEMANGLE)
      include_directories(${JEMALLOC_INCLUDE_DIR})
T
Tongliang Liao 已提交
67
      list(APPEND THIRDPARTY_LIBS ${JEMALLOC_LIBRARIES})
68
    endif()
T
Tamir Duberstein 已提交
69
  endif()
70

71 72 73 74 75 76 77 78 79 80
  # 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 已提交
81

82 83 84 85 86 87
  if(WITH_SNAPPY)
    find_package(snappy REQUIRED)
    add_definitions(-DSNAPPY)
    include_directories(${SNAPPY_INCLUDE_DIR})
    list(APPEND THIRDPARTY_LIBS ${SNAPPY_LIBRARIES})
  endif()
J
Jay 已提交
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

  if(WITH_ZLIB)
    find_package(zlib REQUIRED)
    add_definitions(-DZLIB)
    include_directories(${ZLIB_INCLUDE_DIR})
    list(APPEND THIRDPARTY_LIBS ${ZLIB_LIBRARIES})
  endif()

  option(WITH_BZ2 "build with bzip2" OFF)
  if(WITH_BZ2)
    find_package(bzip2 REQUIRED)
    add_definitions(-DBZIP2)
    include_directories(${BZIP2_INCLUDE_DIR})
    list(APPEND THIRDPARTY_LIBS ${BZIP2_LIBRARIES})
  endif()

  if(WITH_LZ4)
    find_package(lz4 REQUIRED)
    add_definitions(-DLZ4)
    include_directories(${LZ4_INCLUDE_DIR})
    list(APPEND THIRDPARTY_LIBS ${LZ4_LIBRARIES})
  endif()

  option(WITH_ZSTD "build with zstd" OFF)
  if(WITH_ZSTD)
    find_package(zstd REQUIRED)
    add_definitions(-DZSTD)
    include_directories(${ZSTD_INCLUDE_DIR})
    list(APPEND THIRDPARTY_LIBS ${ZSTD_LIBRARIES})
  endif()
118 119
endif()

120
string(TIMESTAMP GIT_DATE_TIME "%Y/%m/%d %H:%M:%S" UTC)
D
Dmitri Smirnov 已提交
121

122 123
find_package(Git)

T
Tamir Duberstein 已提交
124
if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
125
  if(WIN32)
126
    execute_process(COMMAND $ENV{COMSPEC} /C ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
127 128 129
  else()
    execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
  endif()
130
else()
131
  set(GIT_SHA 0)
132 133
endif()

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

136 137 138 139 140 141 142 143 144 145 146

# Read rocksdb version from version.h header file.
file(READ include/rocksdb/version.h version_header_file)
string(REGEX MATCH "#define ROCKSDB_MAJOR ([0-9]+)" _ ${version_header_file})
set(ROCKSDB_VERSION_MAJOR ${CMAKE_MATCH_1})
string(REGEX MATCH "#define ROCKSDB_MINOR ([0-9]+)" _ ${version_header_file})
set(ROCKSDB_VERSION_MINOR ${CMAKE_MATCH_1})
string(REGEX MATCH "#define ROCKSDB_PATCH ([0-9]+)" _ ${version_header_file})
set(ROCKSDB_VERSION_PATCH ${CMAKE_MATCH_1})
set(ROCKSDB_VERSION ${ROCKSDB_VERSION_MAJOR}.${ROCKSDB_VERSION_MINOR}.${ROCKSDB_VERSION_PATCH})

A
Arun Sharma 已提交
147

148 149 150 151 152 153
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 已提交
154
  endif()
155
endif()
T
Tomas Kolda 已提交
156

157 158 159 160 161 162 163
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")
164
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
165 166
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall")
O
Orgad Shaneh 已提交
167
  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")
168 169 170 171 172
  if(MINGW)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format")
  endif()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
T
Tamir Duberstein 已提交
173
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
174 175 176 177 178 179 180 181
    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()

182 183 184 185 186 187 188 189 190 191 192 193
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")

194 195 196 197 198 199
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)
200
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpclmul")
T
Tomas Kolda 已提交
201
  endif()
T
Tamir Duberstein 已提交
202
else()
203 204 205
  if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
  else()
206 207 208
    if(NOT HAVE_POWER8)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
    endif()
T
Tamir Duberstein 已提交
209
  endif()
T
Tamir Duberstein 已提交
210 211
endif()

212
include(CheckCXXSourceCompiles)
213
if(NOT MSVC)
214
  set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
215
endif()
216 217 218
CHECK_CXX_SOURCE_COMPILES("
#include <cstdint>
#include <nmmintrin.h>
219
#include <wmmintrin.h>
220 221
int main() {
  volatile uint32_t x = _mm_crc32_u32(0, 0);
222 223 224 225
  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);
226 227
}
" HAVE_SSE42)
228
unset(CMAKE_REQUIRED_FLAGS)
229 230
if(HAVE_SSE42)
  add_definitions(-DHAVE_SSE42)
231
  add_definitions(-DHAVE_PCLMUL)
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
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()

248 249 250 251 252 253 254 255 256
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()

257 258 259 260 261 262 263 264 265
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 已提交
266

267 268 269 270 271 272 273 274 275
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()
276

277 278
option(WITH_UBSAN "build with UBSAN" OFF)
if(WITH_UBSAN)
279
  add_definitions(-DROCKSDB_UBSAN_RUN)
280 281 282 283 284 285 286
  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 已提交
287

288 289 290
option(WITH_NUMA "build with NUMA policy support" OFF)
if(WITH_NUMA)
  find_package(NUMA REQUIRED)
291 292 293 294 295
  add_definitions(-DNUMA)
  include_directories(${NUMA_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS ${NUMA_LIBRARIES})
endif()

296 297 298
option(WITH_TBB "build with Threading Building Blocks (TBB)" OFF)
if(WITH_TBB)
  find_package(TBB REQUIRED)
299 300 301 302 303
  add_definitions(-DTBB)
  include_directories(${TBB_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS ${TBB_LIBRARIES})
endif()

304 305 306 307 308 309
# 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()

310 311 312 313 314 315 316 317 318
# Used to run CI build and tests so we can run faster
set(OPTIMIZE_DEBUG_DEFAULT 0)        # Debug build is unoptimized by default use -DOPTDBG=1 to optimize

if(DEFINED OPTDBG)
   set(OPTIMIZE_DEBUG ${OPTDBG})
else()
   set(OPTIMIZE_DEBUG ${OPTIMIZE_DEBUG_DEFAULT})
endif()

319 320 321 322 323 324
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()
325 326 327 328 329 330 331 332 333
    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()
334
  endif()
335 336 337
else()
  message(STATUS "Enabling RTTI in Debug builds only (default)")
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
338 339 340 341 342
  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()
343 344
endif()

O
Orgad Shaneh 已提交
345
if(MSVC)
346 347
  if((${OPTIMIZE_DEBUG} EQUAL 1))
    message(STATUS "Debug optimization is enabled")
T
Tomas Kolda 已提交
348
    set(CMAKE_CXX_FLAGS_DEBUG "/Oxt /${RUNTIME_LIBRARY}d")
349
  else()
T
Tomas Kolda 已提交
350
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /RTC1 /Gm /${RUNTIME_LIBRARY}d")
351
  endif()
T
Tomas Kolda 已提交
352
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
353 354 355

  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
356 357
endif()

358 359 360
if(CMAKE_COMPILER_IS_GNUCXX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-memcmp")
endif()
D
Dmitri Smirnov 已提交
361

362 363 364 365 366
option(ROCKSDB_LITE "Build RocksDBLite version" OFF)
if(ROCKSDB_LITE)
  add_definitions(-DROCKSDB_LITE)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
endif()
D
Dmitri Smirnov 已提交
367

368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392
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 已提交
393 394 395
  if(MINGW)
    add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_VISTA)
  endif()
396 397 398 399 400 401 402 403
endif()

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

option(WITH_FALLOCATE "build with fallocate" ON)
if(WITH_FALLOCATE)
404
  CHECK_CXX_SOURCE_COMPILES("
405 406 407 408 409 410 411 412 413 414 415 416
#include <fcntl.h>
#include <linux/falloc.h>
int main() {
 int fd = open(\"/dev/null\", 0);
 fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, 0, 1024);
}
" HAVE_FALLOCATE)
  if(HAVE_FALLOCATE)
    add_definitions(-DROCKSDB_FALLOCATE_PRESENT)
  endif()
endif()

417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
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)
440 441 442
if(HAVE_MALLOC_USABLE_SIZE)
  add_definitions(-DROCKSDB_MALLOC_USABLE_SIZE)
endif()
D
Dmitri Smirnov 已提交
443

444 445 446 447 448
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 已提交
449 450
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/include)
451 452
include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/gtest-1.7.0/fused-src)
find_package(Threads REQUIRED)
D
Dmitri Smirnov 已提交
453 454 455

add_subdirectory(third-party/gtest-1.7.0/fused-src/gtest)

456
# Main library source code
457

D
Dmitri Smirnov 已提交
458
set(SOURCES
459 460 461
        cache/clock_cache.cc
        cache/lru_cache.cc
        cache/sharded_cache.cc
D
Dmitri Smirnov 已提交
462 463 464
        db/builder.cc
        db/c.cc
        db/column_family.cc
465
        db/compacted_db_impl.cc
D
Dmitri Smirnov 已提交
466
        db/compaction.cc
467
        db/compaction_iterator.cc
D
Dmitri Smirnov 已提交
468 469
        db/compaction_job.cc
        db/compaction_picker.cc
S
Siying Dong 已提交
470
        db/compaction_picker_universal.cc
A
agiardullo 已提交
471
        db/convenience.cc
D
Dmitri Smirnov 已提交
472 473
        db/db_filesnapshot.cc
        db/db_impl.cc
S
Siying Dong 已提交
474 475 476 477
        db/db_impl_write.cc
        db/db_impl_compaction_flush.cc
        db/db_impl_files.cc
        db/db_impl_open.cc
D
Dmitri Smirnov 已提交
478 479 480
        db/db_impl_debug.cc
        db/db_impl_experimental.cc
        db/db_impl_readonly.cc
481
        db/db_info_dumper.cc
D
Dmitri Smirnov 已提交
482
        db/db_iter.cc
483
        db/dbformat.cc
484
        db/error_handler.cc
D
Dmitri Smirnov 已提交
485 486
        db/event_helpers.cc
        db/experimental.cc
487
        db/external_sst_file_ingestion_job.cc
D
Dmitri Smirnov 已提交
488 489 490 491 492
        db/file_indexer.cc
        db/flush_job.cc
        db/flush_scheduler.cc
        db/forward_iterator.cc
        db/internal_stats.cc
S
Siying Dong 已提交
493
        db/logs_with_prep_tracker.cc
D
Dmitri Smirnov 已提交
494 495
        db/log_reader.cc
        db/log_writer.cc
496
        db/malloc_stats.cc
D
Dmitri Smirnov 已提交
497 498 499 500
        db/memtable.cc
        db/memtable_list.cc
        db/merge_helper.cc
        db/merge_operator.cc
501
        db/range_del_aggregator.cc
D
Dmitri Smirnov 已提交
502
        db/repair.cc
503
        db/snapshot_impl.cc
D
Dmitri Smirnov 已提交
504 505 506 507 508 509 510 511 512 513 514
        db/table_cache.cc
        db/table_properties_collector.cc
        db/transaction_log_impl.cc
        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
515 516
        env/env.cc
        env/env_chroot.cc
E
Ewout Prangsma 已提交
517
        env/env_encryption.cc
518
        env/env_hdfs.cc
519
        env/mock_env.cc
520
        memtable/alloc_tracker.cc
521 522 523
        memtable/hash_cuckoo_rep.cc
        memtable/hash_linklist_rep.cc
        memtable/hash_skiplist_rep.cc
524 525
        memtable/skiplistrep.cc
        memtable/vectorrep.cc
526
        memtable/write_buffer_manager.cc
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
        monitoring/histogram.cc
        monitoring/histogram_windowing.cc
        monitoring/instrumented_mutex.cc
        monitoring/iostats_context.cc
        monitoring/perf_context.cc
        monitoring/perf_level.cc
        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 已提交
544 545 546 547 548 549 550 551
        port/stack_trace.cc
        table/adaptive_table_factory.cc
        table/block.cc
        table/block_based_filter_block.cc
        table/block_based_table_builder.cc
        table/block_based_table_factory.cc
        table/block_based_table_reader.cc
        table/block_builder.cc
S
Siying Dong 已提交
552
        table/block_fetcher.cc
D
Dmitri Smirnov 已提交
553 554 555 556 557 558 559 560 561
        table/block_prefix_index.cc
        table/bloom_block.cc
        table/cuckoo_table_builder.cc
        table/cuckoo_table_factory.cc
        table/cuckoo_table_reader.cc
        table/flush_block_policy.cc
        table/format.cc
        table/full_filter_block.cc
        table/get_context.cc
M
Maysam Yabandeh 已提交
562
        table/index_builder.cc
D
Dmitri Smirnov 已提交
563
        table/iterator.cc
564
        table/merging_iterator.cc
D
Dmitri Smirnov 已提交
565
        table/meta_blocks.cc
M
Maysam Yabandeh 已提交
566
        table/partitioned_filter_block.cc
567
        table/persistent_cache_helper.cc
D
Dmitri Smirnov 已提交
568 569 570 571 572
        table/plain_table_builder.cc
        table/plain_table_factory.cc
        table/plain_table_index.cc
        table/plain_table_key_coding.cc
        table/plain_table_reader.cc
573
        table/sst_file_writer.cc
D
Dmitri Smirnov 已提交
574 575
        table/table_properties.cc
        table/two_level_iterator.cc
576
        tools/db_bench_tool.cc
577
        tools/dump/db_dump_tool.cc
578 579 580
        tools/ldb_cmd.cc
        tools/ldb_tool.cc
        tools/sst_dump_tool.cc
D
Dmitri Smirnov 已提交
581
        util/arena.cc
582
        util/auto_roll_logger.cc
D
Dmitri Smirnov 已提交
583 584 585 586
        util/bloom.cc
        util/coding.cc
        util/compaction_job_stats_impl.cc
        util/comparator.cc
587
        util/compression_context_cache.cc
588
        util/concurrent_arena.cc
D
Dmitri Smirnov 已提交
589
        util/crc32c.cc
590
        util/delete_scheduler.cc
D
Dmitri Smirnov 已提交
591 592
        util/dynamic_bloom.cc
        util/event_logger.cc
593
        util/file_reader_writer.cc
594
        util/file_util.cc
595
        util/filename.cc
D
Dmitri Smirnov 已提交
596 597 598 599
        util/filter_policy.cc
        util/hash.cc
        util/log_buffer.cc
        util/murmurhash.cc
600
        util/random.cc
D
Dmitri Smirnov 已提交
601 602
        util/rate_limiter.cc
        util/slice.cc
603
        util/sst_file_manager_impl.cc
D
Dmitri Smirnov 已提交
604
        util/status.cc
A
agiardullo 已提交
605
        util/status_message.cc
D
Dmitri Smirnov 已提交
606 607
        util/string_util.cc
        util/sync_point.cc
608
        util/sync_point_impl.cc
D
Dmitri Smirnov 已提交
609 610
        util/testutil.cc
        util/thread_local.cc
611
        util/threadpool_imp.cc
S
SherlockNoMad 已提交
612
        util/transaction_test_util.cc
D
Dmitri Smirnov 已提交
613 614
        util/xxhash.cc
        utilities/backupable/backupable_db.cc
Y
Yi Wu 已提交
615
        utilities/blob_db/blob_compaction_filter.cc
616
        utilities/blob_db/blob_db.cc
A
Anirban Rahut 已提交
617
        utilities/blob_db/blob_db_impl.cc
Y
Yi Wu 已提交
618
        utilities/blob_db/blob_dump_tool.cc
619
        utilities/blob_db/blob_file.cc
A
Anirban Rahut 已提交
620 621 622
        utilities/blob_db/blob_log_reader.cc
        utilities/blob_db/blob_log_writer.cc
        utilities/blob_db/blob_log_format.cc
Y
Yi Wu 已提交
623
        utilities/blob_db/ttl_extractor.cc
624 625 626
        utilities/cassandra/cassandra_compaction_filter.cc
        utilities/cassandra/format.cc
        utilities/cassandra/merge_operator.cc
627
        utilities/checkpoint/checkpoint_impl.cc
628 629 630
        utilities/col_buf_decoder.cc
        utilities/col_buf_encoder.cc
        utilities/column_aware_encoding_util.cc
631
        utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc
O
omegaga 已提交
632
        utilities/date_tiered/date_tiered_db_impl.cc
A
Andrew Kryczka 已提交
633
        utilities/debug.cc
D
Dmitri Smirnov 已提交
634 635 636
        utilities/document/document_db.cc
        utilities/document/json_document.cc
        utilities/document/json_document_builder.cc
D
Dmitri Smirnov 已提交
637
        utilities/env_mirror.cc
A
Andrew Kryczka 已提交
638
        utilities/env_timed.cc
D
Dmitri Smirnov 已提交
639 640
        utilities/geodb/geodb_impl.cc
        utilities/leveldb_options/leveldb_options.cc
641
        utilities/lua/rocks_lua_compaction_filter.cc
642
        utilities/memory/memory_util.cc
P
Pooya Shareghi 已提交
643
        utilities/merge_operators/bytesxor.cc
644 645
        utilities/merge_operators/max.cc
        utilities/merge_operators/put.cc
D
Dmitri Smirnov 已提交
646 647 648
        utilities/merge_operators/string_append/stringappend.cc
        utilities/merge_operators/string_append/stringappend2.cc
        utilities/merge_operators/uint64add.cc
649
        utilities/option_change_migration/option_change_migration.cc
650
        utilities/options/options_util.cc
651 652 653
        utilities/persistent_cache/block_cache_tier.cc
        utilities/persistent_cache/block_cache_tier_file.cc
        utilities/persistent_cache/block_cache_tier_metadata.cc
654
        utilities/persistent_cache/persistent_cache_tier.cc
655
        utilities/persistent_cache/volatile_tier_impl.cc
D
Dmitri Smirnov 已提交
656
        utilities/redis/redis_lists.cc
657
        utilities/simulator_cache/sim_cache.cc
D
Dmitri Smirnov 已提交
658
        utilities/spatialdb/spatial_db.cc
659
        utilities/table_properties_collectors/compact_on_deletion_collector.cc
D
Dmitri Smirnov 已提交
660
        utilities/transactions/optimistic_transaction_db_impl.cc
661
        utilities/transactions/optimistic_transaction.cc
Y
Yi Wu 已提交
662
        utilities/transactions/pessimistic_transaction.cc
M
Maysam Yabandeh 已提交
663
        utilities/transactions/pessimistic_transaction_db.cc
Y
Yi Wu 已提交
664 665
        utilities/transactions/snapshot_checker.cc
        utilities/transactions/transaction_base.cc
A
agiardullo 已提交
666
        utilities/transactions/transaction_db_mutex_impl.cc
A
agiardullo 已提交
667 668
        utilities/transactions/transaction_lock_mgr.cc
        utilities/transactions/transaction_util.cc
669
        utilities/transactions/write_prepared_txn.cc
670
        utilities/transactions/write_prepared_txn_db.cc
671 672
        utilities/transactions/write_unprepared_txn.cc
        utilities/transactions/write_unprepared_txn_db.cc
D
Dmitri Smirnov 已提交
673 674 675
        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
676 677
        $<TARGET_OBJECTS:build_version>)

678
if(HAVE_SSE42 AND NOT FORCE_SSE42)
679
  if(NOT MSVC)
680 681
set_source_files_properties(
  util/crc32c.cc
682
      PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul")
683
  endif()
684 685
endif()

686 687 688 689 690 691
if(HAVE_POWER8)
  list(APPEND SOURCES
    util/crc32c_ppc.c
    util/crc32c_ppc_asm.S)
endif(HAVE_POWER8)

692 693 694 695 696 697 698
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
699 700 701 702
    port/win/win_thread.cc)

if(WITH_XPRESS)
  list(APPEND SOURCES
703
    port/win/xpress_win.cc)
704
endif()
705

706 707 708 709
if(WITH_JEMALLOC)
  list(APPEND SOURCES
    port/win/win_jemalloc.cc)
endif()
710

711 712 713
else()
  list(APPEND SOURCES
    port/port_posix.cc
714 715
    env/env_posix.cc
    env/io_posix.cc)
716
endif()
D
Dmitri Smirnov 已提交
717

718 719 720
set(ROCKSDB_STATIC_LIB rocksdb${ARTIFACT_SUFFIX})
set(ROCKSDB_SHARED_LIB rocksdb-shared${ARTIFACT_SUFFIX})
set(ROCKSDB_IMPORT_LIB ${ROCKSDB_SHARED_LIB})
721 722 723 724 725 726 727 728

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

729 730 731 732
if(WIN32)
  set(SYSTEM_LIBS ${SYSTEM_LIBS} Shlwapi.lib Rpcrt4.lib)
  set(LIBS ${ROCKSDB_STATIC_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
else()
733
  set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
734 735 736 737 738 739 740
  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
A
Arun Sharma 已提交
741 742
                        VERSION ${ROCKSDB_VERSION}
                        SOVERSION ${ROCKSDB_VERSION_MAJOR}
743 744 745 746 747 748
                        CXX_STANDARD 11
                        OUTPUT_NAME "rocksdb")
endif()

add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES})
target_link_libraries(${ROCKSDB_STATIC_LIB}
749 750 751
  ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})

if(WIN32)
752 753 754 755
  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 已提交
756 757 758 759 760 761 762
    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()
763 764 765 766 767 768
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)
769 770 771 772
else()
  message(STATUS "JNI library is disabled")
endif()

P
Paweł Bylica 已提交
773 774 775 776 777 778 779 780 781 782 783 784 785
# 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)
786 787 788 789 790
  include(CMakePackageConfigHelpers)

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

  configure_package_config_file(
B
Bartek Wrona 已提交
791
    ${CMAKE_CURRENT_LIST_DIR}/cmake/RocksDBConfig.cmake.in RocksDBConfig.cmake
792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833
    INSTALL_DESTINATION ${package_config_destination}
  )

  write_basic_package_version_file(
    RocksDBConfigVersion.cmake
    VERSION ${ROCKSDB_VERSION}
    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
    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 已提交
834 835 836 837
endif()

option(WITH_TESTS "build with tests" ON)
if(WITH_TESTS)
P
Paweł Bylica 已提交
838
  set(TESTS
839 840
        cache/cache_test.cc
        cache/lru_cache_test.cc
D
Dmitri Smirnov 已提交
841 842
        db/column_family_test.cc
        db/compact_files_test.cc
843
        db/compaction_iterator_test.cc
D
Dmitri Smirnov 已提交
844
        db/compaction_job_stats_test.cc
845
        db/compaction_job_test.cc
D
Dmitri Smirnov 已提交
846 847 848 849
        db/compaction_picker_test.cc
        db/comparator_db_test.cc
        db/corruption_test.cc
        db/cuckoo_table_db_test.cc
850
        db/db_basic_test.cc
Y
Yi Wu 已提交
851
        db/db_blob_index_test.cc
852 853
        db/db_block_cache_test.cc
        db/db_bloom_filter_test.cc
854
        db/db_compaction_filter_test.cc
855
        db/db_compaction_test.cc
856
        db/db_dynamic_level_test.cc
857
        db/db_flush_test.cc
858
        db/db_inplace_update_test.cc
859
        db/db_io_failure_test.cc
860
        db/db_iter_test.cc
861
        db/db_iter_stress_test.cc
862
        db/db_iterator_test.cc
863
        db/db_log_iter_test.cc
864
        db/db_memtable_test.cc
865
        db/db_merge_operator_test.cc
866
        db/db_options_test.cc
867
        db/db_properties_test.cc
868 869
        db/db_range_del_test.cc
        db/db_sst_test.cc
870
        db/db_statistics_test.cc
871 872 873
        db/db_table_properties_test.cc
        db/db_tailing_iter_test.cc
        db/db_test.cc
874
        db/db_test2.cc
875
        db/db_universal_compaction_test.cc
S
sdong 已提交
876
        db/db_wal_test.cc
Y
Yi Wu 已提交
877
        db/db_write_test.cc
D
Dmitri Smirnov 已提交
878 879
        db/dbformat_test.cc
        db/deletefile_test.cc
880
        db/error_handler_test.cc
881
        db/obsolete_files_test.cc
882 883
        db/external_sst_file_basic_test.cc
        db/external_sst_file_test.cc
D
Dmitri Smirnov 已提交
884 885 886 887 888 889
        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
890
        db/manual_compaction_test.cc
D
Dmitri Smirnov 已提交
891
        db/memtable_list_test.cc
892
        db/merge_helper_test.cc
893
        db/merge_test.cc
894
        db/options_file_test.cc
D
Dmitri Smirnov 已提交
895 896 897
        db/perf_context_test.cc
        db/plain_table_db_test.cc
        db/prefix_test.cc
A
Andrew Kryczka 已提交
898
        db/repair_test.cc
D
Dmitri Smirnov 已提交
899 900 901 902 903 904 905 906
        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
907 908 909
        env/env_basic_test.cc
        env/env_test.cc
        env/mock_env_test.cc
910 911
        memtable/inlineskiplist_test.cc
        memtable/skiplist_test.cc
912
        memtable/write_buffer_manager_test.cc
913 914 915 916 917
        monitoring/histogram_test.cc
        monitoring/iostats_context_test.cc
        monitoring/statistics_test.cc
        options/options_settable_test.cc
        options/options_test.cc
D
Dmitri Smirnov 已提交
918 919
        table/block_based_filter_block_test.cc
        table/block_test.cc
Y
Yi Wu 已提交
920
        table/cleanable_test.cc
D
Dmitri Smirnov 已提交
921 922 923 924 925
        table/cuckoo_table_builder_test.cc
        table/cuckoo_table_reader_test.cc
        table/full_filter_block_test.cc
        table/merger_test.cc
        table/table_test.cc
926
        tools/ldb_cmd_test.cc
D
Dmitri Smirnov 已提交
927
        tools/reduce_levels_test.cc
928
        tools/sst_dump_test.cc
D
Dmitri Smirnov 已提交
929
        util/arena_test.cc
930
        util/auto_roll_logger_test.cc
D
Dmitri Smirnov 已提交
931 932 933 934
        util/autovector_test.cc
        util/bloom_test.cc
        util/coding_test.cc
        util/crc32c_test.cc
935
        util/delete_scheduler_test.cc
D
Dmitri Smirnov 已提交
936 937
        util/dynamic_bloom_test.cc
        util/event_logger_test.cc
938
        util/file_reader_writer_test.cc
939
        util/filelock_test.cc
940
        util/hash_test.cc
941
        util/heap_test.cc
D
Dmitri Smirnov 已提交
942 943
        util/rate_limiter_test.cc
        util/slice_transform_test.cc
A
Anirban Rahut 已提交
944
        util/timer_queue_test.cc
D
Dmitri Smirnov 已提交
945 946 947
        util/thread_list_test.cc
        util/thread_local_test.cc
        utilities/backupable/backupable_db_test.cc
Y
Yi Wu 已提交
948
        utilities/blob_db/blob_db_test.cc
949 950 951 952
        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 已提交
953
        utilities/checkpoint/checkpoint_test.cc
954
        utilities/column_aware_encoding_test.cc
O
omegaga 已提交
955
        utilities/date_tiered/date_tiered_test.cc
D
Dmitri Smirnov 已提交
956 957 958
        utilities/document/document_db_test.cc
        utilities/document/json_document_test.cc
        utilities/geodb/geodb_test.cc
959
        utilities/lua/rocks_lua_test.cc
960
        utilities/memory/memory_test.cc
D
Dmitri Smirnov 已提交
961
        utilities/merge_operators/string_append/stringappend_test.cc
962
        utilities/object_registry_test.cc
963
        utilities/option_change_migration/option_change_migration_test.cc
Y
yuslepukhin 已提交
964
        utilities/options/options_util_test.cc
965
        utilities/persistent_cache/hash_table_test.cc
966
        utilities/persistent_cache/persistent_cache_test.cc
D
Dmitri Smirnov 已提交
967 968
        utilities/redis/redis_lists_test.cc
        utilities/spatialdb/spatial_db_test.cc
969
        utilities/simulator_cache/sim_cache_test.cc
970
        utilities/table_properties_collectors/compact_on_deletion_collector_test.cc
D
Dmitri Smirnov 已提交
971
        utilities/transactions/optimistic_transaction_test.cc
A
agiardullo 已提交
972
        utilities/transactions/transaction_test.cc
973
        utilities/transactions/write_prepared_transaction_test.cc
974
        utilities/transactions/write_unprepared_transaction_test.cc
D
Dmitri Smirnov 已提交
975 976
        utilities/ttl/ttl_test.cc
        utilities/write_batch_with_index/write_batch_with_index_test.cc
P
Paweł Bylica 已提交
977 978 979 980
  )
  if(WITH_LIBRADOS)
    list(APPEND TESTS utilities/env_librados_test.cc)
  endif()
981

P
Paweł Bylica 已提交
982 983 984 985 986 987 988 989 990
  set(BENCHMARKS
    cache/cache_bench.cc
    memtable/memtablerep_bench.cc
    tools/db_bench.cc
    table/table_reader_bench.cc
    utilities/column_aware_encoding_exp.cc
    utilities/persistent_cache/hash_table_bench.cc)
  add_library(testharness OBJECT util/testharness.cc)
  foreach(sourcefile ${BENCHMARKS})
991 992 993
    get_filename_component(exename ${sourcefile} NAME_WE)
    add_executable(${exename}${ARTIFACT_SUFFIX} ${sourcefile}
      $<TARGET_OBJECTS:testharness>)
P
Paweł Bylica 已提交
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
    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
      util/fault_injection_test_env.cc
      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 已提交
1025
      add_executable(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} ${sourcefile}
P
Paweł Bylica 已提交
1026
        $<TARGET_OBJECTS:testharness>)
B
Bartek Wrona 已提交
1027
      set_target_properties(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX}
P
Paweł Bylica 已提交
1028 1029 1030
        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
B
Bartek Wrona 已提交
1031
        OUTPUT_NAME ${exename}${ARTIFACT_SUFFIX}
P
Paweł Bylica 已提交
1032
        )
B
Bartek Wrona 已提交
1033
      target_link_libraries(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} testutillib${ARTIFACT_SUFFIX} gtest ${LIBS})
P
Paweł Bylica 已提交
1034 1035
      if(NOT "${exename}" MATCHES "db_sanity_test")
        add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
B
Bartek Wrona 已提交
1036
        add_dependencies(check ${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX})
P
Paweł Bylica 已提交
1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
      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})
1054 1055
      add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
      add_dependencies(check ${exename}${ARTIFACT_SUFFIX})
P
Paweł Bylica 已提交
1056
  endforeach(sourcefile ${C_TEST_EXES})
P
Paweł Bylica 已提交
1057
endif()
A
Arun Sharma 已提交
1058

P
Paweł Bylica 已提交
1059 1060 1061
option(WITH_TOOLS "build with tools" ON)
if(WITH_TOOLS)
  add_subdirectory(tools)
A
Arun Sharma 已提交
1062
endif()