X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=CMakeLists.txt;h=547c7c126bf69c7558732091dbc6c6df5e22960e;hp=8b5214435e1866f92e37295b11a7b888d99818bc;hb=326cf6feb8598aa03a35fd6f678e4f536f168149;hpb=d69b3c315c5335091a659a3c268cd5f7e27a4b26 diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b521443..547c7c12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,6 @@ cmake_minimum_required(VERSION 2.8.6) -include(FindPkgConfig) include(GNUInstallDirs) project(pulseview) @@ -34,7 +33,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake") option(DISABLE_WERROR "Build without -Werror" FALSE) option(ENABLE_SIGNALS "Build with UNIX signals" TRUE) option(ENABLE_DECODE "Build with libsigrokdecode" TRUE) -option(ENABLE_TESTS "Enable unit tests" FALSE) +option(ENABLE_TESTS "Enable unit tests" TRUE) option(STATIC_PKGDEPS_LIBS "Statically link to (pkg-config) libraries" FALSE) option(FORCE_QT4 "Force use of Qt4 even if Qt5 is available" FALSE) @@ -82,6 +81,11 @@ if(FORCE_QT4) set(Qt5Core_FOUND FALSE) else() find_package(Qt5Core QUIET) +if(WIN32) + # MXE workaround: Use pkg-config to find Qt5 libs. + # https://github.com/mxe/mxe/issues/1642 + pkg_check_modules(QT5ALL REQUIRED Qt5Widgets Qt5Gui Qt5Svg) +endif() endif() if(Qt5Core_FOUND) @@ -98,16 +102,65 @@ else() find_package(Qt4 REQUIRED QtCore QtGui QtSvg) endif() +set(BOOSTCOMPS filesystem serialization system thread) if(ENABLE_TESTS) - find_package(Boost 1.42 COMPONENTS filesystem system thread unit_test_framework REQUIRED) -else() - find_package(Boost 1.42 COMPONENTS filesystem system thread REQUIRED) + list(APPEND BOOSTCOMPS unit_test_framework) endif() +find_package(Boost 1.55 COMPONENTS ${BOOSTCOMPS} REQUIRED) # Find the platform's thread library (needed for C++11 threads). # 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 #------------------------------------------------------------------------------- @@ -121,29 +174,17 @@ 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) -git_describe(PV_TAG_VERSION_STRING --tags --dirty) +# Append the revision hash unless we are exactly on a tagged release. +git_describe(PV_TAG_VERSION_STRING --match "pulseview-${PV_VERSION_STRING}" --exact-match) if(NOT PV_TAG_VERSION_STRING) - # Read the version from a file that is distributed with - # the source package (see writepackageversion.cmake). - file(STRINGS "${PROJECT_SOURCE_DIR}/VERSION" PV_TAG_VERSION_STRING LIMIT_COUNT 1) -endif() - -if(PV_TAG_VERSION_STRING MATCHES - "^pulseview-([0-9]+\\.[0-9]+\\.[0-9]+)(-[0-9a-z]+)?(-g[-0-9a-z]+)?$") - set(PV_TAG_VERSION ${CMAKE_MATCH_1}) - set(PV_TAG_PATCHLEVEL ${CMAKE_MATCH_2}) - set(PV_TAG_REVHASH ${CMAKE_MATCH_3}) - - if(PV_VERSION_STRING VERSION_GREATER ${PV_TAG_VERSION}) - # Tagged version older than current one: indicate pre-release. - set(PV_VERSION_STRING "${PV_VERSION_STRING}-pre${PV_TAG_REVHASH}") - else() - # For post-release changes, indicate the patch level. - set(PV_VERSION_STRING "${PV_TAG_VERSION}${PV_TAG_PATCHLEVEL}${PV_TAG_REVHASH}") + get_git_head_revision(PV_REVSPEC PV_HASH) + if(PV_HASH) + string(SUBSTRING "${PV_HASH}" 0 7 PV_SHORTHASH) + set(PV_VERSION_STRING "${PV_VERSION_STRING}-git-${PV_SHORTHASH}") endif() endif() @@ -169,6 +210,7 @@ set(pulseview_SOURCES main.cpp pv/application.cpp pv/devicemanager.cpp + pv/globalsettings.cpp pv/mainwindow.cpp pv/session.cpp pv/storesession.cpp @@ -180,6 +222,7 @@ set(pulseview_SOURCES pv/data/analogsegment.cpp pv/data/logic.cpp pv/data/logicsegment.cpp + pv/data/signalbase.cpp pv/data/signaldata.cpp pv/data/segment.cpp pv/devices/device.cpp @@ -190,6 +233,7 @@ set(pulseview_SOURCES pv/dialogs/about.cpp pv/dialogs/connect.cpp pv/dialogs/inputoutputoptions.cpp + pv/dialogs/settings.cpp pv/dialogs/storeprogress.cpp pv/popups/deviceoptions.cpp pv/popups/channels.cpp @@ -208,40 +252,53 @@ set(pulseview_SOURCES pv/view/marginwidget.cpp pv/view/logicsignal.cpp pv/view/rowitem.cpp - pv/view/rowitemowner.cpp pv/view/ruler.cpp pv/view/signal.cpp + pv/view/signalscalehandle.cpp pv/view/timeitem.cpp pv/view/timemarker.cpp pv/view/trace.cpp pv/view/tracegroup.cpp pv/view/tracepalette.cpp + pv/view/tracetreeitem.cpp + pv/view/tracetreeitemowner.cpp + pv/view/triggermarker.cpp pv/view/view.cpp pv/view/viewitem.cpp + pv/view/viewitemowner.cpp pv/view/viewitempaintparams.cpp pv/view/viewport.cpp pv/view/viewwidget.cpp + pv/views/viewbase.cpp + pv/views/trace/standardbar.cpp pv/widgets/colourbutton.cpp pv/widgets/colourpopup.cpp pv/widgets/devicetoolbutton.cpp pv/widgets/exportmenu.cpp - pv/widgets/hidingmenubar.cpp pv/widgets/importmenu.cpp pv/widgets/popup.cpp pv/widgets/popuptoolbutton.cpp pv/widgets/sweeptimingwidget.cpp + pv/widgets/timestampspinbox.cpp pv/widgets/wellarray.cpp ) # This list includes only QObject derived class headers. set(pulseview_HEADERS + pv/globalsettings.hpp pv/mainwindow.hpp pv/session.hpp pv/storesession.hpp pv/binding/device.hpp + pv/data/analog.hpp + pv/data/analogsegment.hpp + pv/data/logic.hpp + pv/data/logicsegment.hpp + pv/data/signalbase.hpp pv/dialogs/about.hpp pv/dialogs/connect.hpp pv/dialogs/inputoutputoptions.hpp + pv/dialogs/settings.hpp pv/dialogs/storeprogress.hpp pv/popups/channels.hpp pv/popups/deviceoptions.hpp @@ -252,6 +309,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 @@ -260,23 +318,28 @@ set(pulseview_HEADERS pv/view/rowitem.hpp pv/view/ruler.hpp pv/view/signal.hpp + pv/view/signalscalehandle.hpp pv/view/timeitem.hpp pv/view/timemarker.hpp pv/view/trace.hpp pv/view/tracegroup.hpp + pv/view/tracetreeitem.hpp + pv/view/triggermarker.hpp pv/view/view.hpp pv/view/viewitem.hpp pv/view/viewport.hpp pv/view/viewwidget.hpp + pv/views/viewbase.hpp + pv/views/trace/standardbar.hpp pv/widgets/colourbutton.hpp pv/widgets/colourpopup.hpp pv/widgets/devicetoolbutton.hpp pv/widgets/exportmenu.hpp - pv/widgets/hidingmenubar.hpp pv/widgets/importmenu.hpp pv/widgets/popup.hpp pv/widgets/popuptoolbutton.hpp pv/widgets/sweeptimingwidget.hpp + pv/widgets/timestampspinbox.hpp pv/widgets/wellarray.hpp ) @@ -322,7 +385,10 @@ if(WIN32) endif() if(ANDROID) - list(APPEND pulseview_SOURCES android/loghandler.cpp) + list(APPEND pulseview_SOURCES + android/assetreader.cpp + android/loghandler.cpp + ) endif() if(Qt5Core_FOUND) @@ -330,7 +396,7 @@ if(Qt5Core_FOUND) qt5_wrap_ui(pulseview_FORMS_HEADERS ${pulseview_FORMS}) qt5_add_resources(pulseview_RESOURCES_RCC ${pulseview_RESOURCES}) else() - # Workaroud for QTBUG-22829: -DBOOST_NEXT_PRIOR_HPP_INCLUDED. + # Workaround for QTBUG-22829: -DBOOST_NEXT_PRIOR_HPP_INCLUDED. # https://bugreports.qt.io/browse/QTBUG-22829 qt4_wrap_cpp(pulseview_HEADERS_MOC ${pulseview_HEADERS} OPTIONS -DBOOST_NEXT_PRIOR_HPP_INCLUDED) @@ -347,6 +413,7 @@ add_definitions(${QT_DEFINITIONS} -DQT_NO_KEYWORDS) add_definitions(-D__STDC_LIMIT_MACROS) add_definitions(-Wall -Wextra) add_definitions(-std=c++11) +add_definitions(-DBOOST_MATH_DISABLE_FLOAT128=1) if(ENABLE_DECODE) add_definitions(-DENABLE_DECODE) @@ -387,15 +454,12 @@ 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}) -if(WIN32) - # Workaround for a MinGW linking issue. - list(APPEND PULSEVIEW_LINK_LIBS "-llzma -llcms2") -endif() + list(APPEND PULSEVIEW_LINK_LIBS ${PKGDEPS_STATIC_LDFLAGS}) else() link_directories(${PKGDEPS_LIBRARY_DIRS}) list(APPEND PULSEVIEW_LINK_LIBS ${PKGDEPS_LIBRARIES}) @@ -404,10 +468,12 @@ endif() if(WIN32) # On Windows we need to statically link the libqsvg imageformat # plugin (and the QtSvg component) for SVG graphics/icons to work. + # We also need QWindowsIntegrationPlugin, Qt5PlatformSupport, and all + # Qt libs and their dependencies. add_definitions(-DQT_STATICPLUGIN) - link_directories("${QT_PLUGINS_DIR}/imageformats") - list(APPEND PULSEVIEW_LINK_LIBS "-lqsvg") - list(APPEND PULSEVIEW_LINK_LIBS ${QT_QTSVG_LIBRARY}) + list(APPEND PULSEVIEW_LINK_LIBS Qt5::QSvgPlugin) + list(APPEND PULSEVIEW_LINK_LIBS Qt5::QWindowsIntegrationPlugin) + list(APPEND PULSEVIEW_LINK_LIBS -lQt5PlatformSupport ${QT5ALL_LDFLAGS}) endif() if(ANDROID) @@ -447,6 +513,9 @@ install(TARGETS ${PROJECT_NAME} DESTINATION bin/) # Install the manpage. install(FILES doc/pulseview.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT doc) +# Generate Windows installer script. +configure_file(contrib/pulseview_cross.nsi.in contrib/pulseview_cross.nsi @ONLY) + #=============================================================================== #= Packaging (handled by CPack) #------------------------------------------------------------------------------- @@ -459,7 +528,6 @@ set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/COPYING) set(CPACK_SOURCE_IGNORE_FILES ${CMAKE_CURRENT_BINARY_DIR} ".gitignore" ".git") set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${PV_VERSION_STRING}") set(CPACK_SOURCE_GENERATOR "TGZ") -set(CPACK_INSTALL_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/CMake/writepackageversion.cmake) include(CPack)