CMakeLists.txt 37.0 KB
Newer Older
G
guokuankuan 已提交
1
cmake_minimum_required(VERSION 3.4)
郭宽宽 已提交
2
project(terarkdb)
3 4 5
enable_language(CXX)
enable_language(C)
enable_language(ASM)
D
Dmitri Smirnov 已提交
6

7 8 9 10
if(POLICY CMP0042)
  cmake_policy(SET CMP0042 NEW)
endif()

11
# Default build type
G
guokuankuan 已提交
12
IF(CMAKE_BUILD_TYPE STREQUAL "" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebug")
13
  SET(CMAKE_BUILD_TYPE "RelWithDebInfo")
14 15
ENDIF()

B
Bartek Wrona 已提交
16
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/")
郭宽宽 已提交
17 18 19
SET(CMAKE_INSTALL_LIBDIR ${CMAKE_BINARY_DIR}/lib)
SET(CMAKE_INSTALL_BINDIR ${CMAKE_BINARY_DIR}/bin)
SET(CMAKE_INSTALL_INCLUDEDIR ${CMAKE_BINARY_DIR}/include)
Z
ZhaoMing 已提交
20

21
option(WITH_COVERAGE "build with gcov support" OFF)
G
guokuankuan 已提交
22
option(WITH_JEMALLOC "build with JeMalloc" ON)
郭宽宽 已提交
23 24
option(WITH_SNAPPY "build with SNAPPY" ON)
option(WITH_LZ4 "build with lz4" ON)
郭宽宽 已提交
25
option(WITH_ZLIB "build with zlib" ON)
郭宽宽 已提交
26
option(WITH_ZSTD "build with zstd" ON)
G
guokuankuan 已提交
27
option(WITH_BZ2 "build with bzip2" ON)
28
option(WITH_WINDOWS_UTF8_FILENAMES "use UTF8 as characterset for opening files, regardles of the system code page" OFF)
29
option(WITH_BYTEDANCE_METRICS "build with bytedance internal metrics" OFF)
N
noobpwnftw 已提交
30
option(WITH_ASAN "build with ASAN" OFF)
31
option(WITH_GFLAGS "build with GFlags" ON)
N
noobpwnftw 已提交
32 33 34
include(CMakeDependentOption)
# Tests are excluded from Release builds
CMAKE_DEPENDENT_OPTION(WITH_TESTS "build with tests" ON "CMAKE_BUILD_TYPE STREQUAL Debug" OFF)
郭宽宽 已提交
35
option(WITH_TOOLS "build with tools" OFF)
36
option(WITH_TERARK_ZIP "build with TerarkZipTable support" ON)
37
option(WITH_BOOSTLIB "build with boost, if WITH_TERARK_ZIP is ON, this will also set to ON" OFF)
38
option(WITH_TERARKDB_NAMESPACE "namespace" "terark")
郭宽宽 已提交
39

郭宽宽 已提交
40 41
option(BUILD_SUFFIX "library sufix" "d")
option(FORCE_TERARKDB_RELEASE_BUILD "ignore outside cmake_build_type" OFF)
42

43 44 45
SET(CMAKE_THREAD_PREFER_PTHREAD TRUE)
Find_Package(Threads REQUIRED)

46 47 48 49 50
#----------------------- namespace
if(WITH_TERARKDB_NAMESPACE)
  add_definitions(-DTERARKDB_NAMESPACE=WITH_TERARKDB_NAMESPACE)
endif()

郭宽宽 已提交
51
#----------------------- Global Options
52 53 54
if (WITH_WINDOWS_UTF8_FILENAMES)
  add_definitions(-DROCKSDB_WINDOWS_UTF8_FILENAMES)
endif()
雷鹏 已提交
55

56 57 58
IF(FORCE_TERARKDB_RELEASE_BUILD)
  SET(CMAKE_BUILD_TYPE "Release")
ENDIF()
郭宽宽 已提交
59

60
IF(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
郭宽宽 已提交
61 62
  SET(BUILD_SUFFIX "r")
ELSE()
郭宽宽 已提交
63
  SET(BUILD_SUFFIX "d")
郭宽宽 已提交
64
ENDIF()
郭宽宽 已提交
65

66 67 68 69 70 71 72
# terark-zip embedded boost, will remove the boost library in the future
if(WITH_TERARK_ZIP)
  add_definitions(-DWITH_TERARK_ZIP=1)
  SET(WITH_BOOSTLIB ON)
  SET(TERARK_ZIP_LIB terark-zip-${BUILD_SUFFIX})
endif()

73 74 75 76
IF(WITH_COVERAGE)
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
ENDIF()

郭宽宽 已提交
77
#-------------------------- Print Global Options
78
message("[terarkdb] FORCE_RELEASE_BUILD = ${FORCE_TERARKDB_RELEASE_BUILD}, cmake_build_type = ${CMAKE_BUILD_TYPE}")
郭宽宽 已提交
79
message("[terarkdb] WITH_TOOLS = ${WITH_TOOLS}, WITH_ASAN = ${WITH_ASAN}, WITH_TESTS = ${WITH_TESTS}")
80
message("[terarkdb] WITH_JEMALLOC = ${WITH_JEMALLOC}, WITH_COVERAGE=${WITH_COVERAGE}")
郭宽宽 已提交
81
MESSAGE("[terarkdb] CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}, BUILD_SUFFIX=${BUILD_SUFFIX}")
82
MESSAGE("[terarkdb] CMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}")
83
MESSAGE("[terarkdb] CMAKE_THREAD_LIBS_INIT=${CMAKE_THREAD_LIBS_INIT}")
雷鹏 已提交
84

85

郭宽宽 已提交
86 87
#-------------------------- Third-party Libraries
ADD_SUBDIRECTORY(third-party)
88 89 90 91
if(WITH_TERARK_ZIP)
  GET_TARGET_PROPERTY(terark_zip_include_dir terark-zip-${BUILD_SUFFIX} INCLUDE_DIRECTORIES)
  INCLUDE_DIRECTORIES(${terark_zip_include_dir})
ENDIF()
郭宽宽 已提交
92

J
Jay 已提交
93

郭宽宽 已提交
94 95 96 97 98
#-------------------------- Third-party Library Flags for RocksDB
if(WITH_JEMALLOC)
  add_definitions(-DROCKSDB_JEMALLOC -DJEMALLOC_NO_DEMANGLE)
  get_target_property(jemalloc_INCLUDE_DIR jemalloc INCLUDE_DIRECTORIES)
  include_directories(${jemalloc_INCLUDE_DIR})
R
Roy Guo 已提交
99
  list(APPEND THIRDPARTY_LIBS jemalloc pthread dl)
G
guokuankuan 已提交
100
  message("[terarkdb] jemalloc include dir: ${jemalloc_INCLUDE_DIR}")
郭宽宽 已提交
101
endif()
J
Jay 已提交
102

郭宽宽 已提交
103 104 105 106 107 108 109
if(WITH_GFLAGS)
  add_definitions(-DGFLAGS=1)
  get_target_property(gflags_INCLUDE_DIR gflags INCLUDE_DIRECTORIES)
  include_directories(${gflags_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS gflags)
  message("[terarkdb] gflags include dir: ${gflags_INCLUDE_DIR}")
endif()
J
Jay 已提交
110

111 112 113 114 115 116 117
if(WITH_BOOSTLIB)
  add_definitions(-DBOOSTLIB=1)
  message("[terarkdb] with boost")
else()
  message("[terarkdb] without boost")
endif()

郭宽宽 已提交
118 119 120 121 122
if(WITH_TESTS OR WITH_TOOLS)
  get_target_property(gtest_INCLUDE_DIR gtest INCLUDE_DIRECTORIES)
  include_directories(${gtest_INCLUDE_DIR})
  message("[terarkdb] gtest include dir: ${gtest_INCLUDE_DIR}")
endif()
J
Jay 已提交
123

郭宽宽 已提交
124 125 126 127 128 129 130
if(WITH_SNAPPY)
  add_definitions(-DSNAPPY)
  get_target_property(snappy_INCLUDE_DIR snappy INCLUDE_DIRECTORIES)
  include_directories(${snappy_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS snappy)
  message("[terarkdb] snappy include dir: ${snappy_INCLUDE_DIR}")
endif()
J
Jay 已提交
131

郭宽宽 已提交
132 133 134 135 136 137 138
if(WITH_ZLIB)
  add_definitions(-DZLIB)
  get_target_property(zlib_INCLUDE_DIR zlib INCLUDE_DIRECTORIES)
  include_directories(${zlib_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS zlib)
  message("[terarkdb] zlib include dir: ${zlib_INCLUDE_DIR}")
endif()
郭宽宽 已提交
139

郭宽宽 已提交
140 141 142 143 144 145 146 147
if(WITH_BZ2)
  add_definitions(-DBZIP2)
  get_target_property(bzip2_INCLUDE_DIR bzip2 INCLUDE_DIRECTORIES)
  include_directories(${bzip2_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS bzip2)
  message("[terarkdb] bzip2 include dir : ${bzip2_INCLUDE_DIR}")
endif()

148 149 150 151 152 153 154 155
if(WITH_BYTEDANCE_METRICS)	
  add_definitions(-DTERARKDB_ENABLE_METRICS)	
  get_target_property(metrics2_INCLUDE_DIR metrics2 INCLUDE_DIRECTORIES)	
  include_directories(${metrics2_INCLUDE_DIR})	
  list(APPEND THIRDPARTY_LIBS metrics2)	
  message("[terarkdb] bytedance_metrics2 include dir : ${metrics2_INCLUDE_DIR}")	
endif()

郭宽宽 已提交
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
if(WITH_LZ4)
  add_definitions(-DLZ4)
  get_target_property(lz4_INCLUDE_DIR lz4 INCLUDE_DIRECTORIES)
  include_directories(${lz4_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS lz4)
  message("[terarkdb] lz4 include dir : ${lz4_INCLUDE_DIR}")
endif()

if(WITH_ZSTD)
  add_definitions(-DZSTD)
  get_target_property(zstd_INCLUDE_DIR zstd INCLUDE_DIRECTORIES)
  include_directories(${zstd_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS zstd)
  message("[terarkdb] zstd include dir : ${zstd_INCLUDE_DIR}")
endif()

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

174

郭宽宽 已提交
175 176
#----------------------- Version Information
find_package(Git)
T
Tamir Duberstein 已提交
177
if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
178
  if(WIN32)
179
    execute_process(COMMAND $ENV{COMSPEC} /C ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
180 181 182
  else()
    execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
  endif()
183
else()
184
  set(GIT_SHA 0)
185 186
endif()

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

189 190 191 192 193 194 195 196 197 198
# Read rocksdb version from version.h header file.
file(READ include/rocksdb/version.h version_header_file)
string(REGEX MATCH "#define ROCKSDB_MAJOR ([0-9]+)" _ ${version_header_file})
set(ROCKSDB_VERSION_MAJOR ${CMAKE_MATCH_1})
string(REGEX MATCH "#define ROCKSDB_MINOR ([0-9]+)" _ ${version_header_file})
set(ROCKSDB_VERSION_MINOR ${CMAKE_MATCH_1})
string(REGEX MATCH "#define ROCKSDB_PATCH ([0-9]+)" _ ${version_header_file})
set(ROCKSDB_VERSION_PATCH ${CMAKE_MATCH_1})
set(ROCKSDB_VERSION ${ROCKSDB_VERSION_MAJOR}.${ROCKSDB_VERSION_MINOR}.${ROCKSDB_VERSION_PATCH})

A
Arun Sharma 已提交
199

郭宽宽 已提交
200 201
#-------------------------- Compiler Options

202 203 204 205 206 207
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 已提交
208
  endif()
209
endif()
T
Tomas Kolda 已提交
210

郭宽宽 已提交
211 212 213 214
set(ROCKSDB_BUILD_VERSION_CC ${CMAKE_CURRENT_SOURCE_DIR}/util/build_version.cc)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/util/build_version.cc.in ${ROCKSDB_BUILD_VERSION_CC} @ONLY)
add_library(rocksdb_build_version OBJECT ${ROCKSDB_BUILD_VERSION_CC})
target_include_directories(rocksdb_build_version PRIVATE
215 216 217
  ${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")
218
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
219 220
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall")
郭宽宽 已提交
221
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-sign-compare -Wno-shadow -Wno-unused-parameter -Wno-unused-variable -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers -Wno-strict-aliasing")
222 223 224
  if(MINGW)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format")
  endif()
225
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -DBUILD_BY_CMAKE -fPIC")
226
  if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
T
Tamir Duberstein 已提交
227
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
228 229 230 231 232 233 234 235
    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()

236 237 238 239 240 241 242 243 244 245 246 247
include(CheckCCompilerFlag)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le")
  CHECK_C_COMPILER_FLAG("-maltivec" HAS_ALTIVEC)
  if(HAS_ALTIVEC)
    message(STATUS " HAS_ALTIVEC yes")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maltivec")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maltivec")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power8")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power8")
  endif(HAS_ALTIVEC)
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le")

248 249 250
option(PORTABLE "build a portable binary" OFF)
option(FORCE_SSE42 "force building with SSE4.2, even when PORTABLE=ON" OFF)
if(PORTABLE)
N
noobpwnftw 已提交
251
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=haswell")
252 253 254
  # 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)
255
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpclmul")
T
Tomas Kolda 已提交
256
  endif()
T
Tamir Duberstein 已提交
257
else()
258 259 260
  if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
  else()
261
    if(NOT HAVE_POWER8)
N
noobpwnftw 已提交
262
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
263
    endif()
T
Tamir Duberstein 已提交
264
  endif()
T
Tamir Duberstein 已提交
265 266
endif()

267
include(CheckCXXSourceCompiles)
268
if(NOT MSVC)
269
  set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
270
endif()
271 272 273
CHECK_CXX_SOURCE_COMPILES("
#include <cstdint>
#include <nmmintrin.h>
274
#include <wmmintrin.h>
275 276
int main() {
  volatile uint32_t x = _mm_crc32_u32(0, 0);
277 278 279 280
  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);
281 282
}
" HAVE_SSE42)
283
unset(CMAKE_REQUIRED_FLAGS)
284 285
if(HAVE_SSE42)
  add_definitions(-DHAVE_SSE42)
286
  add_definitions(-DHAVE_PCLMUL)
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
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()

C
chenchanglong 已提交
303
option(FAIL_ON_WARNINGS "Treat compile warnings as errors" OFF)
304 305 306 307 308 309 310 311
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()

312
if(MSVC)
R
rockeet 已提交
313
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /FR /std:c++14")
314 315
endif()

316 317 318 319 320 321 322
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()
郭宽宽 已提交
323
  list(APPEND THIRDPARTY_LIBS asan)
324
endif()
D
Dmitri Smirnov 已提交
325

326 327 328 329 330 331 332 333 334
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()
335

336 337
option(WITH_UBSAN "build with UBSAN" OFF)
if(WITH_UBSAN)
338
  add_definitions(-DROCKSDB_UBSAN_RUN)
339 340 341 342 343 344 345
  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 已提交
346

347 348 349
option(WITH_NUMA "build with NUMA policy support" OFF)
if(WITH_NUMA)
  find_package(NUMA REQUIRED)
350 351 352 353 354
  add_definitions(-DNUMA)
  include_directories(${NUMA_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS ${NUMA_LIBRARIES})
endif()

355 356 357
option(WITH_TBB "build with Threading Building Blocks (TBB)" OFF)
if(WITH_TBB)
  find_package(TBB REQUIRED)
358 359 360 361 362
  add_definitions(-DTBB)
  include_directories(${TBB_INCLUDE_DIR})
  list(APPEND THIRDPARTY_LIBS ${TBB_LIBRARIES})
endif()

363 364 365 366 367 368
# 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()

N
noobpwnftw 已提交
369
SET(USE_RTTI ON)
370 371 372 373 374 375
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()
376 377 378 379 380 381 382 383 384
    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()
385
  endif()
386 387 388
else()
  message(STATUS "Enabling RTTI in Debug builds only (default)")
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
389 390 391 392 393
  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()
394 395
endif()

396 397
# Used to run CI build and tests so we can run faster
option(OPTDBG "Build optimized debug build with MSVC" OFF)
398
option(WITH_RUNTIME_DEBUG "build with debug version of runtime library" ON)
O
Orgad Shaneh 已提交
399
if(MSVC)
400
  if(OPTDBG)
401
    message(STATUS "Debug optimization is enabled")
402
    set(CMAKE_CXX_FLAGS_DEBUG "/Oxt")
403
  else()
404 405 406 407 408 409
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /RTC1 /Gm")
  endif()
  if(WITH_RUNTIME_DEBUG)
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}d")
  else()
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}")
410
  endif()
T
Tomas Kolda 已提交
411
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
412 413 414

  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
415 416
endif()

417 418 419
if(CMAKE_COMPILER_IS_GNUCXX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-memcmp")
endif()
D
Dmitri Smirnov 已提交
420

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

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

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

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

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

503 504 505 506 507
check_cxx_symbol_exists(sched_getcpu sched.h HAVE_SCHED_GETCPU)
if(HAVE_SCHED_GETCPU)
  add_definitions(-DROCKSDB_SCHED_GETCPU_PRESENT)
endif()

D
Dmitri Smirnov 已提交
508 509
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/include)
510
find_package(Threads REQUIRED)
D
Dmitri Smirnov 已提交
511

512

郭宽宽 已提交
513

514
if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
G
guokuankuan 已提交
515
  LIST(APPEND TERARK_SHARED_DEPENDS pthread gomp aio rt dl)
郭宽宽 已提交
516
  if ((${CMAKE_BUILD_TYPE} STREQUAL "Debug") AND (${WITH_ASAN}))
郭宽宽 已提交
517 518 519
    message("[terarkdb] build terarkdb with asan")
    LIST(APPEND TERARK_SHARED_DEPENDS asan)
  endif()
520
endif()
郭宽宽 已提交
521

D
Dmitri Smirnov 已提交
522

523
# Main library source code
D
Dmitri Smirnov 已提交
524
set(SOURCES
525
        cache/clock_cache.cc
赵明 已提交
526
        cache/lirs_cache.cc
527 528
        cache/lru_cache.cc
        cache/sharded_cache.cc
D
Dmitri Smirnov 已提交
529 530 531
        db/builder.cc
        db/c.cc
        db/column_family.cc
532
        db/compacted_db_impl.cc
D
Dmitri Smirnov 已提交
533
        db/compaction.cc
534
        db/compaction_iterator.cc
D
Dmitri Smirnov 已提交
535 536
        db/compaction_job.cc
        db/compaction_picker.cc
537
        db/compaction_picker_fifo.cc
S
Siying Dong 已提交
538
        db/compaction_picker_universal.cc
A
agiardullo 已提交
539
        db/convenience.cc
D
Dmitri Smirnov 已提交
540 541
        db/db_filesnapshot.cc
        db/db_impl.cc
S
Siying Dong 已提交
542 543 544 545
        db/db_impl_write.cc
        db/db_impl_compaction_flush.cc
        db/db_impl_files.cc
        db/db_impl_open.cc
D
Dmitri Smirnov 已提交
546 547 548
        db/db_impl_debug.cc
        db/db_impl_experimental.cc
        db/db_impl_readonly.cc
549
        db/db_info_dumper.cc
D
Dmitri Smirnov 已提交
550
        db/db_iter.cc
551
        db/dbformat.cc
552
        db/error_handler.cc
D
Dmitri Smirnov 已提交
553 554
        db/event_helpers.cc
        db/experimental.cc
555
        db/external_sst_file_ingestion_job.cc
D
Dmitri Smirnov 已提交
556 557 558 559 560
        db/file_indexer.cc
        db/flush_job.cc
        db/flush_scheduler.cc
        db/forward_iterator.cc
        db/internal_stats.cc
561
        db/in_memory_stats_history.cc
S
Siying Dong 已提交
562
        db/logs_with_prep_tracker.cc
D
Dmitri Smirnov 已提交
563 564
        db/log_reader.cc
        db/log_writer.cc
565
        db/malloc_stats.cc
奏之章 已提交
566
        db/map_builder.cc
D
Dmitri Smirnov 已提交
567
        db/memtable.cc
L
Lei Peng 已提交
568
        db/memtablerep.cc
D
Dmitri Smirnov 已提交
569 570 571
        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 579 580 581 582 583 584 585 586
        db/table_cache.cc
        db/table_properties_collector.cc
        db/transaction_log_impl.cc
        db/version_builder.cc
        db/version_edit.cc
        db/version_set.cc
        db/wal_manager.cc
        db/write_batch.cc
        db/write_batch_base.cc
        db/write_controller.cc
        db/write_thread.cc
587 588
        env/env.cc
        env/env_chroot.cc
E
Ewout Prangsma 已提交
589
        env/env_encryption.cc
590
        env/env_hdfs.cc
C
chenchanglong 已提交
591
        env/env_io_prof.cc
592
        env/mock_env.cc
593
        memtable/alloc_tracker.cc
594 595 596
        memtable/hash_cuckoo_rep.cc
        memtable/hash_linklist_rep.cc
        memtable/hash_skiplist_rep.cc
597 598
        memtable/skiplistrep.cc
        memtable/vectorrep.cc
599
        memtable/write_buffer_manager.cc
600 601 602 603 604 605 606
        monitoring/histogram.cc
        monitoring/histogram_windowing.cc
        monitoring/instrumented_mutex.cc
        monitoring/iostats_context.cc
        monitoring/perf_context.cc
        monitoring/perf_level.cc
        monitoring/statistics.cc
W
wangyi.ywq 已提交
607
        monitoring/stats_dump_scheduler.cc
608 609 610 611 612 613 614 615 616 617
        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 已提交
618 619 620 621 622 623 624 625
        port/stack_trace.cc
        table/adaptive_table_factory.cc
        table/block.cc
        table/block_based_filter_block.cc
        table/block_based_table_builder.cc
        table/block_based_table_factory.cc
        table/block_based_table_reader.cc
        table/block_builder.cc
S
Siying Dong 已提交
626
        table/block_fetcher.cc
D
Dmitri Smirnov 已提交
627 628 629 630 631
        table/block_prefix_index.cc
        table/bloom_block.cc
        table/cuckoo_table_builder.cc
        table/cuckoo_table_factory.cc
        table/cuckoo_table_reader.cc
632
        table/data_block_hash_index.cc
633
        table/data_block_footer.cc
D
Dmitri Smirnov 已提交
634 635 636 637
        table/flush_block_policy.cc
        table/format.cc
        table/full_filter_block.cc
        table/get_context.cc
M
Maysam Yabandeh 已提交
638
        table/index_builder.cc
D
Dmitri Smirnov 已提交
639
        table/iterator.cc
640
        table/merging_iterator.cc
D
Dmitri Smirnov 已提交
641
        table/meta_blocks.cc
M
Maysam Yabandeh 已提交
642
        table/partitioned_filter_block.cc
643
        table/persistent_cache_helper.cc
D
Dmitri Smirnov 已提交
644 645 646 647 648
        table/plain_table_builder.cc
        table/plain_table_factory.cc
        table/plain_table_index.cc
        table/plain_table_key_coding.cc
        table/plain_table_reader.cc
649
        table/sst_file_reader.cc
650
        table/sst_file_writer.cc
D
Dmitri Smirnov 已提交
651
        table/table_properties.cc
Z
ZhaoMing 已提交
652
        table/table_reader.cc
D
Dmitri Smirnov 已提交
653
        table/two_level_iterator.cc
654
        tools/db_bench_tool.cc
655
        tools/dump/db_dump_tool.cc
656 657 658
        tools/ldb_cmd.cc
        tools/ldb_tool.cc
        tools/sst_dump_tool.cc
Z
Zhichao Cao 已提交
659
        tools/trace_analyzer_tool.cc
D
Dmitri Smirnov 已提交
660
        util/arena.cc
661
        util/auto_roll_logger.cc
D
Dmitri Smirnov 已提交
662 663 664 665
        util/bloom.cc
        util/coding.cc
        util/compaction_job_stats_impl.cc
        util/comparator.cc
666
        util/compression_context_cache.cc
667
        util/concurrent_arena.cc
D
Dmitri Smirnov 已提交
668
        util/crc32c.cc
669
        util/delete_scheduler.cc
D
Dmitri Smirnov 已提交
670 671
        util/dynamic_bloom.cc
        util/event_logger.cc
672
        util/file_reader_writer.cc
673
        util/file_util.cc
674
        util/filename.cc
D
Dmitri Smirnov 已提交
675 676
        util/filter_policy.cc
        util/hash.cc
奏之章 已提交
677
        util/iterator_cache.cc
678
        util/jemalloc_nodump_allocator.cc
Z
ZhaoMing 已提交
679
        util/lazy_buffer.cc
D
Dmitri Smirnov 已提交
680 681
        util/log_buffer.cc
        util/murmurhash.cc
682
        util/random.cc
D
Dmitri Smirnov 已提交
683 684
        util/rate_limiter.cc
        util/slice.cc
685
        util/sst_file_manager_impl.cc
D
Dmitri Smirnov 已提交
686 687 688
        util/status.cc
        util/string_util.cc
        util/sync_point.cc
689
        util/sync_point_impl.cc
D
Dmitri Smirnov 已提交
690 691
        util/testutil.cc
        util/thread_local.cc
692
        util/threadpool_imp.cc
693
        util/trace_replay.cc
S
SherlockNoMad 已提交
694
        util/transaction_test_util.cc
D
Dmitri Smirnov 已提交
695 696
        util/xxhash.cc
        utilities/backupable/backupable_db.cc
697
        utilities/checkpoint/checkpoint_impl.cc
698 699 700
        utilities/col_buf_decoder.cc
        utilities/col_buf_encoder.cc
        utilities/column_aware_encoding_util.cc
701
        utilities/console/server.cc
702
        utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc
O
omegaga 已提交
703
        utilities/date_tiered/date_tiered_db_impl.cc
A
Andrew Kryczka 已提交
704
        utilities/debug.cc
D
Dmitri Smirnov 已提交
705 706 707
        utilities/document/document_db.cc
        utilities/document/json_document.cc
        utilities/document/json_document_builder.cc
D
Dmitri Smirnov 已提交
708
        utilities/env_mirror.cc
A
Andrew Kryczka 已提交
709
        utilities/env_timed.cc
郭宽宽 已提交
710
        utilities/flink/flink_compaction_filter.cc
C
chenchanglong 已提交
711 712
        utilities/geodb/geodb_impl.cc
        utilities/ioprof/ioprof.cc
D
Dmitri Smirnov 已提交
713
        utilities/leveldb_options/leveldb_options.cc
714
        utilities/lua/rocks_lua_compaction_filter.cc
715
        utilities/memory/memory_util.cc
P
Pooya Shareghi 已提交
716
        utilities/merge_operators/bytesxor.cc
717 718
        utilities/merge_operators/max.cc
        utilities/merge_operators/put.cc
D
Dmitri Smirnov 已提交
719 720 721
        utilities/merge_operators/string_append/stringappend.cc
        utilities/merge_operators/string_append/stringappend2.cc
        utilities/merge_operators/uint64add.cc
722
        utilities/option_change_migration/option_change_migration.cc
723
        utilities/options/options_util.cc
724 725 726
        utilities/persistent_cache/block_cache_tier.cc
        utilities/persistent_cache/block_cache_tier_file.cc
        utilities/persistent_cache/block_cache_tier_metadata.cc
727
        utilities/persistent_cache/persistent_cache_tier.cc
728
        utilities/persistent_cache/volatile_tier_impl.cc
D
Dmitri Smirnov 已提交
729
        utilities/redis/redis_lists.cc
730
        utilities/simulator_cache/sim_cache.cc
D
Dmitri Smirnov 已提交
731
        utilities/spatialdb/spatial_db.cc
732
        utilities/table_properties_collectors/compact_on_deletion_collector.cc
733
        utilities/trace/file_trace_reader_writer.cc
734
        utilities/trace/bytedance_metrics_reporter.cc
D
Dmitri Smirnov 已提交
735
        utilities/transactions/optimistic_transaction_db_impl.cc
736
        utilities/transactions/optimistic_transaction.cc
Y
Yi Wu 已提交
737
        utilities/transactions/pessimistic_transaction.cc
M
Maysam Yabandeh 已提交
738
        utilities/transactions/pessimistic_transaction_db.cc
Y
Yi Wu 已提交
739 740
        utilities/transactions/snapshot_checker.cc
        utilities/transactions/transaction_base.cc
A
agiardullo 已提交
741
        utilities/transactions/transaction_db_mutex_impl.cc
A
agiardullo 已提交
742 743
        utilities/transactions/transaction_lock_mgr.cc
        utilities/transactions/transaction_util.cc
744
        utilities/transactions/write_prepared_txn.cc
745
        utilities/transactions/write_prepared_txn_db.cc
746 747
        utilities/transactions/write_unprepared_txn.cc
        utilities/transactions/write_unprepared_txn_db.cc
D
Dmitri Smirnov 已提交
748 749 750
        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
751
        utilities/util/factory.cc
郭宽宽 已提交
752 753
        $<TARGET_OBJECTS:rocksdb_build_version>)

754 755 756 757 758 759 760 761 762 763 764 765
IF(WITH_TERARK_ZIP)
  LIST(APPEND SOURCES db/compaction_dispatcher.cc
                      memtable/terark_zip_entry_index.cc	
                      memtable/terark_zip_memtable.cc
                      table/terark_zip_common.cc	
                      table/terark_zip_config.cc	
                      table/terark_zip_table_builder.cc	
                      table/terark_zip_table_reader.cc	
                      table/terark_zip_table.cc
                      tools/remote_compaction_worker_101.cc)
ENDIF()

郭宽宽 已提交
766 767 768 769 770
IF(WITH_TESTS OR WITH_TOOLS)
  LIST(APPEND SOURCES utilities/cassandra/cassandra_compaction_filter.cc
                      utilities/cassandra/format.cc
                      utilities/cassandra/merge_operator.cc)
ENDIF()
771

郭宽宽 已提交
772 773 774 775
# Scan more sources
FILE(GLOB CONSOLE_SOURCES utilities/console/*.cc)
FILE(GLOB TEST_CONSOLE_SOURCES utilities/console/*_test.cc)
LIST(REMOVE_ITEM CONSOLE_SOURCES "${TEST_CONSOLE_SOURCES}")
776 777 778
LIST(APPEND SOURCES ${CONSOLE_SOURCES})


H
Huachao Huang 已提交
779 780 781 782
if(HAVE_SSE42 AND NOT MSVC)
  set_source_files_properties(
    util/crc32c.cc
    PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul")
783 784
endif()

785 786 787 788 789 790
if(HAVE_POWER8)
  list(APPEND SOURCES
    util/crc32c_ppc.c
    util/crc32c_ppc_asm.S)
endif(HAVE_POWER8)

791 792 793 794 795 796 797
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
798 799
    port/win/win_thread.cc)

郭宽宽 已提交
800 801 802 803
    if(WITH_XPRESS)
      list(APPEND SOURCES
        port/win/xpress_win.cc)
    endif()
804

郭宽宽 已提交
805 806 807 808
    if(WITH_JEMALLOC)
      list(APPEND SOURCES
        port/win/win_jemalloc.cc)
    endif()
809

郭宽宽 已提交
810 811 812 813
  else()
    list(APPEND SOURCES
      port/port_posix.cc
      env/env_posix.cc
G
guokuankuan 已提交
814
      env/io_posix.cc)
815
endif()
D
Dmitri Smirnov 已提交
816

郭宽宽 已提交
817 818
set(ROCKSDB_STATIC_LIB terarkdb${ARTIFACT_SUFFIX})
set(ROCKSDB_SHARED_LIB terarkdb-shared${ARTIFACT_SUFFIX})
819
set(ROCKSDB_IMPORT_LIB ${ROCKSDB_SHARED_LIB})
820 821 822 823 824 825 826 827

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

828 829 830 831 832
if(WIN32)
  set(SYSTEM_LIBS ${SYSTEM_LIBS} Shlwapi.lib Rpcrt4.lib)
  set(LIBS ${ROCKSDB_STATIC_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
endif()

833
# Static terarkdb lib
834
add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES})
835
target_link_libraries(${ROCKSDB_STATIC_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS} ${TERARK_ZIP_LIB} ${TERARK_SHARED_DEPENDS})
郭宽宽 已提交
836
target_include_directories(${ROCKSDB_STATIC_LIB} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
837 838
                                                        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
                                                        $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include>)
839 840

if(WIN32)
郭宽宽 已提交
841
  # imported terarkdb lib
842
  add_library(${ROCKSDB_IMPORT_LIB} SHARED ${SOURCES})
843
  target_link_libraries(${ROCKSDB_IMPORT_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS} ${TERARK_ZIP_LIB})
郭宽宽 已提交
844
  target_include_directories(${ROCKSDB_IMPORT_LIB} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
845
  set_target_properties(${ROCKSDB_IMPORT_LIB} PROPERTIES
O
Orgad Shaneh 已提交
846 847 848 849 850 851 852
    COMPILE_DEFINITIONS "ROCKSDB_DLL;ROCKSDB_LIBRARY_EXPORTS")
  if(MSVC)
    set_target_properties(${ROCKSDB_STATIC_LIB} PROPERTIES
      COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_STATIC_LIB}.pdb")
    set_target_properties(${ROCKSDB_IMPORT_LIB} PROPERTIES
      COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_IMPORT_LIB}.pdb")
  endif()
853 854 855 856 857 858
endif()

option(WITH_JNI "build with JNI" OFF)
if(WITH_JNI OR JNI)
  message(STATUS "JNI library is enabled")
  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/java)
859 860 861 862
else()
  message(STATUS "JNI library is disabled")
endif()

P
Paweł Bylica 已提交
863 864 865 866 867 868 869 870 871 872 873 874 875
# 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)
876 877
  include(CMakePackageConfigHelpers)

Z
ZhaoMing 已提交
878
  set(package_config_destination ${CMAKE_INSTALL_LIBDIR})
879 880

  configure_package_config_file(
B
Bartek Wrona 已提交
881
    ${CMAKE_CURRENT_LIST_DIR}/cmake/RocksDBConfig.cmake.in RocksDBConfig.cmake
882 883 884 885 886 887 888 889 890
    INSTALL_DESTINATION ${package_config_destination}
  )

  write_basic_package_version_file(
    RocksDBConfigVersion.cmake
    VERSION ${ROCKSDB_VERSION}
    COMPATIBILITY SameMajorVersion
  )

Z
ZhaoMing 已提交
891
  install(
892 893
          DIRECTORY include/rocksdb
          COMPONENT devel
Z
ZhaoMing 已提交
894
          DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
895 896

  install(
郭宽宽 已提交
897 898 899 900
        TARGETS ${ROCKSDB_STATIC_LIB}
        #EXPORT RocksDBTargets
        COMPONENT devel
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
901 902
  )

郭宽宽 已提交
903 904 905 906
  #install(
  #  EXPORT RocksDBTargets
  #  COMPONENT devel
  #  DESTINATION ${package_config_destination}
907
  #  NAMESPACE TERARKDB_NAMESPACE::
郭宽宽 已提交
908
  #)
909 910 911 912 913 914 915 916

  install(
    FILES
    ${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfig.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfigVersion.cmake
    COMPONENT devel
    DESTINATION ${package_config_destination}
  )
P
Paweł Bylica 已提交
917 918
endif()

919 920 921 922 923 924

IF(WITH_TESTS OR WITH_TOOLS)
  add_library(testharness OBJECT util/testharness.cc)
ENDIF()


P
Paweł Bylica 已提交
925
if(WITH_TESTS)
P
Paweł Bylica 已提交
926
  set(TESTS
927 928
        cache/cache_test.cc
        cache/lru_cache_test.cc
D
Dmitri Smirnov 已提交
929 930
        db/column_family_test.cc
        db/compact_files_test.cc
931
        db/compaction_iterator_test.cc
D
Dmitri Smirnov 已提交
932
        db/compaction_job_stats_test.cc
933
        db/compaction_job_test.cc
D
Dmitri Smirnov 已提交
934 935 936 937
        db/compaction_picker_test.cc
        db/comparator_db_test.cc
        db/corruption_test.cc
        db/cuckoo_table_db_test.cc
938
        db/db_basic_test.cc
939 940
        db/db_block_cache_test.cc
        db/db_bloom_filter_test.cc
941
        db/db_compaction_filter_test.cc
942
        db/db_compaction_test.cc
943
        db/db_dynamic_level_test.cc
944
        db/db_flush_test.cc
U
ustcwelcome 已提交
945
        db/db_impl_gc_ttl_test.cc
946
        db/db_inplace_update_test.cc
947
        db/db_io_failure_test.cc
948
        db/db_iter_test.cc
949
        db/db_iter_stress_test.cc
950
        db/db_iterator_test.cc
951
        db/db_log_iter_test.cc
952
        db/db_memtable_test.cc
953
        db/db_merge_operator_test.cc
954
        db/db_options_test.cc
955
        db/db_properties_test.cc
956 957
        db/db_range_del_test.cc
        db/db_sst_test.cc
958
        db/db_statistics_test.cc
959 960 961
        db/db_table_properties_test.cc
        db/db_tailing_iter_test.cc
        db/db_test.cc
962
        db/db_test2.cc
963
        db/db_universal_compaction_test.cc
S
sdong 已提交
964
        db/db_wal_test.cc
Y
Yi Wu 已提交
965
        db/db_write_test.cc
D
Dmitri Smirnov 已提交
966 967
        db/dbformat_test.cc
        db/deletefile_test.cc
968
        db/error_handler_test.cc
969
        db/obsolete_files_test.cc
970 971
        db/external_sst_file_basic_test.cc
        db/external_sst_file_test.cc
D
Dmitri Smirnov 已提交
972 973 974 975 976 977
        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
978
        db/manual_compaction_test.cc
979
        db/map_builder_test
D
Dmitri Smirnov 已提交
980
        db/memtable_list_test.cc
981
        db/merge_helper_test.cc
982
        db/merge_test.cc
983
        db/options_file_test.cc
D
Dmitri Smirnov 已提交
984 985 986
        db/perf_context_test.cc
        db/plain_table_db_test.cc
        db/prefix_test.cc
987 988
        db/range_del_aggregator_test.cc
        db/range_tombstone_fragmenter_test.cc
A
Andrew Kryczka 已提交
989
        db/repair_test.cc
D
Dmitri Smirnov 已提交
990 991 992 993 994 995 996 997
        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
998 999 1000
        env/env_basic_test.cc
        env/env_test.cc
        env/mock_env_test.cc
1001 1002
        memtable/inlineskiplist_test.cc
        memtable/skiplist_test.cc
N
noobpwnftw 已提交
1003
        memtable/terark_zip_memtable_test.cc
1004
        memtable/write_buffer_manager_test.cc
1005 1006 1007 1008 1009
        monitoring/histogram_test.cc
        monitoring/iostats_context_test.cc
        monitoring/statistics_test.cc
        options/options_settable_test.cc
        options/options_test.cc
D
Dmitri Smirnov 已提交
1010
        table/block_based_filter_block_test.cc
1011
        table/block_based_table_builder_ttl_test.cc
1012
        util/timer_test.cc
P
Paweł Bylica 已提交
1013 1014 1015 1016
  )
  if(WITH_LIBRADOS)
    list(APPEND TESTS utilities/env_librados_test.cc)
  endif()
1017

P
Paweł Bylica 已提交
1018 1019 1020 1021 1022 1023 1024 1025 1026
  # For test util library that is build only in DEBUG mode
  # and linked to tests. Add test only code that is not #ifdefed for Release here.
  set(TESTUTIL_SOURCE
      db/db_test_util.cc
      monitoring/thread_status_updater_debug.cc
      table/mock_table.cc
      util/fault_injection_test_env.cc
      utilities/cassandra/test_utils.cc
  )
G
guokuankuan 已提交
1027
  # test utilities are built only in debug mode
P
Paweł Bylica 已提交
1028 1029 1030 1031
  enable_testing()
  add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
  set(TESTUTILLIB testutillib${ARTIFACT_SUFFIX})
  add_library(${TESTUTILLIB} STATIC ${TESTUTIL_SOURCE})
G
guokuankuan 已提交
1032
  target_link_libraries(${TESTUTILLIB} ${THIRDPARTY_LIBS})
P
Paweł Bylica 已提交
1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
  if(MSVC)
    set_target_properties(${TESTUTILLIB} PROPERTIES COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/testutillib${ARTIFACT_SUFFIX}.pdb")
  endif()
  set_target_properties(${TESTUTILLIB}
        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
        )

  # Tests are excluded from Release builds
  set(TEST_EXES ${TESTS})
1044

P
Paweł Bylica 已提交
1045 1046
  foreach(sourcefile ${TEST_EXES})
      get_filename_component(exename ${sourcefile} NAME_WE)
B
Bartek Wrona 已提交
1047
      add_executable(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} ${sourcefile}
P
Paweł Bylica 已提交
1048
        $<TARGET_OBJECTS:testharness>)
B
Bartek Wrona 已提交
1049
      set_target_properties(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX}
P
Paweł Bylica 已提交
1050 1051 1052
        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
B
Bartek Wrona 已提交
1053
        OUTPUT_NAME ${exename}${ARTIFACT_SUFFIX}
P
Paweł Bylica 已提交
1054
        )
郭宽宽 已提交
1055
      target_link_libraries(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} testutillib${ARTIFACT_SUFFIX} gtest ${ROCKSDB_STATIC_LIB})
P
Paweł Bylica 已提交
1056 1057
      if(NOT "${exename}" MATCHES "db_sanity_test")
        add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
B
Bartek Wrona 已提交
1058
        add_dependencies(check ${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX})
P
Paweł Bylica 已提交
1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074
      endif()
  endforeach(sourcefile ${TEST_EXES})

  # C executables must link to a shared object
  set(C_TESTS db/c_test.c)
  set(C_TEST_EXES ${C_TESTS})

  foreach(sourcefile ${C_TEST_EXES})
      string(REPLACE ".c" "" exename ${sourcefile})
      string(REGEX REPLACE "^((.+)/)+" "" exename ${exename})
      add_executable(${exename}${ARTIFACT_SUFFIX} ${sourcefile})
      set_target_properties(${exename}${ARTIFACT_SUFFIX}
        PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
        EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
        )
郭宽宽 已提交
1075
      target_link_libraries(${exename}${ARTIFACT_SUFFIX} ${ROCKSDB_STATIC_LIB} testutillib${ARTIFACT_SUFFIX})
1076 1077
      add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
      add_dependencies(check ${exename}${ARTIFACT_SUFFIX})
P
Paweł Bylica 已提交
1078
  endforeach(sourcefile ${C_TEST_EXES})
P
Paweł Bylica 已提交
1079
endif()
A
Arun Sharma 已提交
1080

1081
if(WITH_TOOLS)
郭宽宽 已提交
1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096
  set(BENCHMARKS
    cache/cache_bench.cc
    memtable/memtablerep_bench.cc
    db/range_del_aggregator_bench.cc
    tools/db_bench.cc
    table/table_reader_bench.cc
    utilities/column_aware_encoding_exp.cc
    utilities/persistent_cache/hash_table_bench.cc)
  foreach(sourcefile ${BENCHMARKS})
    get_filename_component(exename ${sourcefile} NAME_WE)
    add_executable(${exename}${ARTIFACT_SUFFIX} ${sourcefile}
      $<TARGET_OBJECTS:testharness>)
    target_link_libraries(${exename}${ARTIFACT_SUFFIX} gtest ${ROCKSDB_STATIC_LIB})
  endforeach(sourcefile ${BENCHMARKS})

P
Paweł Bylica 已提交
1097
  add_subdirectory(tools)
1098
  #add_subdirectory(terark-tools/terark-test)
1099
  add_subdirectory(terark-tools/batch-write-bench)
L
bugfix  
leipeng 已提交
1100
endif()