diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 2abb8165..a308b78a 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -106,7 +106,7 @@ jobs: shell: bash run: | mkdir -p macOS - mv build/*.tar.gz macOS + mv build/*.dmg macOS # Upload artifacts - name: Upload artifacts diff --git a/.vscode/launch.json b/.vscode/launch.json index f1eb3533..9f351e73 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -33,6 +33,18 @@ "cwd": "${workspaceFolder}", "environment": [], "console": "internalConsole" + }, + { + "name": "(macOS) Hyperion.app", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/bin/hyperiond.app/Contents/MacOS/hyperiond", + "args": ["-d"], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "console": "internalConsole", + "MIMode": "lldb" } ] } diff --git a/3RD_PARTY_LICENSES b/3RD_PARTY_LICENSES index e573395a..ad7b48de 100644 --- a/3RD_PARTY_LICENSES +++ b/3RD_PARTY_LICENSES @@ -802,6 +802,35 @@ HIDAPI long as the copyright notice in the source files remains intact. +============================== + HyperHDR +============================== + +MIT License + +Copyright (c) 2021 awawa-dev + +Project homesite: https://github.com/awawa-dev/HyperHDR + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + =========== JSON-Editor =========== @@ -1754,4 +1783,3 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - diff --git a/CMakeLists.txt b/CMakeLists.txt index af5890e8..5f96c6a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,6 +121,8 @@ MACRO(FIRSTSUBDIR result curdir) ENDMACRO() if ( "${PLATFORM}" MATCHES "osx" ) + # specify the min version of the target platform + SET ( CMAKE_OSX_DEPLOYMENT_TARGET "10.15" ) # add specific prefix paths FIRSTSUBDIR(SUBDIRQT "/usr/local/Cellar/qt") FIRSTSUBDIR(SUBDIRPY "/usr/local/opt/python3/Frameworks/Python.framework/Versions") diff --git a/assets/webconfig/content/about.html b/assets/webconfig/content/about.html index fe9c3f1c..4715ac5b 100644 --- a/assets/webconfig/content/about.html +++ b/assets/webconfig/content/about.html @@ -58,21 +58,18 @@ initRestart(); }); - var url = 'https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/3RD_PARTY_LICENSES'; - fetch(url) - .then(function (response) { - if (!response.ok) { - $("#3rdpartylicenses").html('' + $.i18n("about_3rd_party_licenses_error") + ''); - } - else { - response.text().then(function (text) { - $("#3rdpartylicenses").html('' + text + ''); - }); - } - }) - .catch(function (rejected) { - $("#3rdpartylicenses").html('' + $.i18n("about_3rd_party_licenses_error") + ''); - }); + $.ajax({ + url:'3RD_PARTY_LICENSES', + dataType: "text", + success: function() + { + $("#3rdpartylicenses").html('' + $.i18n("about_3rd_party_licenses_error") + ''); + }, + error: function(data) + { + $("#3rdpartylicenses").html('' + data + ''); + } + }); removeOverlay(); diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index 378c21da..4cbbc453 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -1,4 +1,94 @@ -macro(DeployUnix TARGET) +macro(DeployMacOS TARGET) + if (EXISTS ${TARGET_FILE}) + message(STATUS "Collecting Dependencies for target file: ${TARGET_FILE}") + + get_target_property(QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) + execute_process( + COMMAND ${QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS + OUTPUT_VARIABLE QT_PLUGIN_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + install(CODE "set(TARGET_FILE \"${TARGET_FILE}\") \n set(TARGET_BUNDLE_NAME \"${TARGET}.app\") \n set(PLUGIN_DIR \"${QT_PLUGIN_DIR}\")" COMPONENT "Hyperion") + install(CODE [[ + file(GET_RUNTIME_DEPENDENCIES + EXECUTABLES ${TARGET_FILE} + RESOLVED_DEPENDENCIES_VAR resolved_deps + UNRESOLVED_DEPENDENCIES_VAR unresolved_deps + PRE_INCLUDE_REGEXES ".dylib" + PRE_EXCLUDE_REGEXES ".*" + ) + + foreach(dependency ${resolved_deps}) + file(INSTALL + FILES "${dependency}" + DESTINATION "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/Frameworks" + TYPE SHARED_LIBRARY + ) + endforeach() + + list(LENGTH unresolved_deps unresolved_length) + if("${unresolved_length}" GREATER 0) + message(WARNING "The following unresolved dependencies were discovered: ${unresolved_deps}") + endif() + + foreach(PLUGIN "platforms" "sqldrivers" "imageformats") + if(EXISTS ${PLUGIN_DIR}/${PLUGIN}) + file(GLOB files "${PLUGIN_DIR}/${PLUGIN}/*") + foreach(file ${files}) + get_filename_component(plugin ${file} NAME) + list(APPEND QT_PLUGINS "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/plugins/${PLUGIN}/${plugin}") + file(INSTALL + FILES ${file} + DESTINATION "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/plugins/${PLUGIN}" + TYPE SHARED_LIBRARY + ) + endforeach() + endif() + endforeach() + + include(BundleUtilities) + fixup_bundle("${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}" "${QT_PLUGINS}" "" IGNORE_ITEM "python;python3;Python;Python3;.Python;.Python3") + + # Detect the Python version and modules directory + find_package(Python3 3.5 REQUIRED) + execute_process( + COMMAND ${Python3_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(standard_lib=True))" + OUTPUT_VARIABLE PYTHON_MODULES_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # Copy Python modules to '/../Frameworks/Python.framework/Versions/Current/lib/PythonMAJOR.MINOR' and ignore the unnecessary stuff listed below + if (PYTHON_MODULES_DIR) + set(PYTHON_VERSION_MAJOR_MINOR "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}") + file( + COPY ${PYTHON_MODULES_DIR}/ + DESTINATION "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/Frameworks/Python.framework/Versions/Current/lib/python${PYTHON_VERSION_MAJOR_MINOR}" + PATTERN "*.pyc" EXCLUDE # compiled bytecodes + PATTERN "__pycache__" EXCLUDE # any cache + PATTERN "config-${PYTHON_VERSION_MAJOR_MINOR}*" EXCLUDE # static libs + PATTERN "lib2to3" EXCLUDE # automated Python 2 to 3 code translation + PATTERN "tkinter" EXCLUDE # Tk interface + PATTERN "turtledemo" EXCLUDE # Tk demo folder + PATTERN "turtle.py" EXCLUDE # Tk demo file + PATTERN "test" EXCLUDE # unittest module + PATTERN "sitecustomize.py" EXCLUDE # site-specific configs + ) + endif(PYTHON_MODULES_DIR) + ]] COMPONENT "Hyperion") + + else() + add_custom_command( + TARGET ${TARGET} POST_BUILD + COMMAND "${CMAKE_COMMAND}" "-DTARGET_FILE=$" + ARGS ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + VERBATIM + ) + endif() +endmacro() + +macro(DeployLinux TARGET) if (EXISTS ${TARGET_FILE}) message(STATUS "Collecting Dependencies for target file: ${TARGET_FILE}") include(GetPrerequisites) @@ -80,8 +170,8 @@ macro(DeployUnix TARGET) endforeach() endif(OPENSSL_FOUND) - # Detect the Qt5 plugin directory, source: https://github.com/lxde/lxqt-qtplugin/blob/master/src/CMakeLists.txt - get_target_property(QT_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) + # Detect the Qt5 plugin directory + get_target_property(QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) execute_process( COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS OUTPUT_VARIABLE QT_PLUGINS_DIR @@ -139,26 +229,18 @@ macro(DeployUnix TARGET) # Detect the Python version and modules directory if (NOT CMAKE_VERSION VERSION_LESS "3.12") - set(PYTHON_VERSION_MAJOR_MINOR "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}") - execute_process( - COMMAND ${Python3_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(standard_lib=True))" - OUTPUT_VARIABLE PYTHON_MODULES_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - + set(PYTHON_MODULES_DIR "${Python3_STDLIB}") else() - set(PYTHON_VERSION_MAJOR_MINOR "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}") execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(standard_lib=True))" OUTPUT_VARIABLE PYTHON_MODULES_DIR OUTPUT_STRIP_TRAILING_WHITESPACE ) - endif() - # Copy Python modules to 'share/hyperion/lib/pythonXX' and ignore the unnecessary stuff listed below + # Copy Python modules to 'share/hyperion/lib/pythonMAJOR.MINOR' and ignore the unnecessary stuff listed below if (PYTHON_MODULES_DIR) install( diff --git a/cmake/osxbundle/AppleScript.scpt b/cmake/osxbundle/AppleScript.scpt new file mode 100644 index 00000000..f3a08e21 --- /dev/null +++ b/cmake/osxbundle/AppleScript.scpt @@ -0,0 +1,61 @@ +on run argv + set image_name to item 1 of argv + tell application "Finder" + tell disk image_name + + -- wait for the image to finish mounting + set open_attempts to 0 + repeat while open_attempts < 4 + try + open + delay 1 + set open_attempts to 5 + close + on error errStr number errorNumber + set open_attempts to open_attempts + 1 + delay 10 + end try + end repeat + delay 5 + + -- open the image the first time and save a DS_Store with just + -- background and icon setup + open + set current view of container window to icon view + set theViewOptions to the icon view options of container window + set background picture of theViewOptions to file ".background:background.png" + set arrangement of theViewOptions to not arranged + set icon size of theViewOptions to 100 + delay 5 + close + + -- next setup the position of the app and Applications symlink + -- plus hide all the window decoration + open + tell container window + set sidebar width to 0 + set toolbar visible to false + set statusbar visible to false + set the bounds to {300, 100, 1000, 548} + set position of item "Hyperion.app" to {260, 230} + set extension hidden of item "Hyperion.app" to true + set position of item "Applications" to {590, 228} + + -- Move these out of the way for users with Finder configured to show all files + set position of item ".background" to {800, 280} + set position of item ".fseventsd" to {800, 280} + set position of item ".VolumeIcon.icns" to {800, 280} + end tell + delay 1 + close + + -- one last open and close so you can see everything looks correct + open + delay 5 + close + + end tell + + delay 1 + end tell +end run diff --git a/cmake/osxbundle/Background.png b/cmake/osxbundle/Background.png new file mode 100644 index 00000000..27c5bdc3 Binary files /dev/null and b/cmake/osxbundle/Background.png differ diff --git a/cmake/osxbundle/Info.plist b/cmake/osxbundle/Info.plist index 2adbbe7b..f37e63bf 100644 --- a/cmake/osxbundle/Info.plist +++ b/cmake/osxbundle/Info.plist @@ -1,70 +1,24 @@ - - CFBundleVersion - 1489366340 - CFBundleSignature - ???? - - CFBundlePackageType - APPL - CFBundleInfoDictionaryVersion - 6.0 - - CFBundleExecutable - hyperiond - CFBundleIconFile - Hyperion.icns - - CFBundleIdentifier - com.hyperion-project.Hyperion - CFBundleName - Hyperion - CFBundleShortVersionString - 2.0 - - BuildMachineOSBuild - 11G63 - CFBundleDevelopmentRegion - en - - DTCompiler - - DTPlatformBuild - 4H1003 - DTPlatformVersion - GM - DTSDKBuild - 12D75 - DTSDKName - macosx10.8 - DTXcode - 0462 - DTXcodeBuild - 4H1003 - - LSApplicationCategoryType - public.app-category.utilities - LSMinimumSystemVersion - 10.6 - - NSHumanReadableCopyright - Copyright © 2017 Hyperion team. All rights reserved. - - NSPrincipalClass - NSApplication - NSHighResolutionCapable - - - SUEnableAutomaticChecks - - SUEnableSystemProfiling - - SUShowReleaseNotes - - SUAllowsAutomaticUpdates - - + + CFBundleDeveloperRegion + en + CFBundleIdentifier + com.hyperion-project.hyperiond + CFBundleName + Hyperion + CFBundleExecutable + Hyperion + CFBundleIconFile + Hyperion.icns + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + NSHumanReadableCopyright + MIT License + Source Code + "https://github.com/hyperion-project/hyperion.ng" + diff --git a/cmake/osxbundle/PackageIcon.icns b/cmake/osxbundle/PackageIcon.icns new file mode 100644 index 00000000..0c0f632d Binary files /dev/null and b/cmake/osxbundle/PackageIcon.icns differ diff --git a/cmake/osxbundle/launch.sh b/cmake/osxbundle/launch.sh deleted file mode 100644 index 0c3ea053..00000000 --- a/cmake/osxbundle/launch.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -cd "$(dirname "$0")" -# Path to hyperiond!? -cd ../Resources/bin -exec ./hyperiond "$@" diff --git a/cmake/packages.cmake b/cmake/packages.cmake index cf1a4a63..7b25f20e 100644 --- a/cmake/packages.cmake +++ b/cmake/packages.cmake @@ -1,8 +1,9 @@ # cmake file for generating distribution packages -# default packages to build +# Default packages to build IF (APPLE) - SET ( CPACK_GENERATOR "TGZ") + SET ( CPACK_GENERATOR "DragNDrop") + SET ( CPACK_DMG_FORMAT "UDBZ" ) ELSEIF (UNIX) SET ( CPACK_GENERATOR "TGZ") ELSEIF (WIN32) @@ -11,11 +12,12 @@ ENDIF() # Determine packages by found generator executables find_package(RpmBuilder) -find_package(DebBuilder) IF(RPM_BUILDER_FOUND) message(STATUS "CPACK: Found RPM builder") SET ( CPACK_GENERATOR ${CPACK_GENERATOR} "RPM") ENDIF() + +find_package(DebBuilder) IF(DEB_BUILDER_FOUND) message(STATUS "CPACK: Found DEB builder") SET ( CPACK_GENERATOR ${CPACK_GENERATOR} "DEB") @@ -43,12 +45,12 @@ SET ( CPACK_PACKAGE_CONTACT "packages@hyperion-project.org") SET ( CPACK_PACKAGE_VENDOR "hyperion-project") SET ( CPACK_PACKAGE_EXECUTABLES "hyperiond;Hyperion" ) SET ( CPACK_PACKAGE_INSTALL_DIRECTORY "Hyperion" ) -SET ( CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icons/hyperion-icon-32px.png") +SET ( CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icons/hyperion-icon-32px.png" ) SET ( CPACK_PACKAGE_VERSION_MAJOR "${HYPERION_VERSION_MAJOR}") SET ( CPACK_PACKAGE_VERSION_MINOR "${HYPERION_VERSION_MINOR}") SET ( CPACK_PACKAGE_VERSION_PATCH "${HYPERION_VERSION_PATCH}") -SET ( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" ) +SET ( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE" ) SET ( CPACK_PACKAGE_EXECUTABLES "hyperiond;Hyperion" ) SET ( CPACK_CREATE_DESKTOP_LINKS "hyperiond;Hyperion" ) @@ -57,46 +59,46 @@ if (NOT "${HYPERION_VERSION_PRE}" STREQUAL "") string(APPEND CPACK_PACKAGE_VERSION_PATCH ${HYPERION_VERSION_PRE}) endif() -# Define the install prefix path for cpack -IF ( UNIX ) - #SET ( CPACK_PACKAGING_INSTALL_PREFIX "share/hyperion") -ENDIF() - # Specific CPack Package Generators -# https://cmake.org/Wiki/CMake:CPackPackageGenerators +# https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/PackageGenerators + # .deb files for apt -SET ( CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/cmake/package-scripts/preinst;${CMAKE_CURRENT_SOURCE_DIR}/cmake/package-scripts/postinst;${CMAKE_CURRENT_SOURCE_DIR}/cmake/package-scripts/prerm" ) +# https://cmake.org/cmake/help/latest/cpack_gen/deb.html +SET ( CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/cmake/package-scripts/preinst;${CMAKE_SOURCE_DIR}/cmake/package-scripts/postinst;${CMAKE_SOURCE_DIR}/cmake/package-scripts/prerm" ) SET ( CPACK_DEBIAN_PACKAGE_DEPENDS "libcec6 | libcec4" ) SET ( CPACK_DEBIAN_PACKAGE_SECTION "Miscellaneous" ) # .rpm for rpm -# https://cmake.org/cmake/help/v3.5/module/CPackRPM.html +# https://cmake.org/cmake/help/latest/cpack_gen/rpm.html SET ( CPACK_RPM_PACKAGE_RELEASE 1 ) SET ( CPACK_RPM_PACKAGE_LICENSE "MIT" ) SET ( CPACK_RPM_PACKAGE_GROUP "Applications" ) SET ( CPACK_RPM_PACKAGE_REQUIRES "libcec >= 4.0.0" ) -SET ( CPACK_RPM_PRE_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/package-scripts/preinst" ) -SET ( CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/package-scripts/postinst" ) -SET ( CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/package-scripts/prerm" ) +SET ( CPACK_RPM_PRE_INSTALL_SCRIPT_FILE "${CMAKE_SOURCE_DIR}/cmake/package-scripts/preinst" ) +SET ( CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_SOURCE_DIR}/cmake/package-scripts/postinst" ) +SET ( CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE "${CMAKE_SOURCE_DIR}/cmake/package-scripts/prerm" ) -# OSX "Bundle" generator TODO Add more osx generators -# https://cmake.org/cmake/help/v3.10/module/CPackBundle.html -SET ( CPACK_BUNDLE_NAME "Hyperion" ) -SET ( CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/cmake/osxbundle/Hyperion.icns ) -SET ( CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/cmake/osxbundle/Info.plist ) -SET ( CPACK_BUNDLE_STARTUP_COMMAND "${CMAKE_SOURCE_DIR}/cmake/osxbundle/launch.sh" ) +# .dmg for Apple macOS +# https://cmake.org/cmake/help/latest/cpack_gen/dmg.html +IF (APPLE) + SET ( CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/cmake/osxbundle/PackageIcon.icns" ) + SET ( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_BINARY_DIR}/LICENSE" ) + SET ( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/cmake/osxbundle/Background.png" ) + SET ( CPACK_DMG_DS_STORE_SETUP_SCRIPT "${CMAKE_SOURCE_DIR}/cmake/osxbundle/AppleScript.scpt" ) +ENDIF(APPLE) # Windows NSIS # Use custom script based on cpack nsis template set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/nsis/template ${CMAKE_MODULE_PATH}) + # Some path transformations if(WIN32) file(TO_NATIVE_PATH ${CPACK_PACKAGE_ICON} CPACK_PACKAGE_ICON) STRING(REGEX REPLACE "\\\\" "\\\\\\\\" CPACK_PACKAGE_ICON ${CPACK_PACKAGE_ICON}) endif() -file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/nsis/installer.ico" NSIS_HYP_ICO) -file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/nsis/header.bmp" NSIS_HYP_LOGO_HORI) -file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/nsis/logo.bmp" NSIS_HYP_LOGO_VERT) +file(TO_NATIVE_PATH "${CMAKE_SOURCE_DIR}/cmake/nsis/installer.ico" NSIS_HYP_ICO) +file(TO_NATIVE_PATH "${CMAKE_SOURCE_DIR}/cmake/nsis/header.bmp" NSIS_HYP_LOGO_HORI) +file(TO_NATIVE_PATH "${CMAKE_SOURCE_DIR}/cmake/nsis/logo.bmp" NSIS_HYP_LOGO_VERT) STRING(REGEX REPLACE "\\\\" "\\\\\\\\" NSIS_HYP_ICO "${NSIS_HYP_ICO}") STRING(REGEX REPLACE "\\\\" "\\\\\\\\" NSIS_HYP_LOGO_VERT "${NSIS_HYP_LOGO_VERT}") STRING(REGEX REPLACE "\\\\" "\\\\\\\\" NSIS_HYP_LOGO_HORI "${NSIS_HYP_LOGO_HORI}") @@ -113,19 +115,25 @@ SET ( CPACK_NSIS_HELP_LINK "https://www.hyperion-project.org") SET ( CPACK_NSIS_URL_INFO_ABOUT "https://www.hyperion-project.org") SET ( CPACK_NSIS_MUI_FINISHPAGE_RUN "hyperiond.exe") SET ( CPACK_NSIS_BRANDING_TEXT "Hyperion-${HYPERION_VERSION}") + # custom nsis plugin directory SET ( CPACK_NSIS_EXTRA_DEFS "!addplugindir ${CMAKE_SOURCE_DIR}/cmake/nsis/plugins") + # additional hyperiond startmenu link, won't be created if the user disables startmenu links SET ( CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Hyperion (Console).lnk' '$INSTDIR\\\\bin\\\\hyperiond.exe' '-d -c'") SET ( CPACK_NSIS_DELETE_ICONS_EXTRA "Delete '$SMPROGRAMS\\\\$MUI_TEMP\\\\Hyperion (Console).lnk'") -# define the install components +# Define the install components # See also https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/Component-Install-With-CPack # and https://cmake.org/cmake/help/latest/module/CPackComponent.html SET ( CPACK_COMPONENTS_GROUPING "ALL_COMPONENTS_IN_ONE") -# Components base -SET ( CPACK_COMPONENTS_ALL "Hyperion" "hyperion_remote" ) -# optional compiled + +# Components base (All builds) +SET ( CPACK_COMPONENTS_ALL "Hyperion" ) + +SET ( CPACK_COMPONENTS_ALL ${CPACK_COMPONENTS_ALL} "hyperion_remote" ) + +# Optional compiled if(ENABLE_QT) SET ( CPACK_COMPONENTS_ALL ${CPACK_COMPONENTS_ALL} "hyperion_qt" ) endif() @@ -151,6 +159,11 @@ if(ENABLE_OSX) SET ( CPACK_COMPONENTS_ALL ${CPACK_COMPONENTS_ALL} "hyperion_osx" ) endif() +# Only include Hyperion to macOS dmg package (without standalone programs) +IF ( CPACK_GENERATOR MATCHES "DragNDrop" ) + LIST ( REMOVE_ITEM CPACK_COMPONENTS_ALL "hyperion_remote" "hyperion_qt" "hyperion_osx" ) +ENDIF() + SET ( CPACK_ARCHIVE_COMPONENT_INSTALL ON ) SET ( CPACK_DEB_COMPONENT_INSTALL ON ) SET ( CPACK_RPM_COMPONENT_INSTALL ON ) @@ -164,6 +177,7 @@ cpack_add_install_type(Full DISPLAY_NAME "Full") cpack_add_install_type(Min DISPLAY_NAME "Minimal") cpack_add_component_group(Runtime EXPANDED DESCRIPTION "Hyperion runtime and hyperion-remote commandline tool") cpack_add_component_group(Screencapture EXPANDED DESCRIPTION "Standalone Screencapture commandline programs") + # Components base cpack_add_component(Hyperion DISPLAY_NAME "Hyperion" @@ -172,6 +186,7 @@ cpack_add_component(Hyperion GROUP Runtime REQUIRED ) + cpack_add_component(hyperion_remote DISPLAY_NAME "Hyperion Remote" DESCRIPTION "Hyperion remote cli tool" @@ -253,4 +268,3 @@ if(ENABLE_OSX) DEPENDS Hyperion ) endif() - diff --git a/libsrc/python/PythonInit.cpp b/libsrc/python/PythonInit.cpp index d8ed5fce..d2fd41e0 100644 --- a/libsrc/python/PythonInit.cpp +++ b/libsrc/python/PythonInit.cpp @@ -7,6 +7,9 @@ // qt include #include #include +#include +#include +#include // modules to init #include @@ -31,21 +34,39 @@ PythonInit::PythonInit() Py_SetProgramName(L"Hyperion"); // set Python module path when exists - QString py_patch = QDir::cleanPath(qApp->applicationDirPath() + "/../lib/python" + STRINGIFY(PYTHON_VERSION_MAJOR) + "." + STRINGIFY(PYTHON_VERSION_MINOR)); - QString py_file = QDir::cleanPath(qApp->applicationDirPath() + "/python" + STRINGIFY(PYTHON_VERSION_MAJOR) + STRINGIFY(PYTHON_VERSION_MINOR) + ".zip"); + QString py_path = QDir::cleanPath(qApp->applicationDirPath() + "/../lib/python" + STRINGIFY(PYTHON_VERSION_MAJOR) + "." + STRINGIFY(PYTHON_VERSION_MINOR)); + QString py_file = QDir::cleanPath(qApp->applicationDirPath() + "/python" + STRINGIFY(PYTHON_VERSION_MAJOR) + STRINGIFY(PYTHON_VERSION_MINOR) + ".zip"); + QString py_framework = QDir::cleanPath(qApp->applicationDirPath() + "/../Frameworks/Python.framework/Versions/Current/lib/python" + STRINGIFY(PYTHON_VERSION_MAJOR) + "." + STRINGIFY(PYTHON_VERSION_MINOR)); - if (QFile(py_file).exists() || QDir(py_patch).exists()) + if (QFile(py_file).exists() || QDir(py_path).exists() || QDir(py_framework).exists() ) { Py_NoSiteFlag++; - if (QFile(py_file).exists()) + if (QFile(py_file).exists()) // Windows { Py_SetPythonHome(Py_DecodeLocale(py_file.toLatin1().data(), nullptr)); Py_SetPath(Py_DecodeLocale(py_file.toLatin1().data(), nullptr)); } - else if (QDir(py_patch).exists()) + else if (QDir(py_path).exists()) // Linux { - Py_SetPythonHome(Py_DecodeLocale(py_patch.toLatin1().data(), nullptr)); - Py_SetPath(Py_DecodeLocale(py_patch.toLatin1().data(), nullptr)); + QStringList python_paths; + python_paths.append(QDir(py_path).absolutePath()); + python_paths.append(QDir(py_path + "/lib-dynload").absolutePath()); + QVector joined_paths(python_paths.join(":").size() + 1, 0); + python_paths.join(":").toWCharArray(joined_paths.data()); + Py_SetPath(joined_paths.data()); + py_path = QDir::cleanPath(qApp->applicationDirPath() + "/../"); + Py_SetPythonHome(Py_DecodeLocale(py_path.toLatin1().data(), nullptr)); + } + else if (QDir(py_framework).exists()) // macOS + { + QStringList python_paths; + python_paths.append(QDir(py_framework).absolutePath()); + python_paths.append(QDir(py_framework + "/lib-dynload").absolutePath()); + QVector joined_paths(python_paths.join(":").size() + 1, 0); + python_paths.join(":").toWCharArray(joined_paths.data()); + Py_SetPath(joined_paths.data()); + py_framework = QDir::cleanPath(qApp->applicationDirPath() + "/../Frameworks/Python.framework/Versions/Current"); + Py_SetPythonHome(Py_DecodeLocale(py_framework.toLatin1().data(), nullptr)); } } #endif diff --git a/libsrc/webserver/WebConfig.qrc.in b/libsrc/webserver/WebConfig.qrc.in index e2212432..6e458bcc 100644 --- a/libsrc/webserver/WebConfig.qrc.in +++ b/libsrc/webserver/WebConfig.qrc.in @@ -1,5 +1,6 @@ + ${CMAKE_SOURCE_DIR}/3RD_PARTY_LICENSES ${HYPERION_WEBCONFIG_RES} diff --git a/src/hyperion-osx/CMakeLists.txt b/src/hyperion-osx/CMakeLists.txt index d4e3c626..83c4279f 100644 --- a/src/hyperion-osx/CMakeLists.txt +++ b/src/hyperion-osx/CMakeLists.txt @@ -34,10 +34,4 @@ target_link_libraries( ${PROJECT_NAME} Qt5::Network ) -install ( TARGETS ${PROJECT_NAME} DESTINATION "share/hyperion/bin" COMPONENT "hyperion_osx" ) - -if(CMAKE_HOST_UNIX) - install(CODE "EXECUTE_PROCESS(COMMAND ln -sf \"../share/hyperion/bin/${PROJECT_NAME}\" \"${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME}\" )" COMPONENT "hyperion_osx" ) - install(FILES "${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME}" DESTINATION "bin" RENAME "${PROJECT_NAME}" COMPONENT "hyperion_osx" ) - install(CODE "FILE (REMOVE ${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME} )" COMPONENT "hyperion_osx" ) -endif(CMAKE_HOST_UNIX) +install ( TARGETS ${PROJECT_NAME} DESTINATION "." COMPONENT "hyperion_osx" ) diff --git a/src/hyperion-qt/CMakeLists.txt b/src/hyperion-qt/CMakeLists.txt index e2d3ca1d..e8a8c7af 100644 --- a/src/hyperion-qt/CMakeLists.txt +++ b/src/hyperion-qt/CMakeLists.txt @@ -40,14 +40,16 @@ target_link_libraries(${PROJECT_NAME} Qt5::Network ) -if(NOT WIN32) +if(APPLE) + install ( TARGETS ${PROJECT_NAME} DESTINATION "." COMPONENT "hyperion_qt" ) +elseif(NOT WIN32) install ( TARGETS ${PROJECT_NAME} DESTINATION "share/hyperion/bin" COMPONENT "hyperion_qt" ) else() install ( TARGETS ${PROJECT_NAME} DESTINATION "bin" COMPONENT "hyperion_qt" ) endif() -if(CMAKE_HOST_UNIX) +if(CMAKE_HOST_UNIX AND NOT APPLE) install(CODE "EXECUTE_PROCESS(COMMAND ln -sf \"../share/hyperion/bin/${PROJECT_NAME}\" \"${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME}\" )" COMPONENT "hyperion_qt" ) install(FILES "${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME}" DESTINATION "bin" RENAME "${PROJECT_NAME}" COMPONENT "hyperion_qt" ) install(CODE "FILE (REMOVE ${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME} )" COMPONENT "hyperion_qt" ) -endif(CMAKE_HOST_UNIX) +endif() diff --git a/src/hyperion-remote/CMakeLists.txt b/src/hyperion-remote/CMakeLists.txt index e39a8116..313f4a10 100644 --- a/src/hyperion-remote/CMakeLists.txt +++ b/src/hyperion-remote/CMakeLists.txt @@ -44,14 +44,16 @@ if (ENABLE_AMLOGIC) ) endif() -if(NOT WIN32) +if(APPLE) + install ( TARGETS ${PROJECT_NAME} DESTINATION "." COMPONENT "hyperion_remote" ) +elseif(NOT WIN32) install ( TARGETS ${PROJECT_NAME} DESTINATION "share/hyperion/bin" COMPONENT "hyperion_remote" ) else() install ( TARGETS ${PROJECT_NAME} DESTINATION "bin" COMPONENT "hyperion_remote" ) endif() -if(CMAKE_HOST_UNIX) +if(CMAKE_HOST_UNIX AND NOT APPLE) install(CODE "EXECUTE_PROCESS(COMMAND ln -sf \"../share/hyperion/bin/${PROJECT_NAME}\" \"${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME}\" )" COMPONENT "hyperion_remote" ) install(FILES "${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME}" DESTINATION "bin" RENAME "${PROJECT_NAME}" COMPONENT "hyperion_remote" ) install(CODE "FILE (REMOVE ${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME} )" COMPONENT "hyperion_remote" ) -endif(CMAKE_HOST_UNIX) +endif() diff --git a/src/hyperiond/CMakeLists.txt b/src/hyperiond/CMakeLists.txt index 74e50486..b2f01f39 100644 --- a/src/hyperiond/CMakeLists.txt +++ b/src/hyperiond/CMakeLists.txt @@ -1,3 +1,9 @@ +if (APPLE) + project(Hyperion) +else() + project(hyperiond) +endif() + if (NOT CMAKE_VERSION VERSION_LESS "3.12") find_package(Python3 COMPONENTS Interpreter Development REQUIRED) include_directories(${Python3_INCLUDE_DIRS} ${Python3_INCLUDE_DIRS}/..) @@ -11,10 +17,18 @@ find_package(Qt5Widgets REQUIRED) # generate windows .rc file for this binary if (WIN32) include(${CMAKE_SOURCE_DIR}/cmake/win/win_rc.cmake) - generate_win_rc_file(hyperiond) + generate_win_rc_file(${PROJECT_NAME}) endif(WIN32) -add_executable(hyperiond +# include resource files for macos bundle (copy LICENSE file and correct line breaks) +if (APPLE) + configure_file(${CMAKE_SOURCE_DIR}/LICENSE ${CMAKE_BINARY_DIR}/LICENSE COPYONLY) + execute_process(COMMAND bash -c "perl -pi -e 's/\n/\r/g' ${CMAKE_BINARY_DIR}/LICENSE") + set(BUNDLE_RESOURCE_FILES ${CMAKE_SOURCE_DIR}/cmake/osxbundle/Hyperion.icns ${CMAKE_BINARY_DIR}/LICENSE) + set_source_files_properties(${BUNDLE_RESOURCE_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) +endif(APPLE) + +add_executable(${PROJECT_NAME} console.h hyperiond.h systray.h @@ -22,14 +36,15 @@ add_executable(hyperiond systray.cpp main.cpp ${hyperiond_WIN_RC_PATH} + ${BUNDLE_RESOURCE_FILES} ) # promote hyperiond as GUI app if (WIN32) - target_link_options(hyperiond PUBLIC /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup) + target_link_options(${PROJECT_NAME} PUBLIC /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup) endif(WIN32) -target_link_libraries(hyperiond +target_link_libraries(${PROJECT_NAME} commandline hyperion effectengine @@ -45,17 +60,17 @@ target_link_libraries(hyperiond ) if (NOT CMAKE_VERSION VERSION_LESS "3.12") - target_link_libraries( hyperiond ${Python3_LIBRARIES} ) + target_link_libraries( ${PROJECT_NAME} ${Python3_LIBRARIES} ) else() - target_link_libraries( hyperiond ${PYTHON_LIBRARIES} ) + target_link_libraries( ${PROJECT_NAME} ${PYTHON_LIBRARIES} ) endif() if (ENABLE_AVAHI) - target_link_libraries(hyperiond bonjour) + target_link_libraries(${PROJECT_NAME} bonjour) endif (ENABLE_AVAHI) if (ENABLE_AMLOGIC) - target_link_libraries(hyperiond + target_link_libraries(${PROJECT_NAME} Qt5::Core pcre16 dl z ) @@ -69,64 +84,79 @@ if (ENABLE_DISPMANX) SET(BCM_INCLUDE_DIRS "") SET(BCM_LIBRARIES "") ENDIF() - target_link_libraries(hyperiond dispmanx-grabber) + target_link_libraries(${PROJECT_NAME} dispmanx-grabber) endif (ENABLE_DISPMANX) if (ENABLE_FB) - target_link_libraries(hyperiond framebuffer-grabber) + target_link_libraries(${PROJECT_NAME} framebuffer-grabber) endif (ENABLE_FB) if (ENABLE_OSX) - target_link_libraries(hyperiond osx-grabber) + target_link_libraries(${PROJECT_NAME} osx-grabber) endif (ENABLE_OSX) if (ENABLE_V4L2) - target_link_libraries(hyperiond v4l2-grabber) + target_link_libraries(${PROJECT_NAME} v4l2-grabber) endif () if (ENABLE_MF) - target_link_libraries(hyperiond mf-grabber) + target_link_libraries(${PROJECT_NAME} mf-grabber) endif (ENABLE_MF) if (ENABLE_AMLOGIC) - target_link_libraries(hyperiond amlogic-grabber) + target_link_libraries(${PROJECT_NAME} amlogic-grabber) endif (ENABLE_AMLOGIC) if (ENABLE_X11) if(APPLE) include_directories("/opt/X11/include") endif(APPLE) - target_link_libraries(hyperiond x11-grabber) + target_link_libraries(${PROJECT_NAME} x11-grabber) endif (ENABLE_X11) if (ENABLE_XCB) - target_link_libraries(hyperiond xcb-grabber) + target_link_libraries(${PROJECT_NAME} xcb-grabber) endif (ENABLE_XCB) if (ENABLE_QT) - target_link_libraries(hyperiond qt-grabber) + target_link_libraries(${PROJECT_NAME} qt-grabber) endif (ENABLE_QT) if (ENABLE_DX) include_directories(${DIRECTX9_INCLUDE_DIRS}) - target_link_libraries(hyperiond directx-grabber) + target_link_libraries(${PROJECT_NAME} directx-grabber) endif (ENABLE_DX) if (ENABLE_CEC) - target_link_libraries(hyperiond cechandler) + target_link_libraries(${PROJECT_NAME} cechandler) endif (ENABLE_CEC) -if(NOT WIN32) - install ( TARGETS hyperiond DESTINATION "share/hyperion/bin" COMPONENT "Hyperion" ) +if (APPLE) + set_target_properties( ${PROJECT_NAME} PROPERTIES + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/cmake/osxbundle/Info.plist + MACOSX_BUNDLE_BUNDLE_NAME "Hyperion" + MACOSX_BUNDLE_BUNDLE_VERSION ${HYPERION_VERSION} + MACOSX_BUNDLE_COPYRIGHT "Copyright (c) 2014-2021 Hyperion Project" + MACOSX_BUNDLE_GUI_IDENTIFIER "com.hyperion-project.${PROJECT_NAME}" + MACOSX_BUNDLE_ICON_FILE "Hyperion.icns" + MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} Version ${HYPERION_VERSION}" + MACOSX_BUNDLE_LONG_VERSION_STRING ${HYPERION_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${HYPERION_VERSION} + ) + + install ( TARGETS ${PROJECT_NAME} DESTINATION . COMPONENT "Hyperion") +elseif(NOT WIN32) + install ( TARGETS ${PROJECT_NAME} DESTINATION "share/hyperion/bin" COMPONENT "Hyperion" ) install ( DIRECTORY ${CMAKE_SOURCE_DIR}/bin/service DESTINATION "share/hyperion/" COMPONENT "Hyperion" ) install ( FILES ${CMAKE_SOURCE_DIR}/effects/readme.txt DESTINATION "share/hyperion/effects" COMPONENT "Hyperion" ) install ( FILES ${CMAKE_SOURCE_DIR}/resources/icons/hyperion-icon-32px.png DESTINATION "share/hyperion/icons" COMPONENT "Hyperion" ) - # Desktop file for hyperiond + # Desktop file for Hyperion install ( FILES ${CMAKE_SOURCE_DIR}/cmake/desktop/hyperiond_128.png DESTINATION "share/hyperion/desktop" COMPONENT "Hyperion" ) install ( FILES ${CMAKE_SOURCE_DIR}/cmake/desktop/hyperiond.desktop DESTINATION "share/hyperion/desktop" COMPONENT "Hyperion" ) else() - install ( TARGETS hyperiond DESTINATION "bin" COMPONENT "Hyperion" ) + install ( TARGETS ${PROJECT_NAME} DESTINATION "bin" COMPONENT "Hyperion" ) install ( FILES ${CMAKE_SOURCE_DIR}/effects/readme.txt DESTINATION "effects" COMPONENT "Hyperion" ) #set( CMAKE_INSTALL_UCRT_LIBRARIES TRUE ) @@ -134,30 +164,31 @@ else() #include( InstallRequiredSystemLibraries ) endif() -if(CMAKE_HOST_UNIX) - install( CODE "EXECUTE_PROCESS(COMMAND ln -sf \"../share/hyperion/bin/hyperiond\" \"${CMAKE_BINARY_DIR}/symlink_hyperiond\" )" COMPONENT "Hyperion" ) - install( FILES ${CMAKE_BINARY_DIR}/symlink_hyperiond DESTINATION "bin" RENAME hyperiond COMPONENT "Hyperion" ) - install( CODE "FILE (REMOVE ${CMAKE_BINARY_DIR}/symlink_hyperiond )" COMPONENT "Hyperion" ) - install ( FILES ${CMAKE_SOURCE_DIR}/bin/scripts/updateHyperionUser.sh DESTINATION "share/hyperion/scripts" COMPONENT "Hyperion" ) +if (CMAKE_HOST_UNIX AND NOT APPLE) + install( CODE "EXECUTE_PROCESS(COMMAND ln -sf \"../share/hyperion/bin/${PROJECT_NAME}\" \"${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME}\" )" COMPONENT "Hyperion" ) + install( FILES "${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME}" DESTINATION "bin" RENAME ${PROJECT_NAME} COMPONENT "Hyperion" ) + install( CODE "FILE (REMOVE ${CMAKE_BINARY_DIR}/symlink_${PROJECT_NAME})" COMPONENT "Hyperion" ) endif() # Deploy Qt DLLs into the binary folder. # This is necessary for starting the application from within the IDE -if(WIN32) +if (WIN32) get_target_property(QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) get_filename_component(QT_BIN_DIR "${QT_QMAKE_EXECUTABLE}" DIRECTORY) find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${QT_BIN_DIR}") set(WINDEPLOYQT_PARAMS --verbose 0 --no-compiler-runtime --no-opengl-sw --no-system-d3d-compiler) - add_custom_command(TARGET hyperiond POST_BUILD COMMAND ${WINDEPLOYQT_EXECUTABLE} ${WINDEPLOYQT_PARAMS} "$") -endif() + add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${WINDEPLOYQT_EXECUTABLE} ${WINDEPLOYQT_PARAMS} "$") +endif(WIN32) if(ENABLE_DEPLOY_DEPENDENCIES) - # Deploy all dependencies for package creation (not for OSX) + # Deploy all dependencies for package creation include(${CMAKE_SOURCE_DIR}/cmake/Dependencies.cmake) - if (NOT ENABLE_OSX AND NOT WIN32) # Unix - DeployUnix("hyperiond") + if (APPLE) #macOS + DeployMacOS(${PROJECT_NAME}) + elseif (NOT WIN32) # Linux + DeployLinux(${PROJECT_NAME}) elseif(WIN32) # Windows - DeployWindows("hyperiond") + DeployWindows(${PROJECT_NAME}) endif () endif(ENABLE_DEPLOY_DEPENDENCIES) diff --git a/src/hyperiond/main.cpp b/src/hyperiond/main.cpp index a658ecb1..30fd35d7 100644 --- a/src/hyperiond/main.cpp +++ b/src/hyperiond/main.cpp @@ -130,7 +130,9 @@ QCoreApplication* createApplication(int &argc, char *argv[]) // add optional library path app->addLibraryPath(QApplication::applicationDirPath() + "/../lib"); app->setApplicationDisplayName("Hyperion"); +#ifndef __APPLE__ app->setWindowIcon(QIcon(":/hyperion-icon-32px.png")); +#endif return app; }