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