From ec71772f98fcab20be337d6f41d6e25dc2f0b1b4 Mon Sep 17 00:00:00 2001 From: LordGrey <48840279+Lord-Grey@users.noreply.github.com> Date: Sun, 22 May 2022 08:01:49 +0200 Subject: [PATCH] Fix OSX Bundling (#1465) * Fix OSX Bundling * Fix OSX Bundling - Refined * editorial updates * Update change log * Update version references * Update Link * Test * Pass ENABLE_EFFECTENGINE to install code, correct output messages --- CHANGELOG.md | 67 +++++++++------ CMakeLists.txt | 6 +- README.md | 2 +- cmake/Dependencies.cmake | 148 ++++++++++++++++++++------------ doc/development/CompileHowto.md | 20 ++--- 5 files changed, 148 insertions(+), 95 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b30ac7c..3f8ba92c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,55 +6,72 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased](https://github.com/hyperion-project/hyperion.ng/compare/2.0.12...HEAD) -### Breaking - ### Added - Allow to build a "light" version of Hyperion, i.e. no grabbers, or services like flat-/proto buffers, boblight, CEC - Allow to restart Hyperion via Systray -- LED-Device: Support retry attempts enabling devices, e.g. to open devices after network or a device itself got available (#1302) - (Fixes that devices got "stuck", if initial open failed e.g. for WLED, Hue) -- LED-Devices: New UDP-DDP (Distributed Display Protocol) device to overcome the 490 LEDs limitation of UDP-RAW -- LED Matrix Layout - Support vertical cabling direction (#1420) -- Support additional Yeelight models -- LED-Devices: Show warning, if get properties failed (Network devices: indication that network device is not reachable) -- hyperion-remote: Show image filename in UI for images sent - mDNS support for all platforms inkl. Windows (#740) -- LED-Devices mDNS discovery support and ease of configuration (Cololight, Nanoleaf, Philips-Hue, WLED, Yeelight); removes the need to configure IP-Address, as address is resolved automatically. - Forwarder: mDNS discovery support and ease of configuration of other Hyperion instances - Grabber: mDNS discovery for standalone grabbers +- Grabber: Dynamic loading of the Dispmanx Grabber (#1418) +- Flatbuffer/Protobuf are now able to receive RGBA data +- Added the instance number as part of the logline (#910). In the UI Log the instance is presented as a readable name. - New language: Japanese +##### LED-Devices +- Support retry attempts enabling devices, e.g. to open devices after network or a device itself got available (#1302). Fixes that devices got "stuck", if initial open failed e.g. for WLED, Hue +- New UDP-DDP (Distributed Display Protocol) device to overcome the 490 LEDs limitation of UDP-RAW +- mDNS discovery support and ease of configuration (Cololight, Nanoleaf, Philips-Hue, WLED, Yeelight); removes the need to configure IP-Address, as address is resolved automatically. +- Allow to disable switching LEDs on during startup (#1390) +- Support additional Yeelight models +- Show warning, if get properties failed (Network devices: indication that network device is not reachable) +- LED Layout Classic: Support keystone correction via draggable corner LEDs +- LED Layout Matrix: Support vertical cabling direction (#1420) + ### Changed -- Colors Smoothing is started in pause mode to save resources, when Hyperion starts with no active source +- Color Smoothing is started in pause mode to save resources, when Hyperion starts with no active source - Boblight: Support multiple Boblight clients with different priorities +- UI: LED Preview has been given a touch of Ambilight. - UI: Allow configuration of a Boblight server per LED-instance - UI: LED Layout - Removed limitations on indention -- mDNS Publisher :Aligned Hyperion mDNS names to general conventions and simplified namings +- UI: Log output and LED preview window can be maximized +- mDNS Publisher: Aligned Hyperion mDNS names to general conventions and simplified naming + +##### LED-Devices - Refactored Philips Hue wizard and LED-Device -- LED-Devices: WLED's default streaming protocol is now UDP-DDP. More than 490 LEDs are supported now (requires minimum WLED 0.11.0). UDP-RAW is still supported in parallel (via expert settings). +- WLED's default streaming protocol is now UDP-DDP. More than 490 LEDs are supported now (requires minimum WLED 0.11.0). UDP-RAW is still supported in parallel (via expert settings). +- Present all serial/TTY devices during discovery in expert mode; no filtering on existing vendor-identifier (Adalight serial USB does not show up in GUI #1458) ### Fixed +- UI: Ensure all configuration and system info response are there before reloading the page (#1430) +- UI: Show all previous log lines in the Log UI (was only working for Debug before) +- UI: Remote control: Treat duration=0 as endless +- UI: Stop Web-Browser capture when user triggers other activities - Effects: Fix image URL in Matrix effect - Effects: Fix that start effect is stuck on UI -- Fixes that the Led-Device output flow was interrupted, by an enabling API request on an already enabled device (#967 +- Effects: Fixed that effect specific smoothing setup was not applied when effect is started from available- or effects under configuration +- Qt-Grabber: Fixed position handling of multiple monitors (#1320, #1403) +- Standalone grabbers: Improved fps help/error text, fixed default address and port, fixed auto discovery of Hyperion server in hyperion-remote +- hyperion-remote: Show image filename in UI for images sent +- Reworked PriorityMuxer and Subscriptions +- PriorityMuxer: Fix crash when running fore- and background effect in parallel during start-up +- Update Priority, if first LED changes for COLOR update (to reflect color correctly in UI) +- Start JSON and WebServer only, if Hyperion's instance 0 is available +- Treat http headers case insensitive (RFC 2616) +- Fixed: Signal detection does not switch off all instances (#1281) +- Do not kill application on SIGILL-signal (#1435) +- Fixed Qt version override, e.g. set via QTDIR +- Update jsonschema and checkschema to allow checking hyperion.config.json.default on Windows + +##### LED-Devices +- Fixes that the Led-Device output flow was interrupted, by an enabling API request on an already enabled device (#967) - Yeelight - Workaround: Ignore error when setting music mode = off, but the music-mode is already off (#1372) - Fixed: Hue Entertainment mode does not resume after no signal (#930) -- Standalone grabbers: Improved fps help/error text, fixed default address and port, fixed auto discovery of Hyperion server in hyperion-remote -- Fixed Qt version override, e.g. set via QTDIR -- Remote control UI: Treat duration=0 as endless -- Stop Web-Browser capture when user triggers other activities -- Treat http headers case insensitive (RFC 2616) -- Qt-Grabber: Fixed position handling of multiple monitors (#1320, #1403) -- Fixed: Signal detection does not switch off all instances (#1281) -- Reworked PriorityMuxer and Sub-scriptions -- Do not kill application on SIGILL-signal (#1435) -- Start JSON and WebServer only, if Hyperion's instance 0 is available ## Removed -- UI Removed sessions (of other Hyperions) +- UI: Removed sessions (of other Hyperions) - Replaced existing AVAHI/Bonjour code by QMdnsEngine ## [2.0.12](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.12) - 2021-11-20 diff --git a/CMakeLists.txt b/CMakeLists.txt index 06b9c04d..68e791bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -338,16 +338,16 @@ message(STATUS "Services options:") addIndent(" - ") option(ENABLE_EFFECTENGINE "Enable Effect-Engine" ${DEFAULT_EFFECTENGINE}) -message(STATUS "ENABLE_EFFECTENGINE = " ${ENABLE_EFFECTENGINE}) +message(STATUS "ENABLE_EFFECTENGINE = ${ENABLE_EFFECTENGINE}") option(ENABLE_EXPERIMENTAL "Compile experimental features" ${DEFAULT_EXPERIMENTAL}) message(STATUS "ENABLE_EXPERIMENTAL = ${ENABLE_EXPERIMENTAL}") option(ENABLE_MDNS "Enable mDNS (aka Zeroconf)" ${DEFAULT_MDNS}) -message(STATUS "ENABLE_MDNS = " ${ENABLE_MDNS}) +message(STATUS "ENABLE_MDNS = ${ENABLE_MDNS}") option(ENABLE_REMOTE_CTL "Enable Hyperion remote control" ${DEFAULT_REMOTE_CTL}) -message(STATUS "ENABLE_REMOTE_CTL = " ${ENABLE_REMOTE_CTL}) +message(STATUS "ENABLE_REMOTE_CTL = ${ENABLE_REMOTE_CTL}") removeIndent() diff --git a/README.md b/README.md index 4117938b..eb46ed59 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Released and unreleased changes at [CHANGELOG.md](CHANGELOG.md) See [CompileHowto.md](doc/development/CompileHowto.md). ## Installation -See [Documentation](#documentation) or at [Installation.md](Installation.md). +See [Documentation](https://docs.hyperion-project.org/en/user/Installation.html) or at [Installation.md](Installation.md). ## Download Releases available from the [Hyperion release page](https://github.com/hyperion-project/hyperion.ng/releases) diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index ec53e239..a727b0ad 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -9,74 +9,110 @@ macro(DeployMacOS TARGET) 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}\") \n set(BUILD_DIR \"${CMAKE_BINARY_DIR}\")" COMPONENT "Hyperion") + install(CODE "set(TARGET_FILE \"${TARGET_FILE}\")" COMPONENT "Hyperion") + install(CODE "set(TARGET_BUNDLE_NAME \"${TARGET}.app\")" COMPONENT "Hyperion") + install(CODE "set(PLUGIN_DIR \"${QT_PLUGIN_DIR}\")" COMPONENT "Hyperion") + install(CODE "set(BUILD_DIR \"${CMAKE_BINARY_DIR}\")" COMPONENT "Hyperion") + install(CODE "set(ENABLE_EFFECTENGINE \"${ENABLE_EFFECTENGINE}\")" 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 + file(GET_RUNTIME_DEPENDENCIES + EXECUTABLES ${TARGET_FILE} + RESOLVED_DEPENDENCIES_VAR resolved_deps + UNRESOLVED_DEPENDENCIES_VAR unresolved_deps ) - 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}") + foreach(dependency ${resolved_deps}) + string(FIND ${dependency} "dylib" _index) + if (${_index} GREATER -1) file(INSTALL - FILES ${file} - DESTINATION "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/plugins/${PLUGIN}" + FILES "${dependency}" + DESTINATION "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/Frameworks" TYPE SHARED_LIBRARY ) - endforeach() + else() + file(INSTALL + FILES "${dependency}" + DESTINATION "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/lib" + TYPE SHARED_LIBRARY + ) + endif() + endforeach() + + list(LENGTH unresolved_deps unresolved_length) + if("${unresolved_length}" GREATER 0) + MESSAGE("The following unresolved dependencies were discovered: ${unresolved_deps}") endif() - endforeach() - if(ENABLE_EFFECTENGINE) - include(BundleUtilities) - fixup_bundle("${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}" "${QT_PLUGINS}" "" IGNORE_ITEM "python;python3;Python;Python3;.Python;.Python3") + foreach(PLUGIN "platforms" "sqldrivers" "imageformats") + if(EXISTS ${PLUGIN_DIR}/${PLUGIN}) + file(GLOB files "${PLUGIN_DIR}/${PLUGIN}/*") + foreach(file ${files}) + file(GET_RUNTIME_DEPENDENCIES + EXECUTABLES ${file} + RESOLVED_DEPENDENCIES_VAR PLUGINS + UNRESOLVED_DEPENDENCIES_VAR unresolved_deps + ) - # 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 - ) + foreach(DEPENDENCY ${PLUGINS}) + file(INSTALL + DESTINATION "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/lib" + TYPE SHARED_LIBRARY + FILES ${DEPENDENCY} + ) + endforeach() - # 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 + get_filename_component(singleQtLib ${file} NAME) + list(APPEND QT_PLUGINS "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/plugins/${PLUGIN}/${singleQtLib}") + 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}" "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/lib" IGNORE_ITEM "python;python3;Python;Python3;.Python;.Python3") + + if(ENABLE_EFFECTENGINE) + + # 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 ) - endif(PYTHON_MODULES_DIR) - endif(ENABLE_EFFECTENGINE) + + MESSAGE("Add Python ${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} to bundle") + MESSAGE("PYTHON_MODULES_DIR: ${PYTHON_MODULES_DIR}") + + # 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) + endif(ENABLE_EFFECTENGINE) + + file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/${TARGET_BUNDLE_NAME}/Contents/lib") + file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/share") + ]] COMPONENT "Hyperion") else() diff --git a/doc/development/CompileHowto.md b/doc/development/CompileHowto.md index 45b3b846..f0cf7016 100644 --- a/doc/development/CompileHowto.md +++ b/doc/development/CompileHowto.md @@ -132,16 +132,16 @@ brew install qt5 python3 cmake libusb doxygen We assume a 64bit Windows 10. Install the following; - [Git](https://git-scm.com/downloads) (Check: Add to PATH) - [CMake (Windows win64-x64 installer)](https://cmake.org/download/) (Check: Add to PATH) -- [Visual Studio 2019 Build Tools](https://go.microsoft.com/fwlink/?linkid=840931) ([direct link](https://aka.ms/vs/16/release/vs_buildtools.exe)) - - Select C++ Buildtools - - On the right, just select `MSVC v142 VS 2019 C++ x64/x86-Buildtools` and latest `Windows 10 SDK`. Everything else is not needed. +- [Visual Studio 2022 Community Edition](https://visualstudio.microsoft.com/downloads/#visual-studio-community-2022) + - Select 'Desktop development with C++' + - On the right, just select `MSVC v143 VS 2022 C++ x64/x86-Buildtools` and latest `Windows 10 SDK`. Everything else is not needed. - [Win64 OpenSSL v1.1.1k](https://slproweb.com/products/Win32OpenSSL.html) ([direct link](https://slproweb.com/download/Win64OpenSSL-1_1_1k.exe)) - [Python 3 (Windows x86-64 executable installer)](https://www.python.org/downloads/windows/) (Check: Add to PATH and Debug Symbols) - Open a console window and execute `pip install aqtinstall`. - - Now we can download Qt to _C:\Qt_ `mkdir c:\Qt && aqt install -O c:\Qt 5.15.0 windows desktop win64_msvc2019_64` + - Now we can download Qt to _C:\Qt_ `mkdir c:\Qt && aqt install -O c:\Qt 5.15.2 windows desktop win64_msvc2019_64` - QT6.2 requires the [Vulkan SDK](https://vulkan.lunarg.com/sdk/home) to be installed - [libjpeg-turbo SDK for Visual C++](https://sourceforge.net/projects/libjpeg-turbo/files/) - - Download the latest 64bit installer (currently `libjpeg-turbo-2.1.0-vc64.exe`) and install to its default location `C:\libjpeg-turbo64`. + - Download the latest 64bit installer (currently `libjpeg-turbo-2.1.3-vc64.exe`) and install to its default location `C:\libjpeg-turbo64`. ### Optional: - For DirectX9 grabber: @@ -181,14 +181,14 @@ bin/hyperiond In case you would like to build with a dedicated Qt version, Either supply ``QTDIR`` as ``-DQTDIR=`` to cmake or set and environment variable ``QTDIR`` pointing to the Qt installation. -On Windows MSVC2019 set it via the CMakeSettings.json: +On Windows MSVC2022 set it via the CMakeSettings.json: ```posh "configurations": [ { ... "environments": [ { - "QTDIR": "C:/Qt/6.2.0/msvc2019_64/" + "QTDIR": "C:/Qt/6.2.2/msvc2019_64/" } ] }, @@ -241,8 +241,8 @@ Platform should be auto detected and refer to windows, you can also force window ```posh # You might need to setup MSVC env first -call "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat" -cmake -DPLATFORM=windows -G "Visual Studio 16 2019" .. +call "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat" +cmake -DPLATFORM=windows -G "Visual Studio 17 2022" .. ``` **Run make to build Hyperion:** @@ -261,7 +261,7 @@ On Windows run: ```posh cmake --build . --config Release -- -maxcpucount ``` -Maintainer: To build installer, install [NSIS](https://nsis.sourceforge.io/Main_Page) and set env `VCINSTALLDIR="C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC"` +Maintainer: To build installer, install [NSIS](https://nsis.sourceforge.io/Main_Page) and set env `VCINSTALLDIR="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC"` **Install hyperion into your system:** Copy all necessary files to ``/usr/local/share/hyperion``