From 8061c6c7f103ab66296238df89c0dc606aa38d76 Mon Sep 17 00:00:00 2001 From: Alexey Shabalin Date: Sun, 28 Jun 2020 18:56:20 +0300 Subject: [PATCH] Link with -latomic if necessary This commit largely comes from mips_mipsel_libatomic.patch from Debian ceph package. Thanks to iv@ --- CMakeLists.txt | 6 ++++++ build_tools/build_detect_platform | 4 ++++ cmake/modules/CheckAtomic.cmake | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 cmake/modules/CheckAtomic.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index aeef92e..3d5c140 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -799,6 +799,12 @@ else() set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT}) endif() +# check if linking against libatomic is necessary +include(CheckAtomic) +if(HAVE_CXX_ATOMIC_WITH_LIB OR HAVE_CXX_ATOMICS64_WITH_LIB) + set(SYSTEM_LIBS ${SYSTEM_LIBS} atomic) +endif() + add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES}) target_link_libraries(${ROCKSDB_STATIC_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS}) diff --git a/build_tools/build_detect_platform b/build_tools/build_detect_platform index 158c161..493cd89 100755 --- a/build_tools/build_detect_platform +++ b/build_tools/build_detect_platform @@ -681,6 +681,10 @@ EOF fi fi +if [ "$TARGET_ARCHITECTURE" = "mips" ] ; then + PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -latomic" +fi + PLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS" PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS" diff --git a/cmake/modules/CheckAtomic.cmake b/cmake/modules/CheckAtomic.cmake new file mode 100644 index 0000000..67fde83 --- /dev/null +++ b/cmake/modules/CheckAtomic.cmake @@ -0,0 +1,67 @@ +# Checks if atomic operations are supported natively or if linking against +# libatomic is needed. + +# Check inspired by LLVMs cmake/modules/CheckAtomic.cmake + +INCLUDE(CheckCXXSourceCompiles) +INCLUDE(CheckLibraryExists) + +function(check_working_cxx_atomics varname) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11") + CHECK_CXX_SOURCE_COMPILES(" +#include +std::atomic x; +int main() { + return x; +} +" ${varname}) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) +endfunction(check_working_cxx_atomics) + +function(check_working_cxx_atomics64 varname) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "-std=c++11 ${CMAKE_REQUIRED_FLAGS}") + CHECK_CXX_SOURCE_COMPILES(" +#include +#include +std::atomic x (0); +int main() { + uint64_t i = x.load(std::memory_order_relaxed); + return 0; +} +" ${varname}) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) +endfunction(check_working_cxx_atomics64) + +# Check if atomics work without libatomic +check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB) + +if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB) + check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC) + if( HAVE_LIBATOMIC ) + list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") + check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB) + if (NOT HAVE_CXX_ATOMICS_WITH_LIB) + message(FATAL_ERROR "Host compiler must support std::atomic!") + endif() + else() + message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.") + endif() +endif() + +# Check if 64bit atomics work without libatomic +check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) + +if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) + check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) + if(HAVE_CXX_LIBATOMICS64) + list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") + check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) + if (NOT HAVE_CXX_ATOMICS64_WITH_LIB) + message(FATAL_ERROR "Host compiler must support std::atomic!") + endif() + else() + message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.") + endif() +endif() -- libgit2 0.28.4