Browse Source

Merge topic 'cxx-atomic'

78bbd58545 Source: Link libatomic when needed on Linux 32-bit ARM

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !8663
Brad King 2 years ago
parent
commit
8268fc8661

+ 3 - 7
Source/CMakeLists.txt

@@ -981,13 +981,9 @@ if(WIN32 AND NOT CYGWIN)
   list(APPEND _tools cmcldeps)
   list(APPEND _tools cmcldeps)
 endif()
 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()
 endif()
 
 
 # On Apple we need CoreFoundation and CoreServices
 # On Apple we need CoreFoundation and CoreServices

+ 6 - 0
Source/Checks/cm_cxx_atomic.cxx

@@ -0,0 +1,6 @@
+#include <atomic>
+int main()
+{
+  std::atomic<long long>(0).load();
+  return 0;
+}

+ 1 - 0
Source/Checks/cm_cxx_atomic_builtin.cxx

@@ -0,0 +1 @@
+#include "cm_cxx_atomic.cxx"

+ 1 - 0
Source/Checks/cm_cxx_atomic_lib.cxx

@@ -0,0 +1 @@
+#include "cm_cxx_atomic.cxx"

+ 11 - 0
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}
       try_run(CMake_RUN_CXX_${FEATURE} CMake_COMPILE_CXX_${FEATURE}
         ${CMAKE_CURRENT_BINARY_DIR}
         ${CMAKE_CURRENT_BINARY_DIR}
         ${CMAKE_CURRENT_LIST_DIR}/cm_cxx_${name}.cxx
         ${CMAKE_CURRENT_LIST_DIR}/cm_cxx_${name}.cxx
+        LINK_LIBRARIES ${cm_check_cxx_feature_LINK_LIBRARIES}
         CMAKE_FLAGS ${maybe_cxx_standard}
         CMAKE_FLAGS ${maybe_cxx_standard}
         OUTPUT_VARIABLE OUTPUT
         OUTPUT_VARIABLE OUTPUT
         )
         )
@@ -29,6 +30,7 @@ function(cm_check_cxx_feature name)
       try_compile(CMake_HAVE_CXX_${FEATURE}
       try_compile(CMake_HAVE_CXX_${FEATURE}
         ${CMAKE_CURRENT_BINARY_DIR}
         ${CMAKE_CURRENT_BINARY_DIR}
         ${CMAKE_CURRENT_LIST_DIR}/cm_cxx_${name}.cxx
         ${CMAKE_CURRENT_LIST_DIR}/cm_cxx_${name}.cxx
+        LINK_LIBRARIES ${cm_check_cxx_feature_LINK_LIBRARIES}
         CMAKE_FLAGS ${maybe_cxx_standard}
         CMAKE_FLAGS ${maybe_cxx_standard}
         OUTPUT_VARIABLE OUTPUT
         OUTPUT_VARIABLE OUTPUT
         )
         )
@@ -93,3 +95,12 @@ if (NOT CMAKE_CXX_STANDARD LESS "17")
 else()
 else()
   set(CMake_HAVE_CXX_FILESYSTEM FALSE)
   set(CMake_HAVE_CXX_FILESYSTEM FALSE)
 endif()
 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()

+ 3 - 0
Utilities/cmcppdap/CMakeLists.txt

@@ -33,6 +33,9 @@ if(WIN32)
 elseif(NOT APPLE)
 elseif(NOT APPLE)
   target_link_libraries(cmcppdap PRIVATE Threads::Threads)
   target_link_libraries(cmcppdap PRIVATE Threads::Threads)
 endif()
 endif()
+if(CMake_HAVE_CXX_ATOMIC_LIB)
+  target_link_libraries(cmcppdap PRIVATE atomic)
+endif()
 
 
 if(CMake_BUILD_PCH)
 if(CMake_BUILD_PCH)
   target_precompile_headers(cmcppdap PRIVATE "include/dap/protocol.h")
   target_precompile_headers(cmcppdap PRIVATE "include/dap/protocol.h")