Current section

Files

Jump to
rocksdb c_src CMakeLists.txt
Raw

c_src/CMakeLists.txt

cmake_minimum_required(VERSION 3.4.0 FATAL_ERROR)
project(ErlangRocksDBNIF)
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules")
set(priv_dir "${PROJECT_SOURCE_DIR}/../priv")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${priv_dir})
set(ErlangRocksDBNIF_TARGET erocksdb)
add_library(${ErlangRocksDBNIF_TARGET} MODULE "")
set(CMAKE_BUILD_TYPE Release)
# Use lz4 provided by host system
option(ERLANG_ROCKSDB_USE_SYSTEM_LZ4 "Use lz4 from host system" OFF)
# Use snappy provided by host system
option(ERLANG_ROCKSDB_USE_SYSTEM_SNAPPY "Use snappy from host system" OFF)
# Use RocksDB provided by host system
# (for users with extra requirements)
option(ERLANG_ROCKSDB_USE_SYSTEM_ROCKSDB "Use RocksDB from host system" OFF)
#--------------------------------------------------------------------------------
include(FindErlang)
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ${ERLANG_EI_LIBRARY_PATH})
find_library(ERLANG_EI_LIB ei)
find_library(ERLANG_ERL_INTERFACE_LIB erl_interface)
include_directories(${ERLANG_EI_INCLUDE_PATH})
include_directories(${ERLANG_ERTS_INCLUDE_PATH})
#--------------------------------------------------------------------------------
find_package(BZip2)
find_package(ZLIB)
#--------------------------------------------------------------------------------
include(ExternalProject)
if(ERLANG_ROCKSDB_USE_SYSTEM_LZ4)
find_package(LZ4)
else()
set(LZ4_ROOT_DIR "${PROJECT_SOURCE_DIR}/../deps/lz4")
add_custom_command(OUTPUT ${LZ4_ROOT_DIR}/lib/liblz4.a
COMMAND make "CFLAGS= -O2 -fPIC"
WORKING_DIRECTORY ${LZ4_ROOT_DIR}
COMMENT "Build lz4 library"
VERBATIM
)
add_custom_target(lz4 DEPENDS ${LZ4_ROOT_DIR}/lib/liblz4.a)
add_dependencies (${ErlangRocksDBNIF_TARGET} lz4)
set(LZ4_LIBRARY ${LZ4_ROOT_DIR}/lib/liblz4.a)
set(LZ4_INCLUDE_DIR ${LZ4_ROOT_DIR}/lib/)
mark_as_advanced(
LZ4_ROOT_DIR
LZ4_LIBRARY
LZ4_INCLUDE_DIR
)
endif()
#--------------------------------------------------------------------------------
if(ERLANG_ROCKSDB_USE_SYSTEM_SNAPPY)
find_package(snappy)
else()
add_dependencies (${ErlangRocksDBNIF_TARGET} snappy)
set(SNAPPY_ROOT_DIR "${PROJECT_SOURCE_DIR}/../deps/snappy")
ExternalProject_Add(snappy
SOURCE_DIR "${SNAPPY_ROOT_DIR}"
CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON
DOWNLOAD_COMMAND ""
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(snappy BINARY_DIR)
set(SNAPPY_LIBRARY ${BINARY_DIR}/libsnappy.a)
set(SNAPPY_INCLUDE_DIR ${SNAPPY_ROOT_DIR})
mark_as_advanced(
SNAPPY_ROOT_DIR
SNAPPY_LIBRARY
SNAPPY_INCLUDE_DIR
)
endif()
#--------------------------------------------------------------------------------
if(ERLANG_ROCKSDB_USE_SYSTEM_ROCKSDB)
find_package(RocksDB 5.17.2 REQUIRED)
else()
set(ROCKSDB_ROOT_DIR "${PROJECT_SOURCE_DIR}/../deps/rocksdb")
set(ROCKSDB_EXTRA_CXXFLAGS "${CXXFLAGS} -DNDEBUG -DSNAPPY -DLZ4 -I${SNAPPY_INCLUDE_DIR} -I${LZ4_INCLUDE_DIR} -I${BINARY_DIR} -fPIC")
set(ROCKSDB_EXTRA_LDFLAGS "${SNAPPY_LIBRARY} ${LZ4_LIBRARY}")
add_custom_command(OUTPUT ${ROCKSDB_ROOT_DIR}/librocksdb.a
COMMAND make static_lib EXTRA_CXXFLAGS=${ROCKSDB_EXTRA_CXXFLAGS} EXTRA_LDFLAGS=${ROCKSDB_EXTRA_LDFLAGS} USE_RTTI=1 DISABLE_JEMALLOC=1 ROCKSDB_DISABLE_ZSTD=1 DEBUG_LEVEL=0 PORTABLE=1
WORKING_DIRECTORY ${ROCKSDB_ROOT_DIR}
COMMENT "Build RocksDB static library"
VERBATIM
)
add_custom_target(rocksdb DEPENDS ${ROCKSDB_ROOT_DIR}/librocksdb.a)
add_dependencies(${ErlangRocksDBNIF_TARGET} rocksdb)
if(NOT ERLANG_ROCKSDB_USE_SYSTEM_SNAPPY)
add_dependencies (rocksdb snappy)
endif()
if(NOT ERLANG_ROCKSDB_USE_SYSTEM_LZ4)
add_dependencies (rocksdb lz4)
endif()
set(ROCKSDB_LIBRARIES "${ROCKSDB_ROOT_DIR}/librocksdb.a")
set(ROCKSDB_INCLUDE_DIR ${ROCKSDB_ROOT_DIR}/include/)
unset(ROCKSDB_EXTRA_CXXFLAGS)
unset(ROCKSDB_EXTRA_LDFLAGS)
mark_as_advanced(
ROCKSDB_ROOT_DIR
ROCKSDB_LIBRARIES
ROCKSDB_INCLUDE_DIR
)
endif()
#--------------------------------------------------------------------------------
set_property(TARGET ${ErlangRocksDBNIF_TARGET} PROPERTY CXX_STANDARD 14)
set_property(TARGET ${ErlangRocksDBNIF_TARGET} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${ErlangRocksDBNIF_TARGET} PROPERTY CXX_EXTENSIONS OFF)
target_sources(${ErlangRocksDBNIF_TARGET}
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/erocksdb.cc
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/backup.cc
${CMAKE_CURRENT_SOURCE_DIR}/batch.cc
${CMAKE_CURRENT_SOURCE_DIR}/bitset_merge_operator.cc
${CMAKE_CURRENT_SOURCE_DIR}/cache.cc
${CMAKE_CURRENT_SOURCE_DIR}/counter_merge_operator.cc
${CMAKE_CURRENT_SOURCE_DIR}/env.cc
${CMAKE_CURRENT_SOURCE_DIR}/erlang_merge.cc
${CMAKE_CURRENT_SOURCE_DIR}/erocksdb_column_family.cc
${CMAKE_CURRENT_SOURCE_DIR}/erocksdb_db.cc
${CMAKE_CURRENT_SOURCE_DIR}/erocksdb_iter.cc
${CMAKE_CURRENT_SOURCE_DIR}/erocksdb_snapshot.cc
${CMAKE_CURRENT_SOURCE_DIR}/rate_limiter.cc
${CMAKE_CURRENT_SOURCE_DIR}/refobjects.cc
${CMAKE_CURRENT_SOURCE_DIR}/sst_file_manager.cc
${CMAKE_CURRENT_SOURCE_DIR}/transactions.cc
${CMAKE_CURRENT_SOURCE_DIR}/util.cc
${CMAKE_CURRENT_SOURCE_DIR}/write_buffer_manager.cc
)
target_include_directories(${ErlangRocksDBNIF_TARGET}
PRIVATE
${DEFAULT_INCLUDE_DIRECTORIES}
${ROCKSDB_INCLUDE_DIR}
${LZ4_INCLUDE_DIR}
${SNAPPY_INCLUDE_DIR}
${PROJECT_BINARY_DIR}
)
target_compile_options(${ErlangRocksDBNIF_TARGET}
PUBLIC
-Wall
-Wextra
-pedantic-errors
)
set(TARGET_LINKER_OPTIONS)
if(APPLE)
set(TARGET_LINKER_OPTIONS "-flat_namespace -undefined suppress")
endif(APPLE)
target_link_libraries(${ErlangRocksDBNIF_TARGET}
PRIVATE
${TARGET_LINKER_OPTIONS}
${ERLANG_ERL_INTERFACE_LIB}
${ERLANG_EI_LIB}
${ROCKSDB_LIBRARIES}
${LZ4_LIBRARY}
${SNAPPY_LIBRARY}
${BZIP2_LIBRARIES}
${ZLIB_LIBRARY}
)