]> sigrok.org Git - pulseview.git/blobdiff - CMakeLists.txt
cmake: add check for explicit linking against libatomic
[pulseview.git] / CMakeLists.txt
index 9dac69f2b08155200bf9bd49bcd78a99c74f9a08..44f810e3c5fec71a299a166ee546a705ceb22ef8 100644 (file)
@@ -107,6 +107,55 @@ endif()
 # This will set ${CMAKE_THREAD_LIBS_INIT} to the correct, OS-specific value.
 find_package(Threads REQUIRED)
 
 # This will set ${CMAKE_THREAD_LIBS_INIT} to the correct, OS-specific value.
 find_package(Threads REQUIRED)
 
+
+# Check for explicit link against libatomic
+#
+# Depending on the toolchain, linking a program using atomic functions may need
+# "-latomic" explicitly passed to the linker
+#
+# This check first tests if atomics are available in the C-library, if not and
+# libatomic exists, then it runs the same test with -latomic added to the
+# linker flags.
+
+# Helper for checking for atomics
+function(check_working_cxx_atomics varname additional_lib)
+  include(CheckCXXSourceCompiles)
+  include(CMakePushCheckState)
+  cmake_push_check_state()
+  set(CMAKE_REQUIRED_FLAGS "-std=c++11")
+  set(CMAKE_REQUIRED_LIBRARIES "${additional_lib}")
+  set(CMAKE_REQUIRED_QUIET 1)
+  CHECK_CXX_SOURCE_COMPILES("
+#include <atomic>
+std::atomic<int> x;
+int main() {
+  return std::atomic_fetch_add_explicit(&x, 1, std::memory_order_seq_cst);
+}
+" ${varname})
+  cmake_pop_check_state()
+endfunction(check_working_cxx_atomics)
+
+# First check if atomics work without the library.
+# If not, check if the library exists, and atomics work with it.
+check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB "")
+if(HAVE_CXX_ATOMICS_WITHOUT_LIB)
+  message(STATUS "Atomics provided by the C-library - yes")
+else()
+  message(STATUS "Atomics provided by the C-library - no")
+  find_library(LIBATOMIC_LIBRARY NAMES atomic PATH_SUFFIXES lib)
+  if(LIBATOMIC_LIBRARY)
+    check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB "${LIBATOMIC_LIBRARY}")
+    if (HAVE_CXX_ATOMICS_WITH_LIB)
+      message(STATUS "Atomics provided by libatomic - yes")
+    else()
+      message(STATUS "Atomics provided by libatomic - no")
+      message(FATAL_ERROR "Compiler must support std::atomic!")
+    endif()
+  else()
+    message(FATAL_ERROR "Compiler appears to require libatomic, but cannot find it.")
+  endif()
+endif()
+
 #===============================================================================
 #= System Introspection
 #-------------------------------------------------------------------------------
 #===============================================================================
 #= System Introspection
 #-------------------------------------------------------------------------------
@@ -387,6 +436,7 @@ set(PULSEVIEW_LINK_LIBS
        ${Boost_LIBRARIES}
        ${QT_LIBRARIES}
        ${CMAKE_THREAD_LIBS_INIT}
        ${Boost_LIBRARIES}
        ${QT_LIBRARIES}
        ${CMAKE_THREAD_LIBS_INIT}
+       ${LIBATOMIC_LIBRARY}
 )
 
 if(STATIC_PKGDEPS_LIBS)
 )
 
 if(STATIC_PKGDEPS_LIBS)