168 lines
7.0 KiB
CMake
168 lines
7.0 KiB
CMake
# FindRocksDB
|
|
|
|
# Load RocksDB version configuration from source-controlled file
|
|
include(${CMAKE_CURRENT_LIST_DIR}/RocksDBVersion.cmake)
|
|
|
|
# Validate configuration - must use exactly one of the two options
|
|
if(ROCKSDB_GIT_HASH AND ROCKSDB_VERSION)
|
|
message(FATAL_ERROR
|
|
"Both ROCKSDB_GIT_HASH and ROCKSDB_VERSION are set in cmake/RocksDBVersion.cmake. "
|
|
"Please choose only ONE option: comment out the one you don't want to use.")
|
|
endif()
|
|
|
|
if(NOT ROCKSDB_GIT_HASH AND NOT ROCKSDB_VERSION)
|
|
message(FATAL_ERROR
|
|
"Neither ROCKSDB_GIT_HASH nor ROCKSDB_VERSION is set in cmake/RocksDBVersion.cmake. "
|
|
"Please configure at least one option.")
|
|
endif()
|
|
|
|
# Determine version string for header generation
|
|
if(ROCKSDB_GIT_HASH)
|
|
# Auto-fetch version from GitHub
|
|
message(STATUS "Fetching RocksDB version for commit ${ROCKSDB_GIT_HASH}...")
|
|
set(ROCKSDB_VERSION_URL "https://raw.githubusercontent.com/facebook/rocksdb/${ROCKSDB_GIT_HASH}/include/rocksdb/version.h")
|
|
file(DOWNLOAD
|
|
${ROCKSDB_VERSION_URL}
|
|
"${CMAKE_BINARY_DIR}/rocksdb_version_check.h"
|
|
STATUS ROCKSDB_VERSION_DOWNLOAD_STATUS
|
|
TIMEOUT 30)
|
|
list(GET ROCKSDB_VERSION_DOWNLOAD_STATUS 0 ROCKSDB_VERSION_DOWNLOAD_ERROR)
|
|
if(NOT ROCKSDB_VERSION_DOWNLOAD_ERROR EQUAL 0)
|
|
list(GET ROCKSDB_VERSION_DOWNLOAD_STATUS 1 ROCKSDB_VERSION_DOWNLOAD_ERROR_MSG)
|
|
message(FATAL_ERROR
|
|
"Failed to fetch RocksDB version.h from ${ROCKSDB_VERSION_URL}: ${ROCKSDB_VERSION_DOWNLOAD_ERROR_MSG}\n"
|
|
"Network access is required when using ROCKSDB_GIT_HASH.")
|
|
endif()
|
|
|
|
# Parse version from downloaded file
|
|
file(READ "${CMAKE_BINARY_DIR}/rocksdb_version_check.h" ROCKSDB_VERSION_H_CONTENT)
|
|
string(REGEX MATCH "#define ROCKSDB_MAJOR ([0-9]+)" _ ${ROCKSDB_VERSION_H_CONTENT})
|
|
set(FDB_ROCKSDB_MAJOR ${CMAKE_MATCH_1})
|
|
string(REGEX MATCH "#define ROCKSDB_MINOR ([0-9]+)" _ ${ROCKSDB_VERSION_H_CONTENT})
|
|
set(FDB_ROCKSDB_MINOR ${CMAKE_MATCH_1})
|
|
string(REGEX MATCH "#define ROCKSDB_PATCH ([0-9]+)" _ ${ROCKSDB_VERSION_H_CONTENT})
|
|
set(FDB_ROCKSDB_PATCH ${CMAKE_MATCH_1})
|
|
|
|
if(NOT FDB_ROCKSDB_MAJOR OR NOT FDB_ROCKSDB_MINOR OR NOT FDB_ROCKSDB_PATCH)
|
|
message(FATAL_ERROR "Failed to parse version from RocksDB version.h")
|
|
endif()
|
|
|
|
message(STATUS "Detected RocksDB version: ${FDB_ROCKSDB_MAJOR}.${FDB_ROCKSDB_MINOR}.${FDB_ROCKSDB_PATCH}")
|
|
set(FDB_ROCKSDB_GIT_HASH ${ROCKSDB_GIT_HASH})
|
|
else()
|
|
set(ROCKSDB_VERSION_FOR_HEADER ${ROCKSDB_VERSION})
|
|
# Parse version string into MAJOR.MINOR.PATCH
|
|
string(REPLACE "." ";" ROCKSDB_VERSION_LIST ${ROCKSDB_VERSION_FOR_HEADER})
|
|
list(LENGTH ROCKSDB_VERSION_LIST ROCKSDB_VERSION_LIST_LENGTH)
|
|
if(NOT ROCKSDB_VERSION_LIST_LENGTH EQUAL 3)
|
|
message(FATAL_ERROR
|
|
"Invalid RocksDB version format: ${ROCKSDB_VERSION_FOR_HEADER}. Expected MAJOR.MINOR.PATCH (e.g., 9.7.3)")
|
|
endif()
|
|
list(GET ROCKSDB_VERSION_LIST 0 FDB_ROCKSDB_MAJOR)
|
|
list(GET ROCKSDB_VERSION_LIST 1 FDB_ROCKSDB_MINOR)
|
|
list(GET ROCKSDB_VERSION_LIST 2 FDB_ROCKSDB_PATCH)
|
|
set(FDB_ROCKSDB_GIT_HASH "")
|
|
endif()
|
|
|
|
# Generate FDBRocksDBVersion.h from template into the core build include tree
|
|
# This file is NOT source-controlled - it's regenerated at cmake configure time
|
|
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/fdbserver/core/include/fdbserver/core)
|
|
configure_file(
|
|
${CMAKE_CURRENT_LIST_DIR}/FDBRocksDBVersion.h.in
|
|
${CMAKE_BINARY_DIR}/fdbserver/core/include/fdbserver/core/FDBRocksDBVersion.h
|
|
@ONLY)
|
|
message(STATUS "Generated FDBRocksDBVersion.h with version ${FDB_ROCKSDB_MAJOR}.${FDB_ROCKSDB_MINOR}.${FDB_ROCKSDB_PATCH}")
|
|
|
|
# Only try to find system RocksDB if not using a specific commit hash
|
|
if(NOT ROCKSDB_GIT_HASH)
|
|
# Save the configured version - FindRocksDB.cmake may overwrite ROCKSDB_VERSION
|
|
# with the system version even when find_package fails
|
|
set(_FDB_ROCKSDB_VERSION_CONFIGURED ${ROCKSDB_VERSION})
|
|
find_package(RocksDB ${ROCKSDB_VERSION})
|
|
if(NOT ROCKSDB_FOUND)
|
|
# Restore configured version since FindRocksDB overwrote it
|
|
set(ROCKSDB_VERSION ${_FDB_ROCKSDB_VERSION_CONFIGURED})
|
|
endif()
|
|
endif()
|
|
|
|
include(ExternalProject)
|
|
|
|
set(RocksDB_CMAKE_ARGS
|
|
-DUSE_RTTI=1
|
|
-DPORTABLE=${PORTABLE_ROCKSDB}
|
|
-DFORCE_SSE42=${ROCKSDB_SSE42}
|
|
-DFORCE_AVX=${ROCKSDB_AVX}
|
|
-DFORCE_AVX2=${ROCKSDB_AVX2}
|
|
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
|
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
|
|
-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
|
|
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
|
|
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
|
|
-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}
|
|
-DCMAKE_STATIC_LINKER_FLAGS=${CMAKE_STATIC_LINKER_FLAGS}
|
|
-DCMAKE_EXE_LINKER_FLAGS=${CMAKE_EXE_LINKER_FLAGS}
|
|
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
|
|
-DCMAKE_EXPORT_COMPILE_COMMANDS=${CMAKE_EXPORT_COMPILE_COMMANDS}
|
|
-DFAIL_ON_WARNINGS=OFF
|
|
-DWITH_GFLAGS=OFF
|
|
-DWITH_TESTS=OFF
|
|
-DWITH_TOOLS=${ROCKSDB_TOOLS}
|
|
-DWITH_CORE_TOOLS=${ROCKSDB_TOOLS}
|
|
-DWITH_BENCHMARK_TOOLS=OFF
|
|
-DWITH_BZ2=OFF
|
|
-DWITH_LZ4=ON
|
|
-DWITH_SNAPPY=OFF
|
|
-DWITH_ZLIB=OFF
|
|
-DWITH_ZSTD=OFF
|
|
-DWITH_LIBURING=${WITH_LIBURING}
|
|
-DWITH_TSAN=${USE_TSAN}
|
|
-DWITH_ASAN=${USE_ASAN}
|
|
-DWITH_UBSAN=${USE_UBSAN}
|
|
-DROCKSDB_BUILD_SHARED=OFF
|
|
-DCMAKE_POSITION_INDEPENDENT_CODE=True)
|
|
|
|
if(ROCKSDB_FOUND)
|
|
set(ROCKSDB_LIBRARIES ${ROCKSDB_LIBRARY})
|
|
add_custom_target(rocksdb DEPENDS ${ROCKSDB_LIBRARIES} ${ROCKSDB_INCLUDE_DIR})
|
|
else()
|
|
# Determine download URL and hash based on whether using commit hash or version
|
|
if(ROCKSDB_GIT_HASH)
|
|
if(NOT ROCKSDB_GIT_HASH_SHA256)
|
|
message(FATAL_ERROR "ROCKSDB_GIT_HASH_SHA256 is required when using ROCKSDB_GIT_HASH for security. "
|
|
"Get the SHA256 with: curl -sL https://github.com/facebook/rocksdb/archive/${ROCKSDB_GIT_HASH}.tar.gz | sha256sum")
|
|
endif()
|
|
set(ROCKSDB_DOWNLOAD_URL "https://github.com/facebook/rocksdb/archive/${ROCKSDB_GIT_HASH}.tar.gz")
|
|
set(ROCKSDB_URL_HASH_ARG URL_HASH SHA256=${ROCKSDB_GIT_HASH_SHA256})
|
|
message(STATUS "Building RocksDB from commit: ${ROCKSDB_GIT_HASH}")
|
|
else()
|
|
if(NOT ROCKSDB_VERSION_SHA256)
|
|
message(FATAL_ERROR "ROCKSDB_VERSION_SHA256 is required when using ROCKSDB_VERSION for security. "
|
|
"Get the SHA256 with: curl -sL https://github.com/facebook/rocksdb/archive/refs/tags/v${ROCKSDB_VERSION}.tar.gz | sha256sum")
|
|
endif()
|
|
set(ROCKSDB_DOWNLOAD_URL "https://github.com/facebook/rocksdb/archive/refs/tags/v${ROCKSDB_VERSION}.tar.gz")
|
|
set(ROCKSDB_URL_HASH_ARG URL_HASH SHA256=${ROCKSDB_VERSION_SHA256})
|
|
message(STATUS "Building RocksDB version: ${ROCKSDB_VERSION}")
|
|
endif()
|
|
|
|
ExternalProject_Add(
|
|
rocksdb
|
|
URL ${ROCKSDB_DOWNLOAD_URL}
|
|
${ROCKSDB_URL_HASH_ARG}
|
|
CMAKE_ARGS ${RocksDB_CMAKE_ARGS}
|
|
BUILD_BYPRODUCTS <BINARY_DIR>/librocksdb.a
|
|
INSTALL_COMMAND "")
|
|
|
|
ExternalProject_Get_Property(rocksdb BINARY_DIR)
|
|
set(ROCKSDB_LIBRARIES ${BINARY_DIR}/librocksdb.a)
|
|
|
|
ExternalProject_Get_Property(rocksdb SOURCE_DIR)
|
|
set(ROCKSDB_INCLUDE_DIR "${SOURCE_DIR}/include")
|
|
|
|
set(ROCKSDB_FOUND TRUE)
|
|
endif()
|
|
|
|
message(STATUS "Found RocksDB library: ${ROCKSDB_LIBRARIES}")
|
|
message(STATUS "Found RocksDB includes: ${ROCKSDB_INCLUDE_DIR}")
|
|
|
|
mark_as_advanced(ROCKSDB_LIBRARIES ROCKSDB_INCLUDE_DIR)
|