1*9507f98cSAndroid Build Coastguard Worker# Copyright 2017 The LevelDB Authors. All rights reserved. 2*9507f98cSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*9507f98cSAndroid Build Coastguard Worker# found in the LICENSE file. See the AUTHORS file for names of contributors. 4*9507f98cSAndroid Build Coastguard Worker 5*9507f98cSAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.9) 6*9507f98cSAndroid Build Coastguard Worker# Keep the version below in sync with the one in db.h 7*9507f98cSAndroid Build Coastguard Workerproject(leveldb VERSION 1.23.0 LANGUAGES C CXX) 8*9507f98cSAndroid Build Coastguard Worker 9*9507f98cSAndroid Build Coastguard Worker# C standard can be overridden when this is used as a sub-project. 10*9507f98cSAndroid Build Coastguard Workerif(NOT CMAKE_C_STANDARD) 11*9507f98cSAndroid Build Coastguard Worker # This project can use C11, but will gracefully decay down to C89. 12*9507f98cSAndroid Build Coastguard Worker set(CMAKE_C_STANDARD 11) 13*9507f98cSAndroid Build Coastguard Worker set(CMAKE_C_STANDARD_REQUIRED OFF) 14*9507f98cSAndroid Build Coastguard Worker set(CMAKE_C_EXTENSIONS OFF) 15*9507f98cSAndroid Build Coastguard Workerendif(NOT CMAKE_C_STANDARD) 16*9507f98cSAndroid Build Coastguard Worker 17*9507f98cSAndroid Build Coastguard Worker# C++ standard can be overridden when this is used as a sub-project. 18*9507f98cSAndroid Build Coastguard Workerif(NOT CMAKE_CXX_STANDARD) 19*9507f98cSAndroid Build Coastguard Worker # This project requires C++11. 20*9507f98cSAndroid Build Coastguard Worker set(CMAKE_CXX_STANDARD 11) 21*9507f98cSAndroid Build Coastguard Worker set(CMAKE_CXX_STANDARD_REQUIRED ON) 22*9507f98cSAndroid Build Coastguard Worker set(CMAKE_CXX_EXTENSIONS OFF) 23*9507f98cSAndroid Build Coastguard Workerendif(NOT CMAKE_CXX_STANDARD) 24*9507f98cSAndroid Build Coastguard Worker 25*9507f98cSAndroid Build Coastguard Workerif (WIN32) 26*9507f98cSAndroid Build Coastguard Worker set(LEVELDB_PLATFORM_NAME LEVELDB_PLATFORM_WINDOWS) 27*9507f98cSAndroid Build Coastguard Worker # TODO(cmumford): Make UNICODE configurable for Windows. 28*9507f98cSAndroid Build Coastguard Worker add_definitions(-D_UNICODE -DUNICODE) 29*9507f98cSAndroid Build Coastguard Workerelse (WIN32) 30*9507f98cSAndroid Build Coastguard Worker set(LEVELDB_PLATFORM_NAME LEVELDB_PLATFORM_POSIX) 31*9507f98cSAndroid Build Coastguard Workerendif (WIN32) 32*9507f98cSAndroid Build Coastguard Worker 33*9507f98cSAndroid Build Coastguard Workeroption(LEVELDB_BUILD_TESTS "Build LevelDB's unit tests" ON) 34*9507f98cSAndroid Build Coastguard Workeroption(LEVELDB_BUILD_BENCHMARKS "Build LevelDB's benchmarks" ON) 35*9507f98cSAndroid Build Coastguard Workeroption(LEVELDB_INSTALL "Install LevelDB's header and library" ON) 36*9507f98cSAndroid Build Coastguard Worker 37*9507f98cSAndroid Build Coastguard Workerinclude(CheckIncludeFile) 38*9507f98cSAndroid Build Coastguard Workercheck_include_file("unistd.h" HAVE_UNISTD_H) 39*9507f98cSAndroid Build Coastguard Worker 40*9507f98cSAndroid Build Coastguard Workerinclude(CheckLibraryExists) 41*9507f98cSAndroid Build Coastguard Workercheck_library_exists(crc32c crc32c_value "" HAVE_CRC32C) 42*9507f98cSAndroid Build Coastguard Workercheck_library_exists(snappy snappy_compress "" HAVE_SNAPPY) 43*9507f98cSAndroid Build Coastguard Workercheck_library_exists(tcmalloc malloc "" HAVE_TCMALLOC) 44*9507f98cSAndroid Build Coastguard Worker 45*9507f98cSAndroid Build Coastguard Workerinclude(CheckCXXSymbolExists) 46*9507f98cSAndroid Build Coastguard Worker# Using check_cxx_symbol_exists() instead of check_c_symbol_exists() because 47*9507f98cSAndroid Build Coastguard Worker# we're including the header from C++, and feature detection should use the same 48*9507f98cSAndroid Build Coastguard Worker# compiler language that the project will use later. Principles aside, some 49*9507f98cSAndroid Build Coastguard Worker# versions of do not expose fdatasync() in <unistd.h> in standard C mode 50*9507f98cSAndroid Build Coastguard Worker# (-std=c11), but do expose the function in standard C++ mode (-std=c++11). 51*9507f98cSAndroid Build Coastguard Workercheck_cxx_symbol_exists(fdatasync "unistd.h" HAVE_FDATASYNC) 52*9507f98cSAndroid Build Coastguard Workercheck_cxx_symbol_exists(F_FULLFSYNC "fcntl.h" HAVE_FULLFSYNC) 53*9507f98cSAndroid Build Coastguard Workercheck_cxx_symbol_exists(O_CLOEXEC "fcntl.h" HAVE_O_CLOEXEC) 54*9507f98cSAndroid Build Coastguard Worker 55*9507f98cSAndroid Build Coastguard Workerif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 56*9507f98cSAndroid Build Coastguard Worker # Disable C++ exceptions. 57*9507f98cSAndroid Build Coastguard Worker string(REGEX REPLACE "/EH[a-z]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 58*9507f98cSAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHs-c-") 59*9507f98cSAndroid Build Coastguard Worker add_definitions(-D_HAS_EXCEPTIONS=0) 60*9507f98cSAndroid Build Coastguard Worker 61*9507f98cSAndroid Build Coastguard Worker # Disable RTTI. 62*9507f98cSAndroid Build Coastguard Worker string(REGEX REPLACE "/GR" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 63*9507f98cSAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-") 64*9507f98cSAndroid Build Coastguard Workerelse(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 65*9507f98cSAndroid Build Coastguard Worker # Enable strict prototype warnings for C code in clang and gcc. 66*9507f98cSAndroid Build Coastguard Worker if(NOT CMAKE_C_FLAGS MATCHES "-Wstrict-prototypes") 67*9507f98cSAndroid Build Coastguard Worker set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-prototypes") 68*9507f98cSAndroid Build Coastguard Worker endif(NOT CMAKE_C_FLAGS MATCHES "-Wstrict-prototypes") 69*9507f98cSAndroid Build Coastguard Worker 70*9507f98cSAndroid Build Coastguard Worker # Disable C++ exceptions. 71*9507f98cSAndroid Build Coastguard Worker string(REGEX REPLACE "-fexceptions" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 72*9507f98cSAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") 73*9507f98cSAndroid Build Coastguard Worker 74*9507f98cSAndroid Build Coastguard Worker # Disable RTTI. 75*9507f98cSAndroid Build Coastguard Worker string(REGEX REPLACE "-frtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 76*9507f98cSAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti") 77*9507f98cSAndroid Build Coastguard Workerendif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 78*9507f98cSAndroid Build Coastguard Worker 79*9507f98cSAndroid Build Coastguard Worker# Test whether -Wthread-safety is available. See 80*9507f98cSAndroid Build Coastguard Worker# https://clang.llvm.org/docs/ThreadSafetyAnalysis.html 81*9507f98cSAndroid Build Coastguard Workerinclude(CheckCXXCompilerFlag) 82*9507f98cSAndroid Build Coastguard Workercheck_cxx_compiler_flag(-Wthread-safety HAVE_CLANG_THREAD_SAFETY) 83*9507f98cSAndroid Build Coastguard Worker 84*9507f98cSAndroid Build Coastguard Worker# Used by googletest. 85*9507f98cSAndroid Build Coastguard Workercheck_cxx_compiler_flag(-Wno-missing-field-initializers 86*9507f98cSAndroid Build Coastguard Worker LEVELDB_HAVE_NO_MISSING_FIELD_INITIALIZERS) 87*9507f98cSAndroid Build Coastguard Worker 88*9507f98cSAndroid Build Coastguard Workerinclude(CheckCXXSourceCompiles) 89*9507f98cSAndroid Build Coastguard Worker 90*9507f98cSAndroid Build Coastguard Worker# Test whether C++17 __has_include is available. 91*9507f98cSAndroid Build Coastguard Workercheck_cxx_source_compiles(" 92*9507f98cSAndroid Build Coastguard Worker#if defined(__has_include) && __has_include(<string>) 93*9507f98cSAndroid Build Coastguard Worker#include <string> 94*9507f98cSAndroid Build Coastguard Worker#endif 95*9507f98cSAndroid Build Coastguard Workerint main() { std::string str; return 0; } 96*9507f98cSAndroid Build Coastguard Worker" HAVE_CXX17_HAS_INCLUDE) 97*9507f98cSAndroid Build Coastguard Worker 98*9507f98cSAndroid Build Coastguard Workerset(LEVELDB_PUBLIC_INCLUDE_DIR "include/leveldb") 99*9507f98cSAndroid Build Coastguard Workerset(LEVELDB_PORT_CONFIG_DIR "include/port") 100*9507f98cSAndroid Build Coastguard Worker 101*9507f98cSAndroid Build Coastguard Workerconfigure_file( 102*9507f98cSAndroid Build Coastguard Worker "port/port_config.h.in" 103*9507f98cSAndroid Build Coastguard Worker "${PROJECT_BINARY_DIR}/${LEVELDB_PORT_CONFIG_DIR}/port_config.h" 104*9507f98cSAndroid Build Coastguard Worker) 105*9507f98cSAndroid Build Coastguard Worker 106*9507f98cSAndroid Build Coastguard Workerinclude_directories( 107*9507f98cSAndroid Build Coastguard Worker "${PROJECT_BINARY_DIR}/include" 108*9507f98cSAndroid Build Coastguard Worker "." 109*9507f98cSAndroid Build Coastguard Worker) 110*9507f98cSAndroid Build Coastguard Worker 111*9507f98cSAndroid Build Coastguard Workerif(BUILD_SHARED_LIBS) 112*9507f98cSAndroid Build Coastguard Worker # Only export LEVELDB_EXPORT symbols from the shared library. 113*9507f98cSAndroid Build Coastguard Worker add_compile_options(-fvisibility=hidden) 114*9507f98cSAndroid Build Coastguard Workerendif(BUILD_SHARED_LIBS) 115*9507f98cSAndroid Build Coastguard Worker 116*9507f98cSAndroid Build Coastguard Worker# Must be included before CMAKE_INSTALL_INCLUDEDIR is used. 117*9507f98cSAndroid Build Coastguard Workerinclude(GNUInstallDirs) 118*9507f98cSAndroid Build Coastguard Worker 119*9507f98cSAndroid Build Coastguard Workeradd_library(leveldb "") 120*9507f98cSAndroid Build Coastguard Workertarget_sources(leveldb 121*9507f98cSAndroid Build Coastguard Worker PRIVATE 122*9507f98cSAndroid Build Coastguard Worker "${PROJECT_BINARY_DIR}/${LEVELDB_PORT_CONFIG_DIR}/port_config.h" 123*9507f98cSAndroid Build Coastguard Worker "db/builder.cc" 124*9507f98cSAndroid Build Coastguard Worker "db/builder.h" 125*9507f98cSAndroid Build Coastguard Worker "db/c.cc" 126*9507f98cSAndroid Build Coastguard Worker "db/db_impl.cc" 127*9507f98cSAndroid Build Coastguard Worker "db/db_impl.h" 128*9507f98cSAndroid Build Coastguard Worker "db/db_iter.cc" 129*9507f98cSAndroid Build Coastguard Worker "db/db_iter.h" 130*9507f98cSAndroid Build Coastguard Worker "db/dbformat.cc" 131*9507f98cSAndroid Build Coastguard Worker "db/dbformat.h" 132*9507f98cSAndroid Build Coastguard Worker "db/dumpfile.cc" 133*9507f98cSAndroid Build Coastguard Worker "db/filename.cc" 134*9507f98cSAndroid Build Coastguard Worker "db/filename.h" 135*9507f98cSAndroid Build Coastguard Worker "db/log_format.h" 136*9507f98cSAndroid Build Coastguard Worker "db/log_reader.cc" 137*9507f98cSAndroid Build Coastguard Worker "db/log_reader.h" 138*9507f98cSAndroid Build Coastguard Worker "db/log_writer.cc" 139*9507f98cSAndroid Build Coastguard Worker "db/log_writer.h" 140*9507f98cSAndroid Build Coastguard Worker "db/memtable.cc" 141*9507f98cSAndroid Build Coastguard Worker "db/memtable.h" 142*9507f98cSAndroid Build Coastguard Worker "db/repair.cc" 143*9507f98cSAndroid Build Coastguard Worker "db/skiplist.h" 144*9507f98cSAndroid Build Coastguard Worker "db/snapshot.h" 145*9507f98cSAndroid Build Coastguard Worker "db/table_cache.cc" 146*9507f98cSAndroid Build Coastguard Worker "db/table_cache.h" 147*9507f98cSAndroid Build Coastguard Worker "db/version_edit.cc" 148*9507f98cSAndroid Build Coastguard Worker "db/version_edit.h" 149*9507f98cSAndroid Build Coastguard Worker "db/version_set.cc" 150*9507f98cSAndroid Build Coastguard Worker "db/version_set.h" 151*9507f98cSAndroid Build Coastguard Worker "db/write_batch_internal.h" 152*9507f98cSAndroid Build Coastguard Worker "db/write_batch.cc" 153*9507f98cSAndroid Build Coastguard Worker "port/port_stdcxx.h" 154*9507f98cSAndroid Build Coastguard Worker "port/port.h" 155*9507f98cSAndroid Build Coastguard Worker "port/thread_annotations.h" 156*9507f98cSAndroid Build Coastguard Worker "table/block_builder.cc" 157*9507f98cSAndroid Build Coastguard Worker "table/block_builder.h" 158*9507f98cSAndroid Build Coastguard Worker "table/block.cc" 159*9507f98cSAndroid Build Coastguard Worker "table/block.h" 160*9507f98cSAndroid Build Coastguard Worker "table/filter_block.cc" 161*9507f98cSAndroid Build Coastguard Worker "table/filter_block.h" 162*9507f98cSAndroid Build Coastguard Worker "table/format.cc" 163*9507f98cSAndroid Build Coastguard Worker "table/format.h" 164*9507f98cSAndroid Build Coastguard Worker "table/iterator_wrapper.h" 165*9507f98cSAndroid Build Coastguard Worker "table/iterator.cc" 166*9507f98cSAndroid Build Coastguard Worker "table/merger.cc" 167*9507f98cSAndroid Build Coastguard Worker "table/merger.h" 168*9507f98cSAndroid Build Coastguard Worker "table/table_builder.cc" 169*9507f98cSAndroid Build Coastguard Worker "table/table.cc" 170*9507f98cSAndroid Build Coastguard Worker "table/two_level_iterator.cc" 171*9507f98cSAndroid Build Coastguard Worker "table/two_level_iterator.h" 172*9507f98cSAndroid Build Coastguard Worker "util/arena.cc" 173*9507f98cSAndroid Build Coastguard Worker "util/arena.h" 174*9507f98cSAndroid Build Coastguard Worker "util/bloom.cc" 175*9507f98cSAndroid Build Coastguard Worker "util/cache.cc" 176*9507f98cSAndroid Build Coastguard Worker "util/coding.cc" 177*9507f98cSAndroid Build Coastguard Worker "util/coding.h" 178*9507f98cSAndroid Build Coastguard Worker "util/comparator.cc" 179*9507f98cSAndroid Build Coastguard Worker "util/crc32c.cc" 180*9507f98cSAndroid Build Coastguard Worker "util/crc32c.h" 181*9507f98cSAndroid Build Coastguard Worker "util/env.cc" 182*9507f98cSAndroid Build Coastguard Worker "util/filter_policy.cc" 183*9507f98cSAndroid Build Coastguard Worker "util/hash.cc" 184*9507f98cSAndroid Build Coastguard Worker "util/hash.h" 185*9507f98cSAndroid Build Coastguard Worker "util/logging.cc" 186*9507f98cSAndroid Build Coastguard Worker "util/logging.h" 187*9507f98cSAndroid Build Coastguard Worker "util/mutexlock.h" 188*9507f98cSAndroid Build Coastguard Worker "util/no_destructor.h" 189*9507f98cSAndroid Build Coastguard Worker "util/options.cc" 190*9507f98cSAndroid Build Coastguard Worker "util/random.h" 191*9507f98cSAndroid Build Coastguard Worker "util/status.cc" 192*9507f98cSAndroid Build Coastguard Worker 193*9507f98cSAndroid Build Coastguard Worker # Only CMake 3.3+ supports PUBLIC sources in targets exported by "install". 194*9507f98cSAndroid Build Coastguard Worker $<$<VERSION_GREATER:CMAKE_VERSION,3.2>:PUBLIC> 195*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/c.h" 196*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/cache.h" 197*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/comparator.h" 198*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/db.h" 199*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/dumpfile.h" 200*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/env.h" 201*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/export.h" 202*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/filter_policy.h" 203*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/iterator.h" 204*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/options.h" 205*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/slice.h" 206*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/status.h" 207*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/table_builder.h" 208*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/table.h" 209*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/write_batch.h" 210*9507f98cSAndroid Build Coastguard Worker) 211*9507f98cSAndroid Build Coastguard Worker 212*9507f98cSAndroid Build Coastguard Workerif (WIN32) 213*9507f98cSAndroid Build Coastguard Worker target_sources(leveldb 214*9507f98cSAndroid Build Coastguard Worker PRIVATE 215*9507f98cSAndroid Build Coastguard Worker "util/env_windows.cc" 216*9507f98cSAndroid Build Coastguard Worker "util/windows_logger.h" 217*9507f98cSAndroid Build Coastguard Worker ) 218*9507f98cSAndroid Build Coastguard Workerelse (WIN32) 219*9507f98cSAndroid Build Coastguard Worker target_sources(leveldb 220*9507f98cSAndroid Build Coastguard Worker PRIVATE 221*9507f98cSAndroid Build Coastguard Worker "util/env_posix.cc" 222*9507f98cSAndroid Build Coastguard Worker "util/posix_logger.h" 223*9507f98cSAndroid Build Coastguard Worker ) 224*9507f98cSAndroid Build Coastguard Workerendif (WIN32) 225*9507f98cSAndroid Build Coastguard Worker 226*9507f98cSAndroid Build Coastguard Worker# MemEnv is not part of the interface and could be pulled to a separate library. 227*9507f98cSAndroid Build Coastguard Workertarget_sources(leveldb 228*9507f98cSAndroid Build Coastguard Worker PRIVATE 229*9507f98cSAndroid Build Coastguard Worker "helpers/memenv/memenv.cc" 230*9507f98cSAndroid Build Coastguard Worker "helpers/memenv/memenv.h" 231*9507f98cSAndroid Build Coastguard Worker) 232*9507f98cSAndroid Build Coastguard Worker 233*9507f98cSAndroid Build Coastguard Workertarget_include_directories(leveldb 234*9507f98cSAndroid Build Coastguard Worker PUBLIC 235*9507f98cSAndroid Build Coastguard Worker $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> 236*9507f98cSAndroid Build Coastguard Worker $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 237*9507f98cSAndroid Build Coastguard Worker) 238*9507f98cSAndroid Build Coastguard Worker 239*9507f98cSAndroid Build Coastguard Workerset_target_properties(leveldb 240*9507f98cSAndroid Build Coastguard Worker PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) 241*9507f98cSAndroid Build Coastguard Worker 242*9507f98cSAndroid Build Coastguard Workertarget_compile_definitions(leveldb 243*9507f98cSAndroid Build Coastguard Worker PRIVATE 244*9507f98cSAndroid Build Coastguard Worker # Used by include/export.h when building shared libraries. 245*9507f98cSAndroid Build Coastguard Worker LEVELDB_COMPILE_LIBRARY 246*9507f98cSAndroid Build Coastguard Worker # Used by port/port.h. 247*9507f98cSAndroid Build Coastguard Worker ${LEVELDB_PLATFORM_NAME}=1 248*9507f98cSAndroid Build Coastguard Worker) 249*9507f98cSAndroid Build Coastguard Workerif (NOT HAVE_CXX17_HAS_INCLUDE) 250*9507f98cSAndroid Build Coastguard Worker target_compile_definitions(leveldb 251*9507f98cSAndroid Build Coastguard Worker PRIVATE 252*9507f98cSAndroid Build Coastguard Worker LEVELDB_HAS_PORT_CONFIG_H=1 253*9507f98cSAndroid Build Coastguard Worker ) 254*9507f98cSAndroid Build Coastguard Workerendif(NOT HAVE_CXX17_HAS_INCLUDE) 255*9507f98cSAndroid Build Coastguard Worker 256*9507f98cSAndroid Build Coastguard Workerif(BUILD_SHARED_LIBS) 257*9507f98cSAndroid Build Coastguard Worker target_compile_definitions(leveldb 258*9507f98cSAndroid Build Coastguard Worker PUBLIC 259*9507f98cSAndroid Build Coastguard Worker # Used by include/export.h. 260*9507f98cSAndroid Build Coastguard Worker LEVELDB_SHARED_LIBRARY 261*9507f98cSAndroid Build Coastguard Worker ) 262*9507f98cSAndroid Build Coastguard Workerendif(BUILD_SHARED_LIBS) 263*9507f98cSAndroid Build Coastguard Worker 264*9507f98cSAndroid Build Coastguard Workerif(HAVE_CLANG_THREAD_SAFETY) 265*9507f98cSAndroid Build Coastguard Worker target_compile_options(leveldb 266*9507f98cSAndroid Build Coastguard Worker PUBLIC 267*9507f98cSAndroid Build Coastguard Worker -Werror -Wthread-safety) 268*9507f98cSAndroid Build Coastguard Workerendif(HAVE_CLANG_THREAD_SAFETY) 269*9507f98cSAndroid Build Coastguard Worker 270*9507f98cSAndroid Build Coastguard Workerif(HAVE_CRC32C) 271*9507f98cSAndroid Build Coastguard Worker target_link_libraries(leveldb crc32c) 272*9507f98cSAndroid Build Coastguard Workerendif(HAVE_CRC32C) 273*9507f98cSAndroid Build Coastguard Workerif(HAVE_SNAPPY) 274*9507f98cSAndroid Build Coastguard Worker target_link_libraries(leveldb snappy) 275*9507f98cSAndroid Build Coastguard Workerendif(HAVE_SNAPPY) 276*9507f98cSAndroid Build Coastguard Workerif(HAVE_TCMALLOC) 277*9507f98cSAndroid Build Coastguard Worker target_link_libraries(leveldb tcmalloc) 278*9507f98cSAndroid Build Coastguard Workerendif(HAVE_TCMALLOC) 279*9507f98cSAndroid Build Coastguard Worker 280*9507f98cSAndroid Build Coastguard Worker# Needed by port_stdcxx.h 281*9507f98cSAndroid Build Coastguard Workerfind_package(Threads REQUIRED) 282*9507f98cSAndroid Build Coastguard Workertarget_link_libraries(leveldb Threads::Threads) 283*9507f98cSAndroid Build Coastguard Worker 284*9507f98cSAndroid Build Coastguard Workeradd_executable(leveldbutil 285*9507f98cSAndroid Build Coastguard Worker "db/leveldbutil.cc" 286*9507f98cSAndroid Build Coastguard Worker) 287*9507f98cSAndroid Build Coastguard Workertarget_link_libraries(leveldbutil leveldb) 288*9507f98cSAndroid Build Coastguard Worker 289*9507f98cSAndroid Build Coastguard Workerif(LEVELDB_BUILD_TESTS) 290*9507f98cSAndroid Build Coastguard Worker enable_testing() 291*9507f98cSAndroid Build Coastguard Worker 292*9507f98cSAndroid Build Coastguard Worker # Prevent overriding the parent project's compiler/linker settings on Windows. 293*9507f98cSAndroid Build Coastguard Worker set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) 294*9507f98cSAndroid Build Coastguard Worker set(install_gtest OFF) 295*9507f98cSAndroid Build Coastguard Worker set(install_gmock OFF) 296*9507f98cSAndroid Build Coastguard Worker set(build_gmock ON) 297*9507f98cSAndroid Build Coastguard Worker 298*9507f98cSAndroid Build Coastguard Worker # This project is tested using GoogleTest. 299*9507f98cSAndroid Build Coastguard Worker add_subdirectory("third_party/googletest") 300*9507f98cSAndroid Build Coastguard Worker 301*9507f98cSAndroid Build Coastguard Worker # This project uses Google benchmark for benchmarking. 302*9507f98cSAndroid Build Coastguard Worker set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "" FORCE) 303*9507f98cSAndroid Build Coastguard Worker set(BENCHMARK_ENABLE_EXCEPTIONS OFF CACHE BOOL "" FORCE) 304*9507f98cSAndroid Build Coastguard Worker add_subdirectory("third_party/benchmark") 305*9507f98cSAndroid Build Coastguard Worker 306*9507f98cSAndroid Build Coastguard Worker # GoogleTest triggers a missing field initializers warning. 307*9507f98cSAndroid Build Coastguard Worker if(LEVELDB_HAVE_NO_MISSING_FIELD_INITIALIZERS) 308*9507f98cSAndroid Build Coastguard Worker set_property(TARGET gtest 309*9507f98cSAndroid Build Coastguard Worker APPEND PROPERTY COMPILE_OPTIONS -Wno-missing-field-initializers) 310*9507f98cSAndroid Build Coastguard Worker set_property(TARGET gmock 311*9507f98cSAndroid Build Coastguard Worker APPEND PROPERTY COMPILE_OPTIONS -Wno-missing-field-initializers) 312*9507f98cSAndroid Build Coastguard Worker endif(LEVELDB_HAVE_NO_MISSING_FIELD_INITIALIZERS) 313*9507f98cSAndroid Build Coastguard Worker 314*9507f98cSAndroid Build Coastguard Worker function(leveldb_test test_file) 315*9507f98cSAndroid Build Coastguard Worker get_filename_component(test_target_name "${test_file}" NAME_WE) 316*9507f98cSAndroid Build Coastguard Worker 317*9507f98cSAndroid Build Coastguard Worker add_executable("${test_target_name}" "") 318*9507f98cSAndroid Build Coastguard Worker target_sources("${test_target_name}" 319*9507f98cSAndroid Build Coastguard Worker PRIVATE 320*9507f98cSAndroid Build Coastguard Worker "${PROJECT_BINARY_DIR}/${LEVELDB_PORT_CONFIG_DIR}/port_config.h" 321*9507f98cSAndroid Build Coastguard Worker "util/testutil.cc" 322*9507f98cSAndroid Build Coastguard Worker "util/testutil.h" 323*9507f98cSAndroid Build Coastguard Worker 324*9507f98cSAndroid Build Coastguard Worker "${test_file}" 325*9507f98cSAndroid Build Coastguard Worker ) 326*9507f98cSAndroid Build Coastguard Worker target_link_libraries("${test_target_name}" leveldb gmock gtest benchmark) 327*9507f98cSAndroid Build Coastguard Worker target_compile_definitions("${test_target_name}" 328*9507f98cSAndroid Build Coastguard Worker PRIVATE 329*9507f98cSAndroid Build Coastguard Worker ${LEVELDB_PLATFORM_NAME}=1 330*9507f98cSAndroid Build Coastguard Worker ) 331*9507f98cSAndroid Build Coastguard Worker if (NOT HAVE_CXX17_HAS_INCLUDE) 332*9507f98cSAndroid Build Coastguard Worker target_compile_definitions("${test_target_name}" 333*9507f98cSAndroid Build Coastguard Worker PRIVATE 334*9507f98cSAndroid Build Coastguard Worker LEVELDB_HAS_PORT_CONFIG_H=1 335*9507f98cSAndroid Build Coastguard Worker ) 336*9507f98cSAndroid Build Coastguard Worker endif(NOT HAVE_CXX17_HAS_INCLUDE) 337*9507f98cSAndroid Build Coastguard Worker 338*9507f98cSAndroid Build Coastguard Worker add_test(NAME "${test_target_name}" COMMAND "${test_target_name}") 339*9507f98cSAndroid Build Coastguard Worker endfunction(leveldb_test) 340*9507f98cSAndroid Build Coastguard Worker 341*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/c_test.c") 342*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/fault_injection_test.cc") 343*9507f98cSAndroid Build Coastguard Worker 344*9507f98cSAndroid Build Coastguard Worker leveldb_test("issues/issue178_test.cc") 345*9507f98cSAndroid Build Coastguard Worker leveldb_test("issues/issue200_test.cc") 346*9507f98cSAndroid Build Coastguard Worker leveldb_test("issues/issue320_test.cc") 347*9507f98cSAndroid Build Coastguard Worker 348*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/env_test.cc") 349*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/status_test.cc") 350*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/no_destructor_test.cc") 351*9507f98cSAndroid Build Coastguard Worker 352*9507f98cSAndroid Build Coastguard Worker if(NOT BUILD_SHARED_LIBS) 353*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/autocompact_test.cc") 354*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/corruption_test.cc") 355*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/db_test.cc") 356*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/dbformat_test.cc") 357*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/filename_test.cc") 358*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/log_test.cc") 359*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/recovery_test.cc") 360*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/skiplist_test.cc") 361*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/version_edit_test.cc") 362*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/version_set_test.cc") 363*9507f98cSAndroid Build Coastguard Worker leveldb_test("db/write_batch_test.cc") 364*9507f98cSAndroid Build Coastguard Worker 365*9507f98cSAndroid Build Coastguard Worker leveldb_test("helpers/memenv/memenv_test.cc") 366*9507f98cSAndroid Build Coastguard Worker 367*9507f98cSAndroid Build Coastguard Worker leveldb_test("table/filter_block_test.cc") 368*9507f98cSAndroid Build Coastguard Worker leveldb_test("table/table_test.cc") 369*9507f98cSAndroid Build Coastguard Worker 370*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/arena_test.cc") 371*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/bloom_test.cc") 372*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/cache_test.cc") 373*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/coding_test.cc") 374*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/crc32c_test.cc") 375*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/hash_test.cc") 376*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/logging_test.cc") 377*9507f98cSAndroid Build Coastguard Worker 378*9507f98cSAndroid Build Coastguard Worker # TODO(costan): This test also uses 379*9507f98cSAndroid Build Coastguard Worker # "util/env_{posix|windows}_test_helper.h" 380*9507f98cSAndroid Build Coastguard Worker if (WIN32) 381*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/env_windows_test.cc") 382*9507f98cSAndroid Build Coastguard Worker else (WIN32) 383*9507f98cSAndroid Build Coastguard Worker leveldb_test("util/env_posix_test.cc") 384*9507f98cSAndroid Build Coastguard Worker endif (WIN32) 385*9507f98cSAndroid Build Coastguard Worker endif(NOT BUILD_SHARED_LIBS) 386*9507f98cSAndroid Build Coastguard Workerendif(LEVELDB_BUILD_TESTS) 387*9507f98cSAndroid Build Coastguard Worker 388*9507f98cSAndroid Build Coastguard Workerif(LEVELDB_BUILD_BENCHMARKS) 389*9507f98cSAndroid Build Coastguard Worker function(leveldb_benchmark bench_file) 390*9507f98cSAndroid Build Coastguard Worker get_filename_component(bench_target_name "${bench_file}" NAME_WE) 391*9507f98cSAndroid Build Coastguard Worker 392*9507f98cSAndroid Build Coastguard Worker add_executable("${bench_target_name}" "") 393*9507f98cSAndroid Build Coastguard Worker target_sources("${bench_target_name}" 394*9507f98cSAndroid Build Coastguard Worker PRIVATE 395*9507f98cSAndroid Build Coastguard Worker "${PROJECT_BINARY_DIR}/${LEVELDB_PORT_CONFIG_DIR}/port_config.h" 396*9507f98cSAndroid Build Coastguard Worker "util/histogram.cc" 397*9507f98cSAndroid Build Coastguard Worker "util/histogram.h" 398*9507f98cSAndroid Build Coastguard Worker "util/testutil.cc" 399*9507f98cSAndroid Build Coastguard Worker "util/testutil.h" 400*9507f98cSAndroid Build Coastguard Worker 401*9507f98cSAndroid Build Coastguard Worker "${bench_file}" 402*9507f98cSAndroid Build Coastguard Worker ) 403*9507f98cSAndroid Build Coastguard Worker target_link_libraries("${bench_target_name}" leveldb gmock gtest) 404*9507f98cSAndroid Build Coastguard Worker target_compile_definitions("${bench_target_name}" 405*9507f98cSAndroid Build Coastguard Worker PRIVATE 406*9507f98cSAndroid Build Coastguard Worker ${LEVELDB_PLATFORM_NAME}=1 407*9507f98cSAndroid Build Coastguard Worker ) 408*9507f98cSAndroid Build Coastguard Worker if (NOT HAVE_CXX17_HAS_INCLUDE) 409*9507f98cSAndroid Build Coastguard Worker target_compile_definitions("${bench_target_name}" 410*9507f98cSAndroid Build Coastguard Worker PRIVATE 411*9507f98cSAndroid Build Coastguard Worker LEVELDB_HAS_PORT_CONFIG_H=1 412*9507f98cSAndroid Build Coastguard Worker ) 413*9507f98cSAndroid Build Coastguard Worker endif(NOT HAVE_CXX17_HAS_INCLUDE) 414*9507f98cSAndroid Build Coastguard Worker endfunction(leveldb_benchmark) 415*9507f98cSAndroid Build Coastguard Worker 416*9507f98cSAndroid Build Coastguard Worker if(NOT BUILD_SHARED_LIBS) 417*9507f98cSAndroid Build Coastguard Worker leveldb_benchmark("benchmarks/db_bench.cc") 418*9507f98cSAndroid Build Coastguard Worker endif(NOT BUILD_SHARED_LIBS) 419*9507f98cSAndroid Build Coastguard Worker 420*9507f98cSAndroid Build Coastguard Worker check_library_exists(sqlite3 sqlite3_open "" HAVE_SQLITE3) 421*9507f98cSAndroid Build Coastguard Worker if(HAVE_SQLITE3) 422*9507f98cSAndroid Build Coastguard Worker leveldb_benchmark("benchmarks/db_bench_sqlite3.cc") 423*9507f98cSAndroid Build Coastguard Worker target_link_libraries(db_bench_sqlite3 sqlite3) 424*9507f98cSAndroid Build Coastguard Worker endif(HAVE_SQLITE3) 425*9507f98cSAndroid Build Coastguard Worker 426*9507f98cSAndroid Build Coastguard Worker # check_library_exists is insufficient here because the library names have 427*9507f98cSAndroid Build Coastguard Worker # different manglings when compiled with clang or gcc, at least when installed 428*9507f98cSAndroid Build Coastguard Worker # with Homebrew on Mac. 429*9507f98cSAndroid Build Coastguard Worker set(OLD_CMAKE_REQURED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) 430*9507f98cSAndroid Build Coastguard Worker list(APPEND CMAKE_REQUIRED_LIBRARIES kyotocabinet) 431*9507f98cSAndroid Build Coastguard Worker check_cxx_source_compiles(" 432*9507f98cSAndroid Build Coastguard Worker#include <kcpolydb.h> 433*9507f98cSAndroid Build Coastguard Worker 434*9507f98cSAndroid Build Coastguard Workerint main() { 435*9507f98cSAndroid Build Coastguard Worker kyotocabinet::TreeDB* db = new kyotocabinet::TreeDB(); 436*9507f98cSAndroid Build Coastguard Worker delete db; 437*9507f98cSAndroid Build Coastguard Worker return 0; 438*9507f98cSAndroid Build Coastguard Worker} 439*9507f98cSAndroid Build Coastguard Worker " HAVE_KYOTOCABINET) 440*9507f98cSAndroid Build Coastguard Worker set(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQURED_LIBRARIES}) 441*9507f98cSAndroid Build Coastguard Worker if(HAVE_KYOTOCABINET) 442*9507f98cSAndroid Build Coastguard Worker leveldb_benchmark("benchmarks/db_bench_tree_db.cc") 443*9507f98cSAndroid Build Coastguard Worker target_link_libraries(db_bench_tree_db kyotocabinet) 444*9507f98cSAndroid Build Coastguard Worker endif(HAVE_KYOTOCABINET) 445*9507f98cSAndroid Build Coastguard Workerendif(LEVELDB_BUILD_BENCHMARKS) 446*9507f98cSAndroid Build Coastguard Worker 447*9507f98cSAndroid Build Coastguard Workerif(LEVELDB_INSTALL) 448*9507f98cSAndroid Build Coastguard Worker install(TARGETS leveldb 449*9507f98cSAndroid Build Coastguard Worker EXPORT leveldbTargets 450*9507f98cSAndroid Build Coastguard Worker RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 451*9507f98cSAndroid Build Coastguard Worker LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 452*9507f98cSAndroid Build Coastguard Worker ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 453*9507f98cSAndroid Build Coastguard Worker ) 454*9507f98cSAndroid Build Coastguard Worker install( 455*9507f98cSAndroid Build Coastguard Worker FILES 456*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/c.h" 457*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/cache.h" 458*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/comparator.h" 459*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/db.h" 460*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/dumpfile.h" 461*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/env.h" 462*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/export.h" 463*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/filter_policy.h" 464*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/iterator.h" 465*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/options.h" 466*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/slice.h" 467*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/status.h" 468*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/table_builder.h" 469*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/table.h" 470*9507f98cSAndroid Build Coastguard Worker "${LEVELDB_PUBLIC_INCLUDE_DIR}/write_batch.h" 471*9507f98cSAndroid Build Coastguard Worker DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/leveldb" 472*9507f98cSAndroid Build Coastguard Worker ) 473*9507f98cSAndroid Build Coastguard Worker 474*9507f98cSAndroid Build Coastguard Worker include(CMakePackageConfigHelpers) 475*9507f98cSAndroid Build Coastguard Worker configure_package_config_file( 476*9507f98cSAndroid Build Coastguard Worker "cmake/${PROJECT_NAME}Config.cmake.in" 477*9507f98cSAndroid Build Coastguard Worker "${PROJECT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake" 478*9507f98cSAndroid Build Coastguard Worker INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" 479*9507f98cSAndroid Build Coastguard Worker ) 480*9507f98cSAndroid Build Coastguard Worker write_basic_package_version_file( 481*9507f98cSAndroid Build Coastguard Worker "${PROJECT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake" 482*9507f98cSAndroid Build Coastguard Worker COMPATIBILITY SameMajorVersion 483*9507f98cSAndroid Build Coastguard Worker ) 484*9507f98cSAndroid Build Coastguard Worker install( 485*9507f98cSAndroid Build Coastguard Worker EXPORT leveldbTargets 486*9507f98cSAndroid Build Coastguard Worker NAMESPACE leveldb:: 487*9507f98cSAndroid Build Coastguard Worker DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" 488*9507f98cSAndroid Build Coastguard Worker ) 489*9507f98cSAndroid Build Coastguard Worker install( 490*9507f98cSAndroid Build Coastguard Worker FILES 491*9507f98cSAndroid Build Coastguard Worker "${PROJECT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake" 492*9507f98cSAndroid Build Coastguard Worker "${PROJECT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake" 493*9507f98cSAndroid Build Coastguard Worker DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" 494*9507f98cSAndroid Build Coastguard Worker ) 495*9507f98cSAndroid Build Coastguard Workerendif(LEVELDB_INSTALL) 496