xref: /aosp_15_r20/external/leveldb/CMakeLists.txt (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
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