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

76 77 78 79 80 81 82 83 84 85
  # 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 已提交
86

87 88 89 90 91 92
  if(WITH_SNAPPY)
    find_package(snappy REQUIRED)
    add_definitions(-DSNAPPY)
    include_directories(${SNAPPY_INCLUDE_DIR})
    list(APPEND THIRDPARTY_LIBS ${SNAPPY_LIBRARIES})
  endif()
J
Jay 已提交
93 94

  if(WITH_ZLIB)
95
    find_package(ZLIB REQUIRED)
J
Jay 已提交
96
    add_definitions(-DZLIB)
97 98 99 100 101 102 103
    if(ZLIB_INCLUDE_DIRS)
      # CMake 3
      include_directories(${ZLIB_INCLUDE_DIRS})
    else()
      # CMake 2
      include_directories(${ZLIB_INCLUDE_DIR})
    endif()
J
Jay 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
    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()

  if(WITH_ZSTD)
    find_package(zstd REQUIRED)
    add_definitions(-DZSTD)
    include_directories(${ZSTD_INCLUDE_DIR})
    list(APPEND THIRDPARTY_LIBS ${ZSTD_LIBRARIES})
  endif()
128 129
endif()

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

132 133
find_package(Git)

T
Tamir Duberstein 已提交
134
if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
135
  if(WIN32)
136
    execute_process(COMMAND $ENV{COMSPEC} /C ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
137 138 139
  else()
    execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
  endif()
140
else()
141
  set(GIT_SHA 0)
142 143
endif()

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

146 147 148 149 150 151 152 153 154 155 156

# 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 已提交
157

158 159 160 161 162 163
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 已提交
164
  endif()
165
endif()
T
Tomas Kolda 已提交
166

167 168 169 170 171 172 173
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")
174
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
175 176
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall")
O
Orgad Shaneh 已提交
177
  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")
178 179 180 181 182
  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 已提交
183
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
184 185 186 187 188 189 190 191
    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()

192 193 194 195 196 197 198 199 200 201 202 203
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")

204 205 206 207 208 209
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)
210
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpclmul")
T
Tomas Kolda 已提交
211
  endif()
T
Tamir Duberstein 已提交
212
else()
213 214 215
  if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
  else()
216 217 218
    if(NOT HAVE_POWER8)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
    endif()
T
Tamir Duberstein 已提交
219
  endif()
T
Tamir Duberstein 已提交
220 221
endif()

222
include(CheckCXXSourceCompiles)
223
if(NOT MSVC)
224
  set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
225
endif()
226 227 228
CHECK_CXX_SOURCE_COMPILES("
#include <cstdint>
#include <nmmintrin.h>
229
#include <wmmintrin.h>
230 231
int main() {
  volatile uint32_t x = _mm_crc32_u32(0, 0);
232 233 234 235
  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);
236 237
}
" HAVE_SSE42)
238
unset(CMAKE_REQUIRED_FLAGS)
239 240
if(HAVE_SSE42)
  add_definitions(-DHAVE_SSE42)
241
  add_definitions(-DHAVE_PCLMUL)
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
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()

258 259 260 261 262 263 264 265 266
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()

267 268 269 270 271 272 273 274 275
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 已提交
276

277 278 279 280 281 282 283 284 285
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()
286

287 288
option(WITH_UBSAN "build with UBSAN" OFF)
if(WITH_UBSAN)
289
  add_definitions(-DROCKSDB_UBSAN_RUN)
290 291 292 293 294 295 296
  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 已提交
297

298 299 300
option(WITH_NUMA "build with NUMA policy support" OFF)
if(WITH_NUMA)
  find_package(NUMA REQUIRED)
301 302 303 304 305
  add_definitions(-DNUMA)
  include_directories(${NUMA_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS ${NUMA_LIBRARIES})
endif()

306 307 308
option(WITH_TBB "build with Threading Building Blocks (TBB)" OFF)
if(WITH_TBB)
  find_package(TBB REQUIRED)
309 310 311 312 313
  add_definitions(-DTBB)
  include_directories(${TBB_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS ${TBB_LIBRARIES})
endif()

314 315 316 317 318 319
# 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()

320

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

347 348
# Used to run CI build and tests so we can run faster
option(OPTDBG "Build optimized debug build with MSVC" OFF)
349
option(WITH_RUNTIME_DEBUG "build with debug version of runtime library" ON)
O
Orgad Shaneh 已提交
350
if(MSVC)
351
  if(OPTDBG)
352
    message(STATUS "Debug optimization is enabled")
353
    set(CMAKE_CXX_FLAGS_DEBUG "/Oxt")
354
  else()
355 356 357 358 359 360
    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}")
361
  endif()
T
Tomas Kolda 已提交
362
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
363 364 365

  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
366 367
endif()

368 369 370
if(CMAKE_COMPILER_IS_GNUCXX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-memcmp")
endif()
D
Dmitri Smirnov 已提交
371

372 373 374
option(ROCKSDB_LITE "Build RocksDBLite version" OFF)
if(ROCKSDB_LITE)
  add_definitions(-DROCKSDB_LITE)
Y
Yi Wu 已提交
375
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -Os")
376
endif()
D
Dmitri Smirnov 已提交
377

378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
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 已提交
403 404 405
  if(MINGW)
    add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_VISTA)
  endif()
406 407 408 409 410 411 412 413
endif()

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

option(WITH_FALLOCATE "build with fallocate" ON)
if(WITH_FALLOCATE)
414
  CHECK_CXX_SOURCE_COMPILES("
415 416 417 418
#include <fcntl.h>
#include <linux/falloc.h>
int main() {
 int fd = open(\"/dev/null\", 0);
419
 fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, 1024);
420 421 422 423 424 425 426
}
" HAVE_FALLOCATE)
  if(HAVE_FALLOCATE)
    add_definitions(-DROCKSDB_FALLOCATE_PRESENT)
  endif()
endif()

427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449
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)
450 451 452
if(HAVE_MALLOC_USABLE_SIZE)
  add_definitions(-DROCKSDB_MALLOC_USABLE_SIZE)
endif()
D
Dmitri Smirnov 已提交
453

454 455 456 457 458
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 已提交
459 460
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/include)
461 462
include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/gtest-1.7.0/fused-src)
find_package(Threads REQUIRED)
D
Dmitri Smirnov 已提交
463 464 465

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

466
# Main library source code
467

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

H
Huachao Huang 已提交
687 688 689 690
if(HAVE_SSE42 AND NOT MSVC)
  set_source_files_properties(
    util/crc32c.cc
    PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul")
691 692
endif()

693 694 695 696 697 698
if(HAVE_POWER8)
  list(APPEND SOURCES
    util/crc32c_ppc.c
    util/crc32c_ppc_asm.S)
endif(HAVE_POWER8)

699 700 701 702 703 704 705
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
706 707 708 709
    port/win/win_thread.cc)

if(WITH_XPRESS)
  list(APPEND SOURCES
710
    port/win/xpress_win.cc)
711
endif()
712

713 714 715 716
if(WITH_JEMALLOC)
  list(APPEND SOURCES
    port/win/win_jemalloc.cc)
endif()
717

718 719 720
else()
  list(APPEND SOURCES
    port/port_posix.cc
721 722
    env/env_posix.cc
    env/io_posix.cc)
723
endif()
D
Dmitri Smirnov 已提交
724

725 726 727
set(ROCKSDB_STATIC_LIB rocksdb${ARTIFACT_SUFFIX})
set(ROCKSDB_SHARED_LIB rocksdb-shared${ARTIFACT_SUFFIX})
set(ROCKSDB_IMPORT_LIB ${ROCKSDB_SHARED_LIB})
728 729 730 731 732 733 734 735

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

736 737 738 739
if(WIN32)
  set(SYSTEM_LIBS ${SYSTEM_LIBS} Shlwapi.lib Rpcrt4.lib)
  set(LIBS ${ROCKSDB_STATIC_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
else()
740
  set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
741 742 743 744 745 746 747
  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 已提交
748 749
                        VERSION ${ROCKSDB_VERSION}
                        SOVERSION ${ROCKSDB_VERSION_MAJOR}
750 751 752 753 754 755
                        CXX_STANDARD 11
                        OUTPUT_NAME "rocksdb")
endif()

add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES})
target_link_libraries(${ROCKSDB_STATIC_LIB}
756 757 758
  ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})

if(WIN32)
759 760 761 762
  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 已提交
763 764 765 766 767 768 769
    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()
770 771 772 773 774 775
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)
776 777 778 779
else()
  message(STATUS "JNI library is disabled")
endif()

P
Paweł Bylica 已提交
780 781 782 783 784 785 786 787 788 789 790 791 792
# 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)
793 794 795 796 797
  include(CMakePackageConfigHelpers)

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

  configure_package_config_file(
B
Bartek Wrona 已提交
798
    ${CMAKE_CURRENT_LIST_DIR}/cmake/RocksDBConfig.cmake.in RocksDBConfig.cmake
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821
    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
822
    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841
    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 已提交
842 843 844 845
endif()

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

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

P
Paweł Bylica 已提交
1066 1067 1068
option(WITH_TOOLS "build with tools" ON)
if(WITH_TOOLS)
  add_subdirectory(tools)
A
Arun Sharma 已提交
1069
endif()