Packaging.cmake 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. find_package(Qt5Core REQUIRED)
  2. get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION)
  3. get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
  4. set(CPACK_PACKAGE_VENDOR "Le Tan")
  5. set(CPACK_PACKAGE_NAME "vnote")
  6. set(CPACK_PACKAGE_CONTACT "Le Tan <[email protected]>")
  7. set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
  8. set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md")
  9. set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
  10. set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
  11. set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
  12. set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
  13. set(CPACK_PACKAGE_INSTALL_DIRECTORY "vnote")
  14. set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}")
  15. # set human names to executables
  16. set(CPACK_PACKAGE_EXECUTABLES "VNote" "VNote")
  17. set(CPACK_CREATE_DESKTOP_LINKS "VNote")
  18. set(CPACK_STRIP_FILES TRUE)
  19. #------------------------------------------------------------------------------
  20. # include CPack, so we get target for packages
  21. set(CPACK_OUTPUT_CONFIG_FILE "${CMAKE_BINARY_DIR}/BundleConfig.cmake")
  22. add_custom_target(bundle
  23. COMMAND ${CMAKE_CPACK_COMMAND} "--config" "${CMAKE_BINARY_DIR}/BundleConfig.cmake"
  24. COMMENT "Running CPACK. Please wait..."
  25. DEPENDS VNote)
  26. set(CPACK_GENERATOR)
  27. # Qt IFW packaging framework
  28. set(CPACK_IFW_ROOT $ENV{HOME}/Qt/QtIFW-3.0.6/ CACHE PATH "Qt Installer Framework installation base path")
  29. find_program(BINARYCREATOR_EXECUTABLE binarycreator HINTS "${_qt_bin_dir}" ${CPACK_IFW_ROOT}/bin)
  30. if(BINARYCREATOR_EXECUTABLE)
  31. list(APPEND CPACK_GENERATOR IFW)
  32. message(STATUS " + Qt Installer Framework YES ")
  33. else()
  34. message(STATUS " + Qt Installer Framework NO ")
  35. endif()
  36. if (WIN32 AND NOT UNIX)
  37. #--------------------------------------------------------------------------
  38. # Windows specific
  39. find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}" DOC "Path to the windeployqt utility")
  40. list(APPEND CPACK_GENERATOR ZIP)
  41. message(STATUS "Package generation - Windows")
  42. message(STATUS " + ZIP YES ")
  43. set(PACKAGE_ICON "${CMAKE_SOURCE_DIR}/src/resources/icons/vnote.ico")
  44. # NSIS windows installer
  45. find_program(NSIS_PATH nsis PATH_SUFFIXES nsis)
  46. if(NSIS_PATH)
  47. list(APPEND CPACK_GENERATOR NSIS)
  48. message(STATUS " + NSIS YES ")
  49. set(CPACK_NSIS_DISPLAY_NAME ${CPACK_PACKAGE_NAME})
  50. set(CPACK_NSIS_MUI_ICON "${PACKAGE_ICON}")
  51. set(CPACK_NSIS_MUI_HEADERIMAGE_BITMAP "${PACKAGE_ICON}")
  52. set(CPACK_NSIS_CONTACT "${CPACK_PACKAGE_CONTACT}")
  53. set(CPACK_NSIS_MODIFY_PATH ON)
  54. else()
  55. message(STATUS " + NSIS NO ")
  56. endif()
  57. # NuGet package
  58. find_program(NUGET_EXECUTABLE nuget)
  59. if(NUGET_EXECUTABLE)
  60. list(APPEND CPACK_GENERATOR NuGET)
  61. message(STATUS " + NuGET YES ")
  62. set(CPACK_NUGET_PACKAGE_NAME "VNote")
  63. else()
  64. message(STATUS " + NuGET NO ")
  65. endif()
  66. # Bundle Library Files
  67. if(CMAKE_BUILD_TYPE_UPPER STREQUAL "DEBUG")
  68. set(WINDEPLOYQT_ARGS --debug)
  69. else()
  70. set(WINDEPLOYQT_ARGS --release)
  71. endif()
  72. file(MAKE_DIRECTORY "${CPACK_PACKAGE_DIRECTORY}/_qtstaff")
  73. add_custom_command(TARGET bundle PRE_BUILD
  74. COMMAND "${CMAKE_COMMAND}" -E
  75. env PATH="${_qt_bin_dir}" "${WINDEPLOYQT_EXECUTABLE}"
  76. ${WINDEPLOYQT_ARGS}
  77. --verbose 0
  78. --no-compiler-runtime
  79. --no-angle
  80. --no-opengl-sw
  81. --dir "${CPACK_PACKAGE_DIRECTORY}/_qtstaff"
  82. $<TARGET_FILE:VNote>
  83. COMMENT "Deploying Qt..."
  84. )
  85. install(DIRECTORY "${CPACK_PACKAGE_DIRECTORY}/_qtstaff/" DESTINATION bin)
  86. set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
  87. include(InstallRequiredSystemLibraries)
  88. elseif (APPLE)
  89. #--------------------------------------------------------------------------
  90. # Apple specific
  91. find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${_qt_bin_dir}" DOC "Path to the macdeployqt utility")
  92. find_program(MACDEPLOYQTFIX_EXECUTABLE macdeployqtfix.py HINTS "${_qt_bin_dir}" DOC "Path to the macdeployqtfix utility")
  93. find_package(Python2 REQUIRED COMPONENTS Interpreter)
  94. message(STATUS "Package generation - Mac OS X")
  95. set(CPACK_PACKAGE_ICON ${CMAKE_SOURCE_DIR}/resources/Icon.icns)
  96. list(APPEND CPACK_GENERATOR External)
  97. set(CPACK_EXTERNAL_ENABLE_STAGING ON)
  98. set(CPACK_SET_DESTDIR ON)
  99. message(STATUS " + macdeployqt -dmg YES ")
  100. set(EXTERNAL_WORK "_CPack_Packages/Darwin/External/${CPACK_PACKAGE_NAME}-${PROJECT_VERSION}-Darwin")
  101. set(APP_BUNDLE "${CPACK_PACKAGE_DIRECTORY}/${EXTERNAL_WORK}/${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.app")
  102. string(FIND "${Qt5_DIR}" "/cmake/Qt5" _STR_LOC)
  103. string(SUBSTRING "${Qt5_DIR}" 0 ${_STR_LOC} _QT_LIB_ROOT)
  104. file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/CPackExternal.cmake"
  105. CONTENT "execute_process(COMMAND \"${MACDEPLOYQT_EXECUTABLE}\" \"${APP_BUNDLE}\" -always-overwrite -verbose=2 -libpath=${_QT_LIB_ROOT})
  106. execute_process(COMMAND ${Python2_EXECUTABLE} \"${MACDEPLOYQTFIX_EXECUTABLE}\" \"${APP_BUNDLE}/Contents/MacOS/VNote\" ${_QT_LIB_ROOT} -v)
  107. execute_process(COMMAND \"${MACDEPLOYQT_EXECUTABLE}\" \"${APP_BUNDLE}/Contents/Frameworks/QtWebEngineCore.framework/Versions/5/Helpers/QtWebEngineProcess.app\" -verbose=2 -libpath=${_QT_LIB_ROOT})
  108. execute_process(COMMAND ${Python2_EXECUTABLE} \"${MACDEPLOYQTFIX_EXECUTABLE}\" \"${APP_BUNDLE}/Contents/Frameworks/QtWebEngineCore.framework/Versions/5/Helpers/QtWebEngineProcess.app/Contents/MacOS/QtWebEngineProcess\" ${_QT_LIB_ROOT} -v)
  109. execute_process(COMMAND \"${MACDEPLOYQT_EXECUTABLE}\" \"${APP_BUNDLE}\" -dmg -verbose=2 -always-overwrite -libpath=${_QT_LIB_ROOT})"
  110. )
  111. set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${CMAKE_BINARY_DIR}/CPackExternal.cmake")
  112. include(InstallRequiredSystemLibraries)
  113. else ()
  114. #-----------------------------------------------------------------------------
  115. # Linux specific
  116. list(APPEND CPACK_GENERATOR TBZ2 TXZ)
  117. message(STATUS "Package generation - UNIX")
  118. message(STATUS " + TBZ2 YES ")
  119. message(STATUS " + TXZ YES ")
  120. find_program(RPMBUILD_PATH rpmbuild)
  121. if(RPMBUILD_PATH)
  122. message(STATUS " + RPM YES ")
  123. set(CPACK_GENERATOR "${CPACK_GENERATOR};RPM")
  124. set(CPACK_RPM_PACKAGE_LICENSE "MIT")
  125. else()
  126. message(STATUS " + RPM NO ")
  127. endif()
  128. find_program(DEBUILD_PATH debuild)
  129. if(DEBUILD_PATH)
  130. list(APPEND CPACK_GENERATOR DEB)
  131. message(STATUS " + DEB YES ")
  132. # use default, that is an output of `dpkg --print-architecture`
  133. #set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
  134. set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
  135. set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://tamlok.github.io/vnote")
  136. if(Qt5_DIR STREQUAL "/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/cmake/Qt5" )
  137. set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
  138. else()
  139. set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF)
  140. set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5core5a, libqt5gui5, libqt5positioning5, libqt5webenginewidgets5")
  141. endif()
  142. set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "graphviz")
  143. set(CPACK_DEBIAN_PACKAGE_SUGGESTS "libjs-mathjax")
  144. set(CPACK_DEBIAN_PACKAGE_SECTION "utils")
  145. endif()
  146. find_program(LINUXDEPLOY_EXECUTABLE linuxdeploy linuxdeploy-x86_64.AppImage HINTS "${_qt_bin_dir}")
  147. if(LINUXDEPLOY_EXECUTABLE)
  148. message(STATUS " + AppImage YES ")
  149. find_path(NSS3_PLUGIN_PATH NAMES libsoftokn3.so PATHS /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} /usr/lib /usr/local/lib
  150. PATH_SUFFIXES nss NO_DEFAULT_PATH)
  151. set(CPACK_GENERATOR "External;${CPACK_GENERATOR}")
  152. # run make DESTDIR=<CPACK_INSTALL_PREFIX> install before run package script
  153. set(CPACK_EXTERNAL_ENABLE_STAGING ON)
  154. set(CPACK_SET_DESTDIR ON)
  155. set(_EXTERNAL_PACKDIR ${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/Linux/External/${CPACK_PACKAGE_NAME}-${PROJECT_VERSION}-Linux)
  156. string(FIND "${Qt5_DIR}" "/cmake/Qt5" _STR_LOC)
  157. string(SUBSTRING "${Qt5_DIR}" 0 ${_STR_LOC} _QT_LIB_ROOT)
  158. set(_LINUXDEPLOY_ENV "QMAKE=${_qmake_executable}" "LD_LIBRARY_PATH=${_QT_LIB_ROOT}:$ENV{LD_LIBRARY_PATH}")
  159. file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/CPackExternal.cmake"
  160. CONTENT "execute_process(COMMAND ${CMAKE_COMMAND} -E env ${_LINUXDEPLOY_ENV} \"${LINUXDEPLOY_EXECUTABLE}\" --plugin qt --output appimage
  161. -v1
  162. --appdir ${_EXTERNAL_PACKDIR} -e ${_EXTERNAL_PACKDIR}${CMAKE_INSTALL_PREFIX}/bin/VNote
  163. --desktop-file ${_EXTERNAL_PACKDIR}${CMAKE_INSTALL_PREFIX}/share/applications/vnote.desktop
  164. -i ${CMAKE_SOURCE_DIR}/src/resources/icons/16x16/vnote.png -i ${CMAKE_SOURCE_DIR}/src/resources/icons/32x32/vnote.png
  165. -i ${CMAKE_SOURCE_DIR}/src/resources/icons/48x48/vnote.png -i ${CMAKE_SOURCE_DIR}/src/resources/icons/64x64/vnote.png
  166. -i ${CMAKE_SOURCE_DIR}/src/resources/icons/128x128/vnote.png -i ${CMAKE_SOURCE_DIR}/src/resources/icons/256x256/vnote.png
  167. -i ${CMAKE_SOURCE_DIR}/src/resources/icons/vnote.svg
  168. -l ${NSS3_PLUGIN_PATH}/libfreebl3.so -l ${NSS3_PLUGIN_PATH}/libfreeblpriv3.so -l ${NSS3_PLUGIN_PATH}/libnssckbi.so
  169. -l ${NSS3_PLUGIN_PATH}/libnssdbm3.so -l ${NSS3_PLUGIN_PATH}/libsoftokn3.so
  170. WORKING_DIRECTORY ${CPACK_PACKAGE_DIRECTORY})"
  171. )
  172. set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${CMAKE_BINARY_DIR}/CPackExternal.cmake")
  173. else()
  174. message(STATUS " + AppImage NO ")
  175. endif()
  176. # set package icon
  177. set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/src/resources/icons/vnote.png")
  178. endif()
  179. include(CPack)