diff options
author | Kefu Chai <kchai@redhat.com> | 2018-07-09 19:17:54 +0200 |
---|---|---|
committer | Kefu Chai <kchai@redhat.com> | 2018-07-09 19:37:00 +0200 |
commit | 16976bd42a4db57ffda70267c592c0090b9602b5 (patch) | |
tree | f2cb9be4a10d91055e7d3f4671af668fab856892 /cmake/modules/CheckCxxAtomic.cmake | |
parent | Merge remote-tracking branch 'private/wip-mon-snap-caps' (diff) | |
download | ceph-16976bd42a4db57ffda70267c592c0090b9602b5.tar.xz ceph-16976bd42a4db57ffda70267c592c0090b9602b5.zip |
cmake: should link against libatomic if libcxx/libstdc++ does not offer atomic ops
for instance, GCC-8 on riscv64 does not offer atomic ops like
__atomic_fetch_or_1, so we need to link against libatomic to get access
to these symbols.
Signed-off-by: Kefu Chai <kchai@redhat.com>
Diffstat (limited to 'cmake/modules/CheckCxxAtomic.cmake')
-rw-r--r-- | cmake/modules/CheckCxxAtomic.cmake | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/cmake/modules/CheckCxxAtomic.cmake b/cmake/modules/CheckCxxAtomic.cmake new file mode 100644 index 00000000000..074e4db891a --- /dev/null +++ b/cmake/modules/CheckCxxAtomic.cmake @@ -0,0 +1,38 @@ +# some platforms do not offer support for atomic primitive for all integer +# types, in that case we need to link against libatomic + +include(CheckCXXSourceCompiles) +include(CMakePushCheckState) + + +function(check_cxx_atomics var) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11") + check_cxx_source_compiles(" +#include <atomic> +#include <cstdint> +int main() { + std::atomic<uint8_t> w1; + std::atomic<uint16_t> w2; + std::atomic<uint32_t> w4; + std::atomic<uint64_t> w8; + return w1 + w2 + w4 + w8; +} +" ${var}) +endfunction(check_cxx_atomics) + +cmake_push_check_state() +check_cxx_atomics(HAVE_CXX11_ATOMIC) +cmake_pop_check_state() + +if(NOT HAVE_CXX11_ATOMIC) + cmake_push_check_state() + set(CMAKE_REQUIRED_LIBRARIES "atomic") + check_cxx_atomics(HAVE_LIBATOMIC) + cmake_pop_check_state() + if(HAVE_LIBATOMIC) + set(LIBATOMIC_LINK_FLAGS "-Wl,--as-needed -latomic") + else() + message(FATAL_ERROR + "Host compiler ${CMAKE_CXX_COMPILER} requires libatomic, but it is not found") + endif() +endif() |