From d59e64c8ef4ec2f20aac6777306952efc6c454b8 Mon Sep 17 00:00:00 2001 From: David Gräff Date: Wed, 2 Mar 2016 17:05:10 +0100 Subject: [PATCH] Master branch uses cmake now for building --- .travis.yml | 43 ++++++++++++++++++++++++++++--------------- CMakeLists.txt | 46 ++++++++++++++++++++++++++++++++++++++++++++++ cmake/CPackInfos.cmake | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cmake/FindFFTW.cmake | 22 ++++++++++++++++++++++ cmake/Findlibusb.cmake | 39 +++++++++++++++++++++++++++++++++++++++ cmake/copy_qt5_dlls_to_bin_dir.cmake | 16 ++++++++++++++++ openhantek/CMakeLists.txt | 33 +++++++++++++++++++++++++++++++++ openhantek/OpenHantek.pro | 205 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 8 files changed, 269 insertions(+), 220 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 cmake/CPackInfos.cmake create mode 100644 cmake/FindFFTW.cmake create mode 100644 cmake/Findlibusb.cmake create mode 100644 cmake/copy_qt5_dlls_to_bin_dir.cmake create mode 100644 openhantek/CMakeLists.txt delete mode 100644 openhantek/OpenHantek.pro diff --git a/.travis.yml b/.travis.yml index f693298..cf00024 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,42 +1,55 @@ language: cpp -compiler: - - clang - - gcc - sudo: required +dist: trusty -services: - - docker +compiler: + - gcc + - clang os: - - linux - osx - -matrix: - allow_failures: - - os: osx + - linux addons: apt: - packages: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-3.6 + packages: &native_deps - cmake - qttools5-dev + - qttools5-dev-tools - libusb-1.0-0-dev - libfftw3-dev - libqt5qml5 - doxygen + - gcc-5 + - g++-5 + - clang-3.6 + +# We construct a build matrix for two operating systems (linux, osx) and two compilers (gcc, clang) +matrix: + exclude: + - os: osx + compiler: + - gcc +# fast_finish: true + allow_failures: + - os: osx before_install: - - sudo apt-get install -qq qt5-default qttools5-dev-tools libqt5opengl5-dev + - if [[ "$TRAVIS_OS_NAME" != "osx" ]]; then sudo apt-get install -qq libqt5opengl5-dev; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; brew install libusb fftw qt5; fi before_script: + - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CC" == "gcc" ]]; then export CXX="g++-5" CC="gcc-5"; fi + - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CC" == "clang" ]]; then export CXX="clang++-3.6" CC="clang-3.6"; fi - mkdir build - cd build - cmake ../ script: - - if [ "$TRAVIS_OS_NAME" = "osx" ] && [ "$CC" = "gcc" ]; then export CC=gcc-4.8; fi - make before_deploy: @@ -54,4 +67,4 @@ deploy: - packages/OpenHantek-Release.sh - packages/OpenHantek-Release.zip on: - repo: OpenHantek/openhantek + repo: OpenHantek/openhantek \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5b788ea --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,46 @@ +# We need cmake 3.0 for Qt AUTORCC +cmake_minimum_required(VERSION 3.0 FATAL_ERROR) +project(OpenHantekProject) + +# Default build type +IF(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE RelWithDebInfo) +ENDIF(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + +# Select flags +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") # -Wfatal-errors +SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti") +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG -O0") +SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DDEBUG -O0") + +# C++11: Workaround for cmake < 3.1 with no target_compile_features support. +if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +endif() + +# Find external libraries +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/") + +INCLUDE_DIRECTORIES(.) + +# Qt Widgets based Gui with OpenGL canvas +add_subdirectory(openhantek) + +# Use CPack to make deb/rpm/zip/exe installer packages +include(cmake/CPackInfos.cmake) + +install(FILES ChangeLog COPYING readme.md DESTINATION ".") + +# Add auxiliary files to the project, so that these files appear in VisualStudio/QtCreator +add_custom_target(readme SOURCES readme.md) + +# Add "cppcheck" command +add_custom_target(cppcheck COMMAND "cppcheck --enable=all -I \"${CMAKE_CURRENT_LIST_DIR}/libusbDSO\" -I \"${CMAKE_CURRENT_LIST_DIR}/libPostprocessingDSO\" -I \"${CMAKE_CURRENT_LIST_DIR}/openhantek/src\" -q ${SRC} --template=\"{file}:{line}: {severity}: {message}\"") + +# Add "doc" target to build the documentation. +find_package(Doxygen QUIET) +if (DOXYGEN_FOUND) + add_custom_target(doc + COMMAND "${CMAKE_COMMAND} -E remove_directory html" + COMMAND "${DOXYGEN_EXECUTABLE} Doxyfile" WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}") +endif() \ No newline at end of file diff --git a/cmake/CPackInfos.cmake b/cmake/CPackInfos.cmake new file mode 100644 index 0000000..595e5a7 --- /dev/null +++ b/cmake/CPackInfos.cmake @@ -0,0 +1,85 @@ +# This file configures CPack. We setup a version number that contains +# the current git revision if git is found. A zip file is created on +# all platforms. Additionally an NSIS Installer exe is created on windows +# and a .sh installer file for linux. + +find_package(Git QUIET) + +execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + RESULT_VARIABLE CMD_RESULT + OUTPUT_VARIABLE VCS_REVISION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + +if(NOT DEFINED CMD_RESULT) + message(WARNING "GIT executable not found. Make your PATH environment variable point to git") + return() +else() + execute_process( + COMMAND ${GIT_EXECUTABLE} status + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + RESULT_VARIABLE CMD_RESULT + OUTPUT_VARIABLE DESCRIBE_STATUS + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + string(REPLACE "\n" " " DESCRIBE_STATUS ${DESCRIBE_STATUS}) + string(REPLACE "\r" " " DESCRIBE_STATUS ${DESCRIBE_STATUS}) + string(REPLACE "\rn" " " DESCRIBE_STATUS ${DESCRIBE_STATUS}) + string(REPLACE " " ";" DESCRIBE_STATUS ${DESCRIBE_STATUS}) + list(GET DESCRIBE_STATUS 2 VCS_BRANCH) + +execute_process( + COMMAND ${GIT_EXECUTABLE} config --get remote.origin.url + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + RESULT_VARIABLE CMD_RESULT + OUTPUT_VARIABLE VCS_URL + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +endif() + +string(TIMESTAMP DATE_VERSION "%d.%m.%Y") +string(TIMESTAMP CURRENT_TIME "%d.%m.%Y %H:%M") + +if (UNIX) + set(CPACK_GENERATOR ZIP STGZ) +elseif(WIN32) + set(CPACK_GENERATOR ZIP NSIS) +endif() + +set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") +set(CPACK_PACKAGE_VERSION "${DATE_VERSION}-${VCS_BRANCH}-${VCS_REVISION}") +set(CPACK_PACKAGE_CONTACT "contact@openhantek.org") +set(CPACK_PACKAGE_VENDOR "OpenHantek Community") +set(CPACK_PACKAGE_DESCRIPTION "Digitial Oscilloscope for Hantek USB DSO hardware.") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "OpenHantek is a free software for Hantek (Voltcraft/Darkwire/Protek/Acetech) USB DSOs based on HantekDSO. Build on ${CURRENT_TIME} from ${VCS_URL}. Branch ${VCS_BRANCH} has been used at commit ${VCS_REVISION}") +set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/readme.md") +if (EXISTS "${CMAKE_SOURCE_DIR}/COPYING") + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING") +endif() +set(CPACK_DEBIAN_PACKAGE_SECTION "net") +IF ((MSVC AND CMAKE_GENERATOR MATCHES "Win64+") OR (CMAKE_SIZEOF_VOID_P EQUAL 8)) + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") +else() + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "i586") +endif() +set(CPACK_STRIP_FILES 1) + +include(CMakeDetermineSystem) + +set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") + +set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) +set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CMAKE_SYSTEM_NAME}") +set(CPACK_PACKAGE_INSTALL_DIRECTORY ".") +SET(CPACK_OUTPUT_FILE_PREFIX packages) + +include(CPack) +set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION ".") +include(InstallRequiredSystemLibraries) + +cpack_add_install_type(Full DISPLAY_NAME "All") + +set(VERSION ${CPACK_PACKAGE_VERSION}) \ No newline at end of file diff --git a/cmake/FindFFTW.cmake b/cmake/FindFFTW.cmake new file mode 100644 index 0000000..1073249 --- /dev/null +++ b/cmake/FindFFTW.cmake @@ -0,0 +1,22 @@ +# - Find FFTW +# Find the native FFTW includes and library +# +# FFTW_INCLUDES - where to find fftw3.h +# FFTW_LIBRARIES - List of libraries when using FFTW. +# FFTW_FOUND - True if FFTW found. + +if (FFTW_INCLUDES) + # Already in cache, be silent + set (FFTW_FIND_QUIETLY TRUE) +endif (FFTW_INCLUDES) + +find_path (FFTW_INCLUDES fftw3.h) + +find_library (FFTW_LIBRARIES NAMES fftw3) + +# handle the QUIETLY and REQUIRED arguments and set FFTW_FOUND to TRUE if +# all listed variables are TRUE +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (FFTW DEFAULT_MSG FFTW_LIBRARIES FFTW_INCLUDES) + +mark_as_advanced (FFTW_LIBRARIES FFTW_INCLUDES) \ No newline at end of file diff --git a/cmake/Findlibusb.cmake b/cmake/Findlibusb.cmake new file mode 100644 index 0000000..b5d1895 --- /dev/null +++ b/cmake/Findlibusb.cmake @@ -0,0 +1,39 @@ +find_path(LIBUSB_INCLUDE_DIR + NAMES + libusb.h + PATHS + /usr/local/include + /opt/local/include + /usr/include + PATH_SUFFIXES + libusb-1.0 +) + +if (libusb_USE_STATIC_LIBS AND NOT MSVC) + set (LIBUSB_LIB_PREFIX "lib" CACHE INTERNAL "libusb library name prefox passed to find_library") + set (LIBUSB_LIB_SUFFIX ".a" CACHE INTERNAL "libusb library name suffix passed to find_library") +else () + set (LIBUSB_LIB_PREFIX "" CACHE INTERNAL "libusb library name prefox passed to find_library") + set (LIBUSB_LIB_SUFFIX "" CACHE INTERNAL "libusb library name suffix passed to find_library") +endif () + +find_library(LIBUSB_LIBRARY + NAMES + ${LIBUSB_LIB_PREFIX}usb-1.0${LIBUSB_LIB_SUFFIX} ${LIBUSB_LIB_PREFIX}usb${LIBUSB_LIB_SUFFIX} + PATHS + /usr/local/lib + /opt/local/lib + /usr/lib + /lib64/ + /usr/lib/i386-linux-gnu/ + /usr/lib/x86_64-linux-gnu/ +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(libusb REQUIRED_VARS LIBUSB_LIBRARY LIBUSB_INCLUDE_DIR) + +if (LIBUSB_FOUND) + set(LIBUSB_INCLUDE_DIRS ${LIBUSB_INCLUDE_DIR}) + set(LIBUSB_LIBRARIES ${LIBUSB_LIBRARY}) + mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARY) +endif (LIBUSB_FOUND) \ No newline at end of file diff --git a/cmake/copy_qt5_dlls_to_bin_dir.cmake b/cmake/copy_qt5_dlls_to_bin_dir.cmake new file mode 100644 index 0000000..3916186 --- /dev/null +++ b/cmake/copy_qt5_dlls_to_bin_dir.cmake @@ -0,0 +1,16 @@ +# install Qt Dlls into the binary dir on windows platforms +get_target_property(QT5_BIN_DIR Qt5::Core LOCATION) +get_filename_component(QT5_BIN_DIR "${QT5_BIN_DIR}" DIRECTORY) +if (MSVC AND EXISTS "${QT5_BIN_DIR}/windeployqt.exe") + add_custom_command(TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND "${QT5_BIN_DIR}/qtenv2.bat" + COMMAND "${QT5_BIN_DIR}/windeployqt" --no-translations "${CMAKE_BINARY_DIR}/$/${PROJECT_NAME}.exe" + WORKING_DIRECTORY "${QT5_BIN_DIR}" + COMMENT "Copy Qt5 dlls for ${PROJECT_NAME}" + ) + + SET(EXE "\${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.exe") + configure_file(installQt.cmake.in "${CMAKE_BINARY_DIR}/installQt.cmake") + install(SCRIPT "${CMAKE_BINARY_DIR}/installQt.cmake") +endif() diff --git a/openhantek/CMakeLists.txt b/openhantek/CMakeLists.txt new file mode 100644 index 0000000..fd2753e --- /dev/null +++ b/openhantek/CMakeLists.txt @@ -0,0 +1,33 @@ +project(OpenHantek CXX C) + +find_package(Qt5Widgets REQUIRED) +find_package(Qt5PrintSupport REQUIRED) +find_package(Qt5OpenGL REQUIRED) +find_package(OpenGL) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +# include directories +set(CMAKE_INCLUDE_CURRENT_DIR ON) +include_directories(src/ src/hantek) + +# collect sources and other files +file(GLOB_RECURSE SRC "src/*.cpp") +file(GLOB_RECURSE HEADERS "src/*.h") +file(GLOB_RECURSE QRC "res/*.qrc") + +add_definitions(-DVERSION="${VERSION}") + +add_subdirectory(translations) +add_subdirectory(res) + +# make executable +add_executable(${PROJECT_NAME} ${SRC} ${HEADERS} ${QRC}) +target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::PrintSupport Qt5::OpenGL ${OPENGL_LIBRARIES} ) +#target_compile_features(${PROJECT_NAME} PRIVATE cxx_range_for) + +# install commands +install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ".") + +include(../cmake/copy_qt5_dlls_to_bin_dir.cmake) \ No newline at end of file diff --git a/openhantek/OpenHantek.pro b/openhantek/OpenHantek.pro deleted file mode 100644 index 8058b78..0000000 --- a/openhantek/OpenHantek.pro +++ /dev/null @@ -1,205 +0,0 @@ -# Helper functions -defineReplace(surround) { - elements = $$1 - prefix = $$2 - postfix = $$3 - result = - for(element, elements) { - result += "$${prefix}$${element}$${postfix}" - } - return($${result}) -} - -TEMPLATE = app - -# Configuration -CONFIG += \ - warn_on \ - qt -QT += opengl -QT += printsupport -LIBS += -lfftw3 - -# Source files -SOURCES += \ - src/colorbox.cpp \ - src/configdialog.cpp \ - src/configpages.cpp \ - src/dataanalyzer.cpp \ - src/dockwindows.cpp \ - src/dso.cpp \ - src/dsocontrol.cpp \ - src/dsowidget.cpp \ - src/exporter.cpp \ - src/glgenerator.cpp \ - src/glscope.cpp \ - src/helper.cpp \ - src/levelslider.cpp \ - src/main.cpp \ - src/openhantek.cpp \ - src/settings.cpp \ - src/sispinbox.cpp \ - src/hantek/control.cpp \ - src/hantek/device.cpp \ - src/hantek/types.cpp -HEADERS += \ - src/colorbox.h \ - src/configdialog.h \ - src/configpages.h \ - src/dataanalyzer.h \ - src/dockwindows.h \ - src/dso.h \ - src/dsocontrol.h \ - src/dsowidget.h \ - src/exporter.h \ - src/glscope.h \ - src/glgenerator.h \ - src/helper.h \ - src/levelslider.h \ - src/openhantek.h \ - src/settings.h \ - src/sispinbox.h \ - src/hantek/control.h \ - src/hantek/device.h \ - src/hantek/types.h - -# Ressource files -RESOURCES += \ - res/application.qrc \ - res/configdialog.qrc - -# Doxygen files -DOXYFILES += \ - Doxyfile \ - mainpage.dox \ - roadmap.dox - -# Files copied into the distribution package -DISTFILES += \ - ChangeLog \ - COPYING \ - INSTALL \ - res/images/*.png \ - res/images/*.icns \ - res/images/*.svg \ - translations/*.qm \ - translations/*.ts \ - $${DOXYFILES} - -# Translations -TRANSLATIONS += \ - translations/openhantek_de.ts \ - translations/openhantek_pt.ts - -# Program version -VERSION = 0.2.0 - -# Destination directory for built binaries -DESTDIR = bin - -# Prefix for installation -PREFIX = $$(PREFIX) - -# Build directories -OBJECTS_DIR = build/obj -UI_DIR = build/ui -MOC_DIR = build/moc - -# libusb version -LIBUSB_VERSION = $$(LIBUSB_VERSION) -contains(LIBUSB_VERSION, 0) { - LIBS += -lusb -} -else { - LIBUSB_VERSION = 1 - LIBS += -lusb-1.0 -} -DEFINES += LIBUSB_VERSION=$${LIBUSB_VERSION} - -# Debug output -CONFIG(debug, debug|release): DEFINES += DEBUG -else: DEFINES += QT_NO_DEBUG_OUTPUT - -# Quoted include directories -INCLUDEPATH_QUOTE = "$${IN_PWD}/src" - -# Include directory -QMAKE_CXXFLAGS += "-iquote $${INCLUDEPATH_QUOTE}" - -# Settings for different operating systems -unix:!macx { - isEmpty(PREFIX): PREFIX = /usr/local - TARGET = openhantek - - # Installation directories - target.path = $${PREFIX}/bin - translations.path = $${PREFIX}/share/apps/openhantek/translations - contains(LIBUSB_VERSION, 0) { - INCLUDEPATH += /usr/include/libusb - } - else { - INCLUDEPATH += /usr/include/libusb-1.0 - } - DEFINES += \ - QMAKE_TRANSLATIONS_PATH=\\\"$${translations.path}\\\" \ - OS_UNIX VERSION=\\\"$${VERSION}\\\" -} -macx { - isEmpty(PREFIX): PREFIX = OpenHantek.app - TARGET = OpenHantek - - # Installation directories - target.path = $${PREFIX}/Contents/MacOS - translations.path = $${PREFIX}/Contents/Resources/translations - INCLUDEPATH += $${INCLUDEPATH_QUOTE} - LIBS += -framework IOKit -framework CoreFoundation - ICON = res/images/openhantek.icns - DEFINES += \ - QMAKE_TRANSLATIONS_PATH=\\\"Contents/Resources/translations\\\" \ - OS_DARWIN VERSION=\\\"$${VERSION}\\\" -} -win32 { - isEmpty(PREFIX): PREFIX = OpenHantek - TARGET = OpenHantek - - # Installation directories - target.path = $${PREFIX} - translations.path = $${PREFIX}/translations - INCLUDEPATH += $${INCLUDEPATH_QUOTE} - DEFINES += \ - QMAKE_TRANSLATIONS_PATH=\\\"translations\\\" \ - OS_WINDOWS VERSION=\\\"$${VERSION}\\\" -} -translations.files += translations/*.qm -INSTALLS += \ - target \ - translations - -# Custom compiler "lrelease" for qm generation -isEmpty(QMAKE_LRELEASE) { - win32: QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe - else: QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease -} -lrelease.input = TRANSLATIONS -lrelease.output = ${QMAKE_FILE_PATH}/${QMAKE_FILE_BASE}.qm -lrelease.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_PATH}/${QMAKE_FILE_BASE}.qm -lrelease.CONFIG += no_link -QMAKE_EXTRA_COMPILERS += lrelease -PRE_TARGETDEPS += compiler_lrelease_make_all - -# Custom target "cppcheck" for Cppcheck -INCLUDEPARAMETERS = $$surround($${INCLUDEPATH} $${INCLUDEPATH_QUOTE}, "-I \"", "\"") -cppcheck.commands = "cppcheck --enable=all $${INCLUDEPARAMETERS} -q $${SOURCES} --template=\"{file}:{line}: {severity}: {message}\"" -cppcheck.depends = $${SOURCES} - -# Custom target "doc" for Doxygen -doxygen.target = "doc" -doxygen.commands = "rm -r doc/; env DEFINES=\"$${DEFINES}\" doxygen Doxyfile" -doxygen.depends = \ - $${SOURCES} \ - $${HEADERS} \ - $${DOXYFILES} - -QMAKE_EXTRA_TARGETS += \ - cppcheck \ - doxygen -- libgit2 0.21.4