Skip to content

Commit

Permalink
Merge pull request #17788 from tchaikov/wip-cmake-rocksdb-tcmalloc
Browse files Browse the repository at this point in the history
cmake: identify the possible incompatibility of rocksdb and tcmalloc

Reviewed-by: Brad Hubbard <bhubbard@redhat.com>
  • Loading branch information
tchaikov committed Sep 20, 2017
2 parents 311373a + ff8d6a7 commit fa85dd0
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 53 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Expand Up @@ -531,7 +531,7 @@ endif()
# Rocksdb
option(WITH_SYSTEM_ROCKSDB "require and build with system rocksdb" OFF)
if (WITH_SYSTEM_ROCKSDB)
find_package(rocksdb REQUIRED)
find_package(rocksdb 5.8 REQUIRED)
endif()

# Boost
Expand Down
68 changes: 68 additions & 0 deletions cmake/modules/BuildRocksDB.cmake
@@ -0,0 +1,68 @@
function(do_build_rocksdb)
set(ROCKSDB_CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON)

if(ALLOCATOR STREQUAL "jemalloc")
list(APPEND ROCKSDB_CMAKE_ARGS -DWITH_JEMALLOC=ON)
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})
else()
list(APPEND ROCKSDB_CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER})
endif()

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})

if (CMAKE_CXX_COMPILER_ID STREQUAL Clang)
list(APPEND ROCKSDB_CMAKE_ARGS -DFAIL_ON_WARNINGS=OFF)
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)
ExternalProject_Add(rocksdb_ext
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/rocksdb
CMAKE_ARGS ${ROCKSDB_CMAKE_ARGS}
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/rocksdb
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)
foreach(ver "MAJOR" "MINOR" "PATCH")
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
"${ROCKSDB_VERSION_MAJOR}.${ROCKSDB_VERSION_MINOR}.${ROCKSDB_VERSION_PATCH}")

if(ALLOCATOR MATCHES "tcmalloc(_minimal)?")
# see http://tracker.ceph.com/issues/21422
if(ROCKSDB_VERSION_STRING VERSION_GREATER 5.7 AND
TCMALLOC_VERSION_STRING VERSION_GREATER 2.5 AND
TCMALLOC_VERSION_STRING VERSION_LESS 2.6.2)
message(SEND_ERROR
"Incompatible tcmalloc v${TCMALLOC_VERSION_STRING} and rocksdb v${ROCKSDB_VERSION_STRING}, "
"please install gperf-tools 2.5 or > 2.6.2")
endif()
endif()
endmacro()
29 changes: 25 additions & 4 deletions cmake/modules/Findgperftools.cmake
Expand Up @@ -7,17 +7,38 @@
# GPERFTOOLS_TCMALLOC_LIBRARY - link it to use tcmalloc
# GPERFTOOLS_TCMALLOC_MINIMAL_LIBRARY - link it to use tcmalloc_minimal
# GPERFTOOLS_PROFILER_LIBRARY - link it to use Profiler
# TCMALLOC_VERSION_STRING
# TCMALLOC_VERSION_MAJOR
# TCMALLOC_VERSION_MINOR
# TCMALLOC_VERSION_PATCH

find_path(GPERFTOOLS_INCLUDE_DIR gperftools/profiler.h)
find_path(Tcmalloc_INCLUDE_DIR gperftools/tcmalloc.h)
find_path(GPERFTOOLS_INCLUDE_DIR gperftools/profiler.h
HINTS $ENV{GPERF_ROOT}/include)
find_path(Tcmalloc_INCLUDE_DIR gperftools/tcmalloc.h
HINTS $ENV{GPERF_ROOT}/include)

if(Tcmalloc_INCLUDE_DIR AND EXISTS "${Tcmalloc_INCLUDE_DIR}/gperftools/tcmalloc.h")
foreach(ver "MAJOR" "MINOR" "PATCH")
file(STRINGS "${Tcmalloc_INCLUDE_DIR}/gperftools/tcmalloc.h" TC_VER_${ver}_LINE
REGEX "^#define[ \t]+TC_VERSION_${ver}[ \t]+[^ \t]+$")
string(REGEX REPLACE "^#define[ \t]+TC_VERSION_${ver}[ \t]+(\".)?([0-9]+)\"?$"
"\\2" TCMALLOC_VERSION_${ver} "${TC_VER_${ver}_LINE}")
unset(TC_VER_${ver}_LINE)
endforeach()
set(TCMALLOC_VERSION_STRING
"${TCMALLOC_VERSION_MAJOR}.${TCMALLOC_VERSION_MINOR}.${TCMALLOC_VERSION_PATCH}")
endif()

foreach(component tcmalloc tcmalloc_minimal profiler)
string(TOUPPER ${component} COMPONENT)
find_library(GPERFTOOLS_${COMPONENT}_LIBRARY ${component})
find_library(GPERFTOOLS_${COMPONENT}_LIBRARY ${component}
HINTS $ENV{GPERF_ROOT}/lib)
list(APPEND GPERFTOOLS_LIBRARIES GPERFTOOLS_${COMPONENT}_LIBRARY)
endforeach()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(gperftools DEFAULT_MSG GPERFTOOLS_LIBRARIES GPERFTOOLS_INCLUDE_DIR)
find_package_handle_standard_args(gperftools
REQUIRED_VARS GPERFTOOLS_LIBRARIES GPERFTOOLS_INCLUDE_DIR
VERSION_VAR TCMALLOC_VERSION_STRING)

mark_as_advanced(GPERFTOOLS_LIBRARIES GPERFTOOLS_INCLUDE_DIR)
21 changes: 19 additions & 2 deletions cmake/modules/Findrocksdb.cmake
Expand Up @@ -4,14 +4,31 @@
# ROCKSDB_INCLUDE_DIR is found.
# ROCKSDB_LIBRARIES, libraries to link against to use Rocksdb.
# ROCKSDB_FOUND, If false, do not try to use Rocksdb.
# ROCKSDB_VERSION_STRING
# ROCKSDB_VERSION_MAJOR
# ROCKSDB_VERSION_MINOR
# ROCKSDB_VERSION_PATCH

find_path(ROCKSDB_INCLUDE_DIR rocksdb/db.h)

find_library(ROCKSDB_LIBRARIES rocksdb)

if(ROCKSDB_INCLUDE_DIR AND EXISTS "${ROCKSDB_INCLUDE_DIR}/rocksdb/version.h")
foreach(ver "MAJOR" "MINOR" "PATCH")
file(STRINGS "${ROCKSDB_INCLUDE_DIR}/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} "${ROCKDB_VER_${ver}_LINE}")
unset(${ROCKDB_VER_${ver}_LINE})
endforeach()
set(ROCKSDB_VERSION_STRING
"${ROCKSDB_VERSION_MAJOR}.${ROCKSDB_VERSION_MINOR}.${ROCKSDB_VERSION_PATCH}")
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(rocksdb DEFAULT_MSG
ROCKSDB_LIBRARIES ROCKSDB_INCLUDE_DIR)
find_package_handle_standard_args(rocksdb
REQUIRED_VARS ROCKSDB_LIBRARIES ROCKSDB_INCLUDE_DIR
VERSION_VAR ROCKSDB_VERSION_STRING)

mark_as_advanced(
ROCKSDB_INCLUDE_DIR
Expand Down
49 changes: 3 additions & 46 deletions src/CMakeLists.txt
Expand Up @@ -813,52 +813,9 @@ install(TARGETS ceph-mon DESTINATION bin)
# OSD/ObjectStore
# make rocksdb statically

if (NOT WITH_SYSTEM_ROCKSDB)
set(ROCKSDB_CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON)

if(ALLOCATOR STREQUAL "jemalloc")
list(APPEND ROCKSDB_CMAKE_ARGS -DWITH_JEMALLOC=ON)
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})
else(WITH_CCACHE AND CCACHE_FOUND)
list(APPEND ROCKSDB_CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER})
endif(WITH_CCACHE AND CCACHE_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})

if (CMAKE_CXX_COMPILER_ID STREQUAL Clang)
list(APPEND ROCKSDB_CMAKE_ARGS -DFAIL_ON_WARNINGS=OFF)
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)
ExternalProject_Add(rocksdb_ext
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/rocksdb
CMAKE_ARGS ${ROCKSDB_CMAKE_ARGS}
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/rocksdb
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)

set(ROCKSDB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/rocksdb/include)

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_LIBRARIES rocksdb)

if(NOT WITH_SYSTEM_ROCKSDB)
include(BuildRocksDB)
build_rocksdb()
endif(NOT WITH_SYSTEM_ROCKSDB)

include(TestBigEndian)
Expand Down

0 comments on commit fa85dd0

Please sign in to comment.