From 5ceffe14cc1d6cbdf072f70c68ba129632ca628a Mon Sep 17 00:00:00 2001 From: Davide Gerhard Date: Tue, 7 May 2019 19:36:47 +0200 Subject: [PATCH] rework to prepare for use cpack; new sdrangel icon --- CMakeLists.txt | 148 +++------------- CPack.cmake | 159 ++++++++++++++++++ cmake/Modules/FindSoapySDR.cmake | 36 ---- .../cpack}/MacOSXBundleInfo.plist.in | 0 .../cpack}/sdrangel.desktop.in | 0 .../cpack}/sdrangel_icon.icns | Bin .../desktop => cmake/cpack}/sdrangel_icon.png | Bin .../desktop => cmake/cpack}/sdrangel_icon.svg | 0 cmake/sdrangel.sh | 14 +- devices/soapysdr/CMakeLists.txt | 4 +- .../samplesink/soapysdroutput/CMakeLists.txt | 4 +- .../samplesource/soapysdrinput/CMakeLists.txt | 2 +- sdrgui/resources/sdrangel_icon.ico | Bin 3262 -> 106124 bytes sdrgui/resources/sdrangel_icon.png | Bin 1312 -> 14031 bytes 14 files changed, 190 insertions(+), 177 deletions(-) create mode 100644 CPack.cmake delete mode 100644 cmake/Modules/FindSoapySDR.cmake rename {custom/desktop => cmake/cpack}/MacOSXBundleInfo.plist.in (100%) rename {custom/desktop => cmake/cpack}/sdrangel.desktop.in (100%) rename {custom/desktop => cmake/cpack}/sdrangel_icon.icns (100%) rename {custom/desktop => cmake/cpack}/sdrangel_icon.png (100%) rename {custom/desktop => cmake/cpack}/sdrangel_icon.svg (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cb6f69f3..777f79192 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,25 +102,26 @@ endif() # declare build structures # !! change sdrbase/plugin/pluginmanager.cpp too !! if(WIN32) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") else() - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") endif() -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(BUILD_PLUGINS_DIR ${CMAKE_BINARY_DIR}/lib/plugins) -set(BUILD_PLUGINSSRV_DIR ${CMAKE_BINARY_DIR}/lib/pluginssrv) -set(INSTALL_BIN_DIR "bin") +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") +set(BUILD_PLUGINS_DIR "${CMAKE_BINARY_DIR}/lib/plugins") +set(BUILD_PLUGINSSRV_DIR "${CMAKE_BINARY_DIR}/lib/pluginssrv") # use only lib when create .app/.dmg if(APPLE AND BUNDLE AND BUILD_GUI) + set(INSTALL_BIN_DIR ".") set(INSTALL_LIB_DIR "lib") set(INSTALL_DOC_DIR "doc") else() + set(INSTALL_BIN_DIR "bin") set(INSTALL_LIB_DIR "lib/${CMAKE_PROJECT_NAME}") set(INSTALL_DOC_DIR "share/${CMAKE_PROJECT_NAME}") endif() -set(INSTALL_PLUGINS_DIR ${INSTALL_LIB_DIR}/plugins) -set(INSTALL_PLUGINSSRV_DIR ${INSTALL_LIB_DIR}/pluginssrv) +set(INSTALL_PLUGINS_DIR "${INSTALL_LIB_DIR}/plugins") +set(INSTALL_PLUGINSSRV_DIR "${INSTALL_LIB_DIR}/pluginssrv") set(EXTERNAL_BUILD_LIBRARIES "${CMAKE_BINARY_DIR}/external_build") set(EXTERNAL_INSTALL_LIBRARIES "${CMAKE_BINARY_DIR}/external") @@ -135,7 +136,7 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") OUTPUT_STRIP_TRAILING_WHITESPACE ) endif() - configure_file("${CMAKE_SOURCE_DIR}/custom/desktop/${CMAKE_PROJECT_NAME}.desktop.in" + configure_file("${CMAKE_SOURCE_DIR}/cmake/cpack/${CMAKE_PROJECT_NAME}.desktop.in" "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.desktop" @ONLY) elseif(APPLE) # check @@ -143,7 +144,7 @@ elseif(APPLE) message(STATUS "Build for macOS version: ${CMAKE_OSX_DEPLOYMENT_TARGET}") set(CMAKE_MACOSX_RPATH ON) - configure_file("${CMAKE_SOURCE_DIR}/custom/desktop/MacOSXBundleInfo.plist.in" + configure_file("${CMAKE_SOURCE_DIR}/cmake/cpack/MacOSXBundleInfo.plist.in" "${CMAKE_BINARY_DIR}/Info.plist" @ONLY) elseif (WIN32) set(EXTERNAL_LIBRARY_FOLDER "${CMAKE_SOURCE_DIR}/external/windows") @@ -270,10 +271,14 @@ if(ENABLE_RTLSDR) find_package(LibRTLSDR) endif() if(ENABLE_SOAPYSDR) - find_package(SoapySDR 0.4.0) + find_package(SoapySDR 0.4.0 NO_MODULE) + if(NOT "${SoapySDR_LIBRARIES}" STREQUAL "" AND NOT "${SoapySDR_INCLUDE_DIRS}" STREQUAL "") + set(SOAPYSDR_FOUND ON) + message(STATUS "Found SoapySDR: ${SoapySDR_INCLUDE_DIRS}, ${SoapySDR_LIBRARIES}") + endif() endif() if(ENABLE_XTRX) - find_package(LibXTRX) + find_package(LibXTRX) endif() if (CODEC2_FOUND) @@ -406,8 +411,8 @@ endif() #install files and directories (linux specific) if (LINUX) - install(FILES ${CMAKE_BINARY_DIR}/sdrangel.desktop DESTINATION share/applications) - install(FILES ${CMAKE_SOURCE_DIR}/custom/desktop/sdrangel_icon.png DESTINATION share/pixmaps) + install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.desktop DESTINATION share/applications) + install(FILES ${CMAKE_SOURCE_DIR}/cmake/cpack/${CMAKE_PROJECT_NAME}_icon.png DESTINATION share/pixmaps) endif() ############ uninstall target ################ @@ -421,117 +426,4 @@ add_custom_target(uninstall ${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake) ############ packaging ################ -if(APPLE AND BUNDLE AND BUILD_GUI) - - set(CPACK_GENERATOR "Bundle") - set(CPACK_BINARY_DRAGNDROP ON) - set(CPACK_BUNDLE_NAME "${APPLICATION_NAME}") - set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/custom/desktop/sdrangel_icon.icns") - set(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/Info.plist") - set(CPACK_BUNDLE_STARTUP_COMMAND "${CMAKE_SOURCE_DIR}/cmake/sdrangel.sh") - set(CPACK_BUNDLE_STARTUP_COMMAND "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}") - set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/custom/desktop/sdrangel_icon.icns") - - # fixup_bundle() doesn't work correctly with RPATH so, I move on ;-) - # GET_TARGET_PROPERTY(_qmake_path Qt5::qmake IMPORTED_LOCATION) - # GET_FILENAME_COMPONENT(_qt_bindir ${_qmake_path} DIRECTORY) - # INSTALL( - # CODE "EXECUTE_PROCESS(COMMAND \"${_qt_bindir}/macdeployqt\" \"\${CMAKE_INSTALL_PREFIX}/../../\" - # -appstore-compliant - # -executable=\"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BIN_DIR}/sdrangel\" - # -executable=\"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BIN_DIR}/sdrangelsrv\" - # -executable=\"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BIN_DIR}/sdrangelbench\")" -# -libpath=\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY}\")" - # # -libpath=\"\${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}\")" - # COMPONENT applications) - - INSTALL(CODE " - SET(BU_COPY_FULL_FRAMEWORK_CONTENTS ON) - include(BundleUtilities) - fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/../../../${CPACK_BUNDLE_NAME}.app\" \"\" \"/opt/local/lib;/usr/local/lib\") - " COMPONENT Runtime) - -elseif(LINUX AND BUNDLE) - - find_program (DPKG_BUILDER dpkg-buildpackage DOC "Debian package builder") - if (DPKG_BUILDER) - # - # Derive the correct filename for a Debian package because the DEB - # generator doesn't do this correctly at present. - # - find_program (DPKG_PROGRAM dpkg DOC "dpkg program of Debian-based systems") - if (DPKG_PROGRAM) - execute_process ( - COMMAND ${DPKG_PROGRAM} --print-architecture - OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - else (DPKG_PROGRAM) - set (CPACK_DEBIAN_PACKAGE_ARCHITECTURE noarch) - endif (DPKG_PROGRAM) - - # TODO: - # - perseus package - # - CHANGELOG see https://github.com/xbmc/xbmc/pull/9987/commits/0152e8f50c0f11c8bddcfdc65e1596851fe8b310 - # - verify dpkg info - # - Boost seems used through Qt - - # needs dpkg - set(CPACK_GENERATOR "DEB") - set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}_${LSB_CODENAME}_${CMAKE_SYSTEM_PROCESSOR}") - set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${APPLICATION_MAINTAINER}") - set(CPACK_DEBIAN_PACKAGE_SECTION "hamradio") - set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6, libasound2, libfftw3-single3, libgcc1, libgl1-mesa-glx, libqt5core5a, libqt5gui5, libqt5multimedia5, libqt5network5, libqt5opengl5, libqt5widgets5, libqt5multimedia5-plugins, libstdc++6, libusb-1.0-0, pulseaudio, libxml2, ffmpeg, libopus0, codec2, libairspy0, libhackrf0, librtlsdr0, libbladerf1, libmirisdr0, libiio0, soapysdr-tools") - - if ("${LSB_CODENAME}" STREQUAL "buster") # Debian 10 - set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec58, libavformat58, libairspyhf1, libopencv-imgproc3.2, libopencv-highgui3.2, limesuite") - elseif("${LSB_CODENAME}" STREQUAL "stretch") # Debian 9 - set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec57, libavformat57, libopencv-imgproc2.45v5, libopencv-highgu2.4-deb0, limesuite") - elseif("${LSB_CODENAME}" STREQUAL "bionic") # Ubuntu 18.04 - set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec57, libavformat57, libairspyhf0, libopencv-imgproc3.2, libopencv-highgui3.2, limesuite") - elseif("${LSB_CODENAME}" STREQUAL "xenial") # Ubuntu 16.04 - set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec-ffmpeg56, libavformat-ffmpeg56, libopencv-imgproc2.4v5, libopencv-highgui2.4v5") - endif() - - set (CPACK_DEBIAN_PACKAGE_PACKAGE_SHLIBDEPS ON) - endif (DPKG_BUILDER) - - find_program (RPMBUILDER rpmbuild DOC "RPM package builder") - if (RPMBUILDER) - # TODO - #list(APPEND CPACK_GENERATOR "RPM") - #set(CPACK_RPM_PACKAGE_RELEASE "1") - #set(CPACK_RPM_PACKAGE_LICENSE "GPL-3.0") - #set(CPACK_RPM_PACKAGE_REQUIRES "libusb") - #set (CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) - endif (RPMBUILDER) - -elseif((WIN32 OR MINGW) AND BUNDLE) - - #set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) - - list(APPEND CPACK_GENERATOR "NSIS") - set(CPACK_NSIS_PACKAGE_NAME "${APPLICATION_NAME}") - set(CPACK_NSIS_CONTACT "${APPLICATION_MAINTAINER}") - set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) - set(CPACK_NSIS_MODIFY_PATH ON) - -else() - - if(NOT CMAKE_INSTALL_RPATH) - set(CMAKE_INSTALL_RPATH - ${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR} CACHE - PATH "Library Install RPath" FORCE) - endif() - - # force full path - if(APPLE AND NOT CMAKE_INSTALL_NAME_DIR) - set(CMAKE_INSTALL_NAME_DIR - ${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR} CACHE - PATH "Library Install Name Destination Directory" FORCE) - endif() - -endif(APPLE AND BUNDLE AND BUILD_GUI) - -message(STATUS "CPack generators: ${CPACK_GENERATOR}") include(CPack) diff --git a/CPack.cmake b/CPack.cmake new file mode 100644 index 000000000..b915a8448 --- /dev/null +++ b/CPack.cmake @@ -0,0 +1,159 @@ +# Stuff qmake can tell us +get_target_property (QMAKE_EXECUTABLE Qt5::qmake LOCATION) +function (QUERY_QMAKE VAR RESULT) + exec_program (${QMAKE_EXECUTABLE} ARGS "-query ${VAR}" RETURN_VALUE return_code OUTPUT_VARIABLE output) + if (NOT return_code) + file (TO_CMAKE_PATH "${output}" output) + set (${RESULT} ${output} PARENT_SCOPE) + endif (NOT return_code) + message (STATUS "Asking qmake for ${RESULT} and got ${output}") +endfunction (QUERY_QMAKE) + +query_qmake (QT_INSTALL_PLUGINS QT_PLUGINS_DIR) +query_qmake (QT_INSTALL_IMPORTS QT_IMPORTS_DIR) + +if(APPLE AND BUNDLE AND BUILD_GUI) + + set(CPACK_GENERATOR "Bundle") + set(CPACK_BINARY_DRAGNDROP ON) + set(CPACK_BUNDLE_NAME "${APPLICATION_NAME}") + set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/custom/desktop/sdrangel_icon.icns") + set(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/Info.plist") + set(CPACK_BUNDLE_STARTUP_COMMAND "${CMAKE_SOURCE_DIR}/cmake/cpack/sdrangel.sh") + set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/custom/desktop/sdrangel_icon.icns") + + # Copy Qt Plugins; fixup_bundle doesn't do that + install ( + DIRECTORY + "${QT_PLUGINS_DIR}/platforms" + "${QT_PLUGINS_DIR}/audio" + "${QT_PLUGINS_DIR}/accessible" + "${QT_PLUGINS_DIR}/imageformats" + "${QT_PLUGINS_DIR}/mediaservice" + "${QT_PLUGINS_DIR}/playlistformats" + "${QT_PLUGINS_DIR}/styles" + "${QT_PLUGINS_DIR}/iconengines" + DESTINATION "../PlugIns" + CONFIGURATIONS Release MinSizeRel + COMPONENT runtime + FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}" + PATTERN "*minimal*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*offscreen*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*_debug${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + ) + + # add plugins path for Mac Bundle + install (CODE " + get_filename_component (the_qt_conf \"\${CMAKE_INSTALL_PREFIX}/qt.conf\" REALPATH) + file (WRITE \"\${the_qt_conf}\" +\" +[Paths] +Plugins = ../PlugIns +\")" + ) + + # copy SoapySDR Modules + # probably libmirsdrapi-rsp.dylib can't be re-distribuited + # we remove the file at the end of fixup_bundle + if(ENABLE_SOAPYSDR AND SOAPYSDR_FOUND) + set(SOAPY_SDR_MOD_PATH "${SOAPY_SDR_ROOT}/lib/SoapySDR/modules${SOAPY_SDR_ABI_VERSION}") + file(GLOB SOAPY_MODS ${SOAPY_SDR_MOD_PATH}/*.so) + foreach(SOAPY_MOD_FILE ${SOAPY_MODS}) + install( FILES "${SOAPY_MOD_FILE}" + DESTINATION "../Frameworks/SoapySDR/modules${SOAPY_SDR_ABI_VERSION}" + COMPONENT Runtime + ) + endforeach() + endif() + + install(CODE " + file(GLOB_RECURSE SDRANGEL_PLUGINS + \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_PLUGINS_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\") + file(GLOB_RECURSE SDRANGEL_PLUGINSSRV + \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_PLUGINSSRV_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\") + file(GLOB_RECURSE QTPLUGINS \"\${CMAKE_INSTALL_PREFIX}/../PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\") + file(GLOB_RECURSE SOAPYSDR_PLUGINS \"\${CMAKE_INSTALL_PREFIX}/../Frameworks/SoapySDR/modules${SOAPY_SDR_ABI_VERSION}/*.so\") + + set(BU_CHMOD_BUNDLE_ITEMS ON) + include(BundleUtilities) + fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${CMAKE_PROJECT_NAME}\" \"\${SDRANGEL_PLUGINS};\${SDRANGEL_PLUGINSSRV};\${QTPLUGINS};\${SOAPYSDR_PLUGINS}\" \"${CMAKE_LIBRARY_OUTPUT_DIRECTORY}\") + + # remove non distribuitable files + file(REMOVE \"\${CMAKE_INSTALL_PREFIX}/../Frameworks/libmirsdrapi-rsp.dylib\") + + # Remove unused library + #file(GLOB SDRANGEL_LIB \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\") + #file(REMOVE_RECURSE \"\${SDRANGEL_LIB}\") + file(REMOVE \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\") +" COMPONENT Runtime) + +elseif(LINUX AND BUNDLE) + + find_program (DPKG_BUILDER dpkg-buildpackage DOC "Debian package builder") + if (DPKG_BUILDER) + # + # Derive the correct filename for a Debian package because the DEB + # generator doesn't do this correctly at present. + # + find_program (DPKG_PROGRAM dpkg DOC "dpkg program of Debian-based systems") + if (DPKG_PROGRAM) + execute_process ( + COMMAND ${DPKG_PROGRAM} --print-architecture + OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + else (DPKG_PROGRAM) + set (CPACK_DEBIAN_PACKAGE_ARCHITECTURE noarch) + endif (DPKG_PROGRAM) + + # TODO: + # - perseus package + # - CHANGELOG see https://github.com/xbmc/xbmc/pull/9987/commits/0152e8f50c0f11c8bddcfdc65e1596851fe8b310 + # - verify dpkg info + # - Boost seems used through Qt + + # needs dpkg + set(CPACK_GENERATOR "DEB") + set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}_${LSB_CODENAME}_${CMAKE_SYSTEM_PROCESSOR}") + set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${APPLICATION_MAINTAINER}") + set(CPACK_DEBIAN_PACKAGE_SECTION "hamradio") + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6, libasound2, libfftw3-single3, libgcc1, libgl1-mesa-glx, libqt5core5a, libqt5gui5, libqt5multimedia5, libqt5network5, libqt5opengl5, libqt5widgets5, libqt5multimedia5-plugins, libstdc++6, libusb-1.0-0, pulseaudio, libxml2, ffmpeg, libopus0, codec2, libairspy0, libhackrf0, librtlsdr0, libbladerf1, libmirisdr0, libiio0, soapysdr-tools") + + if ("${LSB_CODENAME}" STREQUAL "buster") # Debian 10 + set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec58, libavformat58, libairspyhf1, libopencv-imgproc3.2, libopencv-highgui3.2, limesuite") + elseif("${LSB_CODENAME}" STREQUAL "stretch") # Debian 9 + set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec57, libavformat57, libopencv-imgproc2.45v5, libopencv-highgu2.4-deb0, limesuite") + elseif("${LSB_CODENAME}" STREQUAL "bionic") # Ubuntu 18.04 + set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec57, libavformat57, libairspyhf0, libopencv-imgproc3.2, libopencv-highgui3.2, limesuite") + elseif("${LSB_CODENAME}" STREQUAL "xenial") # Ubuntu 16.04 + set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec-ffmpeg56, libavformat-ffmpeg56, libopencv-imgproc2.4v5, libopencv-highgui2.4v5") + endif() + + set (CPACK_DEBIAN_PACKAGE_PACKAGE_SHLIBDEPS ON) + endif (DPKG_BUILDER) + + find_program (RPMBUILDER rpmbuild DOC "RPM package builder") + if (RPMBUILDER) + # TODO + #list(APPEND CPACK_GENERATOR "RPM") + #set(CPACK_RPM_PACKAGE_RELEASE "1") + #set(CPACK_RPM_PACKAGE_LICENSE "GPL-3.0") + #set(CPACK_RPM_PACKAGE_REQUIRES "libusb") + #set (CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) + endif (RPMBUILDER) + +elseif((WIN32 OR MINGW) AND BUNDLE) + + #set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) + + list(APPEND CPACK_GENERATOR "NSIS") + set(CPACK_NSIS_PACKAGE_NAME "${APPLICATION_NAME}") + set(CPACK_NSIS_CONTACT "${APPLICATION_MAINTAINER}") + set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) + set(CPACK_NSIS_MODIFY_PATH ON) + +endif(APPLE AND BUNDLE AND BUILD_GUI) + +message(STATUS "CPack generators: ${CPACK_GENERATOR}") +include(CPack) diff --git a/cmake/Modules/FindSoapySDR.cmake b/cmake/Modules/FindSoapySDR.cmake deleted file mode 100644 index fa86cd1a7..000000000 --- a/cmake/Modules/FindSoapySDR.cmake +++ /dev/null @@ -1,36 +0,0 @@ -# Find Soapy SDR - -if (NOT SOAPYSDR_INCLUDE_DIR) - find_path (SOAPYSDR_INCLUDE_DIR - NAMES SoapySDR/Version.h - PATHS ${SOAPYSDR_DIR}/include - /usr/include - /usr/local/include - ) -endif() - -if (NOT SOAPYSDR_LIBRARY) - find_library (SOAPYSDR_LIBRARY - NAMES SoapySDR - HINTS ${CMAKE_INSTALL_PREFIX}/lib - ${CMAKE_INSTALL_PREFIX}/lib64 - PATHS ${SOAPYSDR_DIR}/lib - ${SOAPYSDR_DIR}/lib64 - /usr/local/lib - /usr/local/lib64 - /usr/lib - /usr/lib64 - ) -endif() - -if (SOAPYSDR_INCLUDE_DIR AND SOAPYSDR_LIBRARY) - set(SOAPYSDR_FOUND TRUE) -endif() - -if (SOAPYSDR_FOUND) - message (STATUS "Found SoapySDR: ${SOAPYSDR_INCLUDE_DIR}, ${SOAPYSDR_LIBRARY}") -else() - message (STATUS "Could not find SoapySDR") -endif() - -mark_as_advanced(SOAPYSDR_INCLUDE_DIR SOAPYSDR_LIBRARY) diff --git a/custom/desktop/MacOSXBundleInfo.plist.in b/cmake/cpack/MacOSXBundleInfo.plist.in similarity index 100% rename from custom/desktop/MacOSXBundleInfo.plist.in rename to cmake/cpack/MacOSXBundleInfo.plist.in diff --git a/custom/desktop/sdrangel.desktop.in b/cmake/cpack/sdrangel.desktop.in similarity index 100% rename from custom/desktop/sdrangel.desktop.in rename to cmake/cpack/sdrangel.desktop.in diff --git a/custom/desktop/sdrangel_icon.icns b/cmake/cpack/sdrangel_icon.icns similarity index 100% rename from custom/desktop/sdrangel_icon.icns rename to cmake/cpack/sdrangel_icon.icns diff --git a/custom/desktop/sdrangel_icon.png b/cmake/cpack/sdrangel_icon.png similarity index 100% rename from custom/desktop/sdrangel_icon.png rename to cmake/cpack/sdrangel_icon.png diff --git a/custom/desktop/sdrangel_icon.svg b/cmake/cpack/sdrangel_icon.svg similarity index 100% rename from custom/desktop/sdrangel_icon.svg rename to cmake/cpack/sdrangel_icon.svg diff --git a/cmake/sdrangel.sh b/cmake/sdrangel.sh index 1900f5ca4..e86cdcfd2 100755 --- a/cmake/sdrangel.sh +++ b/cmake/sdrangel.sh @@ -1,12 +1,10 @@ #!/bin/sh -SDRANGEL_BUNDLE="`echo "$0" | sed -e 's/\/Contents\/MacOS\/.*//'`" -SDRANGEL_RESOURCES="$SDRANGEL_BUNDLE/Contents/Resources" +get_abs_dir() { + # $1 : relative filename + echo "$(cd "$(dirname "$1")" && pwd)" +} -echo "running $0" -echo "SDRANGEL_BUNDLE: $SDRANGEL_BUNDLE" +SDRANGEL_RESOURCES="$(get_abs_dir "$0")/../Resources" +exec "$SDRANGEL_RESOURCES/sdrangel" -export "DYLD_LIBRARY_PATH=$SDRANGEL_RESOURCES/lib" -export "PATH=$SDRANGEL_RESOURCES/bin:$PATH" - -exec "$SDRANGEL_RESOURCES/bin/sdrangel" diff --git a/devices/soapysdr/CMakeLists.txt b/devices/soapysdr/CMakeLists.txt index 197af16cf..df998beb3 100644 --- a/devices/soapysdr/CMakeLists.txt +++ b/devices/soapysdr/CMakeLists.txt @@ -16,7 +16,7 @@ set(soapysdrdevice_HEADERS include_directories( ${CMAKE_CURRENT_BINARY_DIR} - ${SOAPYSDR_INCLUDE_DIR} + ${SoapySDR_INCLUDE_DIRS} ) add_library(soapysdrdevice SHARED @@ -27,7 +27,7 @@ set_target_properties(soapysdrdevice PROPERTIES DEFINE_SYMBOL "devices_EXPORTS") target_link_libraries(soapysdrdevice - ${SOAPYSDR_LIBRARY} + ${SoapySDR_LIBRARIES} sdrbase ) diff --git a/plugins/samplesink/soapysdroutput/CMakeLists.txt b/plugins/samplesink/soapysdroutput/CMakeLists.txt index 83093c5ad..86dc18133 100644 --- a/plugins/samplesink/soapysdroutput/CMakeLists.txt +++ b/plugins/samplesink/soapysdroutput/CMakeLists.txt @@ -18,7 +18,7 @@ include_directories( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices - ${SOAPYSDR_INCLUDE_DIR} + ${SoapySDR_INCLUDE_DIRS} ) if(NOT SERVER_MODE) @@ -54,7 +54,7 @@ target_link_libraries(${TARGET_NAME} sdrbase ${TARGET_LIB_GUI} swagger - ${SOAPYSDR_LIBRARY} + ${SoapySDR_LIBRARIES} soapysdrdevice ) diff --git a/plugins/samplesource/soapysdrinput/CMakeLists.txt b/plugins/samplesource/soapysdrinput/CMakeLists.txt index 1fe65ca79..54924a128 100644 --- a/plugins/samplesource/soapysdrinput/CMakeLists.txt +++ b/plugins/samplesource/soapysdrinput/CMakeLists.txt @@ -18,7 +18,7 @@ include_directories( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices - ${SOAPYSDR_INCLUDE_DIR} + ${SoapySDR_INCLUDE_DIRS} ) if(NOT SERVER_MODE) diff --git a/sdrgui/resources/sdrangel_icon.ico b/sdrgui/resources/sdrangel_icon.ico index d55b7387ac8f0de6547ca9759f8506e8e53033da..62c7de726d8e000f4ca61a7f2d2bcd1fa7bd971d 100644 GIT binary patch literal 106124 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 ClseY{ literal 3262 zcmcgvTTc^F5Z=;lX_vOk_C`xkDwI1|C<+9kLJ=aCTS|$Qn-~oN6okmdC`1&*7ZMVE zF+Qom`-46p%9A{3yhi_$A1sW=-L@$hZKut5W@o-LXJ&S`aZZlo z^6`O+tHoziAM2H>(TE%;OPbM0cn`qJ^H!}^;pouoNir-JJF_Hxg1}`orWp(hV|Kg0 zjbE#kl9E_L1^(y!27_g%7K*JCSt9xB`1gq-iPz~w323=nkSR$Jg%<)Qac;#=%UGbu zZt1JazuOylJ>I@P-T88~bv{&G=XE1^bfdzHJ$NGdPt);hlN~>A_p9aMK$AK@yXAN3 zdBiM}f4b4LHr4TMp^x?&3HVq-VC+cZPDvpg3%HZ@i2q)HL$O07o7IVsyajSaN*SQ& zB0U<0O)Q)}HXn&`Fv9?NpeQYOn`>uSIx%v4!%# z6gj4*B@N4;s^R*o@|L@55gVdRNMxq_Gh-p@n|Y!)(51DRjaXu2zM zSw|M1t0{z|-z9yx-o@$>M!H~-;?7UpdIffIbs~CugKezAkMWox7}1$T{%X8E?DssGv_T zG_xde_%n?9IFVzc@3;CK{PweHWpKM2UyQU^leQm!07Z7us#V61fthWUHfB$=(W>#I z!5}PUxzu<_Ho&1)hMT8@mCN0MH&uQiw;!cLtQg+{u3&eY5l1LVI-cyl_fivDvHd^l+J6?LZ(LdW#IoDPNB|0`LzXL_t5zNoc>9@1oEx`Q5 ePf&#yoe>~b{#lziIBNW?{lDOk^}pbM>3;#pf}qC$ diff --git a/sdrgui/resources/sdrangel_icon.png b/sdrgui/resources/sdrangel_icon.png index 450f83b412c285defbb3030c4c90c6b3616988d6..04d0f8c5fcda614c77278e93b7db23d3ebeff233 100644 GIT binary patch literal 14031 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