1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-12-02 04:55:23 -05:00
sdrangel/cmake/cpack/CMakeLists.txt
Jon Beniston 1a9b6d1763 Add ADS-B Demodulator plugin.
Add GS232 Rotator Controller feature plugin.
Add altitude and station name to My Positon.
Use QtDeploy to ensure all required Qt libraries are included (Should
fix OpenGL issues)
2020-10-27 16:22:10 +00:00

328 lines
14 KiB
CMake

# 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)
query_qmake (QT_INSTALL_QML QT_QML_DIR)
if(APPLE AND BUNDLE AND BUILD_GUI)
find_program (SW_VERS_PROGRAM sw_vers)
if (SW_VERS_PROGRAM)
execute_process (
COMMAND ${SW_VERS_PROGRAM} -productVersion
OUTPUT_VARIABLE CPACK_MACOS_PACKAGE_ARCHITECTURE
OUTPUT_STRIP_TRAILING_WHITESPACE
)
else (SW_VERS_PROGRAM)
set (CPACK_MACOS_PACKAGE_ARCHITECTURE noarch)
endif (SW_VERS_PROGRAM)
set(CPACK_GENERATOR "Bundle")
set(CPACK_BINARY_DRAGNDROP ON)
set(CPACK_BUNDLE_NAME "${APPLICATION_NAME}")
set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/cmake/cpack/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}/cmake/cpack/sdrangel_icon.icns")
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_MACOS_PACKAGE_ARCHITECTURE}_${CMAKE_SYSTEM_PROCESSOR}")
# 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 "${SOAPYSDR_ROOT}/lib/SoapySDR/modules${SOAPYSDR_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${SOAPYSDR_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};${MACOS_EXTERNAL_LIBS_FIXUP}\")
# remove non distribuitable file
if(ENABLE_MIRSDRAPI AND OFF)
message(STATUS \"Remove libmirsdrapi-rsp.dylib - not distribuitable\")
file(REMOVE \"\${CMAKE_INSTALL_PREFIX}/../Frameworks/libmirsdrapi-rsp.dylib\")
endif()
# remove unused library
file(GLOB SDRANGEL_REMOVE_LIB \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
foreach(file \${SDRANGEL_REMOVE_LIB})
file(REMOVE \"\${file}\")
endforeach()
" COMPONENT Runtime)
# TODO: code/dmg signature
# see https://github.com/cjcliffe/CubicSDR
# NOTE: only as reference; remove in future
elseif(LINUX AND BUNDLE)
# NOTE: moved to debhelper tool (debian/ folder)
# useful for the moment to maintain dependencies list per distro
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_SHLIBDEPS ON)
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, libqt5websockets5, libqt5multimedia5, libqt5network5, libqt5opengl5, libqt5widgets5, libqt5multimedia5-plugins, libstdc++6, libusb-1.0-0, pulseaudio, libxml2, ffmpeg, libopus0, codec2, libairspy0, libhackrf0, librtlsdr0, libbladerf1, libmirisdr0, libiio0")
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, soapysdr-tools")
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, soapysdr-tools")
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, soapysdr-tools")
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()
# needed before cmake 2.8.3
set(CPACK_SET_DESTDIR true)
endif (DPKG_BUILDER)
# NOTE: moved to distro tool
# for fedora see https://docs.fedoraproject.org/en-US/quick-docs/creating-rpm-packages/
# https://docs.fedoraproject.org/en-US/packaging-guidelines/CMake/
find_program (RPMBUILDER rpmbuild DOC "RPM package builder")
if (RPMBUILDER)
list(APPEND CPACK_GENERATOR "RPM")
set(CPACK_RPM_PACKAGE_RELEASE "1")
set(CPACK_RPM_PACKAGE_LICENSE "GPL-3.0")
# TODO OpenSUSE and Fedora dependencies
set(CPACK_RPM_PACKAGE_REQUIRES "libusb fftw qt5 pulseaudio libxml2")
set (CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
endif (RPMBUILDER)
elseif(WIN32 OR MINGW)
# unfortunately some libraries are dependencies of dll so we copy by hand
# TODO check if we can use fixup_bundle() and have libraries on root path
# demoddatv.dll
file(GLOB FFMPEG_DLLS "${FFMPEG_LIBRARIES}/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
foreach(ffmpeg_dll ${FFMPEG_DLLS})
get_filename_component(ffmpeg_dll_name "${ffmpeg_dll}" NAME)
add_custom_target(copy_ffmpeg_${ffmpeg_dll_name} ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${ffmpeg_dll}" "${SDRANGEL_BINARY_BIN_DIR}/"
)
endforeach(ffmpeg_dll)
# modatv.dll
file(GLOB OPENCV_DLLS "${OpenCV_LIBS_BIN_DIR}/opencv_world*${CMAKE_SHARED_LIBRARY_SUFFIX}")
foreach(opencv_dll ${OPENCV_DLLS})
get_filename_component(opencv_dll_name "${opencv_dll}" NAME)
add_custom_target(copy_ffmpeg_${opencv_dll_name} ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${opencv_dll}" "${SDRANGEL_BINARY_BIN_DIR}/"
)
endforeach(opencv_dll)
if(ENABLE_SOAPYSDR AND SOAPYSDR_FOUND)
# Soapy support libraries
file(MAKE_DIRECTORY ${SDRANGEL_BINARY_LIB_DIR}/SoapySDR)
file(MAKE_DIRECTORY ${SDRANGEL_BINARY_LIB_DIR}/SoapySDR/modules0.7)
file(GLOB SOAPYSUPPORT_DLLS "${SOAPYSUPPORT_DIR}/lib/SoapySDR/modules0.7/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
foreach(soapysupport_dll ${SOAPYSUPPORT_DLLS})
get_filename_component(soapysupport_dll_name "${soapysupport_dll}" NAME)
add_custom_target(copy_soapysupport_${soapysupport_dll_name} ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${soapysupport_dll}" "${SDRANGEL_BINARY_LIB_DIR}/SoapySDR/modules0.7/"
)
endforeach(soapysupport_dll)
endif()
file(GLOB CODEC2_DLLS "${CODEC2_DLL_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
foreach(codec2_dll ${CODEC2_DLLS})
get_filename_component(codec2_dll_name "${codec2_dll}" NAME)
add_custom_target(copy_codec2_${codec2_dll_name} ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${codec2_dll}" "${SDRANGEL_BINARY_BIN_DIR}/"
)
endforeach(codec2_dll)
if(ENABLE_USRP AND UHD_FOUND)
file(GLOB UHD_DLLS "${UHD_DLL_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
foreach(uhd_dll ${UHD_DLLS})
get_filename_component(uhd_dll_name "${uhd_dll}" NAME)
add_custom_target(copy_uhd_${uhd_dll_name} ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${uhd_dll}" "${SDRANGEL_BINARY_BIN_DIR}/"
)
endforeach(uhd_dll)
endif()
file(GLOB OPENSSL_DLLS "${OPENSSL_DLL_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
foreach(openssl_dll ${OPENSSL_DLLS})
get_filename_component(openssl_dll_name "${openssl_dll}" NAME)
add_custom_target(copy_openssl_${openssl_dll_name} ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${openssl_dll}" "${SDRANGEL_BINARY_BIN_DIR}/"
)
endforeach(openssl_dll)
# TODO we need a way to fixup_bundle() on the build bin/ directory without call install
if(BUILD_GUI)
install(CODE "
include(BundleUtilities)
fixup_bundle(\"${SDRANGEL_BINARY_BIN_DIR}/sdrangel${CMAKE_EXECUTABLE_SUFFIX}\" \"\" \"${WINDOWS_FIXUP_BUNDLE_LIB_DIRS}\")
" COMPONENT Runtime)
elseif(BUILD_SERVER)
install(CODE "
include(BundleUtilities)
fixup_bundle(\"${SDRANGEL_BINARY_BIN_DIR}/sdrangelsrv${CMAKE_EXECUTABLE_SUFFIX}\" \"\" \"${WINDOWS_FIXUP_BUNDLE_LIB_DIRS}\")
" COMPONENT Runtime)
endif(BUILD_GUI)
if(BUNDLE)
if(BUILD_GUI)
install(CODE "
include(BundleUtilities)
fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/sdrangel${CMAKE_EXECUTABLE_SUFFIX}\" \"\" \"${WINDOWS_FIXUP_BUNDLE_LIB_DIRS}\")
" COMPONENT Runtime)
elseif(BUILD_SERVER)
install(CODE "
include(BundleUtilities)
fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/sdrangelsrv${CMAKE_EXECUTABLE_SUFFIX}\" \"\" \"${WINDOWS_FIXUP_BUNDLE_LIB_DIRS}\")
" COMPONENT Runtime)
endif(BUILD_GUI)
# unfortunately some libraries are dependencies of dll so we copy by hand
# TODO check if we can use fixup_bundle() and have libraries on root path
# inputkiwisdr.dll
# demoddatv.dll
install(DIRECTORY "${FFMPEG_LIBRARIES}/" DESTINATION "${INSTALL_LIB_DIR}"
FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}")
# modatv.dll
install(DIRECTORY "${OpenCV_LIBS_BIN_DIR}/" DESTINATION "${INSTALL_LIB_DIR}"
FILES_MATCHING PATTERN "opencv_world*${CMAKE_SHARED_LIBRARY_SUFFIX}")
# libusb
get_filename_component(GFN_LIBUSB_DIR "${LIBUSB_LIBRARIES}" DIRECTORY)
install(FILES "${GFN_LIBUSB_DIR}/libusb-1.0${CMAKE_SHARED_LIBRARY_SUFFIX}" DESTINATION "${INSTALL_LIB_DIR}")
# codec2
install(DIRECTORY "${CODEC2_DLL_DIR}/" DESTINATION "${INSTALL_LIB_DIR}"
FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}")
# uhd
install(DIRECTORY "${UHD_DLL_DIR}/" DESTINATION "${INSTALL_LIB_DIR}"
FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}")
# OpenSSL
install(DIRECTORY "${OPENSSL_DLL_DIR}/" DESTINATION "${INSTALL_LIB_DIR}"
FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}")
install(CODE "
# remove *.lib files
# TODO find a better way
file(GLOB NSIS_REMOVE_LIB \"\${CMAKE_INSTALL_PREFIX}/*.lib\")
foreach(file \${NSIS_REMOVE_LIB})
file(REMOVE \"\${file}\")
endforeach()
file(GLOB NSIS_REMOVE_LIB \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_PLUGINS_DIR}/*.lib\")
foreach(file \${NSIS_REMOVE_LIB})
file(REMOVE \"\${file}\")
endforeach()
file(GLOB NSIS_REMOVE_LIB \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_PLUGINSSRV_DIR}/*.lib\")
foreach(file \${NSIS_REMOVE_LIB})
file(REMOVE \"\${file}\")
endforeach()
" COMPONENT Runtime)
list(APPEND CPACK_GENERATOR "ZIP;NSIS")
set(CPACK_MONOLITHIC_INSTALL ON)
set(CPACK_NSIS_HELP_LINK ${CPACK_PACKAGE_CONTACT})
set(CPACK_NSIS_URL_INFO_ABOUT ${CPACK_PACKAGE_CONTACT})
set(CPACK_NSIS_CONTACT ${APPLICATION_MAINTAINER})
set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/cmake/cpack/sdrangel_icon.ico")
set(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}/cmake/cpack/sdrangel_icon.ico")
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)
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${APPLICATION_NAME})
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY ${APPLICATION_NAME})
list(APPEND CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
ExecWait '$INSTDIR\\\\${VCREDIST_FILE} /passive /norestart'
Delete '$INSTDIR\\\\${VCREDIST_FILE}'
")
set(CPACK_NSIS_CREATE_ICONS_EXTRA
"CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\SDRangel.lnk' '$INSTDIR\\\\sdrangel.exe'")
set(CPACK_NSIS_DELETE_ICONS_EXTRA
"Delete '$SMPROGRAMS\\\\$START_MENU\\\\SDRangel.lnk'")
endif(BUNDLE)
endif(APPLE AND BUNDLE AND BUILD_GUI)
message(STATUS "CPack generators: ${CPACK_GENERATOR}")
include(CPack)