Browse Source

CMake: Update packaging script (#663)

* cmake: update osx packaging script

Signed-off-by: Hiroshi Miura <[email protected]>

* Fix debian package dependencies and more

Signed-off-by: Hiroshi Miura <[email protected]>
Hiroshi Miura 6 years ago
parent
commit
a8ab30bb8b
2 changed files with 72 additions and 49 deletions
  1. 3 0
      src/CPackMacDeployQt.cmake.in
  2. 69 49
      src/Packaging.cmake

+ 3 - 0
src/CPackMacDeployQt.cmake.in

@@ -0,0 +1,3 @@
+execute_process(COMMAND "${MACDEPLOYQT_EXECUTABLE}" ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app -dmg
+                 WORKING_DIRECTORY ${CPACK_PACKAGE_DIRECTORY}
+                )

+ 69 - 49
src/Packaging.cmake

@@ -9,7 +9,7 @@ find_program(MACDEPLOYQTFIX_EXECUTABLE macdeployqtfix.py HINTS "${_qt_bin_dir}")
 find_package(Python)
 
 set(CPACK_IFW_ROOT $ENV{HOME}/Qt/QtIFW-3.0.6/ CACHE PATH "Qt Installer Framework installation base path")
-find_program(BINARYCREATOR_EXECUTABLE binarycreator HINTS ${CPACK_IFW_ROOT}/bin)
+find_program(BINARYCREATOR_EXECUTABLE binarycreator HINTS "${_qt_bin_dir}" ${CPACK_IFW_ROOT}/bin)
 
 mark_as_advanced(WINDEPLOYQT_EXECUTABLE LINUXDEPLOYQT_EXECUTABLE)
 mark_as_advanced(MACDEPLOYQT_EXECUTABLE MACDEPLOYQTFIX_EXECUTABLE)
@@ -32,39 +32,45 @@ function(linuxdeployqt destdir desktopfile)
 endfunction()
 
 function(windeployqt target)
+
+    # Bundle Library Files
+    if(CMAKE_BUILD_TYPE_UPPER STREQUAL "DEBUG")
+        set(WINDEPLOYQT_ARGS --debug)
+    else()
+        set(WINDEPLOYQT_ARGS --release)
+    endif()
+
     add_custom_command(TARGET ${target} POST_BUILD
                        COMMAND "${CMAKE_COMMAND}" -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/winqt/"
                        COMMAND "${CMAKE_COMMAND}" -E
                                env PATH="${_qt_bin_dir}" "${WINDEPLOYQT_EXECUTABLE}"
+                               ${WINDEPLOYQT_ARGS}
                                --verbose 0
                                --no-compiler-runtime
                                --no-angle
                                --no-opengl-sw
                                --dir "${CMAKE_CURRENT_BINARY_DIR}/winqt/"
-                               ${target}.exe
+                               $<TARGET_FILE:${target}>
                        COMMENT "Deploying Qt..."
-	)
-	install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/winqt/" DESTINATION bin)
-
+    )
+    install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/winqt/" DESTINATION bin)
     set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
     include(InstallRequiredSystemLibraries)
 endfunction()
 
-function(macdeployqt target)
-    add_custom_command(TARGET bundle POST_BUILD
-                       COMMAND "${MACDEPLOYQT_EXECUTABLE}"
-                           \"$<TARGET_FILE_DIR:${target}>/../..\"
-                           -always-overwrite
-                       COMMAND ${Python_EXECUTABLE} "${MACDEPLOYQTFIX_EXECUTABLE}"
-                           \"$<TARGET_FILE_DIR:${target}>/Contents/MacOS/VNote\"
-                           ${qt_bin_dir}/../
-                       COMMAND "${MACDEPLOYQT_EXECUTABLE}"
-                           \"$<TARGET_FILE_DIR:${target}>/Contents/Frameworks/QtWebEngineCore.framework/Versions/5/Helpers/QtWebEngineProcess.app
-                       COMMAND ${Python_EXECUTABLE} "${MACDEPLOYQTFIX_EXECUTABLE}"
-                           \"$<TARGET_FILE_DIR:${target}>/Contents/Frameworks/QtWebEngineCore.framework/Versions/5/Helpers/QtWebEngineProcess.app/Contents/MacOS/QtWebEngineProcess
-                           ${qt_bin_dir}/../
-                       COMMENT "Deploying Qt..."
+function(macdeployqt bundle targetdir _PACKAGER)
+    file(GENERATE OUTPUT ${CMAKE_BINARY_DIR}/CPackMacDeployQt-${_PACKAGER}.cmake
+         CONTENT "set(APP_BUNDLE_DIR \"${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/Darwin/${_PACKAGER}/${targetdir}/${bundle}\")
+                  execute_process(
+                    COMMAND \"${MACDEPLOYQT_EXECUTABLE}\" \"${APP_BUNDLE_DIR}}\" -always-overwrite
+                    COMMAND ${Python_EXECUTABLE} \"${MACDEPLOYQTFIX_EXECUTABLE}\" \"${APP_BUNDLE_DIR}/Contents/MacOS/VNote\" ${qt_bin_dir}/../
+                    COMMAND \"${MACDEPLOYQT_EXECUTABLE}\" \"${APP_BUNDLE_DIR}>/Contents/Frameworks/QtWebEngineCore.framework/Versions/5/Helpers/QtWebEngineProcess.app
+                    COMMAND ${Python_EXECUTABLE} \"${MACDEPLOYQTFIX_EXECUTABLE}\" \"${APP_BUNDLE_DIR}>/Contents/Frameworks/QtWebEngineCore.framework/Versions/5/Helpers/QtWebEngineProcess.app/Contents/MacOS/QtWebEngineProcess\" ${qt_bin_dir}/../
+                  )"
     )
+
+    install(SCRIPT ${CMAKE_BINARY_DIR}/CPackMacDeployQt-${_PACKAGER}.cmake COMPONENT Runtime)
+    include(InstallRequiredSystemLibraries)
 endfunction()
 
 set(CPACK_PACKAGE_VENDOR "Le Tan")
@@ -81,7 +87,7 @@ set(CPACK_PACKAGE_INSTALL_DIRECTORY "vnote")
 set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/packaging")
 
 # set human names to exetuables
-set(CPACK_PACKAGE_EXECUTABLES "VNote")
+set(CPACK_PACKAGE_EXECUTABLES "VNote" "VNote")
 set(CPACK_CREATE_DESKTOP_LINKS "VNote")
 set(CPACK_STRIP_FILES TRUE)
 
@@ -93,20 +99,29 @@ add_custom_target(bundle
                   COMMAND ${CMAKE_CPACK_COMMAND} "--config" "${CMAKE_BINARY_DIR}/BundleConfig.cmake"
                   COMMENT "Running CPACK. Please wait..."
                   DEPENDS VNote)
+set(CPACK_GENERATOR)
+
+# Qt IFW packaging framework
+if(BINARYCREATOR_EXECUTABLE)
+    list(APPEND CPACK_GENERATOR IFW)
+    message(STATUS "   + Qt Installer Framework               YES ")
+else()
+    message(STATUS "   + Qt Installer Framework                NO ")
+endif()
 
 if(WIN32 AND NOT UNIX)
     #--------------------------------------------------------------------------
     # Windows specific
-    set(CPACK_GENERATOR "ZIP")
+    list(APPEND CPACK_GENERATOR ZIP)
     message(STATUS "Package generation - Windows")
     message(STATUS "   + ZIP                                  YES ")
-    
+
     set(PACKAGE_ICON "${CMAKE_SOURCE_DIR}/src/resources/icons/vnote.ico")
 
     # NSIS windows installer
     find_program(NSIS_PATH nsis PATH_SUFFIXES nsis)
     if(NSIS_PATH)
-        set(CPACK_GENERATOR "${CPACK_GENERATOR};NSIS")
+        list(APPEND CPACK_GENERATOR NSIS)
         message(STATUS "   + NSIS                                 YES ")
 
         set(CPACK_NSIS_DISPLAY_NAME ${CPACK_PACKAGE_NAME})
@@ -122,7 +137,7 @@ if(WIN32 AND NOT UNIX)
     # NuGet package
     find_program(NUGET_EXECUTABLE nuget)
     if(NUGET_EXECUTABLE)
-        set(CPACK_GENERATOR "${CPACK_GENERATOR};NuGET")
+        list(APPEND CPACK_GENERATOR NuGET)
         message(STATUS "   + NuGET                               YES ")
         set(CPACK_NUGET_PACKAGE_NAME "VNote")
     else()
@@ -136,21 +151,31 @@ elseif(APPLE)
     # Apple specific
     message(STATUS "Package generation - Mac OS X")
     message(STATUS "   + TBZ2                                 YES ")
-    message(STATUS "   + DragNDrop                            YES ")
 
-    set(CPACK_GENERATOR "TBZ2;DragNDrop")
-    set(CPACK_PACKAGING_INSTALL_PREFIX "/")
-    set(CPACK_DMG_VOLUME_NAME "VNote")
-    # set(CPACK_DMG_DS_STORE_SETUP_SCRIPT "${CMAKE_SOURCE_DIR}/DS_Store.scpt")
+    list(APPEND CPACK_GENERATOR TBZ2)
+    set(CPACK_PACKAGE_ICON ${CMAKE_SOURCE_DIR}/resources/Icon.icns)
+    set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks")
+    macdeployqt("${PROJECT_NAME}.app" "${PROJECT_NAME}-${PROJECT_VERSION}-Darwin" "TBZ")
+
+    # XXX: not working settings for bundle and dragndrop generator
+    set(CPACK_BUNDLE_NAME "${PROJECT_NAME}" )
+    set(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/Info.plist")
+    set(CPACK_BUNDLE_ICON ${CMAKE_PACKAGE_ICON})
+    set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME}")
+    set(CPACK_DMG_FORMAT "UDBZ")
     set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/src/resources/icons/vnote.png")
-    set(CPACK_OSX_PACKAGE_VERSION "10.6") #min package version
 
-    macdeployqt(VNote)
+    if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
+        list(APPEND CPACK_GENERATOR External)
+        message(STATUS "   + macdeployqt -dmg                     YES ")
+        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CPackMacDeployQt.cmake.in "${CMAKE_BINARY_DIR}/CPackExternal.cmake")
+        set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${CMAKE_BINARY_DIR}/CPackExternal.cmake")
+    endif()
 
 else()
     #-----------------------------------------------------------------------------
     # Linux specific
-    set(CPACK_GENERATOR "TBZ2;TXZ")
+    list(APPEND CPACK_GENERATOR TBZ2 TXZ)
     message(STATUS "Package generation - UNIX")
     message(STATUS "   + TBZ2                                 YES ")
     message(STATUS "   + TXZ                                  YES ")
@@ -164,11 +189,14 @@ else()
         message(STATUS "   + RPM                                  NO ")
     endif()
 
-    set(CPACK_GENERATOR "${CPACK_GENERATOR};DEB")
+    list(APPEND CPACK_GENERATOR DEB)
     message(STATUS "   + DEB                                  YES ")
-    set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
+    # use default, that is an output of `dpkg --print-architecture`
+    #set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
     set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
     set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://tamlok.github.io/vnote")
+    # check if dependencies exist in standard path, i.e standard package
+    # ubuntu bionic or later has it.
     find_path(QT5WEBENGINEWIDGET_PATH
               NAMES libQt5WebEngineWidgets.so
               PATHS /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} /usr/lib
@@ -177,10 +205,11 @@ else()
         set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
     else()
         set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF)
-        if(NOT CPACK_DEBIAN_PACKAGE_DEPENDS)
-            set(CPACK_DEBIAN_PACKAGE_DEPENDS   libqt5core5a libqt5gui5 libqt5positioning5 libqt5webenginewidgets5)
-        endif()
+        set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5core5a, libqt5gui5, libqt5positioning5, libqt5webenginewidgets5")
     endif()
+    set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "graphviz")
+    set(CPACK_DEBIAN_PACKAGE_SUGGESTS "libjs-mathjax")
+    set(CPACK_DEBIAN_PACKAGE_SECTION "utils")
 
     if(LINUXDEPLOYQT_EXECUTABLE)
         message(STATUS "   + AppImage                             YES ")
@@ -190,24 +219,15 @@ else()
             linuxdeployqt("${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/Linux/AppImage" "share/applications/vnote.desktop")
         else()
             set(CPACK_GENERATOR "External;${CPACK_GENERATOR}")
-            configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CPackLinuxDeployQt.cmake.in "${CMAKE_BINARY_DIR}/CPackLinuxDeployQt.cmake")
-            set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${CMAKE_BINARY_DIR}/CPackLinuxDeployQt.cmake")
+            configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CPackLinuxDeployQt.cmake.in "${CMAKE_BINARY_DIR}/CPackExternal.cmake")
+            set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${CMAKE_BINARY_DIR}/CPackExternal.cmake")
         endif()
     else()
         message(STATUS "   + AppImage                              NO ")
     endif()
 
-   # set package icon
+    # set package icon
     set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/src/resources/icons/vnote.png")
 endif()
 
-# Qt IFW packaging framework
-if(BINARYCREATOR_EXECUTABLE)
-    set(CPACK_GENERATOR "${CPACK_GENERATOR};IFW")
-    message(STATUS "   + Qt Installer Framework               YES ")
-    set(CPACK_IFW_PACKAGE_RESOURCES ${CMAKE_SOURCE_DIR}/src/vnote.qrc ${CMAKE_SOURCE_DIR}/src/translations.qrc)
-else()
-    message(STATUS "   + Qt Installer Framework                NO ")
-endif()
-
 include(CPack)