|
| 1 | + |
| 2 | +find_package(Qt5Core REQUIRED) |
| 3 | +get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION) |
| 4 | +get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY) |
| 5 | +find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}") |
| 6 | +find_program(LINUXDEPLOYQT_EXECUTABLE linuxdeployqt linuxdeployqt-continuous-x86_64.AppImage HINTS "${_qt_bin_dir}") |
| 7 | +find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${_qt_bin_dir}") |
| 8 | +find_program(MACDEPLOYQTFIX_EXECUTABLE macdeployqtfix.py HINTS "${_qt_bin_dir}") |
| 9 | +find_package(Python) |
| 10 | + |
| 11 | +set(CPACK_IFW_ROOT $ENV{HOME}/Qt/QtIFW-3.0.6/ CACHE PATH "Qt Installer Framework installation base path") |
| 12 | +find_program(BINARYCREATOR_EXECUTABLE binarycreator HINTS "${_qt_bin_dir}" ${CPACK_IFW_ROOT}/bin) |
| 13 | + |
| 14 | +mark_as_advanced(WINDEPLOYQT_EXECUTABLE LINUXDEPLOYQT_EXECUTABLE MACDEPLOYQT_EXECUTABLE) |
| 15 | + |
| 16 | +function(linuxdeployqt destdir desktopfile) |
| 17 | + # creating AppDir |
| 18 | + add_custom_command(TARGET bundle PRE_BUILD |
| 19 | + COMMAND "${CMAKE_MAKE_PROGRAM}" DESTDIR=${destdir} install |
| 20 | + COMMAND "${LINUXDEPLOYQT_EXECUTABLE}" ${destdir}/${CMAKE_INSTALL_PREFIX}/${desktopfile} -bundle-non-qt-libs |
| 21 | + -qmake=${_qmake_executable} |
| 22 | + # hot fix for a known issue for libnss3 and libnssutils3. |
| 23 | + COMMAND ${CMAKE_COMMAND} -E copy_directory ${NSS3_PLUGIN_PATH} |
| 24 | + ${destdir}/${CMAKE_INSTALL_PREFIX}/lib/ |
| 25 | + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) |
| 26 | + # packaging AppImage |
| 27 | + add_custom_command(TARGET bundle POST_BUILD |
| 28 | + COMMAND "${LINUXDEPLOYQT_EXECUTABLE}" ${destdir}/${CMAKE_INSTALL_PREFIX}/${desktopfile} |
| 29 | + -appimage -qmake=${_qmake_executable} |
| 30 | + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) |
| 31 | +endfunction() |
| 32 | + |
| 33 | +function(windeployqt target) |
| 34 | + |
| 35 | + # Bundle Library Files |
| 36 | + if(CMAKE_BUILD_TYPE_UPPER STREQUAL "DEBUG") |
| 37 | + set(WINDEPLOYQT_ARGS --debug) |
| 38 | + else() |
| 39 | + set(WINDEPLOYQT_ARGS --release) |
| 40 | + endif() |
| 41 | + |
| 42 | + add_custom_command(TARGET ${target} POST_BUILD |
| 43 | + COMMAND "${CMAKE_COMMAND}" -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/winqt/" |
| 44 | + COMMAND "${CMAKE_COMMAND}" -E |
| 45 | + env PATH="${_qt_bin_dir}" "${WINDEPLOYQT_EXECUTABLE}" |
| 46 | + ${WINDEPLOYQT_ARGS} |
| 47 | + --verbose 0 |
| 48 | + --no-compiler-runtime |
| 49 | + --no-angle |
| 50 | + --no-opengl-sw |
| 51 | + --dir "${CMAKE_CURRENT_BINARY_DIR}/winqt/" |
| 52 | + $<TARGET_FILE:${target}> |
| 53 | + COMMENT "Deploying Qt..." |
| 54 | + ) |
| 55 | + install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/winqt/" DESTINATION bin) |
| 56 | + set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) |
| 57 | + include(InstallRequiredSystemLibraries) |
| 58 | +endfunction() |
| 59 | + |
| 60 | +function(macdeployqt bundle targetdir _PACKAGER) |
| 61 | + file(GENERATE OUTPUT ${CMAKE_BINARY_DIR}/CPackMacDeployQt-${_PACKAGER}.cmake |
| 62 | + CONTENT "execute_process(COMMAND \"${MACDEPLOYQT_EXECUTABLE}\" \"${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/Darwin/${_PACKAGER}/${targetdir}/${bundle}\" -always-overwrite)") |
| 63 | + install(SCRIPT ${CMAKE_BINARY_DIR}/CPackMacDeployQt-${_PACKAGER}.cmake COMPONENT Runtime) |
| 64 | + include(InstallRequiredSystemLibraries) |
| 65 | +endfunction() |
| 66 | + |
| 67 | +set(CPACK_PACKAGE_VENDOR "Example_vendor") |
| 68 | +set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") |
| 69 | +set(CPACK_PACKAGE_CONTACT "Alexander Bychuk <bas524@yandex.ru>") |
| 70 | +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}") |
| 71 | +set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md") |
| 72 | +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") |
| 73 | +set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) |
| 74 | +set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) |
| 75 | +set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) |
| 76 | + |
| 77 | +set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME}") |
| 78 | +set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}") |
| 79 | + |
| 80 | +# set human names to exetuables |
| 81 | +set(CPACK_PACKAGE_EXECUTABLES "${PROJECT_NAME}" "DependencyViewer") |
| 82 | +set(CPACK_CREATE_DESKTOP_LINKS "${PROJECT_NAME}") |
| 83 | +set(CPACK_STRIP_FILES TRUE) |
| 84 | + |
| 85 | +#------------------------------------------------------------------------------ |
| 86 | +# include CPack, so we get target for packages |
| 87 | +set(CPACK_OUTPUT_CONFIG_FILE "${CMAKE_BINARY_DIR}/BundleConfig.cmake") |
| 88 | + |
| 89 | +add_custom_target(bundle |
| 90 | + COMMAND ${CMAKE_CPACK_COMMAND} "--config" "${CMAKE_BINARY_DIR}/BundleConfig.cmake" |
| 91 | + COMMENT "Running CPACK. Please wait..." |
| 92 | + DEPENDS ${PROJECT_NAME}) |
| 93 | +set(CPACK_GENERATOR) |
| 94 | + |
| 95 | +# Qt IFW packaging framework |
| 96 | +if(BINARYCREATOR_EXECUTABLE) |
| 97 | + list(APPEND CPACK_GENERATOR IFW) |
| 98 | + message(STATUS " + Qt Installer Framework YES ") |
| 99 | +else() |
| 100 | + message(STATUS " + Qt Installer Framework NO ") |
| 101 | +endif() |
| 102 | + |
| 103 | +if(WIN32 AND NOT UNIX) |
| 104 | + #-------------------------------------------------------------------------- |
| 105 | + # Windows specific |
| 106 | + list(APPEND CPACK_GENERATOR ZIP) |
| 107 | + message(STATUS "Package generation - Windows") |
| 108 | + message(STATUS " + ZIP YES ") |
| 109 | + |
| 110 | + set(PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icon.ico") |
| 111 | + |
| 112 | + # NSIS windows installer |
| 113 | + find_program(NSIS_PATH nsis PATH_SUFFIXES nsis) |
| 114 | + if(NSIS_PATH) |
| 115 | + list(APPEND CPACK_GENERATOR NSIS) |
| 116 | + message(STATUS " + NSIS YES ") |
| 117 | + |
| 118 | + set(CPACK_NSIS_DISPLAY_NAME ${CPACK_PACKAGE_NAME}) |
| 119 | + # Icon of the installer |
| 120 | + file(TO_NATIVE_PATH "${PACKAGE_ICON}" CPACK_NSIS_MUI_ICON) |
| 121 | + file(TO_NATIVE_PATH "${PACKAGE_ICON}" CPACK_NSIS_MUI_HEADERIMAGE_BITMAP) |
| 122 | + set(CPACK_NSIS_CONTACT "${CPACK_PACKAGE_CONTACT}") |
| 123 | + set(CPACK_NSIS_MODIFY_PATH ON) |
| 124 | + else() |
| 125 | + message(STATUS " + NSIS NO ") |
| 126 | + endif() |
| 127 | + |
| 128 | + # NuGet package |
| 129 | + find_program(NUGET_EXECUTABLE nuget) |
| 130 | + if(NUGET_EXECUTABLE) |
| 131 | + list(APPEND CPACK_GENERATOR NuGET) |
| 132 | + message(STATUS " + NuGET YES ") |
| 133 | + set(CPACK_NUGET_PACKAGE_NAME "${PROJECT_NAME}") |
| 134 | + else() |
| 135 | + message(STATUS " + NuGET NO ") |
| 136 | + endif() |
| 137 | + |
| 138 | + windeployqt(${PROJECT_NAME}) |
| 139 | + |
| 140 | +elseif(APPLE) |
| 141 | + #-------------------------------------------------------------------------- |
| 142 | + # Apple specific |
| 143 | + message(STATUS "Package generation - Mac OS X") |
| 144 | + message(STATUS " + TBZ2 YES ") |
| 145 | + |
| 146 | + list(APPEND CPACK_GENERATOR TBZ2) |
| 147 | + set(CPACK_PACKAGE_ICON ${CMAKE_SOURCE_DIR}/resources/icon.icns) |
| 148 | + set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks") |
| 149 | + macdeployqt("${PROJECT_NAME}.app" "${PROJECT_NAME}-${PROJECT_VERSION}-Darwin" "TBZ2") |
| 150 | + |
| 151 | + # XXX: not working settings for bundle and dragndrop generator |
| 152 | + set(CPACK_BUNDLE_NAME "${PROJECT_NAME}" ) |
| 153 | + set(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/Info.plist") |
| 154 | + set(CPACK_BUNDLE_ICON ${CMAKE_PACKAGE_ICON}) |
| 155 | + set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME}") |
| 156 | + set(CPACK_DMG_FORMAT "UDBZ") |
| 157 | + set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/resources/icon64.png") |
| 158 | + |
| 159 | + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13) |
| 160 | + set(CPACK_GENERATOR "External;${CPACK_GENERATOR}") |
| 161 | + message(STATUS " + macdeployqt -dmg YES ") |
| 162 | + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CPackMacDeployQt.cmake.in "${CMAKE_BINARY_DIR}/CPackExternal.cmake") |
| 163 | + set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${CMAKE_BINARY_DIR}/CPackExternal.cmake") |
| 164 | + endif() |
| 165 | + |
| 166 | +else() |
| 167 | + #----------------------------------------------------------------------------- |
| 168 | + # Linux specific |
| 169 | + list(APPEND CPACK_GENERATOR TBZ2 TXZ) |
| 170 | + message(STATUS "Package generation - UNIX") |
| 171 | + message(STATUS " + TBZ2 YES ") |
| 172 | + message(STATUS " + TXZ YES ") |
| 173 | + |
| 174 | + find_program(RPMBUILD_PATH rpmbuild) |
| 175 | + if(RPMBUILD_PATH) |
| 176 | + message(STATUS " + RPM YES ") |
| 177 | + set(CPACK_GENERATOR "${CPACK_GENERATOR};RPM") |
| 178 | + set(CPACK_RPM_PACKAGE_LICENSE "MIT") |
| 179 | + else() |
| 180 | + message(STATUS " + RPM NO ") |
| 181 | + endif() |
| 182 | + |
| 183 | + list(APPEND CPACK_GENERATOR DEB) |
| 184 | + message(STATUS " + DEB YES ") |
| 185 | + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") |
| 186 | + set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE) |
| 187 | + set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PROJECT_URL}") |
| 188 | + set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) |
| 189 | + |
| 190 | + if(LINUXDEPLOYQT_EXECUTABLE) |
| 191 | + message(STATUS " + AppImage YES ") |
| 192 | + find_path(NSS3_PLUGIN_PATH NAMES libsoftokn3.so PATHS /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} /usr/lib /usr/local/lib |
| 193 | + PATH_SUFFIXES nss NO_DEFAULT_PATH) |
| 194 | + if(CMAKE_VERSION VERSION_LESS 3.13) |
| 195 | + linuxdeployqt("${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/Linux/AppImage" "share/applications/example.desktop") |
| 196 | + else() |
| 197 | + set(CPACK_GENERATOR "External;${CPACK_GENERATOR}") |
| 198 | + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CPackLinuxDeployQt.cmake.in "${CMAKE_BINARY_DIR}/CPackExternal.cmake") |
| 199 | + set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${CMAKE_BINARY_DIR}/CPackExternal.cmake") |
| 200 | + endif() |
| 201 | + else() |
| 202 | + message(STATUS " + AppImage NO ") |
| 203 | + endif() |
| 204 | + |
| 205 | + set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icon64.png") |
| 206 | +endif() |
| 207 | + |
| 208 | +include(CPack) |
0 commit comments