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
        cache/cache.cc
522 523 524
        cache/clock_cache.cc
        cache/lru_cache.cc
        cache/sharded_cache.cc
525
        db/arena_wrapped_db_iter.cc
526 527
        db/blob/blob_file_addition.cc
        db/blob/blob_file_garbage.cc
528
        db/blob/blob_file_meta.cc
D
Dmitri Smirnov 已提交
529 530 531
        db/builder.cc
        db/c.cc
        db/column_family.cc
532
        db/compacted_db_impl.cc
533 534
        db/compaction/compaction.cc
        db/compaction/compaction_iterator.cc
535
        db/compaction/compaction_picker.cc
536 537 538 539
        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 已提交
540
        db/convenience.cc
D
Dmitri Smirnov 已提交
541
        db/db_filesnapshot.cc
542 543 544 545 546 547 548 549 550
        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
551
        db/db_info_dumper.cc
D
Dmitri Smirnov 已提交
552
        db/db_iter.cc
553
        db/dbformat.cc
554
        db/error_handler.cc
D
Dmitri Smirnov 已提交
555 556
        db/event_helpers.cc
        db/experimental.cc
557
        db/external_sst_file_ingestion_job.cc
D
Dmitri Smirnov 已提交
558 559 560 561
        db/file_indexer.cc
        db/flush_job.cc
        db/flush_scheduler.cc
        db/forward_iterator.cc
562
        db/import_column_family_job.cc
D
Dmitri Smirnov 已提交
563
        db/internal_stats.cc
S
Siying Dong 已提交
564
        db/logs_with_prep_tracker.cc
D
Dmitri Smirnov 已提交
565 566
        db/log_reader.cc
        db/log_writer.cc
567
        db/malloc_stats.cc
D
Dmitri Smirnov 已提交
568 569 570 571
        db/memtable.cc
        db/memtable_list.cc
        db/merge_helper.cc
        db/merge_operator.cc
572
        db/range_del_aggregator.cc
573
        db/range_tombstone_fragmenter.cc
D
Dmitri Smirnov 已提交
574
        db/repair.cc
575
        db/snapshot_impl.cc
D
Dmitri Smirnov 已提交
576 577 578
        db/table_cache.cc
        db/table_properties_collector.cc
        db/transaction_log_impl.cc
579
        db/trim_history_scheduler.cc
D
Dmitri Smirnov 已提交
580 581
        db/version_builder.cc
        db/version_edit.cc
582
        db/version_edit_handler.cc
D
Dmitri Smirnov 已提交
583 584 585 586 587 588
        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
589 590
        env/env.cc
        env/env_chroot.cc
E
Ewout Prangsma 已提交
591
        env/env_encryption.cc
592
        env/env_hdfs.cc
593
        env/file_system.cc
594
        env/mock_env.cc
595
        file/delete_scheduler.cc
596
        file/file_prefetch_buffer.cc
597 598
        file/file_util.cc
        file/filename.cc
599 600 601 602
        file/random_access_file_reader.cc
        file/read_write_util.cc
        file/readahead_raf.cc
        file/sequence_file_reader.cc
603
        file/sst_file_manager_impl.cc
604
        file/writable_file_writer.cc
605 606 607
        logging/auto_roll_logger.cc
        logging/event_logger.cc
        logging/log_buffer.cc
608 609 610
        memory/arena.cc
        memory/concurrent_arena.cc
        memory/jemalloc_nodump_allocator.cc
611
        memory/memkind_kmem_allocator.cc
612
        memtable/alloc_tracker.cc
613 614
        memtable/hash_linklist_rep.cc
        memtable/hash_skiplist_rep.cc
615 616
        memtable/skiplistrep.cc
        memtable/vectorrep.cc
617
        memtable/write_buffer_manager.cc
618 619
        monitoring/histogram.cc
        monitoring/histogram_windowing.cc
620
        monitoring/in_memory_stats_history.cc
621 622 623 624
        monitoring/instrumented_mutex.cc
        monitoring/iostats_context.cc
        monitoring/perf_context.cc
        monitoring/perf_level.cc
625
        monitoring/persistent_stats_history.cc
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
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
        table/block_fetcher_test.cc
1067
        tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc
1068
        tools/ldb_cmd_test.cc
D
Dmitri Smirnov 已提交
1069
        tools/reduce_levels_test.cc
1070
        tools/sst_dump_test.cc
Z
Zhichao Cao 已提交
1071
        tools/trace_analyzer_test.cc
D
Dmitri Smirnov 已提交
1072 1073 1074 1075
        util/autovector_test.cc
        util/bloom_test.cc
        util/coding_test.cc
        util/crc32c_test.cc
C
Cheng Chang 已提交
1076
        util/defer_test.cc
D
Dmitri Smirnov 已提交
1077
        util/dynamic_bloom_test.cc
1078
        util/file_reader_writer_test.cc
1079
        util/filelock_test.cc
1080
        util/hash_test.cc
1081
        util/heap_test.cc
1082
        util/random_test.cc
D
Dmitri Smirnov 已提交
1083
        util/rate_limiter_test.cc
1084
        util/repeatable_thread_test.cc
1085
        util/slice_test.cc
D
Dmitri Smirnov 已提交
1086
        util/slice_transform_test.cc
A
Anirban Rahut 已提交
1087
        util/timer_queue_test.cc
1088
        util/timer_test.cc
D
Dmitri Smirnov 已提交
1089 1090
        util/thread_list_test.cc
        util/thread_local_test.cc
1091
        util/work_queue_test.cc
D
Dmitri Smirnov 已提交
1092
        utilities/backupable/backupable_db_test.cc
Y
Yi Wu 已提交
1093
        utilities/blob_db/blob_db_test.cc
1094 1095 1096 1097
        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 已提交
1098
        utilities/checkpoint/checkpoint_test.cc
1099
        utilities/memory/memory_test.cc
D
Dmitri Smirnov 已提交
1100
        utilities/merge_operators/string_append/stringappend_test.cc
1101
        utilities/object_registry_test.cc
1102
        utilities/option_change_migration/option_change_migration_test.cc
Y
yuslepukhin 已提交
1103
        utilities/options/options_util_test.cc
1104
        utilities/persistent_cache/hash_table_test.cc
1105
        utilities/persistent_cache/persistent_cache_test.cc
1106
        utilities/simulator_cache/cache_simulator_test.cc
1107
        utilities/simulator_cache/sim_cache_test.cc
1108
        utilities/table_properties_collectors/compact_on_deletion_collector_test.cc
D
Dmitri Smirnov 已提交
1109
        utilities/transactions/optimistic_transaction_test.cc
A
agiardullo 已提交
1110
        utilities/transactions/transaction_test.cc
1111
        utilities/transactions/transaction_lock_mgr_test.cc
1112
        utilities/transactions/write_prepared_transaction_test.cc
1113
        utilities/transactions/write_unprepared_transaction_test.cc
D
Dmitri Smirnov 已提交
1114 1115
        utilities/ttl/ttl_test.cc
        utilities/write_batch_with_index/write_batch_with_index_test.cc
P
Paweł Bylica 已提交
1116 1117 1118 1119
  )
  if(WITH_LIBRADOS)
    list(APPEND TESTS utilities/env_librados_test.cc)
  endif()
1120

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

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

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

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

1174 1175
  if(ROCKSDB_LIB_FOR_C)
    set(C_TESTS db/c_test.c)
1176 1177 1178 1179 1180
    # 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)
1181
  endif()
P
Paweł Bylica 已提交
1182
endif()
A
Arun Sharma 已提交
1183

1184 1185
option(WITH_BENCHMARK_TOOLS "build with benchmarks" ON)
if(WITH_BENCHMARK_TOOLS)
1186
  add_executable(db_bench
1187
    tools/db_bench.cc
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 1220
    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})
1221 1222
endif()

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

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