From 5a71bbbe5921c26bdc24cd811d5c39efb191dbc2 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Mon, 6 Aug 2018 17:55:02 +0800 Subject: [PATCH] cmake: refactor RocksDB related script * rename Findrocksdb.cmake to FindRocksDB.cmake to match its name * add RocksDB::RocksDB target to BuildRocksDB.cmake and FindRocksDB.cmake * use RocksDB::RocksDB target instead of accessing its property directly, and do not link against its dependencies explicitly. let its INTERFACE_LINK_LIBRARIES do the job. Signed-off-by: Kefu Chai --- CMakeLists.txt | 2 +- cmake/modules/BuildRocksDB.cmake | 80 +++++++++++-------- .../{Findrocksdb.cmake => FindRocksDB.cmake} | 14 +++- src/kv/CMakeLists.txt | 11 ++- src/os/CMakeLists.txt | 3 +- 5 files changed, 69 insertions(+), 41 deletions(-) rename cmake/modules/{Findrocksdb.cmake => FindRocksDB.cmake} (75%) diff --git a/CMakeLists.txt b/CMakeLists.txt index ba65aa9f318..af27c909c5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -587,7 +587,7 @@ endif() # Rocksdb option(WITH_SYSTEM_ROCKSDB "require and build with system rocksdb" OFF) if (WITH_SYSTEM_ROCKSDB) - find_package(rocksdb 5.8 REQUIRED) + find_package(RocksDB 5.8 REQUIRED) endif() option(WITH_SEASTAR "Build seastar components") diff --git a/cmake/modules/BuildRocksDB.cmake b/cmake/modules/BuildRocksDB.cmake index f3e0c5b2ee1..69741f46015 100644 --- a/cmake/modules/BuildRocksDB.cmake +++ b/cmake/modules/BuildRocksDB.cmake @@ -1,67 +1,83 @@ -function(do_build_rocksdb) - set(ROCKSDB_CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON) - list(APPEND ROCKSDB_CMAKE_ARGS -DWITH_GFLAGS=OFF) +function(build_rocksdb) + set(rocksdb_CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON) + list(APPEND rocksdb_CMAKE_ARGS -DWITH_GFLAGS=OFF) if(ALLOCATOR STREQUAL "jemalloc") - list(APPEND ROCKSDB_CMAKE_ARGS -DWITH_JEMALLOC=ON) + list(APPEND rocksdb_CMAKE_ARGS -DWITH_JEMALLOC=ON) + list(APPEND rocksdb_INTERFACE_LINK_LIBRARIES JeMalloc::JeMalloc) endif() if (WITH_CCACHE AND CCACHE_FOUND) - list(APPEND ROCKSDB_CMAKE_ARGS -DCMAKE_CXX_COMPILER=ccache) - list(APPEND ROCKSDB_CMAKE_ARGS -DCMAKE_CXX_COMPILER_ARG1=${CMAKE_CXX_COMPILER}) + list(APPEND rocksdb_CMAKE_ARGS -DCMAKE_CXX_COMPILER=ccache) + list(APPEND rocksdb_CMAKE_ARGS -DCMAKE_CXX_COMPILER_ARG1=${CMAKE_CXX_COMPILER}) else() - list(APPEND ROCKSDB_CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}) + list(APPEND rocksdb_CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}) endif() + list(APPEND rocksdb_CMAKE_ARGS -DWITH_SNAPPY=${SNAPPY_FOUND}) + if(SNAPPY_FOUND) + list(APPEND rocksdb_INTERFACE_LINK_LIBRARIES snappy::snappy) + endif() # libsnappy is a C++ library, we need to force rocksdb to link against # libsnappy statically. - list(APPEND ROCKSDB_CMAKE_ARGS -DWITH_SNAPPY=${SNAPPY_FOUND}) if(SNAPPY_FOUND AND WITH_STATIC_LIBSTDCXX) - list(APPEND ROCKSDB_CMAKE_ARGS -DWITH_SNAPPY_STATIC_LIB=ON) + list(APPEND rocksdb_CMAKE_ARGS -DWITH_SNAPPY_STATIC_LIB=ON) + endif() + + list(APPEND rocksdb_CMAKE_ARGS -DWITH_LZ4=${LZ4_FOUND}) + if(LZ4_FOUND) + list(APPEND rocksdb_INTERFACE_LINK_LIBRARIES LZ4::LZ4) + endif() + + list(APPEND rocksdb_CMAKE_ARGS -DWITH_ZLIB=${ZLIB_FOUND}) + if(ZLIB_FOUND) + list(APPEND rocksdb_INTERFACE_LINK_LIBRARIES ZLIB::ZLIB) endif() - list(APPEND ROCKSDB_CMAKE_ARGS -DWITH_LZ4=${LZ4_FOUND}) - list(APPEND ROCKSDB_CMAKE_ARGS -DWITH_ZLIB=${ZLIB_FOUND}) - list(APPEND ROCKSDB_CMAKE_ARGS -DPORTABLE=ON) - list(APPEND ROCKSDB_CMAKE_ARGS -DCMAKE_AR=${CMAKE_AR}) - list(APPEND ROCKSDB_CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}) - list(APPEND ROCKSDB_CMAKE_ARGS -DFAIL_ON_WARNINGS=OFF) - list(APPEND ROCKSDB_CMAKE_ARGS -DUSE_RTTI=1) + + list(APPEND rocksdb_CMAKE_ARGS -DPORTABLE=ON) + list(APPEND rocksdb_CMAKE_ARGS -DCMAKE_AR=${CMAKE_AR}) + list(APPEND rocksdb_CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}) + list(APPEND rocksdb_CMAKE_ARGS -DFAIL_ON_WARNINGS=OFF) + list(APPEND rocksdb_CMAKE_ARGS -DUSE_RTTI=1) CHECK_C_COMPILER_FLAG("-Wno-stringop-truncation" HAS_WARNING_STRINGOP_TRUNCATION) if(HAS_WARNING_STRINGOP_TRUNCATION) - list(APPEND ROCKSDB_CMAKE_ARGS -DCMAKE_C_FLAGS="-Wno-stringop-truncation") + list(APPEND rocksdb_CMAKE_ARGS -DCMAKE_C_FLAGS="-Wno-stringop-truncation") endif() # we use an external project and copy the sources to bin directory to ensure # that object files are built outside of the source tree. include(ExternalProject) + set(rocksdb_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/rocksdb") + set(rocksdb_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/rocksdb") ExternalProject_Add(rocksdb_ext - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/rocksdb - CMAKE_ARGS ${ROCKSDB_CMAKE_ARGS} - BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/rocksdb + SOURCE_DIR "${rocksdb_SOURCE_DIR}" + CMAKE_ARGS ${rocksdb_CMAKE_ARGS} + BINARY_DIR "${rocksdb_BINARY_DIR}" BUILD_COMMAND $(MAKE) rocksdb INSTALL_COMMAND "true") - # force rocksdb make to be called on each time ExternalProject_Add_Step(rocksdb_ext forcebuild DEPENDEES configure DEPENDERS build COMMAND "true" ALWAYS 1) -endfunction() -macro(build_rocksdb) - do_build_rocksdb() - add_library(rocksdb STATIC IMPORTED) - add_dependencies(rocksdb rocksdb_ext) - set_property(TARGET rocksdb PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/rocksdb/librocksdb.a") - set(ROCKSDB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/rocksdb/include) - set(ROCKSDB_LIBRARIES rocksdb) + add_library(RocksDB::RocksDB STATIC IMPORTED) + add_dependencies(RocksDB::RocksDB rocksdb_ext) + set(rocksdb_INCLUDE_DIR "${rocksdb_SOURCE_DIR}/include") + set(rocksdb_LIBRARY "${rocksdb_BINARY_DIR}/librocksdb.a") foreach(ver "MAJOR" "MINOR" "PATCH") - file(STRINGS "${ROCKSDB_INCLUDE_DIR}/rocksdb/version.h" ROCKSDB_VER_${ver}_LINE + file(STRINGS "${rocksdb_INCLUDE_DIR}/rocksdb/version.h" ROCKSDB_VER_${ver}_LINE REGEX "^#define[ \t]+ROCKSDB_${ver}[ \t]+[0-9]+$") string(REGEX REPLACE "^#define[ \t]+ROCKSDB_${ver}[ \t]+([0-9]+)$" "\\1" ROCKSDB_VERSION_${ver} "${ROCKSDB_VER_${ver}_LINE}") unset(ROCKDB_VER_${ver}_LINE) endforeach() - set(ROCKSDB_VERSION_STRING + set(rocksdb_VERSION_STRING "${ROCKSDB_VERSION_MAJOR}.${ROCKSDB_VERSION_MINOR}.${ROCKSDB_VERSION_PATCH}") -endmacro() + set_target_properties(RocksDB::RocksDB PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${rocksdb_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${rocksdb_INTERFACE_LINK_LIBRARIES}" + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${rocksdb_LIBRARY}" + VERSION "${rocksdb_VERSION_STRING}") +endfunction() diff --git a/cmake/modules/Findrocksdb.cmake b/cmake/modules/FindRocksDB.cmake similarity index 75% rename from cmake/modules/Findrocksdb.cmake rename to cmake/modules/FindRocksDB.cmake index 59266473482..9818433b1e5 100644 --- a/cmake/modules/Findrocksdb.cmake +++ b/cmake/modules/FindRocksDB.cmake @@ -26,10 +26,22 @@ if(ROCKSDB_INCLUDE_DIR AND EXISTS "${ROCKSDB_INCLUDE_DIR}/rocksdb/version.h") endif() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(rocksdb +find_package_handle_standard_args(RocksDB REQUIRED_VARS ROCKSDB_LIBRARIES ROCKSDB_INCLUDE_DIR VERSION_VAR ROCKSDB_VERSION_STRING) mark_as_advanced( ROCKSDB_INCLUDE_DIR ROCKSDB_LIBRARIES) + +if(RocksDB_FOUND) + if(NOT TARGET RocksDB::RocksDB) + add_library(RocksDB::RocksDB UNKNOWN IMPORTED) + set_target_properties(RocksDB::RocksDB PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${ROCKSDB_INCLUDE_DIR}" + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${ROCKSDB_LIBRARY}" + VERSION "${ROCKSDB_VERSION_STRING}") + endif() +endif() + diff --git a/src/kv/CMakeLists.txt b/src/kv/CMakeLists.txt index 215b80d56d8..81e27252818 100644 --- a/src/kv/CMakeLists.txt +++ b/src/kv/CMakeLists.txt @@ -9,9 +9,8 @@ endif (WITH_LEVELDB) add_library(kv_objs OBJECT ${kv_srcs}) add_library(kv STATIC $) -target_include_directories(kv_objs SYSTEM BEFORE PUBLIC ${ROCKSDB_INCLUDE_DIR}) -target_include_directories(kv SYSTEM BEFORE PUBLIC ${ROCKSDB_INCLUDE_DIR}) -target_link_libraries(kv ${LEVELDB_LIBRARIES} ${ROCKSDB_LIBRARIES} ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES}) -if(WITH_LZ4) - target_link_libraries(kv ${LZ4_LIBRARY}) -endif() +target_include_directories(kv_objs SYSTEM BEFORE PUBLIC + $) +target_include_directories(kv SYSTEM BEFORE PUBLIC + $) +target_link_libraries(kv ${LEVELDB_LIBRARIES} RocksDB::RocksDB) diff --git a/src/os/CMakeLists.txt b/src/os/CMakeLists.txt index 17f78b71204..0785bc11f0f 100644 --- a/src/os/CMakeLists.txt +++ b/src/os/CMakeLists.txt @@ -76,7 +76,8 @@ add_library(os STATIC ${libos_srcs} $) if(WITH_BLUEFS) add_library(bluefs SHARED bluestore/BlueRocksEnv.cc) - target_include_directories(bluefs SYSTEM PUBLIC ${ROCKSDB_INCLUDE_DIR}) + target_include_directories(bluefs SYSTEM PUBLIC + $) target_link_libraries(bluefs global) install(TARGETS bluefs DESTINATION lib) endif(WITH_BLUEFS) -- 2.39.5