CMakeLists.txt 41.5 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 92 93
include(CMakeDependentOption)
CMAKE_DEPENDENT_OPTION(WITH_GFLAGS "build with GFlags" ON
  "NOT MSVC;NOT MINGW" OFF)

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

110 111
  # No config file for this
  if(WITH_GFLAGS)
112 113 114 115
    find_package(gflags REQUIRED)
    add_definitions(-DGFLAGS=1)
    include_directories(${gflags_INCLUDE_DIR})
    list(APPEND THIRDPARTY_LIBS gflags::gflags)
116
  endif()
J
Jay 已提交
117

118 119 120
  if(WITH_SNAPPY)
    find_package(snappy REQUIRED)
    add_definitions(-DSNAPPY)
121
    list(APPEND THIRDPARTY_LIBS snappy::snappy)
122
  endif()
J
Jay 已提交
123 124

  if(WITH_ZLIB)
125
    find_package(ZLIB REQUIRED)
J
Jay 已提交
126
    add_definitions(-DZLIB)
127
    list(APPEND THIRDPARTY_LIBS ZLIB::ZLIB)
J
Jay 已提交
128 129 130 131
  endif()

  option(WITH_BZ2 "build with bzip2" OFF)
  if(WITH_BZ2)
132
    find_package(BZip2 REQUIRED)
J
Jay 已提交
133
    add_definitions(-DBZIP2)
134 135 136 137 138
    if(BZIP2_INCLUDE_DIRS)
      include_directories(${BZIP2_INCLUDE_DIRS})
    else()
      include_directories(${BZIP2_INCLUDE_DIR})
    endif()
J
Jay 已提交
139 140 141 142 143 144
    list(APPEND THIRDPARTY_LIBS ${BZIP2_LIBRARIES})
  endif()

  if(WITH_LZ4)
    find_package(lz4 REQUIRED)
    add_definitions(-DLZ4)
145
    list(APPEND THIRDPARTY_LIBS lz4::lz4)
J
Jay 已提交
146 147 148 149 150 151
  endif()

  if(WITH_ZSTD)
    find_package(zstd REQUIRED)
    add_definitions(-DZSTD)
    include_directories(${ZSTD_INCLUDE_DIR})
152
    list(APPEND THIRDPARTY_LIBS zstd::zstd)
J
Jay 已提交
153
  endif()
154 155
endif()

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

159 160
find_package(Git)

T
Tamir Duberstein 已提交
161
if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
162
  if(WIN32)
163
    execute_process(COMMAND $ENV{COMSPEC} /C ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
164 165 166
  else()
    execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
  endif()
167
else()
168
  set(GIT_SHA 0)
169 170
endif()

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

173

174 175 176 177 178 179
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 已提交
180
  endif()
181
endif()
T
Tomas Kolda 已提交
182

183 184 185 186 187 188 189
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")
190
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
191 192
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall")
O
Orgad Shaneh 已提交
193
  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")
194
  if(MINGW)
195
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format -fno-asynchronous-unwind-tables")
196
    add_definitions(-D_POSIX_C_SOURCE=1)
197 198
  endif()
  if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
T
Tamir Duberstein 已提交
199
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
200 201 202 203 204 205 206 207
    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()

208
include(CheckCCompilerFlag)
209 210 211 212 213 214 215 216 217 218 219 220
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)
221 222 223 224 225 226
  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)
227
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
228

229
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
230
        CHECK_C_COMPILER_FLAG("-march=armv8-a+crc+crypto" HAS_ARMV8_CRC)
231 232
  if(HAS_ARMV8_CRC)
    message(STATUS " HAS_ARMV8_CRC yes")
233 234
    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")
235 236 237
  endif(HAS_ARMV8_CRC)
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")

238 239 240 241 242 243
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)
244
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpclmul")
T
Tomas Kolda 已提交
245
  endif()
T
Tamir Duberstein 已提交
246
else()
247 248 249
  if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
  else()
250
    if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64" AND NOT HAS_ARMV8_CRC)
251 252
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
    endif()
T
Tamir Duberstein 已提交
253
  endif()
T
Tamir Duberstein 已提交
254 255
endif()

256
include(CheckCXXSourceCompiles)
257
if(NOT MSVC)
258
  set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
259
endif()
P
Peter Dillinger 已提交
260

261 262 263
CHECK_CXX_SOURCE_COMPILES("
#include <cstdint>
#include <nmmintrin.h>
264
#include <wmmintrin.h>
265 266
int main() {
  volatile uint32_t x = _mm_crc32_u32(0, 0);
267 268 269 270
  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);
271 272
}
" HAVE_SSE42)
273
unset(CMAKE_REQUIRED_FLAGS)
274 275
if(HAVE_SSE42)
  add_definitions(-DHAVE_SSE42)
276
  add_definitions(-DHAVE_PCLMUL)
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
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()

293 294 295 296 297 298 299 300 301
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()

302 303 304 305 306 307 308 309 310
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 已提交
311

312 313 314 315 316 317 318 319 320
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()
321

322 323
option(WITH_UBSAN "build with UBSAN" OFF)
if(WITH_UBSAN)
324
  add_definitions(-DROCKSDB_UBSAN_RUN)
325 326 327 328 329 330 331
  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 已提交
332

333 334 335
option(WITH_NUMA "build with NUMA policy support" OFF)
if(WITH_NUMA)
  find_package(NUMA REQUIRED)
336 337
  add_definitions(-DNUMA)
  include_directories(${NUMA_INCLUDE_DIR})
338
  list(APPEND THIRDPARTY_LIBS NUMA::NUMA)
339 340
endif()

341 342 343
option(WITH_TBB "build with Threading Building Blocks (TBB)" OFF)
if(WITH_TBB)
  find_package(TBB REQUIRED)
344
  add_definitions(-DTBB)
345
  list(APPEND THIRDPARTY_LIBS TBB::TBB)
346 347
endif()

348 349 350 351 352 353
# 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()

354 355 356 357
option(WITH_DYNAMIC_EXTENSION "build with dynamic extension support" OFF)
if(NOT WITH_DYNAMIC_EXTENSION)
  add_definitions(-DROCKSDB_NO_DYNAMIC_EXTENSION)
endif()
358

359 360 361 362 363 364
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()
365 366 367 368 369 370 371 372 373
    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()
374
  endif()
375 376 377
else()
  message(STATUS "Enabling RTTI in Debug builds only (default)")
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
378 379 380 381 382
  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()
383 384
endif()

385 386
# Used to run CI build and tests so we can run faster
option(OPTDBG "Build optimized debug build with MSVC" OFF)
387
option(WITH_RUNTIME_DEBUG "build with debug version of runtime library" ON)
O
Orgad Shaneh 已提交
388
if(MSVC)
389
  if(OPTDBG)
390
    message(STATUS "Debug optimization is enabled")
391
    set(CMAKE_CXX_FLAGS_DEBUG "/Oxt")
392
  else()
P
Peter Dillinger 已提交
393 394 395 396 397 398 399 400 401
    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()

402 403 404 405 406
  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}")
407
  endif()
T
Tomas Kolda 已提交
408
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
409 410 411

  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
412 413
endif()

414 415 416
if(CMAKE_COMPILER_IS_GNUCXX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-memcmp")
endif()
D
Dmitri Smirnov 已提交
417

418 419 420
option(ROCKSDB_LITE "Build RocksDBLite version" OFF)
if(ROCKSDB_LITE)
  add_definitions(-DROCKSDB_LITE)
Y
Yi Wu 已提交
421
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -Os")
422
endif()
D
Dmitri Smirnov 已提交
423

424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
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 已提交
449 450 451
  if(MINGW)
    add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_VISTA)
  endif()
452 453 454 455 456 457 458 459
endif()

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

option(WITH_FALLOCATE "build with fallocate" ON)
if(WITH_FALLOCATE)
460
  CHECK_CXX_SOURCE_COMPILES("
461 462 463 464
#include <fcntl.h>
#include <linux/falloc.h>
int main() {
 int fd = open(\"/dev/null\", 0);
465
 fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, 1024);
466 467 468 469 470 471 472
}
" HAVE_FALLOCATE)
  if(HAVE_FALLOCATE)
    add_definitions(-DROCKSDB_FALLOCATE_PRESENT)
  endif()
endif()

473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495
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)
496 497 498
if(HAVE_MALLOC_USABLE_SIZE)
  add_definitions(-DROCKSDB_MALLOC_USABLE_SIZE)
endif()
D
Dmitri Smirnov 已提交
499

500 501 502 503 504
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 已提交
505 506 507 508 509
check_cxx_symbol_exists(getauxval auvx.h HAVE_AUXV_GETAUXVAL)
if(HAVE_AUXV_GETAUXVAL)
  add_definitions(-DROCKSDB_AUXV_GETAUXVAL_PRESENT)
endif()

D
Dmitri Smirnov 已提交
510 511
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/include)
512
include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/gtest-1.8.1/fused-src)
513
if(WITH_FOLLY_DISTRIBUTED_MUTEX)
514 515
  include_directories(${PROJECT_SOURCE_DIR}/third-party/folly)
endif()
516
find_package(Threads REQUIRED)
D
Dmitri Smirnov 已提交
517

518
# Main library source code
519

D
Dmitri Smirnov 已提交
520
set(SOURCES
521 522 523
        cache/clock_cache.cc
        cache/lru_cache.cc
        cache/sharded_cache.cc
524
        db/arena_wrapped_db_iter.cc
525 526
        db/blob/blob_file_addition.cc
        db/blob/blob_file_garbage.cc
527
        db/blob/blob_file_meta.cc
D
Dmitri Smirnov 已提交
528 529 530
        db/builder.cc
        db/c.cc
        db/column_family.cc
531
        db/compacted_db_impl.cc
532 533
        db/compaction/compaction.cc
        db/compaction/compaction_iterator.cc
534
        db/compaction/compaction_picker.cc
535 536 537 538
        db/compaction/compaction_job.cc
        db/compaction/compaction_picker_fifo.cc
        db/compaction/compaction_picker_level.cc
        db/compaction/compaction_picker_universal.cc
A
agiardullo 已提交
539
        db/convenience.cc
D
Dmitri Smirnov 已提交
540
        db/db_filesnapshot.cc
541 542 543 544 545 546 547 548 549
        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
550
        db/db_info_dumper.cc
D
Dmitri Smirnov 已提交
551
        db/db_iter.cc
552
        db/dbformat.cc
553
        db/error_handler.cc
D
Dmitri Smirnov 已提交
554 555
        db/event_helpers.cc
        db/experimental.cc
556
        db/external_sst_file_ingestion_job.cc
D
Dmitri Smirnov 已提交
557 558 559 560
        db/file_indexer.cc
        db/flush_job.cc
        db/flush_scheduler.cc
        db/forward_iterator.cc
561
        db/import_column_family_job.cc
D
Dmitri Smirnov 已提交
562
        db/internal_stats.cc
S
Siying Dong 已提交
563
        db/logs_with_prep_tracker.cc
D
Dmitri Smirnov 已提交
564 565
        db/log_reader.cc
        db/log_writer.cc
566
        db/malloc_stats.cc
D
Dmitri Smirnov 已提交
567 568 569 570
        db/memtable.cc
        db/memtable_list.cc
        db/merge_helper.cc
        db/merge_operator.cc
571
        db/range_del_aggregator.cc
572
        db/range_tombstone_fragmenter.cc
D
Dmitri Smirnov 已提交
573
        db/repair.cc
574
        db/snapshot_impl.cc
D
Dmitri Smirnov 已提交
575 576 577
        db/table_cache.cc
        db/table_properties_collector.cc
        db/transaction_log_impl.cc
578
        db/trim_history_scheduler.cc
D
Dmitri Smirnov 已提交
579 580
        db/version_builder.cc
        db/version_edit.cc
581
        db/version_edit_handler.cc
D
Dmitri Smirnov 已提交
582 583 584 585 586 587
        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
588 589
        env/env.cc
        env/env_chroot.cc
E
Ewout Prangsma 已提交
590
        env/env_encryption.cc
591
        env/env_hdfs.cc
592
        env/file_system.cc
593
        env/mock_env.cc
594
        file/delete_scheduler.cc
595
        file/file_prefetch_buffer.cc
596 597
        file/file_util.cc
        file/filename.cc
598 599 600 601
        file/random_access_file_reader.cc
        file/read_write_util.cc
        file/readahead_raf.cc
        file/sequence_file_reader.cc
602
        file/sst_file_manager_impl.cc
603
        file/writable_file_writer.cc
604 605 606
        logging/auto_roll_logger.cc
        logging/event_logger.cc
        logging/log_buffer.cc
607 608 609
        memory/arena.cc
        memory/concurrent_arena.cc
        memory/jemalloc_nodump_allocator.cc
610
        memory/memkind_kmem_allocator.cc
611
        memtable/alloc_tracker.cc
612 613
        memtable/hash_linklist_rep.cc
        memtable/hash_skiplist_rep.cc
614 615
        memtable/skiplistrep.cc
        memtable/vectorrep.cc
616
        memtable/write_buffer_manager.cc
617 618
        monitoring/histogram.cc
        monitoring/histogram_windowing.cc
619
        monitoring/in_memory_stats_history.cc
620 621 622 623
        monitoring/instrumented_mutex.cc
        monitoring/iostats_context.cc
        monitoring/perf_context.cc
        monitoring/perf_level.cc
624
        monitoring/persistent_stats_history.cc
625 626 627 628 629 630 631 632 633 634 635
        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 已提交
636
        port/stack_trace.cc
637
        table/adaptive/adaptive_table_factory.cc
638
        table/block_based/binary_search_index_reader.cc
639 640 641 642
        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
643
        table/block_based/block_based_table_iterator.cc
644 645
        table/block_based/block_based_table_reader.cc
        table/block_based/block_builder.cc
646
        table/block_based/block_prefetcher.cc
647 648 649
        table/block_based/block_prefix_index.cc
        table/block_based/data_block_hash_index.cc
        table/block_based/data_block_footer.cc
650
        table/block_based/filter_block_reader_common.cc
651
        table/block_based/filter_policy.cc
652 653
        table/block_based/flush_block_policy.cc
        table/block_based/full_filter_block.cc
654
        table/block_based/hash_index_reader.cc
655
        table/block_based/index_builder.cc
656
        table/block_based/index_reader_common.cc
657
        table/block_based/parsed_full_filter_block.cc
658
        table/block_based/partitioned_filter_block.cc
659
        table/block_based/partitioned_index_iterator.cc
660 661
        table/block_based/partitioned_index_reader.cc
        table/block_based/reader_common.cc
662
        table/block_based/uncompression_dict_reader.cc
S
Siying Dong 已提交
663
        table/block_fetcher.cc
664 665 666
        table/cuckoo/cuckoo_table_builder.cc
        table/cuckoo/cuckoo_table_factory.cc
        table/cuckoo/cuckoo_table_reader.cc
D
Dmitri Smirnov 已提交
667 668 669
        table/format.cc
        table/get_context.cc
        table/iterator.cc
670
        table/merging_iterator.cc
D
Dmitri Smirnov 已提交
671
        table/meta_blocks.cc
672
        table/persistent_cache_helper.cc
673
        table/plain/plain_table_bloom.cc
674 675 676 677 678
        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
679
        table/sst_file_reader.cc
680
        table/sst_file_writer.cc
D
Dmitri Smirnov 已提交
681 682
        table/table_properties.cc
        table/two_level_iterator.cc
683 684 685 686
        test_util/sync_point.cc
        test_util/sync_point_impl.cc
        test_util/testutil.cc
        test_util/transaction_test_util.cc
687
        tools/block_cache_analyzer/block_cache_trace_analyzer.cc
688
        tools/dump/db_dump_tool.cc
689 690 691
        tools/ldb_cmd.cc
        tools/ldb_tool.cc
        tools/sst_dump_tool.cc
Z
Zhichao Cao 已提交
692
        tools/trace_analyzer_tool.cc
693
        trace_replay/trace_replay.cc
H
haoyuhuang 已提交
694
        trace_replay/block_cache_tracer.cc
D
Dmitri Smirnov 已提交
695 696 697
        util/coding.cc
        util/compaction_job_stats_impl.cc
        util/comparator.cc
698
        util/compression_context_cache.cc
699
        util/concurrent_task_limiter_impl.cc
D
Dmitri Smirnov 已提交
700 701 702 703
        util/crc32c.cc
        util/dynamic_bloom.cc
        util/hash.cc
        util/murmurhash.cc
704
        util/random.cc
D
Dmitri Smirnov 已提交
705 706
        util/rate_limiter.cc
        util/slice.cc
707
        util/file_checksum_helper.cc
D
Dmitri Smirnov 已提交
708 709 710
        util/status.cc
        util/string_util.cc
        util/thread_local.cc
711
        util/threadpool_imp.cc
D
Dmitri Smirnov 已提交
712 713
        util/xxhash.cc
        utilities/backupable/backupable_db.cc
Y
Yi Wu 已提交
714
        utilities/blob_db/blob_compaction_filter.cc
715
        utilities/blob_db/blob_db.cc
A
Anirban Rahut 已提交
716
        utilities/blob_db/blob_db_impl.cc
717
        utilities/blob_db/blob_db_impl_filesnapshot.cc
Y
Yi Wu 已提交
718
        utilities/blob_db/blob_dump_tool.cc
719
        utilities/blob_db/blob_file.cc
A
Anirban Rahut 已提交
720 721 722
        utilities/blob_db/blob_log_reader.cc
        utilities/blob_db/blob_log_writer.cc
        utilities/blob_db/blob_log_format.cc
723 724 725
        utilities/cassandra/cassandra_compaction_filter.cc
        utilities/cassandra/format.cc
        utilities/cassandra/merge_operator.cc
726
        utilities/checkpoint/checkpoint_impl.cc
727
        utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc
A
Andrew Kryczka 已提交
728
        utilities/debug.cc
D
Dmitri Smirnov 已提交
729
        utilities/env_mirror.cc
A
Andrew Kryczka 已提交
730
        utilities/env_timed.cc
D
Dmitri Smirnov 已提交
731
        utilities/leveldb_options/leveldb_options.cc
732
        utilities/memory/memory_util.cc
P
Pooya Shareghi 已提交
733
        utilities/merge_operators/bytesxor.cc
734 735
        utilities/merge_operators/max.cc
        utilities/merge_operators/put.cc
736
        utilities/merge_operators/sortlist.cc
D
Dmitri Smirnov 已提交
737 738 739
        utilities/merge_operators/string_append/stringappend.cc
        utilities/merge_operators/string_append/stringappend2.cc
        utilities/merge_operators/uint64add.cc
740
        utilities/object_registry.cc
741
        utilities/option_change_migration/option_change_migration.cc
742
        utilities/options/options_util.cc
743 744 745
        utilities/persistent_cache/block_cache_tier.cc
        utilities/persistent_cache/block_cache_tier_file.cc
        utilities/persistent_cache/block_cache_tier_metadata.cc
746
        utilities/persistent_cache/persistent_cache_tier.cc
747
        utilities/persistent_cache/volatile_tier_impl.cc
748
        utilities/simulator_cache/cache_simulator.cc
749
        utilities/simulator_cache/sim_cache.cc
750
        utilities/table_properties_collectors/compact_on_deletion_collector.cc
751
        utilities/trace/file_trace_reader_writer.cc
D
Dmitri Smirnov 已提交
752
        utilities/transactions/optimistic_transaction_db_impl.cc
753
        utilities/transactions/optimistic_transaction.cc
Y
Yi Wu 已提交
754
        utilities/transactions/pessimistic_transaction.cc
M
Maysam Yabandeh 已提交
755
        utilities/transactions/pessimistic_transaction_db.cc
Y
Yi Wu 已提交
756 757
        utilities/transactions/snapshot_checker.cc
        utilities/transactions/transaction_base.cc
A
agiardullo 已提交
758
        utilities/transactions/transaction_db_mutex_impl.cc
A
agiardullo 已提交
759 760
        utilities/transactions/transaction_lock_mgr.cc
        utilities/transactions/transaction_util.cc
761
        utilities/transactions/write_prepared_txn.cc
762
        utilities/transactions/write_prepared_txn_db.cc
763 764
        utilities/transactions/write_unprepared_txn.cc
        utilities/transactions/write_unprepared_txn_db.cc
D
Dmitri Smirnov 已提交
765 766 767
        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
768 769
        $<TARGET_OBJECTS:build_version>)

H
Huachao Huang 已提交
770 771 772 773
if(HAVE_SSE42 AND NOT MSVC)
  set_source_files_properties(
    util/crc32c.cc
    PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul")
774 775
endif()

776
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
777 778 779
  list(APPEND SOURCES
    util/crc32c_ppc.c
    util/crc32c_ppc_asm.S)
780
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
781

782 783 784 785 786
if(HAS_ARMV8_CRC)
  list(APPEND SOURCES
    util/crc32c_arm64.cc)
endif(HAS_ARMV8_CRC)

787 788 789 790 791 792 793
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
794 795 796 797
    port/win/win_thread.cc)

if(WITH_XPRESS)
  list(APPEND SOURCES
798
    port/win/xpress_win.cc)
799
endif()
800

801 802 803 804
if(WITH_JEMALLOC)
  list(APPEND SOURCES
    port/win/win_jemalloc.cc)
endif()
805

806 807 808
else()
  list(APPEND SOURCES
    port/port_posix.cc
809
    env/env_posix.cc
810
    env/fs_posix.cc
811
    env/io_posix.cc)
812
endif()
D
Dmitri Smirnov 已提交
813

814 815 816 817 818 819 820 821 822
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()

823 824
set(ROCKSDB_STATIC_LIB rocksdb${ARTIFACT_SUFFIX})
set(ROCKSDB_SHARED_LIB rocksdb-shared${ARTIFACT_SUFFIX})
825 826

option(ROCKSDB_BUILD_SHARED "Build shared versions of the RocksDB libraries" ON)
827 828 829 830 831 832 833 834

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

835
if(WIN32)
836
  set(SYSTEM_LIBS ${SYSTEM_LIBS} shlwapi.lib rpcrt4.lib)
837
else()
838
  set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
839 840 841 842
endif()

add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES})
target_link_libraries(${ROCKSDB_STATIC_LIB}
843 844
  ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})

845 846 847
if(ROCKSDB_BUILD_SHARED)
  add_library(${ROCKSDB_SHARED_LIB} SHARED ${SOURCES})
  target_link_libraries(${ROCKSDB_SHARED_LIB}
848
    ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864

  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}
                          OUTPUT_NAME "rocksdb")
O
Orgad Shaneh 已提交
865
  endif()
866 867
endif()

868 869 870 871 872 873
if(ROCKSDB_BUILD_SHARED AND NOT WIN32)
  set(ROCKSDB_LIB ${ROCKSDB_SHARED_LIB})
else()
  set(ROCKSDB_LIB ${ROCKSDB_STATIC_LIB})
endif()

874 875 876 877
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)
878 879 880 881
else()
  message(STATUS "JNI library is disabled")
endif()

P
Paweł Bylica 已提交
882 883 884 885 886 887 888 889 890 891 892 893 894
# 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)
895 896 897 898 899
  include(CMakePackageConfigHelpers)

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

  configure_package_config_file(
B
Bartek Wrona 已提交
900
    ${CMAKE_CURRENT_LIST_DIR}/cmake/RocksDBConfig.cmake.in RocksDBConfig.cmake
901 902 903 904 905
    INSTALL_DESTINATION ${package_config_destination}
  )

  write_basic_package_version_file(
    RocksDBConfigVersion.cmake
906
    VERSION ${rocksdb_VERSION}
907 908 909 910 911 912 913 914 915 916 917 918 919
    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}"
  )

920 921 922 923 924 925 926 927 928 929 930
  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()
931 932 933 934 935 936 937 938 939 940 941 942 943 944 945

  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 已提交
946 947
endif()

948 949 950 951
# Tests are excluded from Release builds
CMAKE_DEPENDENT_OPTION(WITH_TESTS "build with tests" ON
  "CMAKE_BUILD_TYPE STREQUAL Debug" OFF)
if(WITH_TESTS)
952 953 954 955 956
  add_subdirectory(third-party/gtest-1.8.1/fused-src/gtest)
  add_library(testharness STATIC
  test_util/testharness.cc)
  target_link_libraries(testharness gtest)

P
Paweł Bylica 已提交
957
  set(TESTS
958 959
        cache/cache_test.cc
        cache/lru_cache_test.cc
960 961 962
        db/blob/blob_file_addition_test.cc
        db/blob/blob_file_garbage_test.cc
        db/blob/db_blob_index_test.cc
D
Dmitri Smirnov 已提交
963 964
        db/column_family_test.cc
        db/compact_files_test.cc
965 966 967 968
        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 已提交
969 970 971
        db/comparator_db_test.cc
        db/corruption_test.cc
        db/cuckoo_table_db_test.cc
972
        db/db_basic_test.cc
973
        db/db_with_timestamp_basic_test.cc
974 975
        db/db_block_cache_test.cc
        db/db_bloom_filter_test.cc
976
        db/db_compaction_filter_test.cc
977
        db/db_compaction_test.cc
978
        db/db_dynamic_level_test.cc
979
        db/db_flush_test.cc
980
        db/db_inplace_update_test.cc
981
        db/db_io_failure_test.cc
982
        db/db_iter_test.cc
983
        db/db_iter_stress_test.cc
984
        db/db_iterator_test.cc
985
        db/db_log_iter_test.cc
986
        db/db_memtable_test.cc
987
        db/db_merge_operator_test.cc
988
        db/db_merge_operand_test.cc
989
        db/db_options_test.cc
990
        db/db_properties_test.cc
991
        db/db_range_del_test.cc
992
        db/db_impl/db_secondary_test.cc
993
        db/db_sst_test.cc
994
        db/db_statistics_test.cc
995 996 997
        db/db_table_properties_test.cc
        db/db_tailing_iter_test.cc
        db/db_test.cc
998
        db/db_test2.cc
999
        db/db_logical_block_size_cache_test.cc
1000
        db/db_universal_compaction_test.cc
S
sdong 已提交
1001
        db/db_wal_test.cc
1002
        db/db_with_timestamp_compaction_test.cc
Y
Yi Wu 已提交
1003
        db/db_write_test.cc
D
Dmitri Smirnov 已提交
1004 1005
        db/dbformat_test.cc
        db/deletefile_test.cc
1006
        db/error_handler_fs_test.cc
1007
        db/obsolete_files_test.cc
1008 1009
        db/external_sst_file_basic_test.cc
        db/external_sst_file_test.cc
D
Dmitri Smirnov 已提交
1010 1011 1012 1013 1014 1015
        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
1016
        db/manual_compaction_test.cc
D
Dmitri Smirnov 已提交
1017
        db/memtable_list_test.cc
1018
        db/merge_helper_test.cc
1019
        db/merge_test.cc
1020
        db/options_file_test.cc
D
Dmitri Smirnov 已提交
1021 1022 1023
        db/perf_context_test.cc
        db/plain_table_db_test.cc
        db/prefix_test.cc
1024 1025
        db/range_del_aggregator_test.cc
        db/range_tombstone_fragmenter_test.cc
A
Andrew Kryczka 已提交
1026
        db/repair_test.cc
D
Dmitri Smirnov 已提交
1027 1028 1029 1030 1031 1032 1033 1034
        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
1035 1036
        env/env_basic_test.cc
        env/env_test.cc
1037
        env/io_posix_test.cc
1038
        env/mock_env_test.cc
1039
        file/delete_scheduler_test.cc
1040
        file/random_access_file_reader_test.cc
1041
        logging/auto_roll_logger_test.cc
1042
        logging/env_logger_test.cc
1043
        logging/event_logger_test.cc
1044
        memory/arena_test.cc
1045
        memory/memkind_kmem_allocator_test.cc
1046 1047
        memtable/inlineskiplist_test.cc
        memtable/skiplist_test.cc
1048
        memtable/write_buffer_manager_test.cc
1049 1050 1051
        monitoring/histogram_test.cc
        monitoring/iostats_context_test.cc
        monitoring/statistics_test.cc
1052
        monitoring/stats_history_test.cc
1053 1054
        options/options_settable_test.cc
        options/options_test.cc
1055 1056 1057 1058
        table/block_based/block_based_filter_block_test.cc
        table/block_based/block_test.cc
        table/block_based/data_block_hash_index_test.cc
        table/block_based/full_filter_block_test.cc
1059
        table/block_based/partitioned_filter_block_test.cc
Y
Yi Wu 已提交
1060
        table/cleanable_test.cc
1061 1062
        table/cuckoo/cuckoo_table_builder_test.cc
        table/cuckoo/cuckoo_table_reader_test.cc
D
Dmitri Smirnov 已提交
1063
        table/merger_test.cc
1064
        table/sst_file_reader_test.cc
D
Dmitri Smirnov 已提交
1065
        table/table_test.cc
1066
        tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc
1067
        tools/ldb_cmd_test.cc
D
Dmitri Smirnov 已提交
1068
        tools/reduce_levels_test.cc
1069
        tools/sst_dump_test.cc
Z
Zhichao Cao 已提交
1070
        tools/trace_analyzer_test.cc
D
Dmitri Smirnov 已提交
1071 1072 1073 1074
        util/autovector_test.cc
        util/bloom_test.cc
        util/coding_test.cc
        util/crc32c_test.cc
C
Cheng Chang 已提交
1075
        util/defer_test.cc
D
Dmitri Smirnov 已提交
1076
        util/dynamic_bloom_test.cc
1077
        util/file_reader_writer_test.cc
1078
        util/filelock_test.cc
1079
        util/hash_test.cc
1080
        util/heap_test.cc
1081
        util/random_test.cc
D
Dmitri Smirnov 已提交
1082
        util/rate_limiter_test.cc
1083
        util/repeatable_thread_test.cc
1084
        util/slice_test.cc
D
Dmitri Smirnov 已提交
1085
        util/slice_transform_test.cc
A
Anirban Rahut 已提交
1086
        util/timer_queue_test.cc
1087
        util/timer_test.cc
D
Dmitri Smirnov 已提交
1088 1089
        util/thread_list_test.cc
        util/thread_local_test.cc
1090
        util/work_queue_test.cc
D
Dmitri Smirnov 已提交
1091
        utilities/backupable/backupable_db_test.cc
Y
Yi Wu 已提交
1092
        utilities/blob_db/blob_db_test.cc
1093 1094 1095 1096
        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 已提交
1097
        utilities/checkpoint/checkpoint_test.cc
1098
        utilities/memory/memory_test.cc
D
Dmitri Smirnov 已提交
1099
        utilities/merge_operators/string_append/stringappend_test.cc
1100
        utilities/object_registry_test.cc
1101
        utilities/option_change_migration/option_change_migration_test.cc
Y
yuslepukhin 已提交
1102
        utilities/options/options_util_test.cc
1103
        utilities/persistent_cache/hash_table_test.cc
1104
        utilities/persistent_cache/persistent_cache_test.cc
1105
        utilities/simulator_cache/cache_simulator_test.cc
1106
        utilities/simulator_cache/sim_cache_test.cc
1107
        utilities/table_properties_collectors/compact_on_deletion_collector_test.cc
D
Dmitri Smirnov 已提交
1108
        utilities/transactions/optimistic_transaction_test.cc
A
agiardullo 已提交
1109
        utilities/transactions/transaction_test.cc
1110
        utilities/transactions/transaction_lock_mgr_test.cc
1111
        utilities/transactions/write_prepared_transaction_test.cc
1112
        utilities/transactions/write_unprepared_transaction_test.cc
D
Dmitri Smirnov 已提交
1113 1114
        utilities/ttl/ttl_test.cc
        utilities/write_batch_with_index/write_batch_with_index_test.cc
P
Paweł Bylica 已提交
1115 1116 1117 1118
  )
  if(WITH_LIBRADOS)
    list(APPEND TESTS utilities/env_librados_test.cc)
  endif()
1119

1120 1121 1122 1123
  if(WITH_FOLLY_DISTRIBUTED_MUTEX)
    list(APPEND TESTS third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp)
  endif()

P
Paweł Bylica 已提交
1124 1125 1126 1127
  set(TESTUTIL_SOURCE
      db/db_test_util.cc
      monitoring/thread_status_updater_debug.cc
      table/mock_table.cc
1128
      test_util/fault_injection_test_env.cc
1129
      test_util/fault_injection_test_fs.cc
P
Paweł Bylica 已提交
1130 1131 1132 1133 1134 1135
      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})
1136
  target_link_libraries(${TESTUTILLIB} ${ROCKSDB_LIB})
P
Paweł Bylica 已提交
1137 1138 1139 1140 1141 1142 1143
  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 已提交
1144
  )
P
Paweł Bylica 已提交
1145

1146
  foreach(sourcefile ${TESTS})
P
Paweł Bylica 已提交
1147
      get_filename_component(exename ${sourcefile} NAME_WE)
1148
      add_executable(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} ${sourcefile})
B
Bartek Wrona 已提交
1149
      set_target_properties(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX}
P
Paweł Bylica 已提交
1150 1151 1152
        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
B
Bartek Wrona 已提交
1153
        OUTPUT_NAME ${exename}${ARTIFACT_SUFFIX}
P
Peter Dillinger 已提交
1154
      )
1155
      target_link_libraries(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} testutillib${ARTIFACT_SUFFIX} testharness gtest ${ROCKSDB_LIB})
P
Paweł Bylica 已提交
1156 1157
      if(NOT "${exename}" MATCHES "db_sanity_test")
        add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
B
Bartek Wrona 已提交
1158
        add_dependencies(check ${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX})
P
Paweł Bylica 已提交
1159
      endif()
1160
  endforeach(sourcefile ${TESTS})
P
Paweł Bylica 已提交
1161

1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
  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 已提交
1172

1173 1174
  if(ROCKSDB_LIB_FOR_C)
    set(C_TESTS db/c_test.c)
1175 1176 1177 1178 1179
    # C executables must link to a shared object
    add_executable(c_test db/c_test.c)
    target_link_libraries(c_test ${ROCKSDB_SHARED_LIB} testharness)
    add_test(NAME c_test COMMAND c_test${ARTIFACT_SUFFIX})
    add_dependencies(check c_test)
1180
  endif()
P
Paweł Bylica 已提交
1181
endif()
A
Arun Sharma 已提交
1182

1183 1184
option(WITH_BENCHMARK_TOOLS "build with benchmarks" ON)
if(WITH_BENCHMARK_TOOLS)
1185
  add_executable(db_bench
1186
    tools/db_bench.cc
1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219
    tools/db_bench_tool.cc)
  target_link_libraries(db_bench
    ${ROCKSDB_LIB})

  add_executable(cache_bench
    cache/cache_bench.cc)
  target_link_libraries(cache_bench
    ${ROCKSDB_LIB})

  add_executable(memtablerep_bench
    memtable/memtablerep_bench.cc)
  target_link_libraries(memtablerep_bench
    ${ROCKSDB_LIB})

  add_executable(range_del_aggregator_bench
    db/range_del_aggregator_bench.cc)
  target_link_libraries(range_del_aggregator_bench
    ${ROCKSDB_LIB})

  add_executable(table_reader_bench
    table/table_reader_bench.cc)
  target_link_libraries(table_reader_bench
    ${ROCKSDB_LIB} testharness)

  add_executable(filter_bench
    util/filter_bench.cc)
  target_link_libraries(filter_bench
    ${ROCKSDB_LIB})

  add_executable(hash_table_bench
    utilities/persistent_cache/hash_table_bench.cc)
  target_link_libraries(hash_table_bench
    ${ROCKSDB_LIB})
1220 1221
endif()

1222
option(WITH_CORE_TOOLS "build with ldb and sst_dump" ON)
P
Paweł Bylica 已提交
1223
option(WITH_TOOLS "build with tools" ON)
1224
if(WITH_CORE_TOOLS OR WITH_TOOLS)
P
Paweł Bylica 已提交
1225
  add_subdirectory(tools)
1226 1227 1228 1229 1230
  add_custom_target(core_tools
    DEPENDS ${core_tool_deps})
endif()

if(WITH_TOOLS)
1231 1232 1233
  add_subdirectory(db_stress_tool)
  add_custom_target(tools
    DEPENDS ${tool_deps})
A
Arun Sharma 已提交
1234
endif()