From 3a249aa0b11e24d2663b720316ed6edc1e2fd8ad Mon Sep 17 00:00:00 2001 From: Jaroslav Škarvada Date: Tue, 1 Feb 2022 00:23:07 +0100 Subject: cmake: added libatomic check for boost/lockfree/queue.hpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The boost/lockfree/queue.hpp requires linking with the libatomic on some platforms (e.g. s390x). Fixes #410 Signed-off-by: Jaroslav Škarvada --- host/cmake/Modules/UHDAtomics.cmake | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'host/cmake/Modules') diff --git a/host/cmake/Modules/UHDAtomics.cmake b/host/cmake/Modules/UHDAtomics.cmake index 4d53a2d0b..410687387 100644 --- a/host/cmake/Modules/UHDAtomics.cmake +++ b/host/cmake/Modules/UHDAtomics.cmake @@ -33,6 +33,18 @@ function(CHECK_WORKING_CXX_ATOMICS64 varname) " ${varname}) endfunction(CHECK_WORKING_CXX_ATOMICS64) +# Note: If we reach this, we have already checked for the existence of Boost, +# and Boost.Lockfree is a header-only library so no linker options required. +function(CHECK_WORKING_CXX_BOOST_ATOMICS varname) + CHECK_CXX_SOURCE_COMPILES(" + #include + boost::lockfree::queue queue(1); + int main() { + return queue.is_lock_free(); + } + " ${varname}) +endfunction(CHECK_WORKING_CXX_BOOST_ATOMICS) + macro(CHECK_ATOMICS_LIB_REQUIRED required_var) set(${required_var} FALSE) if(MSVC) @@ -76,5 +88,24 @@ macro(CHECK_ATOMICS_LIB_REQUIRED required_var) "Host compiler appears to require libatomic for 64-bit operations, but cannot find it.") endif() endif() + # Check whether boost requires atomic. + CHECK_WORKING_CXX_BOOST_ATOMICS(HAVE_CXX_BOOST_ATOMICS_WITHOUT_LIB) + # If not, check if the library exists, and atomics work with it. + if(NOT HAVE_CXX_BOOST_ATOMICS_WITHOUT_LIB) + check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC) + if(HAVE_LIBATOMIC) + set(${required_var} TRUE) + set(CMAKE_REQUIRED_LIBRARIES "atomic") + CHECK_WORKING_CXX_BOOST_ATOMICS(HAVE_CXX_BOOST_ATOMICS_WITH_LIB) + unset(CMAKE_REQUIRED_LIBRARIES) + if (NOT HAVE_CXX_BOOST_ATOMICS_WITH_LIB) + message(FATAL_ERROR "Host compiler must support std::atomic!") + endif() + else() + message( + FATAL_ERROR + "Boost appears to require libatomic, but cannot find it.") + endif() + endif() endif() endmacro(CHECK_ATOMICS_LIB_REQUIRED) -- cgit v1.2.3