diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index a067766b0a..6581e0dfe4 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -981,13 +981,9 @@ if(WIN32 AND NOT CYGWIN) list(APPEND _tools cmcldeps) endif() -if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR MATCHES "sparc") - # the atomic instructions are implemented using libatomic on some platforms, - # so linking to that may be required - check_library_exists(atomic __atomic_fetch_add_4 "" LIBATOMIC_NEEDED) - if(LIBATOMIC_NEEDED) - target_link_libraries(CMakeLib PUBLIC atomic) - endif() +# Some atomic instructions are implemented using libatomic on some platforms. +if(CMake_HAVE_CXX_ATOMIC_LIB) + target_link_libraries(CMakeLib PUBLIC atomic) endif() # On Apple we need CoreFoundation and CoreServices diff --git a/Source/Checks/cm_cxx_atomic.cxx b/Source/Checks/cm_cxx_atomic.cxx new file mode 100644 index 0000000000..098a7a72b7 --- /dev/null +++ b/Source/Checks/cm_cxx_atomic.cxx @@ -0,0 +1,6 @@ +#include +int main() +{ + std::atomic(0).load(); + return 0; +} diff --git a/Source/Checks/cm_cxx_atomic_builtin.cxx b/Source/Checks/cm_cxx_atomic_builtin.cxx new file mode 100644 index 0000000000..d284f6ca1f --- /dev/null +++ b/Source/Checks/cm_cxx_atomic_builtin.cxx @@ -0,0 +1 @@ +#include "cm_cxx_atomic.cxx" diff --git a/Source/Checks/cm_cxx_atomic_lib.cxx b/Source/Checks/cm_cxx_atomic_lib.cxx new file mode 100644 index 0000000000..d284f6ca1f --- /dev/null +++ b/Source/Checks/cm_cxx_atomic_lib.cxx @@ -0,0 +1 @@ +#include "cm_cxx_atomic.cxx" diff --git a/Source/Checks/cm_cxx_features.cmake b/Source/Checks/cm_cxx_features.cmake index f5b7587593..98d5eff072 100644 --- a/Source/Checks/cm_cxx_features.cmake +++ b/Source/Checks/cm_cxx_features.cmake @@ -17,6 +17,7 @@ function(cm_check_cxx_feature name) try_run(CMake_RUN_CXX_${FEATURE} CMake_COMPILE_CXX_${FEATURE} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR}/cm_cxx_${name}.cxx + LINK_LIBRARIES ${cm_check_cxx_feature_LINK_LIBRARIES} CMAKE_FLAGS ${maybe_cxx_standard} OUTPUT_VARIABLE OUTPUT ) @@ -29,6 +30,7 @@ function(cm_check_cxx_feature name) try_compile(CMake_HAVE_CXX_${FEATURE} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR}/cm_cxx_${name}.cxx + LINK_LIBRARIES ${cm_check_cxx_feature_LINK_LIBRARIES} CMAKE_FLAGS ${maybe_cxx_standard} OUTPUT_VARIABLE OUTPUT ) @@ -93,3 +95,12 @@ if (NOT CMAKE_CXX_STANDARD LESS "17") else() set(CMake_HAVE_CXX_FILESYSTEM FALSE) endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR MATCHES "armv7l|sparc") + cm_check_cxx_feature(atomic_builtin) + if(NOT CMake_HAVE_CXX_ATOMIC_BUILTIN) + set(cm_check_cxx_feature_LINK_LIBRARIES atomic) + cm_check_cxx_feature(atomic_lib) # defines CMake_HAVE_CXX_ATOMIC_LIB + unset(cm_check_cxx_feature_LINK_LIBRARIES) + endif() +endif() diff --git a/Utilities/cmcppdap/CMakeLists.txt b/Utilities/cmcppdap/CMakeLists.txt index 2aca681bfa..fe48132bbc 100644 --- a/Utilities/cmcppdap/CMakeLists.txt +++ b/Utilities/cmcppdap/CMakeLists.txt @@ -33,6 +33,9 @@ if(WIN32) elseif(NOT APPLE) target_link_libraries(cmcppdap PRIVATE Threads::Threads) endif() +if(CMake_HAVE_CXX_ATOMIC_LIB) + target_link_libraries(cmcppdap PRIVATE atomic) +endif() if(CMake_BUILD_PCH) target_precompile_headers(cmcppdap PRIVATE "include/dap/protocol.h")