CMakeLists.txt 48.1 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" -DCMAKE_BUILD_TYPE=Release -DWITH_GFLAGS=1 -DWITH_SNAPPY=1 -DWITH_JEMALLOC=1 -DWITH_JNI=1 ..
18
# 4. Then build the project in debug mode (you may want to add /m[:<N>] flag to run msbuild in <N> parallel threads
19
#                                          or simply /m to use all avail cores)
20 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 54 55 56 57
if(NOT CMAKE_BUILD_TYPE)
  if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
    set(default_build_type "Debug")
  else()
    set(default_build_type "RelWithDebInfo")
  endif()
  set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING
    "Default BUILD_TYPE is ${default_build_type}" FORCE)
endif()

58 59 60 61 62 63
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)

64
option(WITH_JEMALLOC "build with JeMalloc" OFF)
65 66 67
option(WITH_SNAPPY "build with SNAPPY" OFF)
option(WITH_LZ4 "build with lz4" OFF)
option(WITH_ZLIB "build with zlib" OFF)
68
option(WITH_ZSTD "build with zstd" OFF)
69 70 71 72
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()
73 74
# third-party/folly is only validated to work on Linux and Windows for now.
# So only turn it on there by default.
75
if(CMAKE_SYSTEM_NAME MATCHES "Linux|Windows")
76 77 78 79 80 81
  if(MSVC AND MSVC_VERSION LESS 1910)
    # Folly does not compile with MSVC older than VS2017
    option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" OFF)
  else()
    option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" ON)
  endif()
82 83 84
else()
  option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" OFF)
endif()
85

P
Peter Dillinger 已提交
86 87 88 89
if( NOT DEFINED CMAKE_CXX_STANDARD )
  set(CMAKE_CXX_STANDARD 11)
endif()

90 91
include(CMakeDependentOption)

T
Tamir Duberstein 已提交
92
if(MSVC)
93
  option(WITH_GFLAGS "build with GFlags" OFF)
94
  option(WITH_XPRESS "build with windows built in compression" OFF)
95 96
  include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc)
else()
97
  if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND NOT CMAKE_SYSTEM_NAME MATCHES "kFreeBSD")
98
    # FreeBSD has jemalloc as default malloc
99
    # but it does not have all the jemalloc files in include/...
T
Tamir Duberstein 已提交
100
    set(WITH_JEMALLOC ON)
101 102 103 104
  else()
    if(WITH_JEMALLOC)
      find_package(JeMalloc REQUIRED)
      add_definitions(-DROCKSDB_JEMALLOC -DJEMALLOC_NO_DEMANGLE)
105
      list(APPEND THIRDPARTY_LIBS JeMalloc::JeMalloc)
106
    endif()
T
Tamir Duberstein 已提交
107
  endif()
108

109 110 111 112 113
  if(MINGW)
    option(WITH_GFLAGS "build with GFlags" OFF)
  else()
    option(WITH_GFLAGS "build with GFlags" ON)
  endif()
114
  set(GFLAGS_LIB)
115
  if(WITH_GFLAGS)
116 117 118 119 120 121
    # Config with namespace available since gflags 2.2.2
    option(GFLAGS_USE_TARGET_NAMESPACE "Use gflags import target with namespace." ON)
    find_package(gflags CONFIG)
    if(gflags_FOUND)
      if(TARGET ${GFLAGS_TARGET})
        # Config with GFLAGS_TARGET available since gflags 2.2.0
122
        set(GFLAGS_LIB ${GFLAGS_TARGET})
123 124
      else()
        # Config with GFLAGS_LIBRARIES available since gflags 2.1.0
125
        set(GFLAGS_LIB ${GFLAGS_LIBRARIES})
126 127 128
      endif()
    else()
      find_package(gflags REQUIRED)
129
        set(GFLAGS_LIB gflags::gflags)
130
    endif()
131 132
    include_directories(${GFLAGS_INCLUDE_DIR})
    list(APPEND THIRDPARTY_LIBS ${GFLAGS_LIB})
133
    add_definitions(-DGFLAGS=1)
134
  endif()
J
Jay 已提交
135

136
  if(WITH_SNAPPY)
137 138 139 140
    find_package(Snappy CONFIG)
    if(NOT Snappy_FOUND)
      find_package(Snappy REQUIRED)
    endif()
141
    add_definitions(-DSNAPPY)
142
    list(APPEND THIRDPARTY_LIBS Snappy::snappy)
143
  endif()
J
Jay 已提交
144 145

  if(WITH_ZLIB)
146
    find_package(ZLIB REQUIRED)
J
Jay 已提交
147
    add_definitions(-DZLIB)
148
    list(APPEND THIRDPARTY_LIBS ZLIB::ZLIB)
J
Jay 已提交
149 150 151 152
  endif()

  option(WITH_BZ2 "build with bzip2" OFF)
  if(WITH_BZ2)
153
    find_package(BZip2 REQUIRED)
J
Jay 已提交
154
    add_definitions(-DBZIP2)
155 156 157 158 159
    if(BZIP2_INCLUDE_DIRS)
      include_directories(${BZIP2_INCLUDE_DIRS})
    else()
      include_directories(${BZIP2_INCLUDE_DIR})
    endif()
J
Jay 已提交
160 161 162 163 164 165
    list(APPEND THIRDPARTY_LIBS ${BZIP2_LIBRARIES})
  endif()

  if(WITH_LZ4)
    find_package(lz4 REQUIRED)
    add_definitions(-DLZ4)
166
    list(APPEND THIRDPARTY_LIBS lz4::lz4)
J
Jay 已提交
167 168 169 170 171 172
  endif()

  if(WITH_ZSTD)
    find_package(zstd REQUIRED)
    add_definitions(-DZSTD)
    include_directories(${ZSTD_INCLUDE_DIR})
173
    list(APPEND THIRDPARTY_LIBS zstd::zstd)
J
Jay 已提交
174
  endif()
175 176
endif()

M
mrambacher 已提交
177 178
string(TIMESTAMP TS "%Y-%m-%d %H:%M:%S" UTC)
set(BUILD_DATE "${TS}" CACHE STRING "the time we first built rocksdb")
D
Dmitri Smirnov 已提交
179

180 181
find_package(Git)

T
Tamir Duberstein 已提交
182
if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
M
mrambacher 已提交
183 184 185 186 187 188
  execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_SHA COMMAND "${GIT_EXECUTABLE}" rev-parse HEAD )
  execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" RESULT_VARIABLE GIT_MOD COMMAND "${GIT_EXECUTABLE}" diff-index HEAD --quiet)
  execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_DATE COMMAND "${GIT_EXECUTABLE}" log -1 --date=format:"%Y-%m-%d %T" --format="%ad")
  execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_TAG RESULT_VARIABLE rv COMMAND "${GIT_EXECUTABLE}" symbolic-ref -q --short HEAD OUTPUT_STRIP_TRAILING_WHITESPACE)
  if (rv AND NOT rv EQUAL 0)
    execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_TAG COMMAND "${GIT_EXECUTABLE}" describe --tags --exact-match OUTPUT_STRIP_TRAILING_WHITESPACE)
189
  endif()
190
else()
191
  set(GIT_SHA 0)
192
  set(GIT_MOD 1)
193
endif()
M
mrambacher 已提交
194 195
string(REGEX REPLACE "[^0-9a-fA-F]+" "" GIT_SHA "${GIT_SHA}")
string(REGEX REPLACE "[^0-9: /-]+" "" GIT_DATE "${GIT_DATE}")
196

197 198 199 200 201 202
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 已提交
203
  endif()
204
endif()
T
Tomas Kolda 已提交
205

206 207
set(BUILD_VERSION_CC ${CMAKE_BINARY_DIR}/build_version.cc)
configure_file(util/build_version.cc.in ${BUILD_VERSION_CC} @ONLY)
M
mrambacher 已提交
208

209 210
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")
211
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
212 213
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall")
O
Orgad Shaneh 已提交
214
  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")
215 216 217
  if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-prototypes")
  endif()
218
  if(MINGW)
219
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format -fno-asynchronous-unwind-tables")
220
    add_definitions(-D_POSIX_C_SOURCE=1)
221 222
  endif()
  if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
T
Tamir Duberstein 已提交
223
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
224 225 226 227 228 229 230 231
    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()

232
include(CheckCCompilerFlag)
233 234 235 236 237 238 239 240 241 242 243 244
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
  CHECK_C_COMPILER_FLAG("-mcpu=power9" HAS_POWER9)
  if(HAS_POWER9)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power9 -mtune=power9")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power9 -mtune=power9")
  else()
    CHECK_C_COMPILER_FLAG("-mcpu=power8" HAS_POWER8)
    if(HAS_POWER8)
      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power8 -mtune=power8")
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power8 -mtune=power8")
    endif(HAS_POWER8)
  endif(HAS_POWER9)
245 246 247 248 249 250
  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")
  endif(HAS_ALTIVEC)
251
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
252

253
if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64|AARCH64")
254
        CHECK_C_COMPILER_FLAG("-march=armv8-a+crc+crypto" HAS_ARMV8_CRC)
255 256
  if(HAS_ARMV8_CRC)
    message(STATUS " HAS_ARMV8_CRC yes")
257 258
    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")
259
  endif(HAS_ARMV8_CRC)
260
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64|AARCH64")
261

262 263
option(PORTABLE "build a portable binary" OFF)
option(FORCE_SSE42 "force building with SSE4.2, even when PORTABLE=ON" OFF)
264 265
option(FORCE_AVX "force building with AVX, even when PORTABLE=ON" OFF)
option(FORCE_AVX2 "force building with AVX2, even when PORTABLE=ON" OFF)
266 267 268 269
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)
270
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpclmul")
T
Tomas Kolda 已提交
271
  endif()
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
  if(MSVC)
    if(FORCE_AVX)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX")
    endif()
    # MSVC automatically enables BMI / lzcnt with AVX2.
    if(FORCE_AVX2)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
    endif()
  else()
    if(FORCE_AVX)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx")
    endif()
    if(FORCE_AVX2)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mbmi -mlzcnt")
    endif()
  endif()
T
Tamir Duberstein 已提交
288
else()
289 290 291
  if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
  else()
292
    if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64" AND NOT HAS_ARMV8_CRC)
293 294
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
    endif()
T
Tamir Duberstein 已提交
295
  endif()
T
Tamir Duberstein 已提交
296 297
endif()

298
include(CheckCXXSourceCompiles)
299
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
300
if(NOT MSVC)
301
  set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
302
endif()
P
Peter Dillinger 已提交
303

304 305 306
CHECK_CXX_SOURCE_COMPILES("
#include <cstdint>
#include <nmmintrin.h>
307
#include <wmmintrin.h>
308 309
int main() {
  volatile uint32_t x = _mm_crc32_u32(0, 0);
310 311 312 313
  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);
314 315 316 317
}
" HAVE_SSE42)
if(HAVE_SSE42)
  add_definitions(-DHAVE_SSE42)
318
  add_definitions(-DHAVE_PCLMUL)
319 320 321
elseif(FORCE_SSE42)
  message(FATAL_ERROR "FORCE_SSE42=ON but unable to compile with SSE4.2 enabled")
endif()
322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342

# Check if -latomic is required or not
if (NOT MSVC)
  set(CMAKE_REQUIRED_FLAGS "--std=c++11")
  CHECK_CXX_SOURCE_COMPILES("
#include <atomic>
std::atomic<uint64_t> x(0);
int main() {
  uint64_t i = x.load(std::memory_order_relaxed);
  bool b = x.is_lock_free();
  return 0;
}
" BUILTIN_ATOMIC)
if (NOT BUILTIN_ATOMIC)
  #TODO: Check if -latomic exists
  list(APPEND THIRDPARTY_LIBS atomic)
endif()
endif()

# Reset the required flags
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
343 344 345 346 347 348 349

CHECK_CXX_SOURCE_COMPILES("
#if defined(_MSC_VER) && !defined(__thread)
#define __thread __declspec(thread)
#endif
int main() {
  static __thread int tls;
350
  (void)tls;
351 352 353 354 355 356
}
" HAVE_THREAD_LOCAL)
if(HAVE_THREAD_LOCAL)
  add_definitions(-DROCKSDB_SUPPORT_THREAD_LOCAL)
endif()

357 358 359 360 361 362 363 364 365 366
option(WITH_IOSTATS_CONTEXT "Enable IO stats context" ON)
if (NOT WITH_IOSTATS_CONTEXT)
  add_definitions(-DNIOSTATS_CONTEXT)
endif()

option(WITH_PERF_CONTEXT "Enable perf context" ON)
if (NOT WITH_PERF_CONTEXT)
  add_definitions(-DNPERF_CONTEXT)
endif()

367 368 369 370 371 372 373 374 375
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()

376 377 378 379 380 381 382 383 384
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 已提交
385

386 387 388 389 390 391 392 393 394
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()
395

396 397
option(WITH_UBSAN "build with UBSAN" OFF)
if(WITH_UBSAN)
398
  add_definitions(-DROCKSDB_UBSAN_RUN)
399 400 401 402 403 404 405
  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 已提交
406

407 408 409
option(WITH_NUMA "build with NUMA policy support" OFF)
if(WITH_NUMA)
  find_package(NUMA REQUIRED)
410 411
  add_definitions(-DNUMA)
  include_directories(${NUMA_INCLUDE_DIR})
412
  list(APPEND THIRDPARTY_LIBS NUMA::NUMA)
413 414
endif()

415 416 417
option(WITH_TBB "build with Threading Building Blocks (TBB)" OFF)
if(WITH_TBB)
  find_package(TBB REQUIRED)
418
  add_definitions(-DTBB)
419
  list(APPEND THIRDPARTY_LIBS TBB::TBB)
420 421
endif()

422 423 424 425 426 427
# 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()

428 429 430 431
option(WITH_DYNAMIC_EXTENSION "build with dynamic extension support" OFF)
if(NOT WITH_DYNAMIC_EXTENSION)
  add_definitions(-DROCKSDB_NO_DYNAMIC_EXTENSION)
endif()
432

433 434 435 436 437 438
option(ASSERT_STATUS_CHECKED "build with assert status checked" OFF)
if (ASSERT_STATUS_CHECKED)
  message(STATUS "Build with assert status checked")
  add_definitions(-DROCKSDB_ASSERT_STATUS_CHECKED)
endif()

439 440 441 442 443 444
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()
445 446 447 448 449 450 451 452 453
    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()
454
  endif()
455 456 457
else()
  message(STATUS "Enabling RTTI in Debug builds only (default)")
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
458 459 460 461 462
  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()
463 464
endif()

465 466
# Used to run CI build and tests so we can run faster
option(OPTDBG "Build optimized debug build with MSVC" OFF)
467
option(WITH_RUNTIME_DEBUG "build with debug version of runtime library" ON)
O
Orgad Shaneh 已提交
468
if(MSVC)
469
  if(OPTDBG)
470
    message(STATUS "Debug optimization is enabled")
471
    set(CMAKE_CXX_FLAGS_DEBUG "/Oxt")
472
  else()
P
Peter Dillinger 已提交
473 474 475 476 477 478 479 480 481
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /RTC1")

    # Minimal Build is deprecated after MSVC 2015
    if( MSVC_VERSION GREATER 1900 )
      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Gm-")
    else()
      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Gm")
    endif()

482 483 484 485 486
  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}")
487
  endif()
T
Tomas Kolda 已提交
488
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
489 490 491

  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
492 493
endif()

494 495 496
if(CMAKE_COMPILER_IS_GNUCXX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-memcmp")
endif()
D
Dmitri Smirnov 已提交
497

498 499 500
option(ROCKSDB_LITE "Build RocksDBLite version" OFF)
if(ROCKSDB_LITE)
  add_definitions(-DROCKSDB_LITE)
Y
Yi Wu 已提交
501
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -Os")
502
endif()
D
Dmitri Smirnov 已提交
503

504 505 506 507 508 509 510 511
if(CMAKE_SYSTEM_NAME MATCHES "Cygwin")
  add_definitions(-fno-builtin-memcmp -DCYGWIN)
elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
  add_definitions(-DOS_MACOSX)
elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
  add_definitions(-DOS_LINUX)
elseif(CMAKE_SYSTEM_NAME MATCHES "SunOS")
  add_definitions(-DOS_SOLARIS)
512 513
elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD")
  add_definitions(-DOS_GNU_KFREEBSD)
514 515 516 517 518 519 520 521 522 523 524 525
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 已提交
526 527 528
  if(MINGW)
    add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_VISTA)
  endif()
529 530 531 532 533 534 535 536
endif()

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

option(WITH_FALLOCATE "build with fallocate" ON)
if(WITH_FALLOCATE)
537
  CHECK_CXX_SOURCE_COMPILES("
538 539 540 541
#include <fcntl.h>
#include <linux/falloc.h>
int main() {
 int fd = open(\"/dev/null\", 0);
542
 fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, 1024);
543 544 545 546 547 548 549
}
" HAVE_FALLOCATE)
  if(HAVE_FALLOCATE)
    add_definitions(-DROCKSDB_FALLOCATE_PRESENT)
  endif()
endif()

550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
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)
572 573 574 575 576
if(CMAKE_SYSTEM_NAME MATCHES "^FreeBSD")
  check_cxx_symbol_exists(malloc_usable_size malloc_np.h HAVE_MALLOC_USABLE_SIZE)
else()
  check_cxx_symbol_exists(malloc_usable_size malloc.h HAVE_MALLOC_USABLE_SIZE)
endif()
577 578 579
if(HAVE_MALLOC_USABLE_SIZE)
  add_definitions(-DROCKSDB_MALLOC_USABLE_SIZE)
endif()
D
Dmitri Smirnov 已提交
580

581 582 583 584 585
check_cxx_symbol_exists(sched_getcpu sched.h HAVE_SCHED_GETCPU)
if(HAVE_SCHED_GETCPU)
  add_definitions(-DROCKSDB_SCHED_GETCPU_PRESENT)
endif()

F
Fabrice Fontaine 已提交
586 587 588 589 590
check_cxx_symbol_exists(getauxval auvx.h HAVE_AUXV_GETAUXVAL)
if(HAVE_AUXV_GETAUXVAL)
  add_definitions(-DROCKSDB_AUXV_GETAUXVAL_PRESENT)
endif()

D
Dmitri Smirnov 已提交
591 592
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/include)
593
if(WITH_FOLLY_DISTRIBUTED_MUTEX)
594 595
  include_directories(${PROJECT_SOURCE_DIR}/third-party/folly)
endif()
596
find_package(Threads REQUIRED)
D
Dmitri Smirnov 已提交
597

598
# Main library source code
599

D
Dmitri Smirnov 已提交
600
set(SOURCES
601
        cache/cache.cc
602 603 604
        cache/clock_cache.cc
        cache/lru_cache.cc
        cache/sharded_cache.cc
605
        db/arena_wrapped_db_iter.cc
606
        db/blob/blob_file_addition.cc
607
        db/blob/blob_file_builder.cc
608
        db/blob/blob_file_cache.cc
609
        db/blob/blob_file_garbage.cc
610
        db/blob/blob_file_meta.cc
611
        db/blob/blob_file_reader.cc
612
        db/blob/blob_log_format.cc
613
        db/blob/blob_log_sequential_reader.cc
614
        db/blob/blob_log_writer.cc
D
Dmitri Smirnov 已提交
615 616 617
        db/builder.cc
        db/c.cc
        db/column_family.cc
618 619
        db/compaction/compaction.cc
        db/compaction/compaction_iterator.cc
620
        db/compaction/compaction_picker.cc
621 622 623 624
        db/compaction/compaction_job.cc
        db/compaction/compaction_picker_fifo.cc
        db/compaction/compaction_picker_level.cc
        db/compaction/compaction_picker_universal.cc
625
        db/compaction/sst_partitioner.cc
A
agiardullo 已提交
626
        db/convenience.cc
D
Dmitri Smirnov 已提交
627
        db/db_filesnapshot.cc
628
        db/db_impl/compacted_db_impl.cc
629 630 631 632 633 634 635 636 637
        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
638
        db/db_info_dumper.cc
D
Dmitri Smirnov 已提交
639
        db/db_iter.cc
640
        db/dbformat.cc
641
        db/error_handler.cc
D
Dmitri Smirnov 已提交
642 643
        db/event_helpers.cc
        db/experimental.cc
644
        db/external_sst_file_ingestion_job.cc
D
Dmitri Smirnov 已提交
645 646 647 648
        db/file_indexer.cc
        db/flush_job.cc
        db/flush_scheduler.cc
        db/forward_iterator.cc
649
        db/import_column_family_job.cc
D
Dmitri Smirnov 已提交
650
        db/internal_stats.cc
S
Siying Dong 已提交
651
        db/logs_with_prep_tracker.cc
D
Dmitri Smirnov 已提交
652 653
        db/log_reader.cc
        db/log_writer.cc
654
        db/malloc_stats.cc
D
Dmitri Smirnov 已提交
655 656 657 658
        db/memtable.cc
        db/memtable_list.cc
        db/merge_helper.cc
        db/merge_operator.cc
659
        db/output_validator.cc
660
        db/periodic_work_scheduler.cc
661
        db/range_del_aggregator.cc
662
        db/range_tombstone_fragmenter.cc
D
Dmitri Smirnov 已提交
663
        db/repair.cc
664
        db/snapshot_impl.cc
D
Dmitri Smirnov 已提交
665 666 667
        db/table_cache.cc
        db/table_properties_collector.cc
        db/transaction_log_impl.cc
668
        db/trim_history_scheduler.cc
D
Dmitri Smirnov 已提交
669 670
        db/version_builder.cc
        db/version_edit.cc
671
        db/version_edit_handler.cc
D
Dmitri Smirnov 已提交
672
        db/version_set.cc
673
        db/wal_edit.cc
D
Dmitri Smirnov 已提交
674 675 676 677 678
        db/wal_manager.cc
        db/write_batch.cc
        db/write_batch_base.cc
        db/write_controller.cc
        db/write_thread.cc
679
        env/composite_env.cc
680 681
        env/env.cc
        env/env_chroot.cc
E
Ewout Prangsma 已提交
682
        env/env_encryption.cc
683
        env/env_hdfs.cc
684
        env/file_system.cc
685
        env/file_system_tracer.cc
686
        env/fs_remap.cc
687
        env/mock_env.cc
688
        file/delete_scheduler.cc
689
        file/file_prefetch_buffer.cc
690 691
        file/file_util.cc
        file/filename.cc
692
        file/line_file_reader.cc
693 694 695 696
        file/random_access_file_reader.cc
        file/read_write_util.cc
        file/readahead_raf.cc
        file/sequence_file_reader.cc
697
        file/sst_file_manager_impl.cc
698
        file/writable_file_writer.cc
699 700 701
        logging/auto_roll_logger.cc
        logging/event_logger.cc
        logging/log_buffer.cc
702 703 704
        memory/arena.cc
        memory/concurrent_arena.cc
        memory/jemalloc_nodump_allocator.cc
705
        memory/memkind_kmem_allocator.cc
706
        memtable/alloc_tracker.cc
707 708
        memtable/hash_linklist_rep.cc
        memtable/hash_skiplist_rep.cc
709 710
        memtable/skiplistrep.cc
        memtable/vectorrep.cc
711
        memtable/write_buffer_manager.cc
712 713
        monitoring/histogram.cc
        monitoring/histogram_windowing.cc
714
        monitoring/in_memory_stats_history.cc
715 716 717 718
        monitoring/instrumented_mutex.cc
        monitoring/iostats_context.cc
        monitoring/perf_context.cc
        monitoring/perf_level.cc
719
        monitoring/persistent_stats_history.cc
720 721 722 723 724 725
        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
726
        options/configurable.cc
727
        options/customizable.cc
728 729 730 731
        options/db_options.cc
        options/options.cc
        options/options_helper.cc
        options/options_parser.cc
D
Dmitri Smirnov 已提交
732
        port/stack_trace.cc
733
        table/adaptive/adaptive_table_factory.cc
734
        table/block_based/binary_search_index_reader.cc
735 736 737 738
        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
739
        table/block_based/block_based_table_iterator.cc
740 741
        table/block_based/block_based_table_reader.cc
        table/block_based/block_builder.cc
742
        table/block_based/block_prefetcher.cc
743 744 745
        table/block_based/block_prefix_index.cc
        table/block_based/data_block_hash_index.cc
        table/block_based/data_block_footer.cc
746
        table/block_based/filter_block_reader_common.cc
747
        table/block_based/filter_policy.cc
748 749
        table/block_based/flush_block_policy.cc
        table/block_based/full_filter_block.cc
750
        table/block_based/hash_index_reader.cc
751
        table/block_based/index_builder.cc
752
        table/block_based/index_reader_common.cc
753
        table/block_based/parsed_full_filter_block.cc
754
        table/block_based/partitioned_filter_block.cc
755
        table/block_based/partitioned_index_iterator.cc
756 757
        table/block_based/partitioned_index_reader.cc
        table/block_based/reader_common.cc
758
        table/block_based/uncompression_dict_reader.cc
S
Siying Dong 已提交
759
        table/block_fetcher.cc
760 761 762
        table/cuckoo/cuckoo_table_builder.cc
        table/cuckoo/cuckoo_table_factory.cc
        table/cuckoo/cuckoo_table_reader.cc
D
Dmitri Smirnov 已提交
763 764 765
        table/format.cc
        table/get_context.cc
        table/iterator.cc
766
        table/merging_iterator.cc
D
Dmitri Smirnov 已提交
767
        table/meta_blocks.cc
768
        table/persistent_cache_helper.cc
769
        table/plain/plain_table_bloom.cc
770 771 772 773 774
        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
775
        table/sst_file_dumper.cc
776
        table/sst_file_reader.cc
777
        table/sst_file_writer.cc
778
        table/table_factory.cc
D
Dmitri Smirnov 已提交
779 780
        table/table_properties.cc
        table/two_level_iterator.cc
781 782 783 784
        test_util/sync_point.cc
        test_util/sync_point_impl.cc
        test_util/testutil.cc
        test_util/transaction_test_util.cc
785
        tools/block_cache_analyzer/block_cache_trace_analyzer.cc
786
        tools/dump/db_dump_tool.cc
A
Akanksha Mahajan 已提交
787
        tools/io_tracer_parser_tool.cc
788 789 790
        tools/ldb_cmd.cc
        tools/ldb_tool.cc
        tools/sst_dump_tool.cc
Z
Zhichao Cao 已提交
791
        tools/trace_analyzer_tool.cc
792
        trace_replay/trace_replay.cc
H
haoyuhuang 已提交
793
        trace_replay/block_cache_tracer.cc
794
        trace_replay/io_tracer.cc
D
Dmitri Smirnov 已提交
795 796 797
        util/coding.cc
        util/compaction_job_stats_impl.cc
        util/comparator.cc
798
        util/compression_context_cache.cc
799
        util/concurrent_task_limiter_impl.cc
D
Dmitri Smirnov 已提交
800 801 802 803
        util/crc32c.cc
        util/dynamic_bloom.cc
        util/hash.cc
        util/murmurhash.cc
804
        util/random.cc
D
Dmitri Smirnov 已提交
805
        util/rate_limiter.cc
806
        util/ribbon_config.cc
D
Dmitri Smirnov 已提交
807
        util/slice.cc
808
        util/file_checksum_helper.cc
D
Dmitri Smirnov 已提交
809 810 811
        util/status.cc
        util/string_util.cc
        util/thread_local.cc
812
        util/threadpool_imp.cc
D
Dmitri Smirnov 已提交
813 814
        util/xxhash.cc
        utilities/backupable/backupable_db.cc
Y
Yi Wu 已提交
815
        utilities/blob_db/blob_compaction_filter.cc
816
        utilities/blob_db/blob_db.cc
A
Anirban Rahut 已提交
817
        utilities/blob_db/blob_db_impl.cc
818
        utilities/blob_db/blob_db_impl_filesnapshot.cc
Y
Yi Wu 已提交
819
        utilities/blob_db/blob_dump_tool.cc
820
        utilities/blob_db/blob_file.cc
821 822 823
        utilities/cassandra/cassandra_compaction_filter.cc
        utilities/cassandra/format.cc
        utilities/cassandra/merge_operator.cc
824
        utilities/checkpoint/checkpoint_impl.cc
825
        utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc
A
Andrew Kryczka 已提交
826
        utilities/debug.cc
D
Dmitri Smirnov 已提交
827
        utilities/env_mirror.cc
A
Andrew Kryczka 已提交
828
        utilities/env_timed.cc
M
mrambacher 已提交
829 830
        utilities/fault_injection_env.cc
        utilities/fault_injection_fs.cc
D
Dmitri Smirnov 已提交
831
        utilities/leveldb_options/leveldb_options.cc
832
        utilities/memory/memory_util.cc
P
Pooya Shareghi 已提交
833
        utilities/merge_operators/bytesxor.cc
834 835
        utilities/merge_operators/max.cc
        utilities/merge_operators/put.cc
836
        utilities/merge_operators/sortlist.cc
D
Dmitri Smirnov 已提交
837 838 839
        utilities/merge_operators/string_append/stringappend.cc
        utilities/merge_operators/string_append/stringappend2.cc
        utilities/merge_operators/uint64add.cc
840
        utilities/object_registry.cc
841
        utilities/option_change_migration/option_change_migration.cc
842
        utilities/options/options_util.cc
843 844 845
        utilities/persistent_cache/block_cache_tier.cc
        utilities/persistent_cache/block_cache_tier_file.cc
        utilities/persistent_cache/block_cache_tier_metadata.cc
846
        utilities/persistent_cache/persistent_cache_tier.cc
847
        utilities/persistent_cache/volatile_tier_impl.cc
848
        utilities/simulator_cache/cache_simulator.cc
849
        utilities/simulator_cache/sim_cache.cc
850
        utilities/table_properties_collectors/compact_on_deletion_collector.cc
851
        utilities/trace/file_trace_reader_writer.cc
852 853 854
        utilities/transactions/lock/lock_manager.cc
        utilities/transactions/lock/point/point_lock_tracker.cc
        utilities/transactions/lock/point/point_lock_manager.cc
855 856
        utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc
        utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc
D
Dmitri Smirnov 已提交
857
        utilities/transactions/optimistic_transaction_db_impl.cc
858
        utilities/transactions/optimistic_transaction.cc
Y
Yi Wu 已提交
859
        utilities/transactions/pessimistic_transaction.cc
M
Maysam Yabandeh 已提交
860
        utilities/transactions/pessimistic_transaction_db.cc
Y
Yi Wu 已提交
861 862
        utilities/transactions/snapshot_checker.cc
        utilities/transactions/transaction_base.cc
A
agiardullo 已提交
863
        utilities/transactions/transaction_db_mutex_impl.cc
A
agiardullo 已提交
864
        utilities/transactions/transaction_util.cc
865
        utilities/transactions/write_prepared_txn.cc
866
        utilities/transactions/write_prepared_txn_db.cc
867 868
        utilities/transactions/write_unprepared_txn.cc
        utilities/transactions/write_unprepared_txn_db.cc
D
Dmitri Smirnov 已提交
869 870
        utilities/ttl/db_ttl_impl.cc
        utilities/write_batch_with_index/write_batch_with_index.cc
M
mrambacher 已提交
871
        utilities/write_batch_with_index/write_batch_with_index_internal.cc)
872

873
list(APPEND SOURCES
874 875 876 877 878 879 880 881 882 883 884 885 886
  utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc
  utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc
  utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc
  utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc
  utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc
  utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc
  utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc
  utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc
  utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc
  utilities/transactions/lock/range/range_tree/lib/standalone_port.cc
  utilities/transactions/lock/range/range_tree/lib/util/dbt.cc
  utilities/transactions/lock/range/range_tree/lib/util/memarena.cc)

H
Huachao Huang 已提交
887 888 889 890
if(HAVE_SSE42 AND NOT MSVC)
  set_source_files_properties(
    util/crc32c.cc
    PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul")
891 892
endif()

893
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
894 895 896
  list(APPEND SOURCES
    util/crc32c_ppc.c
    util/crc32c_ppc_asm.S)
897
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
898

899 900 901 902 903
if(HAS_ARMV8_CRC)
  list(APPEND SOURCES
    util/crc32c_arm64.cc)
endif(HAS_ARMV8_CRC)

904 905 906 907 908 909
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
L
Lucian Petrut 已提交
910 911 912 913 914 915 916
    port/win/win_logger.cc)
  if(NOT MINGW)
    # Mingw only supports std::thread when using
    # posix threads.
    list(APPEND SOURCES
      port/win/win_thread.cc)
  endif()
917 918
if(WITH_XPRESS)
  list(APPEND SOURCES
919
    port/win/xpress_win.cc)
920
endif()
921

922 923 924 925
if(WITH_JEMALLOC)
  list(APPEND SOURCES
    port/win/win_jemalloc.cc)
endif()
926

927 928 929
else()
  list(APPEND SOURCES
    port/port_posix.cc
930
    env/env_posix.cc
931
    env/fs_posix.cc
932
    env/io_posix.cc)
933
endif()
D
Dmitri Smirnov 已提交
934

935 936 937 938 939 940 941 942 943
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()

944 945
set(ROCKSDB_STATIC_LIB rocksdb${ARTIFACT_SUFFIX})
set(ROCKSDB_SHARED_LIB rocksdb-shared${ARTIFACT_SUFFIX})
946 947

option(ROCKSDB_BUILD_SHARED "Build shared versions of the RocksDB libraries" ON)
948 949 950 951 952 953 954 955

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

956
if(WIN32)
957
  set(SYSTEM_LIBS ${SYSTEM_LIBS} shlwapi.lib rpcrt4.lib)
958
else()
959
  set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
960 961
endif()

M
mrambacher 已提交
962
add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES} ${BUILD_VERSION_CC})
963
target_link_libraries(${ROCKSDB_STATIC_LIB} PRIVATE
964 965
  ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})

966
if(ROCKSDB_BUILD_SHARED)
M
mrambacher 已提交
967
  add_library(${ROCKSDB_SHARED_LIB} SHARED ${SOURCES} ${BUILD_VERSION_CC})
968
  target_link_libraries(${ROCKSDB_SHARED_LIB} PRIVATE
969
    ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
970 971 972 973 974 975 976 977 978 979 980 981 982 983 984

  if(WIN32)
    set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
      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_SHARED_LIB} PROPERTIES
        COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_SHARED_LIB}.pdb")
    endif()
  else()
    set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
                          LINKER_LANGUAGE CXX
                          VERSION ${rocksdb_VERSION}
                          SOVERSION ${rocksdb_VERSION_MAJOR}
985
                          OUTPUT_NAME "rocksdb${ARTIFACT_SUFFIX}")
O
Orgad Shaneh 已提交
986
  endif()
987 988
endif()

989 990 991 992 993 994
if(ROCKSDB_BUILD_SHARED AND NOT WIN32)
  set(ROCKSDB_LIB ${ROCKSDB_SHARED_LIB})
else()
  set(ROCKSDB_LIB ${ROCKSDB_STATIC_LIB})
endif()

995
option(WITH_JNI "build with JNI" OFF)
996 997 998 999 1000 1001 1002 1003 1004 1005
# Tests are excluded from Release builds
CMAKE_DEPENDENT_OPTION(WITH_TESTS "build with tests" ON
  "CMAKE_BUILD_TYPE STREQUAL Debug" OFF)
option(WITH_BENCHMARK_TOOLS "build with benchmarks" ON)
option(WITH_CORE_TOOLS "build with ldb and sst_dump" ON)
option(WITH_TOOLS "build with tools" ON)

if(WITH_TESTS OR WITH_BENCHMARK_TOOLS OR WITH_TOOLS OR WITH_JNI OR JNI)
  include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/gtest-1.8.1/fused-src)
endif()
1006 1007 1008
if(WITH_JNI OR JNI)
  message(STATUS "JNI library is enabled")
  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/java)
1009 1010 1011 1012
else()
  message(STATUS "JNI library is disabled")
endif()

P
Paweł Bylica 已提交
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
# 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)
1026 1027 1028 1029 1030
  include(CMakePackageConfigHelpers)

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

  configure_package_config_file(
B
Bartek Wrona 已提交
1031
    ${CMAKE_CURRENT_LIST_DIR}/cmake/RocksDBConfig.cmake.in RocksDBConfig.cmake
1032 1033 1034 1035 1036
    INSTALL_DESTINATION ${package_config_destination}
  )

  write_basic_package_version_file(
    RocksDBConfigVersion.cmake
1037
    VERSION ${rocksdb_VERSION}
1038 1039 1040 1041 1042
    COMPATIBILITY SameMajorVersion
  )

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

1043 1044
  install(DIRECTORY "${PROJECT_SOURCE_DIR}/cmake/modules" COMPONENT devel DESTINATION ${package_config_destination})

1045 1046 1047 1048 1049 1050 1051 1052
  install(
    TARGETS ${ROCKSDB_STATIC_LIB}
    EXPORT RocksDBTargets
    COMPONENT devel
    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
    INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
  )

1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
  if(ROCKSDB_BUILD_SHARED)
    install(
      TARGETS ${ROCKSDB_SHARED_LIB}
      EXPORT RocksDBTargets
      COMPONENT runtime
      ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
      RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
      LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
      INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
    )
  endif()
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078

  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 已提交
1079 1080
endif()

1081 1082
option(WITH_ALL_TESTS "Build all test, rather than a small subset" ON)

球状闪电 已提交
1083
if(WITH_TESTS OR WITH_BENCHMARK_TOOLS)
1084
  add_subdirectory(third-party/gtest-1.8.1/fused-src/gtest)
1085
  add_library(testharness STATIC
1086
  test_util/mock_time_env.cc
1087 1088
  test_util/testharness.cc)
  target_link_libraries(testharness gtest)
球状闪电 已提交
1089
endif()
1090

球状闪电 已提交
1091
if(WITH_TESTS)
P
Paweł Bylica 已提交
1092
  set(TESTS
1093 1094 1095 1096 1097
        db/db_basic_test.cc
        env/env_basic_test.cc
  )
  if(WITH_ALL_TESTS)
    list(APPEND TESTS
1098 1099
        cache/cache_test.cc
        cache/lru_cache_test.cc
1100
        db/blob/blob_file_addition_test.cc
1101
        db/blob/blob_file_builder_test.cc
1102
        db/blob/blob_file_cache_test.cc
1103
        db/blob/blob_file_garbage_test.cc
1104
        db/blob/blob_file_reader_test.cc
1105
        db/blob/db_blob_basic_test.cc
1106
        db/blob/db_blob_compaction_test.cc
1107
        db/blob/db_blob_corruption_test.cc
1108
        db/blob/db_blob_index_test.cc
D
Dmitri Smirnov 已提交
1109 1110
        db/column_family_test.cc
        db/compact_files_test.cc
1111 1112 1113 1114
        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 已提交
1115 1116 1117
        db/comparator_db_test.cc
        db/corruption_test.cc
        db/cuckoo_table_db_test.cc
1118
        db/db_with_timestamp_basic_test.cc
1119 1120
        db/db_block_cache_test.cc
        db/db_bloom_filter_test.cc
1121
        db/db_compaction_filter_test.cc
1122
        db/db_compaction_test.cc
1123
        db/db_dynamic_level_test.cc
1124
        db/db_flush_test.cc
1125
        db/db_inplace_update_test.cc
1126
        db/db_io_failure_test.cc
1127
        db/db_iter_test.cc
1128
        db/db_iter_stress_test.cc
1129
        db/db_iterator_test.cc
1130
        db/db_kv_checksum_test.cc
1131
        db/db_log_iter_test.cc
1132
        db/db_memtable_test.cc
1133
        db/db_merge_operator_test.cc
1134
        db/db_merge_operand_test.cc
1135
        db/db_options_test.cc
1136
        db/db_properties_test.cc
1137
        db/db_range_del_test.cc
1138
        db/db_secondary_test.cc
1139
        db/db_sst_test.cc
1140
        db/db_statistics_test.cc
1141 1142 1143
        db/db_table_properties_test.cc
        db/db_tailing_iter_test.cc
        db/db_test.cc
1144
        db/db_test2.cc
1145
        db/db_logical_block_size_cache_test.cc
1146
        db/db_universal_compaction_test.cc
S
sdong 已提交
1147
        db/db_wal_test.cc
1148
        db/db_with_timestamp_compaction_test.cc
Y
Yi Wu 已提交
1149
        db/db_write_test.cc
D
Dmitri Smirnov 已提交
1150 1151
        db/dbformat_test.cc
        db/deletefile_test.cc
1152
        db/error_handler_fs_test.cc
1153
        db/obsolete_files_test.cc
1154 1155
        db/external_sst_file_basic_test.cc
        db/external_sst_file_test.cc
D
Dmitri Smirnov 已提交
1156 1157 1158 1159 1160 1161
        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
1162
        db/manual_compaction_test.cc
D
Dmitri Smirnov 已提交
1163
        db/memtable_list_test.cc
1164
        db/merge_helper_test.cc
1165
        db/merge_test.cc
1166
        db/options_file_test.cc
D
Dmitri Smirnov 已提交
1167
        db/perf_context_test.cc
1168
        db/periodic_work_scheduler_test.cc
D
Dmitri Smirnov 已提交
1169 1170
        db/plain_table_db_test.cc
        db/prefix_test.cc
1171 1172
        db/range_del_aggregator_test.cc
        db/range_tombstone_fragmenter_test.cc
A
Andrew Kryczka 已提交
1173
        db/repair_test.cc
D
Dmitri Smirnov 已提交
1174 1175 1176 1177 1178
        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
1179
        db/wal_edit_test.cc
D
Dmitri Smirnov 已提交
1180 1181 1182
        db/write_batch_test.cc
        db/write_callback_test.cc
        db/write_controller_test.cc
1183
        env/env_test.cc
1184
        env/io_posix_test.cc
1185
        env/mock_env_test.cc
1186
        file/delete_scheduler_test.cc
1187
        file/prefetch_test.cc
1188
        file/random_access_file_reader_test.cc
1189
        logging/auto_roll_logger_test.cc
1190
        logging/env_logger_test.cc
1191
        logging/event_logger_test.cc
1192
        memory/arena_test.cc
1193
        memory/memkind_kmem_allocator_test.cc
1194 1195
        memtable/inlineskiplist_test.cc
        memtable/skiplist_test.cc
1196
        memtable/write_buffer_manager_test.cc
1197 1198 1199
        monitoring/histogram_test.cc
        monitoring/iostats_context_test.cc
        monitoring/statistics_test.cc
1200
        monitoring/stats_history_test.cc
1201
        options/configurable_test.cc
1202
        options/customizable_test.cc
1203 1204
        options/options_settable_test.cc
        options/options_test.cc
1205
        table/block_based/block_based_filter_block_test.cc
1206
        table/block_based/block_based_table_reader_test.cc
1207 1208 1209
        table/block_based/block_test.cc
        table/block_based/data_block_hash_index_test.cc
        table/block_based/full_filter_block_test.cc
1210
        table/block_based/partitioned_filter_block_test.cc
Y
Yi Wu 已提交
1211
        table/cleanable_test.cc
1212 1213
        table/cuckoo/cuckoo_table_builder_test.cc
        table/cuckoo/cuckoo_table_reader_test.cc
D
Dmitri Smirnov 已提交
1214
        table/merger_test.cc
1215
        table/sst_file_reader_test.cc
D
Dmitri Smirnov 已提交
1216
        table/table_test.cc
1217
        table/block_fetcher_test.cc
1218
        test_util/testutil_test.cc
J
Jay Zhuang 已提交
1219
        trace_replay/block_cache_tracer_test.cc
1220
        trace_replay/io_tracer_test.cc
1221
        tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc
A
Akanksha Mahajan 已提交
1222
        tools/io_tracer_parser_test.cc
1223
        tools/ldb_cmd_test.cc
D
Dmitri Smirnov 已提交
1224
        tools/reduce_levels_test.cc
1225
        tools/sst_dump_test.cc
Z
Zhichao Cao 已提交
1226
        tools/trace_analyzer_test.cc
D
Dmitri Smirnov 已提交
1227 1228 1229 1230
        util/autovector_test.cc
        util/bloom_test.cc
        util/coding_test.cc
        util/crc32c_test.cc
C
Cheng Chang 已提交
1231
        util/defer_test.cc
D
Dmitri Smirnov 已提交
1232
        util/dynamic_bloom_test.cc
1233
        util/file_reader_writer_test.cc
1234
        util/filelock_test.cc
1235
        util/hash_test.cc
1236
        util/heap_test.cc
1237
        util/random_test.cc
D
Dmitri Smirnov 已提交
1238
        util/rate_limiter_test.cc
1239
        util/repeatable_thread_test.cc
1240
        util/ribbon_test.cc
1241
        util/slice_test.cc
D
Dmitri Smirnov 已提交
1242
        util/slice_transform_test.cc
A
Anirban Rahut 已提交
1243
        util/timer_queue_test.cc
1244
        util/timer_test.cc
D
Dmitri Smirnov 已提交
1245 1246
        util/thread_list_test.cc
        util/thread_local_test.cc
1247
        util/work_queue_test.cc
D
Dmitri Smirnov 已提交
1248
        utilities/backupable/backupable_db_test.cc
Y
Yi Wu 已提交
1249
        utilities/blob_db/blob_db_test.cc
1250 1251 1252 1253
        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 已提交
1254
        utilities/checkpoint/checkpoint_test.cc
1255
        utilities/memory/memory_test.cc
D
Dmitri Smirnov 已提交
1256
        utilities/merge_operators/string_append/stringappend_test.cc
1257
        utilities/object_registry_test.cc
1258
        utilities/option_change_migration/option_change_migration_test.cc
Y
yuslepukhin 已提交
1259
        utilities/options/options_util_test.cc
1260
        utilities/persistent_cache/hash_table_test.cc
1261
        utilities/persistent_cache/persistent_cache_test.cc
1262
        utilities/simulator_cache/cache_simulator_test.cc
1263
        utilities/simulator_cache/sim_cache_test.cc
1264
        utilities/table_properties_collectors/compact_on_deletion_collector_test.cc
D
Dmitri Smirnov 已提交
1265
        utilities/transactions/optimistic_transaction_test.cc
A
agiardullo 已提交
1266
        utilities/transactions/transaction_test.cc
1267
        utilities/transactions/lock/point/point_lock_manager_test.cc
1268
        utilities/transactions/write_prepared_transaction_test.cc
1269
        utilities/transactions/write_unprepared_transaction_test.cc
1270
        utilities/transactions/lock/range/range_locking_test.cc
D
Dmitri Smirnov 已提交
1271 1272
        utilities/ttl/ttl_test.cc
        utilities/write_batch_with_index/write_batch_with_index_test.cc
1273 1274
    )
  endif()
P
Paweł Bylica 已提交
1275 1276 1277
  if(WITH_LIBRADOS)
    list(APPEND TESTS utilities/env_librados_test.cc)
  endif()
1278

1279 1280 1281 1282
  if(WITH_FOLLY_DISTRIBUTED_MUTEX)
    list(APPEND TESTS third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp)
  endif()

P
Paweł Bylica 已提交
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292
  set(TESTUTIL_SOURCE
      db/db_test_util.cc
      monitoring/thread_status_updater_debug.cc
      table/mock_table.cc
      utilities/cassandra/test_utils.cc
  )
  enable_testing()
  add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
  set(TESTUTILLIB testutillib${ARTIFACT_SUFFIX})
  add_library(${TESTUTILLIB} STATIC ${TESTUTIL_SOURCE})
1293
  target_link_libraries(${TESTUTILLIB} ${ROCKSDB_LIB})
P
Paweł Bylica 已提交
1294 1295 1296 1297 1298 1299 1300
  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
P
Peter Dillinger 已提交
1301
  )
P
Paweł Bylica 已提交
1302

1303
  foreach(sourcefile ${TESTS})
P
Paweł Bylica 已提交
1304
      get_filename_component(exename ${sourcefile} NAME_WE)
1305
      add_executable(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} ${sourcefile})
B
Bartek Wrona 已提交
1306
      set_target_properties(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX}
P
Paweł Bylica 已提交
1307 1308 1309
        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
B
Bartek Wrona 已提交
1310
        OUTPUT_NAME ${exename}${ARTIFACT_SUFFIX}
P
Peter Dillinger 已提交
1311
      )
1312
      target_link_libraries(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} testutillib${ARTIFACT_SUFFIX} testharness gtest ${THIRDPARTY_LIBS} ${ROCKSDB_LIB})
P
Paweł Bylica 已提交
1313 1314
      if(NOT "${exename}" MATCHES "db_sanity_test")
        add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
B
Bartek Wrona 已提交
1315
        add_dependencies(check ${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX})
P
Paweł Bylica 已提交
1316
      endif()
1317 1318 1319 1320
      if("${exename}" MATCHES "env_librados_test")
        # env_librados_test.cc uses librados directly
        target_link_libraries(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} rados)
      endif()
1321
  endforeach(sourcefile ${TESTS})
P
Paweł Bylica 已提交
1322

1323 1324 1325 1326 1327 1328 1329 1330 1331 1332
  if(WIN32)
    # C executables must link to a shared object
    if(ROCKSDB_BUILD_SHARED)
      set(ROCKSDB_LIB_FOR_C ${ROCKSDB_SHARED_LIB})
    else()
      set(ROCKSDB_LIB_FOR_C OFF)
    endif()
  else()
    set(ROCKSDB_LIB_FOR_C ${ROCKSDB_LIB})
  endif()
P
Paweł Bylica 已提交
1333

1334 1335
  if(ROCKSDB_LIB_FOR_C)
    set(C_TESTS db/c_test.c)
1336
    add_executable(c_test db/c_test.c)
Y
Yuhong Guo 已提交
1337
    target_link_libraries(c_test ${ROCKSDB_LIB_FOR_C} testharness)
1338 1339
    add_test(NAME c_test COMMAND c_test${ARTIFACT_SUFFIX})
    add_dependencies(check c_test)
1340
  endif()
P
Paweł Bylica 已提交
1341
endif()
A
Arun Sharma 已提交
1342

1343
if(WITH_BENCHMARK_TOOLS)
1344
  add_executable(db_bench${ARTIFACT_SUFFIX}
1345
    tools/simulated_hybrid_file_system.cc
1346
    tools/db_bench.cc
1347
    tools/db_bench_tool.cc)
1348
  target_link_libraries(db_bench${ARTIFACT_SUFFIX}
1349
    ${ROCKSDB_LIB} ${THIRDPARTY_LIBS})
1350

1351
  add_executable(cache_bench${ARTIFACT_SUFFIX}
1352
    cache/cache_bench.cc)
1353
  target_link_libraries(cache_bench${ARTIFACT_SUFFIX}
1354
    ${ROCKSDB_LIB} ${GFLAGS_LIB})
1355

1356
  add_executable(memtablerep_bench${ARTIFACT_SUFFIX}
1357
    memtable/memtablerep_bench.cc)
1358
  target_link_libraries(memtablerep_bench${ARTIFACT_SUFFIX}
1359
    ${ROCKSDB_LIB} ${GFLAGS_LIB})
1360

1361
  add_executable(range_del_aggregator_bench${ARTIFACT_SUFFIX}
1362
    db/range_del_aggregator_bench.cc)
1363
  target_link_libraries(range_del_aggregator_bench${ARTIFACT_SUFFIX}
1364
    ${ROCKSDB_LIB} ${GFLAGS_LIB})
1365

1366
  add_executable(table_reader_bench${ARTIFACT_SUFFIX}
1367
    table/table_reader_bench.cc)
1368
  target_link_libraries(table_reader_bench${ARTIFACT_SUFFIX}
1369
    ${ROCKSDB_LIB} testharness ${GFLAGS_LIB})
1370

1371
  add_executable(filter_bench${ARTIFACT_SUFFIX}
1372
    util/filter_bench.cc)
1373
  target_link_libraries(filter_bench${ARTIFACT_SUFFIX}
1374
    ${ROCKSDB_LIB} ${GFLAGS_LIB})
1375

1376
  add_executable(hash_table_bench${ARTIFACT_SUFFIX}
1377
    utilities/persistent_cache/hash_table_bench.cc)
1378
  target_link_libraries(hash_table_bench${ARTIFACT_SUFFIX}
1379
    ${ROCKSDB_LIB} ${GFLAGS_LIB})
1380 1381
endif()

1382
if(WITH_CORE_TOOLS OR WITH_TOOLS)
P
Paweł Bylica 已提交
1383
  add_subdirectory(tools)
1384 1385 1386 1387 1388
  add_custom_target(core_tools
    DEPENDS ${core_tool_deps})
endif()

if(WITH_TOOLS)
1389 1390 1391
  add_subdirectory(db_stress_tool)
  add_custom_target(tools
    DEPENDS ${tool_deps})
A
Arun Sharma 已提交
1392
endif()
1393 1394 1395 1396 1397

option(WITH_EXAMPLES "build with examples" OFF)
if(WITH_EXAMPLES)
  add_subdirectory(examples)
endif()