X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=CMakeLists.txt;h=44f810e3c5fec71a299a166ee546a705ceb22ef8;hp=e21ace688663d4f4327fd161903140f4071c6048;hb=4da54b6be6a1ca19a2026908d48ae5c8d327ec86;hpb=39ccf9c39ec5c1ddeb5ba62f77cc811a2598bf72 diff --git a/CMakeLists.txt b/CMakeLists.txt index e21ace68..44f810e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,55 @@ endif() # 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 +std::atomic 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 #------------------------------------------------------------------------------- @@ -120,7 +169,7 @@ memaccess_check_unaligned_le(HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS) set(PV_TITLE PulseView) set(PV_DESCRIPTION "A GUI for sigrok") -set(PV_VERSION_STRING "0.3.0") +set(PV_VERSION_STRING "0.4.0") include(GetGitRevisionDescription) @@ -244,6 +293,7 @@ set(pulseview_HEADERS pv/prop/property.hpp pv/prop/string.hpp pv/toolbars/mainbar.hpp + pv/view/analogsignal.hpp pv/view/cursor.hpp pv/view/flag.hpp pv/view/header.hpp @@ -386,18 +436,17 @@ set(PULSEVIEW_LINK_LIBS ${Boost_LIBRARIES} ${QT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} + ${LIBATOMIC_LIBRARY} ) if(STATIC_PKGDEPS_LIBS) - link_directories(${PKGDEPS_STATIC_LIBRARY_DIRS}) - list(APPEND PULSEVIEW_LINK_LIBS ${PKGDEPS_STATIC_LIBRARIES}) + list(APPEND PULSEVIEW_LINK_LIBS ${PKGDEPS_STATIC_LDFLAGS}) if(WIN32) # Workaround for a MinGW linking issue. list(APPEND PULSEVIEW_LINK_LIBS "-llzma -llcms2") endif() else() - link_directories(${PKGDEPS_LIBRARY_DIRS}) - list(APPEND PULSEVIEW_LINK_LIBS ${PKGDEPS_LIBRARIES}) + list(APPEND PULSEVIEW_LINK_LIBS ${PKGDEPS_LDFLAGS}) endif() if(WIN32)