github.com/igggame/nebulas-go@v2.1.0+incompatible/nbre/3rd_party/build_option_bak/CMakeLists.txt-rocksdb (about)

     1  # Prerequisites for Windows:
     2  #     This cmake build is for Windows 64-bit only.
     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.
     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.
     8  #
     9  # To build Rocksdb for Windows is as easy as 1-2-3-4-5:
    10  #
    11  # 1. Update paths to third-party libraries in thirdparty.inc file
    12  # 2. Create a new directory for build artifacts
    13  #        mkdir build
    14  #        cd build
    15  # 3. Run cmake to generate project files for Windows, add more options to enable required third-party libraries.
    16  #    See thirdparty.inc for more information.
    17  #        sample command: cmake -G "Visual Studio 15 Win64" -DWITH_GFLAGS=1 -DWITH_SNAPPY=1 -DWITH_JEMALLOC=1 -DWITH_JNI=1 ..
    18  # 4. Then build the project in debug mode (you may want to add /m[:<N>] flag to run msbuild in <N> parallel threads
    19  #                                          or simply /m to use all avail cores)
    20  #        msbuild rocksdb.sln
    21  #
    22  #        rocksdb.sln build features exclusions of test only code in Release. If you build ALL_BUILD then everything
    23  #        will be attempted but test only code does not build in Release mode.
    24  #
    25  # 5. And release mode (/m[:<N>] is also supported)
    26  #        msbuild rocksdb.sln /p:Configuration=Release
    27  #
    28  # Linux:
    29  #
    30  # 1. Install a recent toolchain such as devtoolset-3 if you're on a older distro. C++11 required.
    31  # 2. mkdir build; cd build
    32  # 3. cmake ..
    33  # 4. make -j
    34  
    35  cmake_minimum_required(VERSION 2.8.12)
    36  project(rocksdb)
    37  enable_language(CXX)
    38  enable_language(C)
    39  enable_language(ASM)
    40  add_definitions(-stdlib=libc++)
    41  
    42  if(POLICY CMP0042)
    43    cmake_policy(SET CMP0042 NEW)
    44  endif()
    45  
    46  list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/")
    47  
    48  option(WITH_JEMALLOC "build with JeMalloc" OFF)
    49  option(WITH_SNAPPY "build with SNAPPY" OFF)
    50  option(WITH_LZ4 "build with lz4" OFF)
    51  option(WITH_ZLIB "build with zlib" OFF)
    52  option(WITH_ZSTD "build with zstd" OFF)
    53  if(MSVC)
    54    # Defaults currently different for GFLAGS.
    55    #  We will address find_package work a little later
    56    option(WITH_GFLAGS "build with GFlags" OFF)
    57    option(WITH_XPRESS "build with windows built in compression" OFF)
    58    include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc)
    59  else()
    60    if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
    61      # FreeBSD has jemalloc as default malloc
    62      # but it does not have all the jemalloc files in include/...
    63      set(WITH_JEMALLOC ON)
    64    else()
    65      if(WITH_JEMALLOC)
    66        find_package(JeMalloc REQUIRED)
    67        add_definitions(-DROCKSDB_JEMALLOC -DJEMALLOC_NO_DEMANGLE)
    68        include_directories(${JEMALLOC_INCLUDE_DIR})
    69        list(APPEND THIRDPARTY_LIBS ${JEMALLOC_LIBRARIES})
    70      endif()
    71    endif()
    72  
    73    # No config file for this
    74    #option(WITH_GFLAGS "build with GFlags" ON)
    75    #if(WITH_GFLAGS)
    76      #find_package(gflags)
    77      #if(gflags_FOUND)
    78        #add_definitions(-DGFLAGS=1)
    79        #include_directories(${gflags_INCLUDE_DIR})
    80        #list(APPEND THIRDPARTY_LIBS ${gflags_LIBRARIES})
    81      #endif()
    82    #endif()
    83  
    84    if(WITH_SNAPPY)
    85      find_package(snappy REQUIRED)
    86      add_definitions(-DSNAPPY)
    87      include_directories(${SNAPPY_INCLUDE_DIR})
    88      list(APPEND THIRDPARTY_LIBS ${SNAPPY_LIBRARIES})
    89    endif()
    90  
    91    if(WITH_ZLIB)
    92      find_package(zlib REQUIRED)
    93      add_definitions(-DZLIB)
    94      include_directories(${ZLIB_INCLUDE_DIR})
    95      list(APPEND THIRDPARTY_LIBS ${ZLIB_LIBRARIES})
    96    endif()
    97  
    98    option(WITH_BZ2 "build with bzip2" OFF)
    99    if(WITH_BZ2)
   100      find_package(bzip2 REQUIRED)
   101      add_definitions(-DBZIP2)
   102      include_directories(${BZIP2_INCLUDE_DIR})
   103      list(APPEND THIRDPARTY_LIBS ${BZIP2_LIBRARIES})
   104    endif()
   105  
   106    if(WITH_LZ4)
   107      find_package(lz4 REQUIRED)
   108      add_definitions(-DLZ4)
   109      include_directories(${LZ4_INCLUDE_DIR})
   110      list(APPEND THIRDPARTY_LIBS ${LZ4_LIBRARIES})
   111    endif()
   112  
   113    if(WITH_ZSTD)
   114      find_package(zstd REQUIRED)
   115      add_definitions(-DZSTD)
   116      include_directories(${ZSTD_INCLUDE_DIR})
   117      list(APPEND THIRDPARTY_LIBS ${ZSTD_LIBRARIES})
   118    endif()
   119  endif()
   120  
   121  string(TIMESTAMP GIT_DATE_TIME "%Y/%m/%d %H:%M:%S" UTC)
   122  
   123  find_package(Git)
   124  
   125  if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
   126    if(WIN32)
   127      execute_process(COMMAND $ENV{COMSPEC} /C ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
   128    else()
   129      execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
   130    endif()
   131  else()
   132    set(GIT_SHA 0)
   133  endif()
   134  
   135  string(REGEX REPLACE "[^0-9a-f]+" "" GIT_SHA "${GIT_SHA}")
   136  
   137  
   138  # Read rocksdb version from version.h header file.
   139  file(READ include/rocksdb/version.h version_header_file)
   140  string(REGEX MATCH "#define ROCKSDB_MAJOR ([0-9]+)" _ ${version_header_file})
   141  set(ROCKSDB_VERSION_MAJOR ${CMAKE_MATCH_1})
   142  string(REGEX MATCH "#define ROCKSDB_MINOR ([0-9]+)" _ ${version_header_file})
   143  set(ROCKSDB_VERSION_MINOR ${CMAKE_MATCH_1})
   144  string(REGEX MATCH "#define ROCKSDB_PATCH ([0-9]+)" _ ${version_header_file})
   145  set(ROCKSDB_VERSION_PATCH ${CMAKE_MATCH_1})
   146  set(ROCKSDB_VERSION ${ROCKSDB_VERSION_MAJOR}.${ROCKSDB_VERSION_MINOR}.${ROCKSDB_VERSION_PATCH})
   147  
   148  
   149  option(WITH_MD_LIBRARY "build with MD" ON)
   150  if(WIN32 AND MSVC)
   151    if(WITH_MD_LIBRARY)
   152      set(RUNTIME_LIBRARY "MD")
   153    else()
   154      set(RUNTIME_LIBRARY "MT")
   155    endif()
   156  endif()
   157  
   158  set(BUILD_VERSION_CC ${CMAKE_BINARY_DIR}/build_version.cc)
   159  configure_file(util/build_version.cc.in ${BUILD_VERSION_CC} @ONLY)
   160  add_library(build_version OBJECT ${BUILD_VERSION_CC})
   161  target_include_directories(build_version PRIVATE
   162    ${CMAKE_CURRENT_SOURCE_DIR}/util)
   163  if(MSVC)
   164    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /nologo /EHsc /GS /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue")
   165    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
   166  else()
   167    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall")
   168    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")
   169    if(MINGW)
   170      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format")
   171    endif()
   172    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
   173    if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
   174      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
   175      include(CheckCXXCompilerFlag)
   176      CHECK_CXX_COMPILER_FLAG("-momit-leaf-frame-pointer" HAVE_OMIT_LEAF_FRAME_POINTER)
   177      if(HAVE_OMIT_LEAF_FRAME_POINTER)
   178        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -momit-leaf-frame-pointer")
   179      endif()
   180    endif()
   181  endif()
   182  
   183  include(CheckCCompilerFlag)
   184  if(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le")
   185    CHECK_C_COMPILER_FLAG("-maltivec" HAS_ALTIVEC)
   186    if(HAS_ALTIVEC)
   187      message(STATUS " HAS_ALTIVEC yes")
   188      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maltivec")
   189      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maltivec")
   190      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power8")
   191      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power8")
   192    endif(HAS_ALTIVEC)
   193  endif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le")
   194  
   195  option(PORTABLE "build a portable binary" OFF)
   196  option(FORCE_SSE42 "force building with SSE4.2, even when PORTABLE=ON" OFF)
   197  if(PORTABLE)
   198    # MSVC does not need a separate compiler flag to enable SSE4.2; if nmmintrin.h
   199    # is available, it is available by default.
   200    if(FORCE_SSE42 AND NOT MSVC)
   201      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpclmul")
   202    endif()
   203  else()
   204    if(MSVC)
   205      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
   206    else()
   207      if(NOT HAVE_POWER8)
   208        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
   209      endif()
   210    endif()
   211  endif()
   212  
   213  include(CheckCXXSourceCompiles)
   214  if(NOT MSVC)
   215    set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
   216  endif()
   217  CHECK_CXX_SOURCE_COMPILES("
   218  #include <cstdint>
   219  #include <nmmintrin.h>
   220  #include <wmmintrin.h>
   221  int main() {
   222    volatile uint32_t x = _mm_crc32_u32(0, 0);
   223    const auto a = _mm_set_epi64x(0, 0);
   224    const auto b = _mm_set_epi64x(0, 0);
   225    const auto c = _mm_clmulepi64_si128(a, b, 0x00);
   226    auto d = _mm_cvtsi128_si64(c);
   227  }
   228  " HAVE_SSE42)
   229  unset(CMAKE_REQUIRED_FLAGS)
   230  if(HAVE_SSE42)
   231    add_definitions(-DHAVE_SSE42)
   232    add_definitions(-DHAVE_PCLMUL)
   233  elseif(FORCE_SSE42)
   234    message(FATAL_ERROR "FORCE_SSE42=ON but unable to compile with SSE4.2 enabled")
   235  endif()
   236  
   237  CHECK_CXX_SOURCE_COMPILES("
   238  #if defined(_MSC_VER) && !defined(__thread)
   239  #define __thread __declspec(thread)
   240  #endif
   241  int main() {
   242    static __thread int tls;
   243  }
   244  " HAVE_THREAD_LOCAL)
   245  if(HAVE_THREAD_LOCAL)
   246    add_definitions(-DROCKSDB_SUPPORT_THREAD_LOCAL)
   247  endif()
   248  
   249  option(FAIL_ON_WARNINGS "Treat compile warnings as errors" ON)
   250  if(FAIL_ON_WARNINGS)
   251    if(MSVC)
   252      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")
   253    else() # assume GCC
   254      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
   255    endif()
   256  endif()
   257  
   258  option(WITH_ASAN "build with ASAN" OFF)
   259  if(WITH_ASAN)
   260    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
   261    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
   262    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
   263    if(WITH_JEMALLOC)
   264      message(FATAL "ASAN does not work well with JeMalloc")
   265    endif()
   266  endif()
   267  
   268  option(WITH_TSAN "build with TSAN" OFF)
   269  if(WITH_TSAN)
   270    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread -pie")
   271    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fPIC")
   272    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fPIC")
   273    if(WITH_JEMALLOC)
   274      message(FATAL "TSAN does not work well with JeMalloc")
   275    endif()
   276  endif()
   277  
   278  option(WITH_UBSAN "build with UBSAN" OFF)
   279  if(WITH_UBSAN)
   280    add_definitions(-DROCKSDB_UBSAN_RUN)
   281    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined")
   282    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
   283    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined")
   284    if(WITH_JEMALLOC)
   285      message(FATAL "UBSAN does not work well with JeMalloc")
   286    endif()
   287  endif()
   288  
   289  option(WITH_NUMA "build with NUMA policy support" OFF)
   290  if(WITH_NUMA)
   291    find_package(NUMA REQUIRED)
   292    add_definitions(-DNUMA)
   293    include_directories(${NUMA_INCLUDE_DIR})
   294    list(APPEND THIRDPARTY_LIBS ${NUMA_LIBRARIES})
   295  endif()
   296  
   297  option(WITH_TBB "build with Threading Building Blocks (TBB)" OFF)
   298  if(WITH_TBB)
   299    find_package(TBB REQUIRED)
   300    add_definitions(-DTBB)
   301    include_directories(${TBB_INCLUDE_DIR})
   302    list(APPEND THIRDPARTY_LIBS ${TBB_LIBRARIES})
   303  endif()
   304  
   305  # Stall notifications eat some performance from inserts
   306  option(DISABLE_STALL_NOTIF "Build with stall notifications" OFF)
   307  if(DISABLE_STALL_NOTIF)
   308    add_definitions(-DROCKSDB_DISABLE_STALL_NOTIFICATION)
   309  endif()
   310  
   311  
   312  if(DEFINED USE_RTTI)
   313    if(USE_RTTI)
   314      message(STATUS "Enabling RTTI")
   315      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
   316      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DROCKSDB_USE_RTTI")
   317    else()
   318      if(MSVC)
   319        message(STATUS "Disabling RTTI in Release builds. Always on in Debug.")
   320        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
   321        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
   322      else()
   323        message(STATUS "Disabling RTTI in Release builds")
   324        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-rtti")
   325        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti")
   326      endif()
   327    endif()
   328  else()
   329    message(STATUS "Enabling RTTI in Debug builds only (default)")
   330    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
   331    if(MSVC)
   332       set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
   333    else()
   334      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti")
   335    endif()
   336  endif()
   337  
   338  # Used to run CI build and tests so we can run faster
   339  option(OPTDBG "Build optimized debug build with MSVC" OFF)
   340  if(MSVC)
   341    if(OPTDBG)
   342      message(STATUS "Debug optimization is enabled")
   343      set(CMAKE_CXX_FLAGS_DEBUG "/Oxt /${RUNTIME_LIBRARY}d")
   344    else()
   345      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /RTC1 /Gm /${RUNTIME_LIBRARY}d")
   346    endif()
   347    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
   348  
   349    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
   350    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
   351  endif()
   352  
   353  if(CMAKE_COMPILER_IS_GNUCXX)
   354    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-memcmp")
   355  endif()
   356  
   357  option(ROCKSDB_LITE "Build RocksDBLite version" OFF)
   358  if(ROCKSDB_LITE)
   359    add_definitions(-DROCKSDB_LITE)
   360    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
   361  endif()
   362  
   363  if(CMAKE_SYSTEM_NAME MATCHES "Cygwin")
   364    add_definitions(-fno-builtin-memcmp -DCYGWIN)
   365  elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
   366    add_definitions(-DOS_MACOSX)
   367    if(CMAKE_SYSTEM_PROCESSOR MATCHES arm)
   368      add_definitions(-DIOS_CROSS_COMPILE -DROCKSDB_LITE)
   369      # no debug info for IOS, that will make our library big
   370      add_definitions(-DNDEBUG)
   371    endif()
   372  elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
   373    add_definitions(-DOS_LINUX)
   374  elseif(CMAKE_SYSTEM_NAME MATCHES "SunOS")
   375    add_definitions(-DOS_SOLARIS)
   376  elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
   377    add_definitions(-DOS_FREEBSD)
   378  elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
   379    add_definitions(-DOS_NETBSD)
   380  elseif(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
   381    add_definitions(-DOS_OPENBSD)
   382  elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly")
   383    add_definitions(-DOS_DRAGONFLYBSD)
   384  elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
   385    add_definitions(-DOS_ANDROID)
   386  elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
   387    add_definitions(-DWIN32 -DOS_WIN -D_MBCS -DWIN64 -DNOMINMAX)
   388    if(MINGW)
   389      add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_VISTA)
   390    endif()
   391  endif()
   392  
   393  if(NOT WIN32)
   394    add_definitions(-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX)
   395  endif()
   396  
   397  option(WITH_FALLOCATE "build with fallocate" ON)
   398  if(WITH_FALLOCATE)
   399    CHECK_CXX_SOURCE_COMPILES("
   400  #include <fcntl.h>
   401  #include <linux/falloc.h>
   402  int main() {
   403   int fd = open(\"/dev/null\", 0);
   404   fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, 0, 1024);
   405  }
   406  " HAVE_FALLOCATE)
   407    if(HAVE_FALLOCATE)
   408      add_definitions(-DROCKSDB_FALLOCATE_PRESENT)
   409    endif()
   410  endif()
   411  
   412  CHECK_CXX_SOURCE_COMPILES("
   413  #include <fcntl.h>
   414  int main() {
   415    int fd = open(\"/dev/null\", 0);
   416    sync_file_range(fd, 0, 1024, SYNC_FILE_RANGE_WRITE);
   417  }
   418  " HAVE_SYNC_FILE_RANGE_WRITE)
   419  if(HAVE_SYNC_FILE_RANGE_WRITE)
   420    add_definitions(-DROCKSDB_RANGESYNC_PRESENT)
   421  endif()
   422  
   423  CHECK_CXX_SOURCE_COMPILES("
   424  #include <pthread.h>
   425  int main() {
   426    (void) PTHREAD_MUTEX_ADAPTIVE_NP;
   427  }
   428  " HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
   429  if(HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
   430    add_definitions(-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX)
   431  endif()
   432  
   433  include(CheckCXXSymbolExists)
   434  check_cxx_symbol_exists(malloc_usable_size malloc.h HAVE_MALLOC_USABLE_SIZE)
   435  if(HAVE_MALLOC_USABLE_SIZE)
   436    add_definitions(-DROCKSDB_MALLOC_USABLE_SIZE)
   437  endif()
   438  
   439  check_cxx_symbol_exists(sched_getcpu sched.h HAVE_SCHED_GETCPU)
   440  if(HAVE_SCHED_GETCPU)
   441    add_definitions(-DROCKSDB_SCHED_GETCPU_PRESENT)
   442  endif()
   443  
   444  include_directories(${PROJECT_SOURCE_DIR})
   445  include_directories(${PROJECT_SOURCE_DIR}/include)
   446  include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/gtest-1.7.0/fused-src)
   447  find_package(Threads REQUIRED)
   448  
   449  add_subdirectory(third-party/gtest-1.7.0/fused-src/gtest)
   450  
   451  # Main library source code
   452  
   453  set(SOURCES
   454          cache/clock_cache.cc
   455          cache/lru_cache.cc
   456          cache/sharded_cache.cc
   457          db/builder.cc
   458          db/c.cc
   459          db/column_family.cc
   460          db/compacted_db_impl.cc
   461          db/compaction.cc
   462          db/compaction_iterator.cc
   463          db/compaction_job.cc
   464          db/compaction_picker.cc
   465          db/compaction_picker_universal.cc
   466          db/convenience.cc
   467          db/db_filesnapshot.cc
   468          db/db_impl.cc
   469          db/db_impl_write.cc
   470          db/db_impl_compaction_flush.cc
   471          db/db_impl_files.cc
   472          db/db_impl_open.cc
   473          db/db_impl_debug.cc
   474          db/db_impl_experimental.cc
   475          db/db_impl_readonly.cc
   476          db/db_info_dumper.cc
   477          db/db_iter.cc
   478          db/dbformat.cc
   479          db/error_handler.cc
   480          db/event_helpers.cc
   481          db/experimental.cc
   482          db/external_sst_file_ingestion_job.cc
   483          db/file_indexer.cc
   484          db/flush_job.cc
   485          db/flush_scheduler.cc
   486          db/forward_iterator.cc
   487          db/internal_stats.cc
   488          db/logs_with_prep_tracker.cc
   489          db/log_reader.cc
   490          db/log_writer.cc
   491          db/malloc_stats.cc
   492          db/memtable.cc
   493          db/memtable_list.cc
   494          db/merge_helper.cc
   495          db/merge_operator.cc
   496          db/range_del_aggregator.cc
   497          db/repair.cc
   498          db/snapshot_impl.cc
   499          db/table_cache.cc
   500          db/table_properties_collector.cc
   501          db/transaction_log_impl.cc
   502          db/version_builder.cc
   503          db/version_edit.cc
   504          db/version_set.cc
   505          db/wal_manager.cc
   506          db/write_batch.cc
   507          db/write_batch_base.cc
   508          db/write_controller.cc
   509          db/write_thread.cc
   510          env/env.cc
   511          env/env_chroot.cc
   512          env/env_encryption.cc
   513          env/env_hdfs.cc
   514          env/mock_env.cc
   515          memtable/alloc_tracker.cc
   516          memtable/hash_cuckoo_rep.cc
   517          memtable/hash_linklist_rep.cc
   518          memtable/hash_skiplist_rep.cc
   519          memtable/skiplistrep.cc
   520          memtable/vectorrep.cc
   521          memtable/write_buffer_manager.cc
   522          monitoring/histogram.cc
   523          monitoring/histogram_windowing.cc
   524          monitoring/instrumented_mutex.cc
   525          monitoring/iostats_context.cc
   526          monitoring/perf_context.cc
   527          monitoring/perf_level.cc
   528          monitoring/statistics.cc
   529          monitoring/thread_status_impl.cc
   530          monitoring/thread_status_updater.cc
   531          monitoring/thread_status_util.cc
   532          monitoring/thread_status_util_debug.cc
   533          options/cf_options.cc
   534          options/db_options.cc
   535          options/options.cc
   536          options/options_helper.cc
   537          options/options_parser.cc
   538          options/options_sanity_check.cc
   539          port/stack_trace.cc
   540          table/adaptive_table_factory.cc
   541          table/block.cc
   542          table/block_based_filter_block.cc
   543          table/block_based_table_builder.cc
   544          table/block_based_table_factory.cc
   545          table/block_based_table_reader.cc
   546          table/block_builder.cc
   547          table/block_fetcher.cc
   548          table/block_prefix_index.cc
   549          table/bloom_block.cc
   550          table/cuckoo_table_builder.cc
   551          table/cuckoo_table_factory.cc
   552          table/cuckoo_table_reader.cc
   553          table/flush_block_policy.cc
   554          table/format.cc
   555          table/full_filter_block.cc
   556          table/get_context.cc
   557          table/index_builder.cc
   558          table/iterator.cc
   559          table/merging_iterator.cc
   560          table/meta_blocks.cc
   561          table/partitioned_filter_block.cc
   562          table/persistent_cache_helper.cc
   563          table/plain_table_builder.cc
   564          table/plain_table_factory.cc
   565          table/plain_table_index.cc
   566          table/plain_table_key_coding.cc
   567          table/plain_table_reader.cc
   568          table/sst_file_writer.cc
   569          table/table_properties.cc
   570          table/two_level_iterator.cc
   571          tools/db_bench_tool.cc
   572          tools/dump/db_dump_tool.cc
   573          tools/ldb_cmd.cc
   574          tools/ldb_tool.cc
   575          tools/sst_dump_tool.cc
   576          util/arena.cc
   577          util/auto_roll_logger.cc
   578          util/bloom.cc
   579          util/coding.cc
   580          util/compaction_job_stats_impl.cc
   581          util/comparator.cc
   582          util/compression_context_cache.cc
   583          util/concurrent_arena.cc
   584          util/crc32c.cc
   585          util/delete_scheduler.cc
   586          util/dynamic_bloom.cc
   587          util/event_logger.cc
   588          util/file_reader_writer.cc
   589          util/file_util.cc
   590          util/filename.cc
   591          util/filter_policy.cc
   592          util/hash.cc
   593          util/log_buffer.cc
   594          util/murmurhash.cc
   595          util/random.cc
   596          util/rate_limiter.cc
   597          util/slice.cc
   598          util/sst_file_manager_impl.cc
   599          util/status.cc
   600          util/status_message.cc
   601          util/string_util.cc
   602          util/sync_point.cc
   603          util/sync_point_impl.cc
   604          util/testutil.cc
   605          util/thread_local.cc
   606          util/threadpool_imp.cc
   607          util/transaction_test_util.cc
   608          util/xxhash.cc
   609          utilities/backupable/backupable_db.cc
   610          utilities/blob_db/blob_compaction_filter.cc
   611          utilities/blob_db/blob_db.cc
   612          utilities/blob_db/blob_db_impl.cc
   613          utilities/blob_db/blob_dump_tool.cc
   614          utilities/blob_db/blob_file.cc
   615          utilities/blob_db/blob_log_reader.cc
   616          utilities/blob_db/blob_log_writer.cc
   617          utilities/blob_db/blob_log_format.cc
   618          utilities/cassandra/cassandra_compaction_filter.cc
   619          utilities/cassandra/format.cc
   620          utilities/cassandra/merge_operator.cc
   621          utilities/checkpoint/checkpoint_impl.cc
   622          utilities/col_buf_decoder.cc
   623          utilities/col_buf_encoder.cc
   624          utilities/column_aware_encoding_util.cc
   625          utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc
   626          utilities/date_tiered/date_tiered_db_impl.cc
   627          utilities/debug.cc
   628          utilities/document/document_db.cc
   629          utilities/document/json_document.cc
   630          utilities/document/json_document_builder.cc
   631          utilities/env_mirror.cc
   632          utilities/env_timed.cc
   633          utilities/geodb/geodb_impl.cc
   634          utilities/leveldb_options/leveldb_options.cc
   635          utilities/lua/rocks_lua_compaction_filter.cc
   636          utilities/memory/memory_util.cc
   637          utilities/merge_operators/bytesxor.cc
   638          utilities/merge_operators/max.cc
   639          utilities/merge_operators/put.cc
   640          utilities/merge_operators/string_append/stringappend.cc
   641          utilities/merge_operators/string_append/stringappend2.cc
   642          utilities/merge_operators/uint64add.cc
   643          utilities/option_change_migration/option_change_migration.cc
   644          utilities/options/options_util.cc
   645          utilities/persistent_cache/block_cache_tier.cc
   646          utilities/persistent_cache/block_cache_tier_file.cc
   647          utilities/persistent_cache/block_cache_tier_metadata.cc
   648          utilities/persistent_cache/persistent_cache_tier.cc
   649          utilities/persistent_cache/volatile_tier_impl.cc
   650          utilities/redis/redis_lists.cc
   651          utilities/simulator_cache/sim_cache.cc
   652          utilities/spatialdb/spatial_db.cc
   653          utilities/table_properties_collectors/compact_on_deletion_collector.cc
   654          utilities/transactions/optimistic_transaction_db_impl.cc
   655          utilities/transactions/optimistic_transaction.cc
   656          utilities/transactions/pessimistic_transaction.cc
   657          utilities/transactions/pessimistic_transaction_db.cc
   658          utilities/transactions/snapshot_checker.cc
   659          utilities/transactions/transaction_base.cc
   660          utilities/transactions/transaction_db_mutex_impl.cc
   661          utilities/transactions/transaction_lock_mgr.cc
   662          utilities/transactions/transaction_util.cc
   663          utilities/transactions/write_prepared_txn.cc
   664          utilities/transactions/write_prepared_txn_db.cc
   665          utilities/transactions/write_unprepared_txn.cc
   666          utilities/transactions/write_unprepared_txn_db.cc
   667          utilities/ttl/db_ttl_impl.cc
   668          utilities/write_batch_with_index/write_batch_with_index.cc
   669          utilities/write_batch_with_index/write_batch_with_index_internal.cc
   670          $<TARGET_OBJECTS:build_version>)
   671  
   672  if(HAVE_SSE42 AND NOT FORCE_SSE42)
   673    if(NOT MSVC)
   674  set_source_files_properties(
   675    util/crc32c.cc
   676        PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul")
   677    endif()
   678  endif()
   679  
   680  if(HAVE_POWER8)
   681    list(APPEND SOURCES
   682      util/crc32c_ppc.c
   683      util/crc32c_ppc_asm.S)
   684  endif(HAVE_POWER8)
   685  
   686  if(WIN32)
   687    list(APPEND SOURCES
   688      port/win/io_win.cc
   689      port/win/env_win.cc
   690      port/win/env_default.cc
   691      port/win/port_win.cc
   692      port/win/win_logger.cc
   693      port/win/win_thread.cc)
   694  
   695  if(WITH_XPRESS)
   696    list(APPEND SOURCES
   697      port/win/xpress_win.cc)
   698  endif()
   699  
   700  if(WITH_JEMALLOC)
   701    list(APPEND SOURCES
   702      port/win/win_jemalloc.cc)
   703  endif()
   704  
   705  else()
   706    list(APPEND SOURCES
   707      port/port_posix.cc
   708      env/env_posix.cc
   709      env/io_posix.cc)
   710  endif()
   711  
   712  set(ROCKSDB_STATIC_LIB rocksdb${ARTIFACT_SUFFIX})
   713  set(ROCKSDB_SHARED_LIB rocksdb-shared${ARTIFACT_SUFFIX})
   714  set(ROCKSDB_IMPORT_LIB ${ROCKSDB_SHARED_LIB})
   715  
   716  option(WITH_LIBRADOS "Build with librados" OFF)
   717  if(WITH_LIBRADOS)
   718    list(APPEND SOURCES
   719      utilities/env_librados.cc)
   720    list(APPEND THIRDPARTY_LIBS rados)
   721  endif()
   722  
   723  if(WIN32)
   724    set(SYSTEM_LIBS ${SYSTEM_LIBS} Shlwapi.lib Rpcrt4.lib)
   725    set(LIBS ${ROCKSDB_STATIC_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
   726  else()
   727    set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
   728    set(LIBS ${ROCKSDB_SHARED_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
   729  
   730    add_library(${ROCKSDB_SHARED_LIB} SHARED ${SOURCES})
   731    target_link_libraries(${ROCKSDB_SHARED_LIB}
   732      ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
   733    set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
   734                          LINKER_LANGUAGE CXX
   735                          VERSION ${ROCKSDB_VERSION}
   736                          SOVERSION ${ROCKSDB_VERSION_MAJOR}
   737                          CXX_STANDARD 11
   738                          OUTPUT_NAME "rocksdb")
   739  endif()
   740  
   741  add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES})
   742  target_link_libraries(${ROCKSDB_STATIC_LIB}
   743    ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
   744  
   745  if(WIN32)
   746    add_library(${ROCKSDB_IMPORT_LIB} SHARED ${SOURCES})
   747    target_link_libraries(${ROCKSDB_IMPORT_LIB}
   748      ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
   749    set_target_properties(${ROCKSDB_IMPORT_LIB} PROPERTIES
   750      COMPILE_DEFINITIONS "ROCKSDB_DLL;ROCKSDB_LIBRARY_EXPORTS")
   751    if(MSVC)
   752      set_target_properties(${ROCKSDB_STATIC_LIB} PROPERTIES
   753        COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_STATIC_LIB}.pdb")
   754      set_target_properties(${ROCKSDB_IMPORT_LIB} PROPERTIES
   755        COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_IMPORT_LIB}.pdb")
   756    endif()
   757  endif()
   758  
   759  option(WITH_JNI "build with JNI" OFF)
   760  if(WITH_JNI OR JNI)
   761    message(STATUS "JNI library is enabled")
   762    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/java)
   763  else()
   764    message(STATUS "JNI library is disabled")
   765  endif()
   766  
   767  # Installation and packaging
   768  if(WIN32)
   769    option(ROCKSDB_INSTALL_ON_WINDOWS "Enable install target on Windows" OFF)
   770  endif()
   771  if(NOT WIN32 OR ROCKSDB_INSTALL_ON_WINDOWS)
   772    if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
   773      if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
   774        # Change default installation prefix on Linux to /usr
   775        set(CMAKE_INSTALL_PREFIX /usr CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
   776      endif()
   777    endif()
   778  
   779    include(GNUInstallDirs)
   780    include(CMakePackageConfigHelpers)
   781  
   782    set(package_config_destination ${CMAKE_INSTALL_LIBDIR}/cmake/rocksdb)
   783  
   784    configure_package_config_file(
   785      ${CMAKE_CURRENT_LIST_DIR}/cmake/RocksDBConfig.cmake.in RocksDBConfig.cmake
   786      INSTALL_DESTINATION ${package_config_destination}
   787    )
   788  
   789    write_basic_package_version_file(
   790      RocksDBConfigVersion.cmake
   791      VERSION ${ROCKSDB_VERSION}
   792      COMPATIBILITY SameMajorVersion
   793    )
   794  
   795    install(DIRECTORY include/rocksdb COMPONENT devel DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
   796  
   797    install(
   798      TARGETS ${ROCKSDB_STATIC_LIB}
   799      EXPORT RocksDBTargets
   800      COMPONENT devel
   801      ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
   802      INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
   803    )
   804  
   805    install(
   806      TARGETS ${ROCKSDB_SHARED_LIB}
   807      EXPORT RocksDBTargets
   808      COMPONENT runtime
   809      RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
   810      LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
   811      INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
   812    )
   813  
   814    install(
   815      EXPORT RocksDBTargets
   816      COMPONENT devel
   817      DESTINATION ${package_config_destination}
   818      NAMESPACE RocksDB::
   819    )
   820  
   821    install(
   822      FILES
   823      ${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfig.cmake
   824      ${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfigVersion.cmake
   825      COMPONENT devel
   826      DESTINATION ${package_config_destination}
   827    )
   828  endif()
   829  
   830  option(WITH_TESTS "build with tests" ON)
   831  if(WITH_TESTS)
   832    set(TESTS
   833          cache/cache_test.cc
   834          cache/lru_cache_test.cc
   835          db/column_family_test.cc
   836          db/compact_files_test.cc
   837          db/compaction_iterator_test.cc
   838          db/compaction_job_stats_test.cc
   839          db/compaction_job_test.cc
   840          db/compaction_picker_test.cc
   841          db/comparator_db_test.cc
   842          db/corruption_test.cc
   843          db/cuckoo_table_db_test.cc
   844          db/db_basic_test.cc
   845          db/db_blob_index_test.cc
   846          db/db_block_cache_test.cc
   847          db/db_bloom_filter_test.cc
   848          db/db_compaction_filter_test.cc
   849          db/db_compaction_test.cc
   850          db/db_dynamic_level_test.cc
   851          db/db_flush_test.cc
   852          db/db_inplace_update_test.cc
   853          db/db_io_failure_test.cc
   854          db/db_iter_test.cc
   855          db/db_iter_stress_test.cc
   856          db/db_iterator_test.cc
   857          db/db_log_iter_test.cc
   858          db/db_memtable_test.cc
   859          db/db_merge_operator_test.cc
   860          db/db_options_test.cc
   861          db/db_properties_test.cc
   862          db/db_range_del_test.cc
   863          db/db_sst_test.cc
   864          db/db_statistics_test.cc
   865          db/db_table_properties_test.cc
   866          db/db_tailing_iter_test.cc
   867          db/db_test.cc
   868          db/db_test2.cc
   869          db/db_universal_compaction_test.cc
   870          db/db_wal_test.cc
   871          db/db_write_test.cc
   872          db/dbformat_test.cc
   873          db/deletefile_test.cc
   874          db/error_handler_test.cc
   875          db/obsolete_files_test.cc
   876          db/external_sst_file_basic_test.cc
   877          db/external_sst_file_test.cc
   878          db/fault_injection_test.cc
   879          db/file_indexer_test.cc
   880          db/filename_test.cc
   881          db/flush_job_test.cc
   882          db/listener_test.cc
   883          db/log_test.cc
   884          db/manual_compaction_test.cc
   885          db/memtable_list_test.cc
   886          db/merge_helper_test.cc
   887          db/merge_test.cc
   888          db/options_file_test.cc
   889          db/perf_context_test.cc
   890          db/plain_table_db_test.cc
   891          db/prefix_test.cc
   892          db/repair_test.cc
   893          db/table_properties_collector_test.cc
   894          db/version_builder_test.cc
   895          db/version_edit_test.cc
   896          db/version_set_test.cc
   897          db/wal_manager_test.cc
   898          db/write_batch_test.cc
   899          db/write_callback_test.cc
   900          db/write_controller_test.cc
   901          env/env_basic_test.cc
   902          env/env_test.cc
   903          env/mock_env_test.cc
   904          memtable/inlineskiplist_test.cc
   905          memtable/skiplist_test.cc
   906          memtable/write_buffer_manager_test.cc
   907          monitoring/histogram_test.cc
   908          monitoring/iostats_context_test.cc
   909          monitoring/statistics_test.cc
   910          options/options_settable_test.cc
   911          options/options_test.cc
   912          table/block_based_filter_block_test.cc
   913          table/block_test.cc
   914          table/cleanable_test.cc
   915          table/cuckoo_table_builder_test.cc
   916          table/cuckoo_table_reader_test.cc
   917          table/full_filter_block_test.cc
   918          table/merger_test.cc
   919          table/table_test.cc
   920          tools/ldb_cmd_test.cc
   921          tools/reduce_levels_test.cc
   922          tools/sst_dump_test.cc
   923          util/arena_test.cc
   924          util/auto_roll_logger_test.cc
   925          util/autovector_test.cc
   926          util/bloom_test.cc
   927          util/coding_test.cc
   928          util/crc32c_test.cc
   929          util/delete_scheduler_test.cc
   930          util/dynamic_bloom_test.cc
   931          util/event_logger_test.cc
   932          util/file_reader_writer_test.cc
   933          util/filelock_test.cc
   934          util/hash_test.cc
   935          util/heap_test.cc
   936          util/rate_limiter_test.cc
   937          util/slice_transform_test.cc
   938          util/timer_queue_test.cc
   939          util/thread_list_test.cc
   940          util/thread_local_test.cc
   941          utilities/backupable/backupable_db_test.cc
   942          utilities/blob_db/blob_db_test.cc
   943          utilities/cassandra/cassandra_functional_test.cc
   944          utilities/cassandra/cassandra_format_test.cc
   945          utilities/cassandra/cassandra_row_merge_test.cc
   946          utilities/cassandra/cassandra_serialize_test.cc
   947          utilities/checkpoint/checkpoint_test.cc
   948          utilities/column_aware_encoding_test.cc
   949          utilities/date_tiered/date_tiered_test.cc
   950          utilities/document/document_db_test.cc
   951          utilities/document/json_document_test.cc
   952          utilities/geodb/geodb_test.cc
   953          utilities/lua/rocks_lua_test.cc
   954          utilities/memory/memory_test.cc
   955          utilities/merge_operators/string_append/stringappend_test.cc
   956          utilities/object_registry_test.cc
   957          utilities/option_change_migration/option_change_migration_test.cc
   958          utilities/options/options_util_test.cc
   959          utilities/persistent_cache/hash_table_test.cc
   960          utilities/persistent_cache/persistent_cache_test.cc
   961          utilities/redis/redis_lists_test.cc
   962          utilities/spatialdb/spatial_db_test.cc
   963          utilities/simulator_cache/sim_cache_test.cc
   964          utilities/table_properties_collectors/compact_on_deletion_collector_test.cc
   965          utilities/transactions/optimistic_transaction_test.cc
   966          utilities/transactions/transaction_test.cc
   967          utilities/transactions/write_prepared_transaction_test.cc
   968          utilities/transactions/write_unprepared_transaction_test.cc
   969          utilities/ttl/ttl_test.cc
   970          utilities/write_batch_with_index/write_batch_with_index_test.cc
   971    )
   972    if(WITH_LIBRADOS)
   973      list(APPEND TESTS utilities/env_librados_test.cc)
   974    endif()
   975  
   976    set(BENCHMARKS
   977      cache/cache_bench.cc
   978      memtable/memtablerep_bench.cc
   979      tools/db_bench.cc
   980      table/table_reader_bench.cc
   981      utilities/column_aware_encoding_exp.cc
   982      utilities/persistent_cache/hash_table_bench.cc)
   983    add_library(testharness OBJECT util/testharness.cc)
   984    foreach(sourcefile ${BENCHMARKS})
   985      get_filename_component(exename ${sourcefile} NAME_WE)
   986      add_executable(${exename}${ARTIFACT_SUFFIX} ${sourcefile}
   987        $<TARGET_OBJECTS:testharness>)
   988      target_link_libraries(${exename}${ARTIFACT_SUFFIX} gtest ${LIBS})
   989    endforeach(sourcefile ${BENCHMARKS})
   990  
   991    # For test util library that is build only in DEBUG mode
   992    # and linked to tests. Add test only code that is not #ifdefed for Release here.
   993    set(TESTUTIL_SOURCE
   994        db/db_test_util.cc
   995        monitoring/thread_status_updater_debug.cc
   996        table/mock_table.cc
   997        util/fault_injection_test_env.cc
   998        utilities/cassandra/test_utils.cc
   999    )
  1000    # test utilities are only build in debug
  1001    enable_testing()
  1002    add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
  1003    set(TESTUTILLIB testutillib${ARTIFACT_SUFFIX})
  1004    add_library(${TESTUTILLIB} STATIC ${TESTUTIL_SOURCE})
  1005    if(MSVC)
  1006      set_target_properties(${TESTUTILLIB} PROPERTIES COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/testutillib${ARTIFACT_SUFFIX}.pdb")
  1007    endif()
  1008    set_target_properties(${TESTUTILLIB}
  1009          PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
  1010          EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
  1011          EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
  1012          )
  1013  
  1014    # Tests are excluded from Release builds
  1015    set(TEST_EXES ${TESTS})
  1016  
  1017    foreach(sourcefile ${TEST_EXES})
  1018        get_filename_component(exename ${sourcefile} NAME_WE)
  1019        add_executable(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} ${sourcefile}
  1020          $<TARGET_OBJECTS:testharness>)
  1021        set_target_properties(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX}
  1022          PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
  1023          EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
  1024          EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
  1025          OUTPUT_NAME ${exename}${ARTIFACT_SUFFIX}
  1026          )
  1027        target_link_libraries(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} testutillib${ARTIFACT_SUFFIX} gtest ${LIBS})
  1028        if(NOT "${exename}" MATCHES "db_sanity_test")
  1029          add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
  1030          add_dependencies(check ${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX})
  1031        endif()
  1032    endforeach(sourcefile ${TEST_EXES})
  1033  
  1034    # C executables must link to a shared object
  1035    set(C_TESTS db/c_test.c)
  1036    set(C_TEST_EXES ${C_TESTS})
  1037  
  1038    foreach(sourcefile ${C_TEST_EXES})
  1039        string(REPLACE ".c" "" exename ${sourcefile})
  1040        string(REGEX REPLACE "^((.+)/)+" "" exename ${exename})
  1041        add_executable(${exename}${ARTIFACT_SUFFIX} ${sourcefile})
  1042        set_target_properties(${exename}${ARTIFACT_SUFFIX}
  1043          PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
  1044          EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
  1045          EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
  1046          )
  1047        target_link_libraries(${exename}${ARTIFACT_SUFFIX} ${ROCKSDB_IMPORT_LIB} testutillib${ARTIFACT_SUFFIX})
  1048        add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
  1049        add_dependencies(check ${exename}${ARTIFACT_SUFFIX})
  1050    endforeach(sourcefile ${C_TEST_EXES})
  1051  endif()
  1052  
  1053  option(WITH_TOOLS "build with tools" ON)
  1054  if(WITH_TOOLS)
  1055    add_subdirectory(tools)
  1056  endif()