diff options
Diffstat (limited to 'host/cmake/Modules/UHDAtomics.cmake')
-rw-r--r-- | host/cmake/Modules/UHDAtomics.cmake | 31 |
1 files changed, 31 insertions, 0 deletions
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.hpp> + boost::lockfree::queue<int> 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) |