Skip to content

Commit 74a3b27

Browse files
author
Alexander Bychuk
committed
new : add distributive creation (mac os verified)
1 parent 2c3ec58 commit 74a3b27

File tree

10 files changed

+318
-8
lines changed

10 files changed

+318
-8
lines changed

CMakeLists.txt

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
cmake_minimum_required(VERSION 3.5)
22

3-
project(Qldd LANGUAGES CXX)
3+
project(Qldd
4+
LANGUAGES CXX
5+
VERSION 1.0.0)
46

57
set(CMAKE_INCLUDE_CURRENT_DIR ON)
68

@@ -14,9 +16,8 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
1416
find_package(Qt5 COMPONENTS Widgets REQUIRED)
1517

1618
if (APPLE)
17-
set(MACOSX_BUNDLE_BUNDLE_NAME Qldd)
18-
set(BUNDLE_VAL MACOSX_BUNDLE)
19-
add_executable(Qldd MACOSX_BUNDLE)
19+
set(APP_ICNS "${CMAKE_SOURCE_DIR}/resources/icon.icns")
20+
add_executable(Qldd MACOSX_BUNDLE ${APP_ICNS})
2021
else ()
2122
add_executable(Qldd)
2223
endif ()
@@ -35,11 +36,57 @@ set(SOURCES
3536
target_sources(Qldd PRIVATE ${SOURCES})
3637
target_link_libraries(Qldd PRIVATE Qt5::Widgets)
3738

38-
install(TARGETS Qldd
39-
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
40-
BUNDLE DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
41-
COMPONENT DependencyViewer)
39+
#install(TARGETS Qldd
40+
# RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
41+
# BUNDLE DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
42+
# COMPONENT DependencyViewer)
4243

4344
install(FILES ${CMAKE_SOURCE_DIR}/nemo/actions/dependency-viewer.nemo_action
4445
DESTINATION share/nemo/actions
4546
COMPONENT nemo-integration)
47+
48+
if(APPLE)
49+
set(CMAKE_MACOSX_BUNDLE ON)
50+
set(CMAKE_MACOSX_RPATH ON)
51+
install(TARGETS Qldd
52+
BUNDLE DESTINATION .
53+
RUNTIME DESTINATION .)
54+
set_source_files_properties("${CMAKE_SOURCE_DIR}/resources/icon.icns" PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
55+
56+
set_target_properties(Qldd
57+
PROPERTIES
58+
MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}"
59+
MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} Copyright (c) 2020 bas524@yandex.ru"
60+
MACOSX_BUNDLE_ICON_FILE icon.icns
61+
MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_NAME}"
62+
MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_VERSION}"
63+
MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
64+
MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}"
65+
MACOSX_BUNDLE_COPYRIGHT "Copyright (c) 2020 bas524@yandex.ru"
66+
)
67+
add_custom_command(TARGET Qldd
68+
POST_BUILD
69+
COMMAND plutil -replace NSHighResolutionCapable -bool true Qldd.app/Contents/Info.plist
70+
)
71+
endif()
72+
73+
set(desktop.path applications)
74+
set(desktop.files resources/example.desktop)
75+
set(icon.path icons/hicolor/64x64/apps)
76+
set(icon.files resources/icon64.png)
77+
set(iconsvg.path icons/hicolor/scalable/apps)
78+
set(iconsvg.files resources/icon.svg)
79+
foreach(items IN ITEMS desktop icon iconsvg)
80+
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${${items}.files}
81+
DESTINATION share/${${items}.path}
82+
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
83+
endforeach()
84+
# Components:
85+
if(CMAKE_BUILD_TYPE_UPPER MATCHES "^(DEBUG|RELWITHDEBINFO)$")
86+
set(CPACK_STRIP_FILES FALSE)
87+
else()
88+
set(CPACK_STRIP_FILES TRUE)
89+
endif()
90+
91+
include(${CMAKE_CURRENT_LIST_DIR}/Packaging.cmake)
92+

CPackLinuxDeployQt.cmake.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
execute_process(COMMAND ${CMAKE_MAKE_PROGRAM} DESTDIR=${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/Linux/External/AppImage install
2+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
3+
execute_process(COMMAND "${LINUXDEPLOYQT_EXECUTABLE}" ${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/Linux/External/AppImage${CMAKE_INSTALL_PREFIX}/share/applications/example.desktop -bundle-non-qt-libs -qmake=${_qmake_executable}
4+
# hot fix for a known issue for libnss3 and libnssutils3.
5+
COMMAND ${CMAKE_COMMAND} -E copy_directory ${NSS3_PLUGIN_PATH} ${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/Linux/External/AppImage${CMAKE_INSTALL_PREFIX}/lib/
6+
COMMAND "${LINUXDEPLOYQT_EXECUTABLE}" ${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/Linux/External/AppImage${CMAKE_INSTALL_PREFIX}/share/applications/example.desktop -appimage -qmake=${_qmake_executable}
7+
WORKING_DIRECTORY ${CPACK_PACKAGE_DIRECTORY}
8+
)

CPackMacDeployQt.cmake.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
execute_process(COMMAND "${MACDEPLOYQT_EXECUTABLE}" ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app -dmg
2+
WORKING_DIRECTORY ${CPACK_PACKAGE_DIRECTORY}
3+
)

Packaging.cmake

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
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)

resources/example.desktop

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[Desktop Entry]
2+
Type=Application
3+
Version=1.0
4+
Name=Example
5+
GenericName=Example
6+
Comment=Example
7+
Icon=icon
8+
Terminal=false
9+
Exec=Example %F
10+
MimeType=text/text;
11+
Categories=Qt;Utility;

resources/icon.icns

54.3 KB
Binary file not shown.

resources/icon.ico

361 KB
Binary file not shown.

resources/icon.svg

Lines changed: 1 addition & 0 deletions
Loading

resources/icon64.png

14.1 KB
Loading

resources/window.rc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include "winver.h"
2+
3+
IDI_ICON1 ICON DISCARDABLE "icon.ico"
4+
5+
VS_VERSION_INFO VERSIONINFO
6+
FILEVERSION 1,0,0,0
7+
PRODUCTVERSION 1,0,0,0
8+
FILEFLAGS 0x0L
9+
FILEFLAGSMASK 0x3fL
10+
FILEOS 0x00040004L
11+
FILETYPE 0x1L
12+
FILESUBTYPE 0x0L
13+
BEGIN
14+
BLOCK "StringFileInfo"
15+
BEGIN
16+
BLOCK "000004b0"
17+
BEGIN
18+
VALUE "CompanyName", "The Qt Company Ltd"
19+
VALUE "FileDescription", "QtQuick Window Example"
20+
VALUE "FileVersion", "1.0.0.0"
21+
VALUE "LegalCopyright", "Copyright (C) 2015 The Qt Company Ltd."
22+
VALUE "InternalName", "window"
23+
VALUE "OriginalFilename", "window.exe"
24+
VALUE "ProductName", "QtQuick Window Example"
25+
VALUE "ProductVersion", "1.0.0.0"
26+
END
27+
END
28+
BLOCK "VarFileInfo"
29+
BEGIN
30+
VALUE "Translation", 0x0, 1200
31+
END
32+
END

0 commit comments

Comments
 (0)