mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2026-06-02 13:59:59 +00:00
rocksdb: Fix build on platforms not having all atomic intrinsics
Signed-off-by: Khem Raj <raj.khem@gmail.com>
This commit is contained in:
@@ -0,0 +1,115 @@
|
|||||||
|
From ba0a0e54d9544babbd3963891f4e3200dd5583f5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Khem Raj <raj.khem@gmail.com>
|
||||||
|
Date: Wed, 18 Mar 2020 15:10:37 -0700
|
||||||
|
Subject: [PATCH] cmake: Add check for atomic support
|
||||||
|
|
||||||
|
Detect if libatomic should be linked in or compiler and platform can
|
||||||
|
provide the needed atomic instrinsics, this helps build on certain
|
||||||
|
platforms like mips or clang/i386
|
||||||
|
|
||||||
|
Fixes
|
||||||
|
|
||||||
|
| /mnt/b/yoe/build/tmp/work/mips32r2-yoe-linux/rocksdb/6.6.4-r0/recipe-sysroot-native/usr/bin/mips-yoe-linux/mips-yoe-linux-ld: librocksdb.so.6.6.4: undefined reference to `__atomic_exchange_8'
|
||||||
|
| /mnt/b/yoe/build/tmp/work/mips32r2-yoe-linux/rocksdb/6.6.4-r0/recipe-sysroot-native/usr/bin/mips-yoe-linux/mips-yoe-linux-ld: librocksdb.so.6.6.4: undefined reference to `__atomic_fetch_or_8'
|
||||||
|
| /mnt/b/yoe/build/tmp/work/mips32r2-yoe-linux/rocksdb/6.6.4-r0/recipe-sysroot-native/usr/bin/mips-yoe-linux/mips-yoe-linux-ld: librocksdb.so.6.6.4: undefined reference to `__atomic_compare_exchange_8'
|
||||||
|
| /mnt/b/yoe/build/tmp/work/mips32r2-yoe-linux/rocksdb/6.6.4-r0/recipe-sysroot-native/usr/bin/mips-yoe-linux/mips-yoe-linux-ld: librocksdb.so.6.6.4: undefined reference to `__atomic_fetch_sub_8'
|
||||||
|
| /mnt/b/yoe/build/tmp/work/mips32r2-yoe-linux/rocksdb/6.6.4-r0/recipe-sysroot-native/usr/bin/mips-yoe-linux/mips-yoe-linux-ld: librocksdb.so.6.6.4: undefined reference to `__atomic_load_8'
|
||||||
|
| /mnt/b/yoe/build/tmp/work/mips32r2-yoe-linux/rocksdb/6.6.4-r0/recipe-sysroot-native/usr/bin/mips-yoe-linux/mips-yoe-linux-ld: librocksdb.so.6.6.4: undefined reference to `__atomic_store_8'
|
||||||
|
| /mnt/b/yoe/build/tmp/work/mips32r2-yoe-linux/rocksdb/6.6.4-r0/recipe-sysroot-native/usr/bin/mips-yoe-linux/mips-yoe-linux-ld: librocksdb.so.6.6.4: undefined reference to `__atomic_fetch_add_8'
|
||||||
|
|
||||||
|
Upstream-Status: Submitted [https://github.com/facebook/rocksdb/pull/6555]
|
||||||
|
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
||||||
|
---
|
||||||
|
CMakeLists.txt | 6 +++
|
||||||
|
cmake/modules/CheckAtomic.cmake | 69 +++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 75 insertions(+)
|
||||||
|
create mode 100644 cmake/modules/CheckAtomic.cmake
|
||||||
|
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -780,7 +780,13 @@ if(WIN32)
|
||||||
|
set(SYSTEM_LIBS ${SYSTEM_LIBS} shlwapi.lib rpcrt4.lib)
|
||||||
|
set(LIBS ${ROCKSDB_STATIC_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
|
||||||
|
else()
|
||||||
|
+ # check if linking against libatomic is necessary
|
||||||
|
+ include(CheckAtomic)
|
||||||
|
+
|
||||||
|
set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
+ if(HAVE_CXX_ATOMIC_WITH_LIB OR HAVE_CXX_ATOMICS64_WITH_LIB)
|
||||||
|
+ set(SYSTEM_LIBS ${SYSTEM_LIBS} atomic)
|
||||||
|
+ endif()
|
||||||
|
set(LIBS ${ROCKSDB_SHARED_LIB} ${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
|
||||||
|
|
||||||
|
add_library(${ROCKSDB_SHARED_LIB} SHARED ${SOURCES})
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/cmake/modules/CheckAtomic.cmake
|
||||||
|
@@ -0,0 +1,69 @@
|
||||||
|
+# 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 <atomic>
|
||||||
|
+std::atomic<int> 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 <atomic>
|
||||||
|
+#include <cstdint>
|
||||||
|
+std::atomic<uint64_t> x (0);
|
||||||
|
+std::atomic<double> y (0);
|
||||||
|
+int main() {
|
||||||
|
+ uint64_t i = x.load(std::memory_order_relaxed);
|
||||||
|
+ return int(y);
|
||||||
|
+}
|
||||||
|
+" ${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()
|
||||||
|
+
|
||||||
@@ -12,6 +12,7 @@ PV = "6.6.4"
|
|||||||
|
|
||||||
SRC_URI = "git://github.com/facebook/${BPN}.git;branch=${SRCBRANCH} \
|
SRC_URI = "git://github.com/facebook/${BPN}.git;branch=${SRCBRANCH} \
|
||||||
file://0001-db-write_thread.cc-Initialize-state.patch \
|
file://0001-db-write_thread.cc-Initialize-state.patch \
|
||||||
|
file://0001-cmake-Add-check-for-atomic-support.patch \
|
||||||
"
|
"
|
||||||
|
|
||||||
S = "${WORKDIR}/git"
|
S = "${WORKDIR}/git"
|
||||||
|
|||||||
Reference in New Issue
Block a user