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