summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorcostan <costan@google.com>2018-03-16 19:10:13 -0700
committerVictor Costan <pwnall@chromium.org>2018-03-16 19:17:27 -0700
commit739c25100e46576cdcdfff2d6f43f9f7008103c7 (patch)
tree92fc9ecdd918383f73983cfb3e81dbc5bce8a901 /CMakeLists.txt
parent0fa5a4f7b1ad9dc16b705bcad1f3ca913f187325 (diff)
downloadleveldb-739c25100e46576cdcdfff2d6f43f9f7008103c7.tar.gz
Add CMake build support.
Fixes https://github.com/google/leveldb/issues/466 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=189425354
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt412
1 files changed, 412 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..df486ea
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,412 @@
+# Copyright 2017 The LevelDB Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file. See the AUTHORS file for names of contributors.
+
+cmake_minimum_required(VERSION 3.9)
+project(Leveldb VERSION 0.1.0 LANGUAGES C CXX)
+
+# This project can take advantage of C++11.
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED OFF)
+set(CMAKE_CXX_EXTENSIONS OFF)
+
+option(LEVELDB_BUILD_TESTS "Build LevelDB's unit tests" ON)
+option(LEVELDB_BUILD_BENCHMARKS "Build LevelDB's benchmarks" ON)
+option(LEVELDB_INSTALL "Install LevelDB's header and library" ON)
+
+include(TestBigEndian)
+test_big_endian(LEVELDB_IS_BIG_ENDIAN)
+
+include(CheckIncludeFile)
+check_include_file("unistd.h" HAVE_UNISTD_H)
+
+include(CheckIncludeFileCXX)
+check_include_file_cxx("atomic" LEVELDB_ATOMIC_PRESENT)
+
+include(CheckLibraryExists)
+check_library_exists(crc32c crc32c_value "" HAVE_CRC32C)
+check_library_exists(snappy snappy_compress "" HAVE_SNAPPY)
+check_library_exists(tcmalloc malloc "" HAVE_TCMALLOC)
+
+include(CheckSymbolExists)
+check_symbol_exists(fdatasync "unistd.h" HAVE_FDATASYNC)
+
+include(CheckCXXSourceCompiles)
+
+# Test whether -Wthread-safety is available. See
+# https://clang.llvm.org/docs/ThreadSafetyAnalysis.html
+# -Werror is necessary because unknown attributes only generate warnings.
+set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
+list(APPEND CMAKE_REQUIRED_FLAGS -Werror -Wthread-safety)
+check_cxx_source_compiles("
+struct __attribute__((lockable)) Lock {
+ void Acquire() __attribute__((exclusive_lock_function()));
+ void Release() __attribute__((unlock_function()));
+};
+struct ThreadSafeType {
+ Lock lock_;
+ int data_ __attribute__((guarded_by(lock_)));
+};
+int main() { return 0; }
+" HAVE_CLANG_THREAD_SAFETY)
+set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
+
+set(LEVELDB_PUBLIC_INCLUDE_DIR "include/leveldb")
+set(LEVELDB_PORT_CONFIG_DIR "include/port")
+
+configure_file(
+ "${PROJECT_SOURCE_DIR}/port/port_config.h.in"
+ "${PROJECT_BINARY_DIR}/${LEVELDB_PORT_CONFIG_DIR}/port_config.h"
+)
+
+include_directories(
+ "${PROJECT_BINARY_DIR}/include"
+ "${PROJECT_SOURCE_DIR}"
+)
+
+if(BUILD_SHARED_LIBS)
+ # Only export LEVELDB_EXPORT symbols from the shared library.
+ add_compile_options(-fvisibility=hidden)
+endif(BUILD_SHARED_LIBS)
+
+# POSIX code is specified separately so we can leave it out in the future.
+add_library(leveldb_port_posix OBJECT "")
+target_sources(leveldb_port_posix
+ PRIVATE
+ "${PROJECT_SOURCE_DIR}/port/port_posix.cc"
+
+ PUBLIC
+ # The headers below are dependencies for leveldb, but aren't needed by users
+ # that link to the installed version of leveldb and rely on its public API.
+ $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/${LEVELDB_PORT_CONFIG_DIR}/port_config.h>
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/port/atomic_pointer.h>
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/port/port_posix.h>
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/port/port.h>
+)
+if(BUILD_SHARED_LIBS)
+ set_property(TARGET leveldb_port_posix PROPERTY POSITION_INDEPENDENT_CODE ON)
+endif(BUILD_SHARED_LIBS)
+
+add_library(leveldb "")
+target_sources(leveldb
+ PRIVATE
+ "${PROJECT_SOURCE_DIR}/db/builder.cc"
+ "${PROJECT_SOURCE_DIR}/db/builder.h"
+ "${PROJECT_SOURCE_DIR}/db/c.cc"
+ "${PROJECT_SOURCE_DIR}/db/db_impl.cc"
+ "${PROJECT_SOURCE_DIR}/db/db_impl.h"
+ "${PROJECT_SOURCE_DIR}/db/db_iter.cc"
+ "${PROJECT_SOURCE_DIR}/db/db_iter.h"
+ "${PROJECT_SOURCE_DIR}/db/dbformat.cc"
+ "${PROJECT_SOURCE_DIR}/db/dbformat.h"
+ "${PROJECT_SOURCE_DIR}/db/dumpfile.cc"
+ "${PROJECT_SOURCE_DIR}/db/filename.cc"
+ "${PROJECT_SOURCE_DIR}/db/filename.h"
+ "${PROJECT_SOURCE_DIR}/db/log_format.h"
+ "${PROJECT_SOURCE_DIR}/db/log_reader.cc"
+ "${PROJECT_SOURCE_DIR}/db/log_reader.h"
+ "${PROJECT_SOURCE_DIR}/db/log_writer.cc"
+ "${PROJECT_SOURCE_DIR}/db/log_writer.h"
+ "${PROJECT_SOURCE_DIR}/db/memtable.cc"
+ "${PROJECT_SOURCE_DIR}/db/memtable.h"
+ "${PROJECT_SOURCE_DIR}/db/repair.cc"
+ "${PROJECT_SOURCE_DIR}/db/skiplist.h"
+ "${PROJECT_SOURCE_DIR}/db/snapshot.h"
+ "${PROJECT_SOURCE_DIR}/db/table_cache.cc"
+ "${PROJECT_SOURCE_DIR}/db/table_cache.h"
+ "${PROJECT_SOURCE_DIR}/db/version_edit.cc"
+ "${PROJECT_SOURCE_DIR}/db/version_edit.h"
+ "${PROJECT_SOURCE_DIR}/db/version_set.cc"
+ "${PROJECT_SOURCE_DIR}/db/version_set.h"
+ "${PROJECT_SOURCE_DIR}/db/write_batch_internal.h"
+ "${PROJECT_SOURCE_DIR}/db/write_batch.cc"
+ "${PROJECT_SOURCE_DIR}/port/port.h"
+ "${PROJECT_SOURCE_DIR}/port/thread_annotations.h"
+ "${PROJECT_SOURCE_DIR}/table/block_builder.cc"
+ "${PROJECT_SOURCE_DIR}/table/block_builder.h"
+ "${PROJECT_SOURCE_DIR}/table/block.cc"
+ "${PROJECT_SOURCE_DIR}/table/block.h"
+ "${PROJECT_SOURCE_DIR}/table/filter_block.cc"
+ "${PROJECT_SOURCE_DIR}/table/filter_block.h"
+ "${PROJECT_SOURCE_DIR}/table/format.cc"
+ "${PROJECT_SOURCE_DIR}/table/format.h"
+ "${PROJECT_SOURCE_DIR}/table/iterator_wrapper.h"
+ "${PROJECT_SOURCE_DIR}/table/iterator.cc"
+ "${PROJECT_SOURCE_DIR}/table/merger.cc"
+ "${PROJECT_SOURCE_DIR}/table/merger.h"
+ "${PROJECT_SOURCE_DIR}/table/table_builder.cc"
+ "${PROJECT_SOURCE_DIR}/table/table.cc"
+ "${PROJECT_SOURCE_DIR}/table/two_level_iterator.cc"
+ "${PROJECT_SOURCE_DIR}/table/two_level_iterator.h"
+ "${PROJECT_SOURCE_DIR}/util/arena.cc"
+ "${PROJECT_SOURCE_DIR}/util/arena.h"
+ "${PROJECT_SOURCE_DIR}/util/bloom.cc"
+ "${PROJECT_SOURCE_DIR}/util/cache.cc"
+ "${PROJECT_SOURCE_DIR}/util/coding.cc"
+ "${PROJECT_SOURCE_DIR}/util/coding.h"
+ "${PROJECT_SOURCE_DIR}/util/comparator.cc"
+ "${PROJECT_SOURCE_DIR}/util/crc32c.cc"
+ "${PROJECT_SOURCE_DIR}/util/crc32c.h"
+ "${PROJECT_SOURCE_DIR}/util/env_posix.cc"
+ "${PROJECT_SOURCE_DIR}/util/env.cc"
+ "${PROJECT_SOURCE_DIR}/util/filter_policy.cc"
+ "${PROJECT_SOURCE_DIR}/util/hash.cc"
+ "${PROJECT_SOURCE_DIR}/util/hash.h"
+ "${PROJECT_SOURCE_DIR}/util/logging.cc"
+ "${PROJECT_SOURCE_DIR}/util/logging.h"
+ "${PROJECT_SOURCE_DIR}/util/mutexlock.h"
+ "${PROJECT_SOURCE_DIR}/util/options.cc"
+ "${PROJECT_SOURCE_DIR}/util/posix_logger.h"
+ "${PROJECT_SOURCE_DIR}/util/random.h"
+ "${PROJECT_SOURCE_DIR}/util/status.cc"
+ $<TARGET_OBJECTS:leveldb_port_posix>
+
+ # Only CMake 3.3+ supports PUBLIC sources in targets exported by "install".
+ $<$<VERSION_GREATER:CMAKE_VERSION,3.2>:PUBLIC>
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/c.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/cache.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/comparator.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/db.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/dumpfile.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/env.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/filter_policy.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/iterator.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/options.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/slice.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/status.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/table_builder.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/table.h"
+ "${LEVELDB_PUBLIC_INCLUDE_DIR}/write_batch.h"
+)
+# MemEnv is not part of the interface and could be pulled to a separate library.
+target_sources(leveldb
+ PRIVATE
+ "${PROJECT_SOURCE_DIR}/helpers/memenv/memenv.cc"
+ "${PROJECT_SOURCE_DIR}/helpers/memenv/memenv.h"
+)
+target_include_directories(leveldb
+ PUBLIC
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+)
+target_compile_definitions(leveldb
+ PRIVATE
+ # Used by include/export.h when building shared libraries.
+ LEVELDB_COMPILE_LIBRARY
+ # Used by port/port.h.
+ LEVELDB_PLATFORM_POSIX=1
+)
+if(BUILD_SHARED_LIBS)
+ target_compile_definitions(leveldb
+ PUBLIC
+ # Used by include/export.h.
+ LEVELDB_SHARED_LIBRARY
+ )
+endif(BUILD_SHARED_LIBS)
+
+if(HAVE_CLANG_THREAD_SAFETY)
+ target_compile_options(leveldb
+ PUBLIC
+ -Werror -Wthread-safety)
+endif(HAVE_CLANG_THREAD_SAFETY)
+
+# TODO(costan): This is only needed for port_posix.
+set(THREADS_PREFER_PTHREAD_FLAG ON)
+find_package(Threads REQUIRED)
+target_link_libraries(leveldb Threads::Threads)
+
+if(HAVE_CRC32C)
+ target_link_libraries(leveldb crc32c)
+endif(HAVE_CRC32C)
+if(HAVE_SNAPPY)
+ target_link_libraries(leveldb snappy)
+endif(HAVE_SNAPPY)
+if(HAVE_TCMALLOC)
+ target_link_libraries(leveldb tcmalloc)
+endif(HAVE_TCMALLOC)
+
+add_executable(leveldbutil
+ "${PROJECT_SOURCE_DIR}/db/leveldbutil.cc"
+)
+target_link_libraries(leveldbutil leveldb)
+
+if(LEVELDB_BUILD_TESTS)
+ enable_testing()
+
+ function(leveldb_test test_file)
+ get_filename_component(test_target_name "${test_file}" NAME_WE)
+
+ add_executable("${test_target_name}" "")
+ target_sources("${test_target_name}"
+ PRIVATE
+ "${PROJECT_BINARY_DIR}/${LEVELDB_PORT_CONFIG_DIR}/port_config.h"
+ "${PROJECT_SOURCE_DIR}/util/testharness.cc"
+ "${PROJECT_SOURCE_DIR}/util/testharness.h"
+ "${PROJECT_SOURCE_DIR}/util/testutil.cc"
+ "${PROJECT_SOURCE_DIR}/util/testutil.h"
+
+ "${test_file}"
+ )
+ if(BUILD_SHARED_LIBS)
+ # Port functions aren't exposed in the shared library build.
+ target_sources("${test_target_name}"
+ PRIVATE
+ $<TARGET_OBJECTS:leveldb_port_posix>
+ )
+ endif(BUILD_SHARED_LIBS)
+
+ target_link_libraries("${test_target_name}" leveldb)
+ target_compile_definitions("${test_target_name}"
+ PRIVATE
+ LEVELDB_PLATFORM_POSIX=1
+ )
+
+ add_test(NAME "${test_target_name}" COMMAND "${test_target_name}")
+ endfunction(leveldb_test)
+
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/c_test.c")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/fault_injection_test.cc")
+
+ leveldb_test("${PROJECT_SOURCE_DIR}/issues/issue178_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/issues/issue200_test.cc")
+
+ leveldb_test("${PROJECT_SOURCE_DIR}/util/env_test.cc")
+
+ if(NOT BUILD_SHARED_LIBS)
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/autocompact_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/corruption_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/db_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/dbformat_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/filename_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/log_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/recovery_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/skiplist_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/version_edit_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/version_set_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/db/write_batch_test.cc")
+
+ leveldb_test("${PROJECT_SOURCE_DIR}/helpers/memenv/memenv_test.cc")
+
+ leveldb_test("${PROJECT_SOURCE_DIR}/table/filter_block_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/table/table_test.cc")
+
+ leveldb_test("${PROJECT_SOURCE_DIR}/util/arena_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/util/bloom_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/util/cache_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/util/coding_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/util/crc32c_test.cc")
+ leveldb_test("${PROJECT_SOURCE_DIR}/util/hash_test.cc")
+
+ # TODO(costan): This test also uses
+ # "${PROJECT_SOURCE_DIR}/util/env_posix_test_helper.h"
+ leveldb_test("${PROJECT_SOURCE_DIR}/util/env_posix_test.cc")
+ endif(NOT BUILD_SHARED_LIBS)
+endif(LEVELDB_BUILD_TESTS)
+
+if(LEVELDB_BUILD_BENCHMARKS)
+ function(leveldb_benchmark bench_file)
+ get_filename_component(bench_target_name "${bench_file}" NAME_WE)
+
+ add_executable("${bench_target_name}" "")
+ target_sources("${bench_target_name}"
+ PRIVATE
+ "${PROJECT_BINARY_DIR}/${LEVELDB_PORT_CONFIG_DIR}/port_config.h"
+ "${PROJECT_SOURCE_DIR}/util/histogram.cc"
+ "${PROJECT_SOURCE_DIR}/util/histogram.h"
+ "${PROJECT_SOURCE_DIR}/util/testharness.cc"
+ "${PROJECT_SOURCE_DIR}/util/testharness.h"
+ "${PROJECT_SOURCE_DIR}/util/testutil.cc"
+ "${PROJECT_SOURCE_DIR}/util/testutil.h"
+
+ "${bench_file}"
+ )
+ if(BUILD_SHARED_LIBS)
+ # Port functions aren't exposed in the shared library build.
+ target_sources("${bench_target_name}"
+ PRIVATE
+ $<TARGET_OBJECTS:leveldb_port_posix>
+ )
+ endif(BUILD_SHARED_LIBS)
+
+ target_link_libraries("${bench_target_name}" leveldb)
+ target_compile_definitions("${bench_target_name}"
+ PRIVATE
+ LEVELDB_PLATFORM_POSIX=1
+ )
+ endfunction(leveldb_benchmark)
+
+ if(NOT BUILD_SHARED_LIBS)
+ leveldb_benchmark("${PROJECT_SOURCE_DIR}/db/db_bench.cc")
+ endif(NOT BUILD_SHARED_LIBS)
+
+ check_library_exists(sqlite3 sqlite3_open "" HAVE_SQLITE3)
+ if(HAVE_SQLITE3)
+ leveldb_benchmark("${PROJECT_SOURCE_DIR}/doc/bench/db_bench_sqlite3.cc")
+ target_link_libraries(db_bench_sqlite3 sqlite3)
+ endif(HAVE_SQLITE3)
+
+ # check_library_exists is insufficient here because the library names have
+ # different manglings when compiled with clang or gcc, at least when installed
+ # with Homebrew on Mac.
+ set(OLD_CMAKE_REQURED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
+ list(APPEND CMAKE_REQUIRED_LIBRARIES kyotocabinet)
+ check_cxx_source_compiles("
+#include <kcpolydb.h>
+
+int main() {
+ kyotocabinet::TreeDB* db = new kyotocabinet::TreeDB();
+ delete db;
+ return 0;
+}
+ " HAVE_KYOTOCABINET)
+ set(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQURED_LIBRARIES})
+ if(HAVE_KYOTOCABINET)
+ leveldb_benchmark("${PROJECT_SOURCE_DIR}/doc/bench/db_bench_tree_db.cc")
+ target_link_libraries(db_bench_tree_db kyotocabinet)
+ endif(HAVE_KYOTOCABINET)
+endif(LEVELDB_BUILD_BENCHMARKS)
+
+if(LEVELDB_INSTALL)
+ include(GNUInstallDirs)
+ install(TARGETS leveldb
+ EXPORT LeveldbTargets
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ )
+ install(
+ FILES
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/c.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/cache.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/comparator.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/db.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/dumpfile.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/env.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/filter_policy.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/iterator.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/options.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/slice.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/status.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/table_builder.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/table.h"
+ "${PROJECT_SOURCE_DIR}/${LEVELDB_PUBLIC_INCLUDE_DIR}/write_batch.h"
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/leveldb
+ )
+
+ include(CMakePackageConfigHelpers)
+ write_basic_package_version_file(
+ "${PROJECT_BINARY_DIR}/LeveldbConfigVersion.cmake"
+ COMPATIBILITY SameMajorVersion
+ )
+ install(
+ EXPORT LeveldbTargets
+ NAMESPACE Leveldb::
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Leveldb"
+ )
+ install(
+ FILES
+ "${PROJECT_SOURCE_DIR}/cmake/LeveldbConfig.cmake"
+ "${PROJECT_BINARY_DIR}/LeveldbConfigVersion.cmake"
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Leveldb"
+ )
+endif(LEVELDB_INSTALL)