From 86a0467dcfcf09d8bc34afd76c9ae4b3185214e1 Mon Sep 17 00:00:00 2001 From: Awawa <69086569+awawa-dev@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:26:16 +0100 Subject: [PATCH] Implement FHS --- .github/workflows/cache_cleaner.yml | 6 +- .github/workflows/push-master.yml | 24 +- BUILDING.md | 2 + CHANGELOG.md | 28 +- CMakeLists.txt | 15 + HyperhdrConfig.h.in | 4 + build.sh | 21 +- cmake/installer_linux.cmake | 197 ++++++ cmake/installer_macos.cmake | 183 +++++ cmake/installer_windows.cmake | 158 +++++ cmake/installers.cmake | 657 ------------------ cmake/linux/arch/INSTALL | 329 ++------- cmake/linux/arch/PKGBUILD | 10 +- cmake/linux/debian/postinst | 157 ++--- cmake/linux/debian/preinst | 32 +- cmake/linux/debian/prerm | 46 +- cmake/linux/resources/hyperhdr.desktop | 2 +- cmake/linux/rpm/%post | 64 ++ cmake/linux/rpm/%pre | 11 + cmake/linux/rpm/%preun | 16 + cmake/linux/rpm/postinst | 156 ----- cmake/linux/rpm/preinst | 34 - cmake/linux/rpm/prerm | 57 -- cmake/linux/service/hyperhdr.init | 82 --- cmake/linux/service/hyperhdr.initctl | 11 - .../{hyperhdr.systemd => hyperhdr@.service} | 1 - cmake/packages.cmake | 32 +- external/CMakeLists.txt | 3 +- sources/hyperhdr/CMakeLists.txt | 27 +- sources/hyperhdr/SystrayHandler.cpp | 14 +- sources/hyperhdr/main.cpp | 8 +- sources/webserver/FileServer.cpp | 8 +- www/js/settings.js | 5 +- 33 files changed, 921 insertions(+), 1479 deletions(-) create mode 100644 cmake/installer_linux.cmake create mode 100644 cmake/installer_macos.cmake create mode 100644 cmake/installer_windows.cmake delete mode 100644 cmake/installers.cmake create mode 100644 cmake/linux/rpm/%post create mode 100644 cmake/linux/rpm/%pre create mode 100644 cmake/linux/rpm/%preun delete mode 100644 cmake/linux/rpm/postinst delete mode 100644 cmake/linux/rpm/preinst delete mode 100644 cmake/linux/rpm/prerm delete mode 100644 cmake/linux/service/hyperhdr.init delete mode 100644 cmake/linux/service/hyperhdr.initctl rename cmake/linux/service/{hyperhdr.systemd => hyperhdr@.service} (85%) diff --git a/.github/workflows/cache_cleaner.yml b/.github/workflows/cache_cleaner.yml index 67faba331..66be99bdd 100644 --- a/.github/workflows/cache_cleaner.yml +++ b/.github/workflows/cache_cleaner.yml @@ -13,9 +13,9 @@ jobs: permissions: actions: write steps: - - uses: yumemi-inc/clean-cache-action@v1.0.5 - with: - ref: 'refs/heads/${{ github.head_ref }}' + - run: gh cache delete --all --ref "refs/heads/${{ github.head_ref }}" + env: + GH_TOKEN: ${{ github.token }} clean_PR_artifacts: name: Delete old Artifacts runs-on: ubuntu-latest diff --git a/.github/workflows/push-master.yml b/.github/workflows/push-master.yml index 469ccfddc..20080a98c 100644 --- a/.github/workflows/push-master.yml +++ b/.github/workflows/push-master.yml @@ -75,11 +75,11 @@ jobs: - name: Clear branch ccache storage if: startsWith(github.event.ref, 'refs/tags') == false - uses: yumemi-inc/clean-cache-action@v1 continue-on-error: true - with: - ref: ${{ github.event.ref }} - key: ${{ matrix.architecture }}-${{ matrix.distroName }}-${{ matrix.distroVersion }}-ccache- + run: | + gh cache list --ref ${{ github.event.ref }} --key "${{ matrix.architecture }}-${{ matrix.distroName }}-${{ matrix.distroVersion }}-ccache-" --limit 100 --json id --jq '.[].id' | xargs -r -n1 gh cache delete + env: + GH_TOKEN: ${{ github.token }} - name: Upload artifacts (release) if: startsWith(github.event.ref, 'refs/tags') && github.event_name != 'pull_request' @@ -143,11 +143,11 @@ jobs: run: ./build.sh || ./build.sh - name: Clear branch ccache storage - uses: yumemi-inc/clean-cache-action@v1 continue-on-error: true - with: - ref: ${{ github.event.ref }} - key: macOS-${{ matrix.NICE_NAME }}-ccache + run: | + gh cache list --ref ${{ github.event.ref }} --key "macOS-${{ matrix.NICE_NAME }}-ccache" --limit 100 --json id --jq '.[].id' | xargs -r -n1 gh cache delete + env: + GH_TOKEN: ${{ github.token }} - name: Upload artifacts (release) if: startsWith(github.event.ref, 'refs/tags') && github.event_name != 'pull_request' @@ -232,11 +232,11 @@ jobs: ./build.sh - name: Clear branch ccache storage - uses: yumemi-inc/clean-cache-action@v1 continue-on-error: true - with: - ref: ${{ github.event.ref }} - key: ${{ runner.os }}-ccache + run: | + gh cache list --ref ${{ github.event.ref }} --key "${{ runner.os }}-ccache" --limit 100 --json id --jq '.[].id' | xargs -r -n1 gh cache delete + env: + GH_TOKEN: ${{ github.token }} - name: Upload artifacts (release) if: startsWith(github.event.ref, 'refs/tags') && github.event_name != 'pull_request' diff --git a/BUILDING.md b/BUILDING.md index 205e5339c..42b707d81 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -158,6 +158,7 @@ BUILD_ARCHIVES - false|true, cpack will build ZIP package USE_STANDARD_INSTALLER_NAME - false|true, use standard Linux package naming USE_CCACHE - false|true, use ccache if available RESET_CACHE - false|true, reset ccache storage +INCLUDE_DEP_LIB - false|true, bundle dependency libs into the Linux installer Example of usage: PLATFORM=rpi DISTRO_NAME=debian DISTRO_VERSION=bullseye ARCHITECTURE=arm64 ./build.sh @@ -224,3 +225,4 @@ Use -D prefix when configuring the build. * USE_SYSTEM_STB_LIBS = ON | OFF, prefer system stb libs * USE_STATIC_QT_PLUGINS = ON | OFF, embed static QT-plugins into the app * USE_STANDARD_INSTALLER_NAME = ON | OFF, use standard Linux package naming + * ENABLE_DEPENDENCY_PACKAGING = ON | OFF, bundle dependency libs into the Linux installer diff --git a/CHANGELOG.md b/CHANGELOG.md index f8fb5e9d3..1c297dc4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,22 @@ -- Fix: Initial smoothing surge after period of static video input (#1410) - fix for v22beta1 🆕 -- Fix: Minimum brightness preservation in YUV and Hybrid-Inertia smoothing modes (#1410) - fix for v22beta1 🆕 -- upgrades old style format logging (with %) to c++20 format in some places (#1410) - fix for v22beta1 🆕 -- restores custom user RGB order at the start (#1410) - fix for v22beta1 🆕 -- restores compatibility with Qt5.15 (#1410) - fix for v22beta1 🆕 -- Improved state management of the software grabber during sleep and monitor‑suspend events (#1410) - fix for v22beta1 🆕 +- Switch to Filesystem Hierarchy Standard (FHS) compliant installation on Linux (#1477) - v22beta2 🆕 +- Migrate to standard OS config location if ~/.hyperhdr folder is missing (#1472) - v22beta2 🆕 +- Add Philips WiZ support (driver + web wizard) Thanks @user83749 (#1469) - v22beta2 🆕 +- Add aspect ratio detection for Amlogic grabber. Thanks @santievil (#1476) - v22beta2 🆕 +- Fix remote tab JSON parsing error caused by missing black color in API JSON scheme (#1471) - v22beta2 🆕 +- Implement DDP / Hyperk drivers (#1467) - v22beta2 🆕 +- Fix: Initial smoothing surge after period of static video input (#1410) - v22beta2 🆕 +- Fix: Minimum brightness preservation in YUV and Hybrid-Inertia smoothing modes (#1410) - v22beta2 🆕 +- upgrades old style format logging (with %) to c++20 format in some places (#1410) - v22beta2 🆕 +- restores custom user RGB order at the start (#1410) - v22beta2 🆕 +- restores compatibility with Qt5.15 (#1410) - v22beta2 🆕 +- Improved state management of the software grabber during sleep and monitor‑suspend events (#1410) - v22beta2 🆕 - PipeWire is particularly sensitive to sessions resuming too early after such events and, despite having provided a saved session token, would display a new source select dialog after resume when screen‑lock‑after‑suspend was enabled -- Set disableOnLocked option enabled by default, because software grabbers for ex. Pipewire wont function properly without it (#1410) - fix for v22beta1 🆕 -- Fix translation resources -- Infinite Color Engine: new anti-flickering filter in the smoothing configuration (#1410) - fix for v22beta1 🆕 +- Set disableOnLocked option enabled by default, because software grabbers for ex. Pipewire wont function properly without it (#1410) - v22beta2 🆕 +- Fix translation resources- v22beta2 🆕 +- Infinite Color Engine: new anti-flickering filter in the smoothing configuration (#1410) - v22beta2 🆕 - Implements an anti-flickering filter that minimizes quantization jitter on 8-bit-per-channel drivers (24-bit RGB). Deep color capable drivers (like Philips Hue using entertainment mode) are bypassed as they don't suffer from LSB oscillation. -- Improved handshake stability connecting to Philips Hue bridge using OpenSSL 3.2+ (#1410) - fix for v22beta1 🆕 -- Fix: Add missing Qt meta-type registrations (#1456) - fix for v22beta1 🆕 +- Improved handshake stability connecting to Philips Hue bridge using OpenSSL 3.2+ (#1410) - v22beta2 🆕 +- Fix: Add missing Qt meta-type registrations (#1456) - v22beta2 🆕 - Infinite Color Engine - Breaking 24-bit Limits (#1261) - v22beta1 🆕 - Floating-Point Precision: All color computations use high-precision floating-point arithmetic, eliminating cumulative rounding errors for more accurate results - Linear sRGB Accuracy: Core color transformations are processed in linear sRGB space, ensuring physically correct and consistent light reproduction diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fd7a1ec7..79a438a43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -554,6 +554,21 @@ if(UNIX AND NOT APPLE) colorMe("USE_STANDARD_INSTALLER_NAME = " ${USE_STANDARD_INSTALLER_NAME}) colorMe("HYPERHDR_HAVE_DBUS = " ${HYPERHDR_HAVE_DBUS}) + + include(GNUInstallDirs) + + option(ENABLE_DEPENDENCY_PACKAGING "Bundle dependency libraries" OFF) + colorMe("ENABLE_DEPENDENCY_PACKAGING = " ${ENABLE_DEPENDENCY_PACKAGING}) + + if(ENABLE_DEPENDENCY_PACKAGING) + SET ( PORTABLE_LIB_FOLDER "../${CMAKE_INSTALL_LIBDIR}/hyperhdr" ) + colorMe("PORTABLE_LIB_FOLDER = " ${PORTABLE_LIB_FOLDER}) + endif() + + if (NOT USE_EMBEDDED_WEB_RESOURCES) + file(RELATIVE_PATH WEB_REL_PATH "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_FULL_DATADIR}/hyperhdr/web") + SET( WEB_RESOURCES_FOLDER "${WEB_REL_PATH}") + endif() else() SET ( USE_STANDARD_INSTALLER_NAME OFF ) endif() diff --git a/HyperhdrConfig.h.in b/HyperhdrConfig.h.in index e192a4367..d7b9c66c8 100644 --- a/HyperhdrConfig.h.in +++ b/HyperhdrConfig.h.in @@ -88,6 +88,10 @@ #cmakedefine HYPERHDR_HAVE_DBUS +#cmakedefine PORTABLE_LIB_FOLDER "@PORTABLE_LIB_FOLDER@" + +#cmakedefine WEB_RESOURCES_FOLDER "@WEB_RESOURCES_FOLDER@" + // the hyperhdr build id string #define HYPERHDR_BUILD_ID "${HYPERHDR_BUILD_ID}" #define HYPERHDR_GIT_REMOTE "${HYPERHDR_GIT_REMOTE}" diff --git a/build.sh b/build.sh index fbdea195e..5040e040e 100755 --- a/build.sh +++ b/build.sh @@ -34,6 +34,7 @@ print_manual() printf "\n\n${GreenColor}Optional environmental options:${ColorReset}" printf "\n${CyanColor}BUILD_TYPE${ColorReset} - Release|Debug, default is Release version" printf "\n${CyanColor}BUILD_ARCHIVES${ColorReset} - false|true, cpack will build ZIP package" + printf "\n${CyanColor}INCLUDE_DEP_LIB${ColorReset} - false|true, include dependent libraries in the installer" printf "\n${CyanColor}USE_STANDARD_INSTALLER_NAME${ColorReset} - false|true, use standard Linux package naming" printf "\n${CyanColor}USE_CCACHE${ColorReset} - false|true, use ccache if available" printf "\n${CyanColor}RESET_CACHE${ColorReset} - false|true, reset ccache storage" @@ -74,6 +75,7 @@ fi [ -z "${USE_CCACHE}" ] && USE_CCACHE=true [ -z "${RESET_CACHE}" ] && RESET_CACHE=false [ -z "${BUILD_ARCHIVES}" ] && BUILD_ARCHIVES=true +[ -z "${INCLUDE_DEP_LIB}" ] && INCLUDE_DEP_LIB=true printf "\n${GreenColor}PLATFORM${ColorReset} = ${YellowColor}${PLATFORM}${ColorReset}" @@ -84,6 +86,7 @@ printf "\n${GreenColor}BUILD_TYPE${ColorReset} = ${YellowColor}${BUILD_TYPE} printf "\n${GreenColor}BUILD_ARCHIVES${ColorReset} = ${YellowColor}${BUILD_ARCHIVES}${ColorReset}" printf "\n${GreenColor}USE_CCACHE${ColorReset} = ${YellowColor}${USE_CCACHE}${ColorReset}" printf "\n${GreenColor}RESET_CACHE${ColorReset} = ${YellowColor}${RESET_CACHE}${ColorReset}" +printf "\n${GreenColor}INCLUDE_DEP_LIB{ColorReset} = ${YellowColor}${INCLUDE_DEP_LIB}${ColorReset}" printf "\n${GreenColor}USE_STANDARD_INSTALLER_NAME${ColorReset} = ${YellowColor}${USE_STANDARD_INSTALLER_NAME}${ColorReset}" printf "\n\n" @@ -103,6 +106,14 @@ else ARCHIVE_OPTION=" ${ARCHIVE_OPTION} -DUSE_STANDARD_INSTALLER_NAME=OFF" fi +if [ ${INCLUDE_DEP_LIB} = true ]; then + echo "Include dependent libraries in the installer" + ARCHIVE_OPTION=" ${ARCHIVE_OPTION} -DENABLE_DEPENDENCY_PACKAGING=ON" +else + echo "Do not include dependent libraries in the installer" + ARCHIVE_OPTION=" ${ARCHIVE_OPTION} -DENABLE_DEPENDENCY_PACKAGING=OFF" +fi + echo "Platform: ${PLATFORM}, build type: ${BUILD_TYPE}, CI_NAME: $CI_NAME, docker: ${ARCHITECTURE}/${DISTRO_NAME}:${DISTRO_VERSION}, archive options: ${ARCHIVE_OPTION}, use ccache: ${USE_CCACHE}, reset ccache: ${RESET_CACHE}" # clear ccache if neccesery @@ -207,7 +218,15 @@ elif [[ "$CI_NAME" == 'linux' ]]; then chmod -R a+rw ${CI_BUILD_DIR}/deploy versionFile=`cat version` executeCommand="echo \"GLIBC version: \$(ldd --version | head -1 | sed 's/[^0-9]*\([.0-9]*\)$/\1/')\"" - executeCommand=${executeCommand}" && sed -i \"s/{GLIBC_VERSION}/\$(ldd --version | head -1 | sed 's/[^0-9]*\([.0-9]*\)$/\1/')/\" PKGBUILD && makepkg" + executeCommand=${executeCommand}" && sed -i \"s/{GLIBC_VERSION}/\$(ldd --version | head -1 | sed 's/[^0-9]*\([.0-9]*\)$/\1/')/\" PKGBUILD" + + if [ ${INCLUDE_DEP_LIB} = true ]; then + executeCommand=${executeCommand}" && makepkg" + else + executeCommand=${executeCommand}" && sed -i 's|) #| alsa-lib libftdi gtk3 hicolor-icon-theme libayatana-appindicator libjpeg-turbo libusb libx11 libglvnd mesa openssl pipewire qt6-base qt6-serialport systemd-libs wayland xz zstd)|' PKGBUILD" + executeCommand=${executeCommand}" && makepkg -d" + fi + echo ${executeCommand} sed -i "s/{VERSION}/${versionFile}/" PKGBUILD sed -i "s/{BUILD_OPTION}/${BUILD_OPTION}/" PKGBUILD diff --git a/cmake/installer_linux.cmake b/cmake/installer_linux.cmake new file mode 100644 index 000000000..b64fb53e1 --- /dev/null +++ b/cmake/installer_linux.cmake @@ -0,0 +1,197 @@ +macro(InstallerLinux TARGET) + include(GNUInstallDirs) + + if (EXISTS ${TARGET_FILE}) + # Podstawowe pliki licencji + install(FILES "${PROJECT_SOURCE_DIR}/LICENSE" DESTINATION "${CMAKE_INSTALL_DATADIR}/hyperhdr" COMPONENT "HyperHDR") + install(FILES "${PROJECT_SOURCE_DIR}/3RD_PARTY_LICENSES" DESTINATION "${CMAKE_INSTALL_DATADIR}/hyperhdr" COMPONENT "HyperHDR") + + # Binarka główna + install(TARGETS hyperhdr DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT "HyperHDR") + + # Plik serwisu (jako szablony dla postinst) + install(FILES ${CMAKE_SOURCE_DIR}/cmake/linux/service/hyperhdr@.service DESTINATION "/usr/lib/systemd/system" COMPONENT "HyperHDR") + + # Ikony i plik .desktop (Zgodne z FHS, np. /usr/share/applications i /usr/share/icons) + install(FILES ${CMAKE_SOURCE_DIR}/cmake/linux/resources/hyperhdr-icon-32px.png + DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/32x32/apps" RENAME "hyperhdr.png" COMPONENT "HyperHDR") + install(FILES ${CMAKE_SOURCE_DIR}/cmake/linux/resources/hyperhdr_128.png + DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps" RENAME "hyperhdr.png" COMPONENT "HyperHDR") + install(FILES ${CMAKE_SOURCE_DIR}/cmake/linux/resources/hyperhdr.desktop + DESTINATION "${CMAKE_INSTALL_DATADIR}/applications" COMPONENT "HyperHDR") + + # Web resources + if (NOT USE_EMBEDDED_WEB_RESOURCES) + if (NOT TARGET webserver-resources) + message(FATAL_ERROR "Could not find compiled resources for the web server. Consider using USE_EMBEDDED_WEB_RESOURCES option" ) + endif() + get_target_property(webserver-resources-path webserver-resources OUTPUT_FILE) + install(FILES ${webserver-resources-path} DESTINATION "${CMAKE_INSTALL_DATADIR}/hyperhdr/web" COMPONENT "HyperHDR" ) + endif() + + # Optymalizacja: Pętla dla naszych wewnętrznych bibliotek, customizowanej wersji sqlite lub jesli ich nie ma w publicznym repo + set(CUSTOM_INTERNAL_LIBS smart-x11 smart-pipewire utils-image utils-zstd systray-widget qmqtt sqlite3 ) + foreach(custom_lib ${CUSTOM_INTERNAL_LIBS}) + if (TARGET ${custom_lib}) + get_target_property(TYPE ${custom_lib} TYPE) + if (TYPE STREQUAL "SHARED_LIBRARY") + install(TARGETS ${custom_lib} DESTINATION "${CMAKE_INSTALL_LIBDIR}/hyperhdr" COMPONENT "HyperHDR") + endif() + endif() + endforeach() + + # Pakowanie opcjonalnych zależności + if (ENABLE_DEPENDENCY_PACKAGING) + set(PREREQUISITE_LIBS "") + + # OpenSSL + find_package(OpenSSL) + if(OPENSSL_FOUND) + foreach(openssl_lib ${OPENSSL_LIBRARIES}) + include(GetPrerequisites) + gp_append_unique(PREREQUISITE_LIBS ${openssl_lib}) + get_filename_component(file_canonical ${openssl_lib} REALPATH) + gp_append_unique(PREREQUISITE_LIBS ${file_canonical}) + + get_filename_component(rootLib ${openssl_lib} NAME) + get_filename_component(rootPath ${openssl_lib} DIRECTORY) + file(GLOB resultSSL "${rootPath}/${rootLib}*") + foreach(targetlib ${resultSSL}) + gp_append_unique(PREREQUISITE_LIBS ${targetlib}) + endforeach() + endforeach() + else() + message( WARNING "OpenSSL NOT found (https instance will not work)") + endif() + + # Detect the Qt5 plugin directory + if ( Qt5Core_FOUND ) + get_target_property(QT_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) + execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS OUTPUT_VARIABLE QT_PLUGINS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) + elseif ( TARGET Qt${QT_VERSION_MAJOR}::qmake ) + get_target_property(QT_QMAKE_EXECUTABLE Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION) + execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS OUTPUT_VARIABLE QT_PLUGINS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + + # CEC lib + if (ENABLE_CEC) + find_library(XRANDR_LIBRARY NAMES Xrandr libXrandr libXrandr.so.2) + if (XRANDR_LIBRARY) + get_filename_component(resolvedXrandr ${XRANDR_LIBRARY} ABSOLUTE) + list (APPEND cecFiles ${resolvedXrandr}) + endif() + + foreach(resolved_file_in ${CEC_LIBRARIES}) + unset(LIBCEC CACHE) + find_library(LIBCEC NAMES ${resolved_file_in}) + if (LIBCEC) + get_filename_component(resolvedCec ${LIBCEC} ABSOLUTE) + list (APPEND cecFiles ${resolvedCec}) + endif() + endforeach() + + foreach(cecFile ${cecFiles}) + FILE(GLOB foundCec "${cecFile}*") + foreach(installCec ${foundCec}) + include(GetPrerequisites) + gp_append_unique(PREREQUISITE_LIBS ${installCec}) + endforeach() + endforeach() + endif() + + # Install CODE dla zależności + install(CODE "set(TARGET_FILE \"${TARGET_FILE}\")" COMPONENT "HyperHDR") + install(CODE "set(PREREQUISITE_LIBS \"${PREREQUISITE_LIBS}\")" COMPONENT "HyperHDR") + install(CODE "set(QT_PLUGINS_DIR \"${QT_PLUGINS_DIR}\")" COMPONENT "HyperHDR") + install(CODE "set(DEST_DIR \"${CMAKE_INSTALL_LIBDIR}/hyperhdr/external\")" COMPONENT "HyperHDR") + + install(CODE [[ + set(SYSTEM_LIBS_SKIP + "libc" "libglib-2" "libsystemd0" "libdl" "libexpat" "libfontconfig" "libgcc_s" + "libm" "libpthread" "librt" "libstdc++" "libudev" "libz.so" "libxrender1" + "libxi6" "libxext6" "libx11-xcb1" "libsm" "libice6" "libdrm2" "libxkbcommon0" + "libwacom2" "libmtdev1" "libinput10" "libgudev-1.0-0" "libffi6" "libevdev2" + "libuuid1" "libselinux1" "libmount1" "libblkid1" "libwayland" "libxcb-icccm4" + "libxcb-image0" "libxcb-keysyms1" "libxcb-randr0" "libxcb-render-util0" + "libxcb-render0" "libxcb-shape0" "libxcb-shm0" "libxcb-sync1" "libxcb-util0" + "libxcb-xfixes0" "libxcb-xkb1" "libxkbcommon-x11-0" "ld-" "libasound" + "libblkid" "libffi" "libgio-2" "libgmodule-2" "libgobject-2" "libidn2" + "libnghttp" "libsystemd" "libpsl" "libunistring" "libssh" "libselinux" + "libevent-2" "libldap" "libutils" "libsqlite3" "libqmqtt" + ) + + include(GetPrerequisites) + if (NOT CMAKE_CROSSCOMPILING) + file(GET_RUNTIME_DEPENDENCIES RESOLVED_DEPENDENCIES_VAR DEPENDENCIES EXECUTABLES ${TARGET_FILE}) + + file(GET_RUNTIME_DEPENDENCIES RESOLVED_DEPENDENCIES_VAR SYS_DEPENDENCIES EXECUTABLES $) + foreach(systrayLib ${SYS_DEPENDENCIES}) + string(FIND ${systrayLib} "libayatana" _sysindex) + string(FIND ${systrayLib} "libdbusmenu" _sysDBusindex) + if (${_sysindex} GREATER -1 OR ${_sysDBusindex} GREATER -1) + list(APPEND DEPENDENCIES ${systrayLib}) + endif() + endforeach() + endif() + + # Kopiowanie pluginów QT do lib/hyperhdr/external/plugins + foreach(PLUGIN "tls") + if(EXISTS ${QT_PLUGINS_DIR}/${PLUGIN}) + file(GLOB files "${QT_PLUGINS_DIR}/${PLUGIN}/*openssl*") + foreach(file ${files}) + file(GET_RUNTIME_DEPENDENCIES RESOLVED_DEPENDENCIES_VAR QT_DEPENDENCIES EXECUTABLES ${file}) + list(APPEND DEPENDENCIES ${QT_DEPENDENCIES}) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/${DEST_DIR}/plugins/${PLUGIN}" TYPE SHARED_LIBRARY FILES ${file}) + message("Installing QT plugin: ${file} to ${CMAKE_INSTALL_PREFIX}/${DEST_DIR}/plugins/${PLUGIN}") + endforeach() + endif() + endforeach() + + foreach(DEPENDENCY ${DEPENDENCIES}) + get_filename_component(resolved ${DEPENDENCY} NAME_WE) + + set(SKIP_LIB FALSE) + foreach(myitem ${SYSTEM_LIBS_SKIP}) + string(FIND ${resolved} ${myitem} _index) + if (${_index} EQUAL 0) + set(SKIP_LIB TRUE) + break() + endif() + endforeach() + + if (SKIP_LIB) + continue() + else() + gp_resolve_item("${TARGET_FILE}" "${DEPENDENCY}" "" "" resolved_file) + get_filename_component(resolved_file ${resolved_file} ABSOLUTE) + gp_append_unique(PREREQUISITE_LIBS ${resolved_file}) + get_filename_component(file_canonical ${resolved_file} REALPATH) + gp_append_unique(PREREQUISITE_LIBS ${file_canonical}) + endif() + endforeach() + + # Kopiowanie i ew. patchowanie RPATH z zachowaniem nowych ścieżek FHS + foreach(PREREQUISITE_LIB IN LISTS PREREQUISITE_LIBS) + # 1. Instalacja pliku bezpośrednio do katalogu docelowego + file(INSTALL FILES "${PREREQUISITE_LIB}" DESTINATION "${CMAKE_INSTALL_PREFIX}/${DEST_DIR}" TYPE SHARED_LIBRARY) + message("Installing: ${PREREQUISITE_LIB} to ${CMAKE_INSTALL_PREFIX}/${DEST_DIR}") + # 2. Sprawdzenie, czy plik nie jest dowiązaniem i czy to libproxy / libpxbackend + if(NOT IS_SYMLINK "${PREREQUISITE_LIB}" AND "${PREREQUISITE_LIB}" MATCHES "libproxy|libpxbackend") + get_filename_component(FILENAME "${PREREQUISITE_LIB}" NAME) + set(INSTALLED_FILE "${CMAKE_INSTALL_PREFIX}/${DEST_DIR}/${FILENAME}") + message("Patching RPATH: ${INSTALLED_FILE}") + execute_process(COMMAND chrpath -d "${INSTALLED_FILE}" OUTPUT_VARIABLE outputResult) + endif() + endforeach() + ]] COMPONENT "HyperHDR") + endif() + 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() diff --git a/cmake/installer_macos.cmake b/cmake/installer_macos.cmake new file mode 100644 index 000000000..95a9b3ca8 --- /dev/null +++ b/cmake/installer_macos.cmake @@ -0,0 +1,183 @@ +macro(InstallerMacOS TARGET) + if(EXISTS ${TARGET_FILE}) + cmake_policy(PUSH) + cmake_policy(SET CMP0177 NEW) + install ( TARGETS hyperhdr DESTINATION "share/.." COMPONENT "HyperHDR" ) + cmake_policy(POP) + + install(FILES "${PROJECT_SOURCE_DIR}/cmake/osx/Hyperhdr.icns" DESTINATION "hyperhdr.app/Contents/Resources" COMPONENT "HyperHDR") + install(FILES "${PROJECT_SOURCE_DIR}/LICENSE" DESTINATION "hyperhdr.app/Contents/Resources" COMPONENT "HyperHDR") + install(FILES "${PROJECT_SOURCE_DIR}/3RD_PARTY_LICENSES" DESTINATION "hyperhdr.app/Contents/Resources" COMPONENT "HyperHDR") + + # Copy QMQTT + if (USE_SHARED_LIBS AND TARGET qmqtt) + install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") + install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") + endif() + + # Copy SQLITE3 + if (USE_SHARED_LIBS AND TARGET sqlite3) + install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") + endif() + + # Copy utils-zstd + if (USE_SHARED_LIBS AND TARGET utils-zstd) + install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") + endif() + + # Copy utils-image + if (USE_SHARED_LIBS AND TARGET utils-image) + install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") + endif() + + if ( Qt5Core_FOUND ) + get_target_property(MYQT_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) + else() + SET (MYQT_QMAKE_EXECUTABLE "${_qt_import_prefix}/../../../bin/qmake") + endif() + + execute_process( + COMMAND ${MYQT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS + OUTPUT_VARIABLE MYQT_PLUGINS_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + install(CODE "set(MYQT_PLUGINS_DIR \"${MYQT_PLUGINS_DIR}\")" COMPONENT "HyperHDR") + install(CODE "set(MY_DEPENDENCY_PATHS \"${TARGET_FILE}\")" COMPONENT "HyperHDR") + install(CODE "set(MY_SYSTEM_LIBS_SKIP \"${SYSTEM_LIBS_SKIP}\")" COMPONENT "HyperHDR") + install(CODE "set(SCOPE_Qt_VERSION ${Qt_VERSION})" COMPONENT "HyperHDR") + install(CODE "set(SCOPE_CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR})" COMPONENT "HyperHDR") + install(CODE [[ + execute_process( + COMMAND brew --prefix openssl@3 + RESULT_VARIABLE BREW_OPENSSL3 + OUTPUT_VARIABLE BREW_OPENSSL3_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if (BREW_OPENSSL3 EQUAL 0 AND EXISTS "${BREW_OPENSSL3_PATH}/lib") + set(BREW_OPENSSL3_LIB "${BREW_OPENSSL3_PATH}/lib") + message("Found OpenSSL@3 at ${BREW_OPENSSL3_LIB}") + file(GLOB filesSSL3 "${BREW_OPENSSL3_LIB}/*") + if (NOT (SCOPE_Qt_VERSION EQUAL 5)) + list (APPEND filesSSL ${filesSSL3}) + else() + message("Skipping OpenSSL@3 for Qt5") + endif() + endif() + + #OpenSSL + if(filesSSL) + list( REMOVE_DUPLICATES filesSSL) + foreach(openssl_lib ${filesSSL}) + string(FIND ${openssl_lib} "dylib" _indexSSL) + if (${_indexSSL} GREATER -1) + file(INSTALL + DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/Frameworks" + TYPE SHARED_LIBRARY + FILES "${openssl_lib}" + ) + else() + file(INSTALL + DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" + TYPE SHARED_LIBRARY + FILES "${openssl_lib}" + ) + endif() + endforeach() + else() + message( WARNING "OpenSSL NOT found (https instance will not work)") + endif() + + file(GET_RUNTIME_DEPENDENCIES + EXECUTABLES ${MY_DEPENDENCY_PATHS} + RESOLVED_DEPENDENCIES_VAR _r_deps + UNRESOLVED_DEPENDENCIES_VAR _u_deps + ) + + foreach(_libfile ${_r_deps}) + if(_libfile MATCHES "\\.dylib$") + set(_dest "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/Frameworks") + else() + set(_dest "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib") + endif() + file(COPY "${_libfile}" DESTINATION "${_dest}" FOLLOW_SYMLINK_CHAIN) + endforeach() + + list(LENGTH _u_deps _u_length) + if("${_u_length}" GREATER 0) + message(WARNING "Unresolved dependencies detected!") + endif() + + foreach(PLUGIN "tls") + if(EXISTS ${MYQT_PLUGINS_DIR}/${PLUGIN}) + file(GLOB files "${MYQT_PLUGINS_DIR}/${PLUGIN}/*openssl*") + foreach(file ${files}) + file(GET_RUNTIME_DEPENDENCIES + EXECUTABLES ${file} + RESOLVED_DEPENDENCIES_VAR PLUGINS + UNRESOLVED_DEPENDENCIES_VAR _u_deps + ) + + foreach(DEPENDENCY ${PLUGINS}) + file(INSTALL + DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" + TYPE SHARED_LIBRARY + FILES ${DEPENDENCY} + ) + endforeach() + + get_filename_component(real_file "${file}" REALPATH) + get_filename_component(singleQtLib ${file} NAME) + list(APPEND MYQT_PLUGINS "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/plugins/${PLUGIN}/${singleQtLib}") + file(INSTALL + DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/plugins/${PLUGIN}" + TYPE SHARED_LIBRARY + FILES "${real_file}" + ) + + endforeach() + endif() + endforeach() + + include(BundleUtilities) + fixup_bundle("${CMAKE_INSTALL_PREFIX}/hyperhdr.app" "${MYQT_PLUGINS}" "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib;${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/Frameworks") + fixup_bundle("${CMAKE_INSTALL_PREFIX}/hyperhdr.app" "" "") + + file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib") + file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/share") + + message( "Detected architecture: '${SCOPE_CMAKE_SYSTEM_PROCESSOR}'") + if(SCOPE_CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + cmake_policy(PUSH) + cmake_policy(SET CMP0009 NEW) + message( "Re-signing bundle's components...") + file(GLOB_RECURSE libSignFramework LIST_DIRECTORIES false "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/Frameworks/*" "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/plugins/tls/*") + list(APPEND libSignFramework "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/MacOS/hyperhdr") + foreach(_fileToSign ${libSignFramework}) + string(FIND ${_fileToSign} ".framework/Resources" isResources) + if (${isResources} EQUAL -1) + execute_process(COMMAND bash -c "codesign --force -s - ${_fileToSign}" RESULT_VARIABLE CODESIGN_VERIFY) + if(NOT CODESIGN_VERIFY EQUAL 0) + message(WARNING "Failed to repair the component signature: signing failed for ${_fileToSign}") + endif() + endif() + endforeach() + message( "Perform final verification...") + execute_process(COMMAND bash -c "codesign --verify --strict --verbose=4 ${CMAKE_INSTALL_PREFIX}/hyperhdr.app" RESULT_VARIABLE CODESIGN_VERIFY) + if(NOT CODESIGN_VERIFY EQUAL 0) + message(WARNING "Failed to repair the bundle signature: verification failed") + endif() + cmake_policy(POP) + endif() + ]] COMPONENT "HyperHDR") + else() + # Run CMake after target was built to run get_prerequisites on ${TARGET_FILE} + add_custom_command( + TARGET ${TARGET} POST_BUILD + COMMAND "${CMAKE_COMMAND}" "-DTARGET_FILE=$" + ARGS ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + VERBATIM + ) + endif() +endmacro() diff --git a/cmake/installer_windows.cmake b/cmake/installer_windows.cmake new file mode 100644 index 000000000..357ce39c8 --- /dev/null +++ b/cmake/installer_windows.cmake @@ -0,0 +1,158 @@ +macro(InstallerWindows TARGET) + if(EXISTS ${TARGET_FILE}) + + install ( TARGETS hyperhdr DESTINATION "bin" COMPONENT "HyperHDR" ) + include( InstallRequiredSystemLibraries ) + + message("Collecting Dependencies for target file: ${TARGET_FILE}") + + # Collect the runtime libraries + get_filename_component(COMPILER_PATH "${CMAKE_CXX_COMPILER}" DIRECTORY) + if (Qt_VERSION EQUAL 5) + set(WINDEPLOYQT_PARAMS --no-angle --no-opengl-sw) + else() + set(WINDEPLOYQT_PARAMS --no-opengl-sw) + endif() + + execute_process( + COMMAND "${CMAKE_COMMAND}" -E + env "PATH=${COMPILER_PATH};${QT_BIN_DIR}" "${WINDEPLOYQT_EXECUTABLE}" + --dry-run + ${WINDEPLOYQT_PARAMS} + --list mapping + "${TARGET_FILE}" + OUTPUT_VARIABLE DEPS + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # Parse DEPS into a semicolon-separated list. + separate_arguments(DEPENDENCIES WINDOWS_COMMAND ${DEPS}) + string(REPLACE "\\" "/" DEPENDENCIES "${DEPENDENCIES}") + + # Copy dependencies to 'hyperhdr/lib' or 'hyperhdr' + while (DEPENDENCIES) + list(GET DEPENDENCIES 0 src) + list(GET DEPENDENCIES 1 dst) + get_filename_component(dst ${dst} DIRECTORY) + + if (NOT "${dst}" STREQUAL "") + install( + FILES ${src} + DESTINATION "lib/${dst}" + COMPONENT "HyperHDR" + ) + else() + install( + FILES ${src} + DESTINATION "bin" + COMPONENT "HyperHDR" + ) + endif() + + list(REMOVE_AT DEPENDENCIES 0 1) + endwhile() + + # Copy TurboJPEG Libs + install(FILES ${TurboJPEG_INSTALL_LIB} DESTINATION "bin" COMPONENT "HyperHDR" ) + + # Web resources + if (NOT USE_EMBEDDED_WEB_RESOURCES) + if (NOT TARGET webserver-resources) + message(FATAL_ERROR "Could not find compiled resources for the web server. Consider using USE_EMBEDDED_WEB_RESOURCES option" ) + endif() + get_target_property(webserver-resources-path webserver-resources OUTPUT_FILE) + install(FILES ${webserver-resources-path} DESTINATION "lib" COMPONENT "HyperHDR" ) + endif() + + # Copy QMQTT + if (USE_SHARED_LIBS AND TARGET qmqtt) + install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") + endif() + + # Copy SQLITE3 + if (USE_SHARED_LIBS AND TARGET sqlite3) + install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") + endif() + + # Copy utils-zstd + if (USE_SHARED_LIBS AND TARGET utils-zstd) + install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") + endif() + + # Copy utils-image + if (USE_SHARED_LIBS AND TARGET utils-image) + install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") + endif() + + # Create a qt.conf file in 'bin' to override hard-coded search paths in Qt plugins + file(WRITE "${CMAKE_BINARY_DIR}/qt.conf" "[Paths]\nPlugins=../lib/\n") + install( + FILES "${CMAKE_BINARY_DIR}/qt.conf" + DESTINATION "bin" + COMPONENT "HyperHDR" + ) + + INSTALL(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION bin COMPONENT "HyperHDR") + + install(FILES "${PROJECT_SOURCE_DIR}/LICENSE" DESTINATION bin COMPONENT "HyperHDR") + install(FILES "${PROJECT_SOURCE_DIR}/3RD_PARTY_LICENSES" DESTINATION bin COMPONENT "HyperHDR") + + find_package(OpenSSL) + + get_filename_component(OPENSSL_BASE_DIR "${OPENSSL_INCLUDE_DIR}" DIRECTORY) + message("OpenSSL default path: ${OPENSSL_BASE_DIR}") + + find_file(OPENSSL_SSL + NAMES libssl-3-x64.dll libssl-1_1-x64.dll libssl-1_1.dll + HINTS "${OPENSSL_BASE_DIR}" + PATHS "C:/Program Files/OpenSSL" "C:/Program Files/OpenSSL-Win64" + PATH_SUFFIXES bin + ) + + find_file(OPENSSL_CRYPTO + NAMES libcrypto-3-x64.dll libcrypto-1_1-x64.dll libcrypto-1_1.dll + HINTS "${OPENSSL_BASE_DIR}" + PATHS "C:/Program Files/OpenSSL" "C:/Program Files/OpenSSL-Win64" + PATH_SUFFIXES bin + ) + + if(OPENSSL_SSL AND OPENSSL_CRYPTO) + message( STATUS "OpenSSL found: ${OPENSSL_SSL} ${OPENSSL_CRYPTO}") + install( + FILES ${OPENSSL_SSL} ${OPENSSL_CRYPTO} + DESTINATION "bin" + COMPONENT "HyperHDR" + ) + else() + message( WARNING "OpenSSL NOT found. HyperHDR's https instance and Philips Hue devices will not work.") + endif() + + else() + if (Qt_VERSION EQUAL 5) + get_target_property(QT_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) + get_filename_component(QT_BIN_DIR "${QT_QMAKE_EXECUTABLE}" DIRECTORY) + find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${QT_BIN_DIR}") + else() + get_filename_component(My_Qt6Core_EXECUTABLE_DIR ${QT6_INSTALL_PREFIX}/${QT6_INSTALL_BINS} ABSOLUTE) + find_program(WINDEPLOYQT_EXECUTABLE windeployqt PATHS "${My_Qt6Core_EXECUTABLE_DIR}" NO_DEFAULT_PATH) + if (NOT WINDEPLOYQT_EXECUTABLE) + find_program(WINDEPLOYQT_EXECUTABLE windeployqt) + endif() + endif() + + if (WINDEPLOYQT_EXECUTABLE AND (NOT CMAKE_GITHUB_ACTION)) + set(WINDEPLOYQT_PARAMS_RUNTIME --verbose 0 --no-compiler-runtime --no-opengl-sw --no-system-d3d-compiler) + message(STATUS "Found windeployqt: ${WINDEPLOYQT_EXECUTABLE} PATH_HINT:${My_Qt6Core_EXECUTABLE_DIR}${QT_BIN_DIR}") + add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${WINDEPLOYQT_EXECUTABLE} ${WINDEPLOYQT_PARAMS_RUNTIME} "$") + add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TurboJPEG_INSTALL_LIB} $) + endif() + + add_custom_command( + TARGET ${TARGET} POST_BUILD + COMMAND "${CMAKE_COMMAND}" "-DTARGET_FILE=$" + ARGS ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + VERBATIM + ) + endif() +endmacro() diff --git a/cmake/installers.cmake b/cmake/installers.cmake deleted file mode 100644 index efa8ba41e..000000000 --- a/cmake/installers.cmake +++ /dev/null @@ -1,657 +0,0 @@ -macro(DeployApple TARGET) - if(EXISTS ${TARGET_FILE}) - cmake_policy(PUSH) - cmake_policy(SET CMP0177 NEW) - install ( TARGETS hyperhdr DESTINATION "share/.." COMPONENT "HyperHDR" ) - cmake_policy(POP) - - install(FILES "${PROJECT_SOURCE_DIR}/cmake/osx/Hyperhdr.icns" DESTINATION "hyperhdr.app/Contents/Resources" COMPONENT "HyperHDR") - install(FILES "${PROJECT_SOURCE_DIR}/LICENSE" DESTINATION "hyperhdr.app/Contents/Resources" COMPONENT "HyperHDR") - install(FILES "${PROJECT_SOURCE_DIR}/3RD_PARTY_LICENSES" DESTINATION "hyperhdr.app/Contents/Resources" COMPONENT "HyperHDR") - - # Copy QMQTT - if (USE_SHARED_LIBS AND TARGET qmqtt) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - # Copy SQLITE3 - if (USE_SHARED_LIBS AND TARGET sqlite3) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - # Copy utils-zstd - if (USE_SHARED_LIBS AND TARGET utils-zstd) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - # Copy utils-image - if (USE_SHARED_LIBS AND TARGET utils-image) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - if ( Qt5Core_FOUND ) - get_target_property(MYQT_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) - else() - SET (MYQT_QMAKE_EXECUTABLE "${_qt_import_prefix}/../../../bin/qmake") - endif() - - execute_process( - COMMAND ${MYQT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS - OUTPUT_VARIABLE MYQT_PLUGINS_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - - install(CODE "set(MYQT_PLUGINS_DIR \"${MYQT_PLUGINS_DIR}\")" COMPONENT "HyperHDR") - install(CODE "set(MY_DEPENDENCY_PATHS \"${TARGET_FILE}\")" COMPONENT "HyperHDR") - install(CODE "set(MY_SYSTEM_LIBS_SKIP \"${SYSTEM_LIBS_SKIP}\")" COMPONENT "HyperHDR") - install(CODE "set(SCOPE_Qt_VERSION ${Qt_VERSION})" COMPONENT "HyperHDR") - install(CODE "set(SCOPE_CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR})" COMPONENT "HyperHDR") - install(CODE [[ - execute_process( - COMMAND brew --prefix openssl@3 - RESULT_VARIABLE BREW_OPENSSL3 - OUTPUT_VARIABLE BREW_OPENSSL3_PATH - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if (BREW_OPENSSL3 EQUAL 0 AND EXISTS "${BREW_OPENSSL3_PATH}/lib") - set(BREW_OPENSSL3_LIB "${BREW_OPENSSL3_PATH}/lib") - message("Found OpenSSL@3 at ${BREW_OPENSSL3_LIB}") - file(GLOB filesSSL3 "${BREW_OPENSSL3_LIB}/*") - if (NOT (SCOPE_Qt_VERSION EQUAL 5)) - list (APPEND filesSSL ${filesSSL3}) - else() - message("Skipping OpenSSL@3 for Qt5") - endif() - endif() - - #OpenSSL - if(filesSSL) - list( REMOVE_DUPLICATES filesSSL) - foreach(openssl_lib ${filesSSL}) - string(FIND ${openssl_lib} "dylib" _indexSSL) - if (${_indexSSL} GREATER -1) - file(INSTALL - DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/Frameworks" - TYPE SHARED_LIBRARY - FILES "${openssl_lib}" - ) - else() - file(INSTALL - DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" - TYPE SHARED_LIBRARY - FILES "${openssl_lib}" - ) - endif() - endforeach() - else() - message( WARNING "OpenSSL NOT found (https instance will not work)") - endif() - - file(GET_RUNTIME_DEPENDENCIES - EXECUTABLES ${MY_DEPENDENCY_PATHS} - RESOLVED_DEPENDENCIES_VAR _r_deps - UNRESOLVED_DEPENDENCIES_VAR _u_deps - ) - - foreach(_libfile ${_r_deps}) - if(_libfile MATCHES "\\.dylib$") - set(_dest "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/Frameworks") - else() - set(_dest "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib") - endif() - file(COPY "${_libfile}" DESTINATION "${_dest}" FOLLOW_SYMLINK_CHAIN) - endforeach() - - list(LENGTH _u_deps _u_length) - if("${_u_length}" GREATER 0) - message(WARNING "Unresolved dependencies detected!") - endif() - - foreach(PLUGIN "tls") - if(EXISTS ${MYQT_PLUGINS_DIR}/${PLUGIN}) - file(GLOB files "${MYQT_PLUGINS_DIR}/${PLUGIN}/*openssl*") - foreach(file ${files}) - file(GET_RUNTIME_DEPENDENCIES - EXECUTABLES ${file} - RESOLVED_DEPENDENCIES_VAR PLUGINS - UNRESOLVED_DEPENDENCIES_VAR _u_deps - ) - - foreach(DEPENDENCY ${PLUGINS}) - file(INSTALL - DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib" - TYPE SHARED_LIBRARY - FILES ${DEPENDENCY} - ) - endforeach() - - get_filename_component(real_file "${file}" REALPATH) - get_filename_component(singleQtLib ${file} NAME) - list(APPEND MYQT_PLUGINS "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/plugins/${PLUGIN}/${singleQtLib}") - file(INSTALL - DESTINATION "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/plugins/${PLUGIN}" - TYPE SHARED_LIBRARY - FILES "${real_file}" - ) - - endforeach() - endif() - endforeach() - - include(BundleUtilities) - fixup_bundle("${CMAKE_INSTALL_PREFIX}/hyperhdr.app" "${MYQT_PLUGINS}" "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib;${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/Frameworks") - fixup_bundle("${CMAKE_INSTALL_PREFIX}/hyperhdr.app" "" "") - - file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/lib") - file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/share") - - message( "Detected architecture: '${SCOPE_CMAKE_SYSTEM_PROCESSOR}'") - if(SCOPE_CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") - cmake_policy(PUSH) - cmake_policy(SET CMP0009 NEW) - message( "Re-signing bundle's components...") - file(GLOB_RECURSE libSignFramework LIST_DIRECTORIES false "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/Frameworks/*" "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/plugins/tls/*") - list(APPEND libSignFramework "${CMAKE_INSTALL_PREFIX}/hyperhdr.app/Contents/MacOS/hyperhdr") - foreach(_fileToSign ${libSignFramework}) - string(FIND ${_fileToSign} ".framework/Resources" isResources) - if (${isResources} EQUAL -1) - execute_process(COMMAND bash -c "codesign --force -s - ${_fileToSign}" RESULT_VARIABLE CODESIGN_VERIFY) - if(NOT CODESIGN_VERIFY EQUAL 0) - message(WARNING "Failed to repair the component signature: signing failed for ${_fileToSign}") - endif() - endif() - endforeach() - message( "Perform final verification...") - execute_process(COMMAND bash -c "codesign --verify --strict --verbose=4 ${CMAKE_INSTALL_PREFIX}/hyperhdr.app" RESULT_VARIABLE CODESIGN_VERIFY) - if(NOT CODESIGN_VERIFY EQUAL 0) - message(WARNING "Failed to repair the bundle signature: verification failed") - endif() - cmake_policy(POP) - endif() - ]] COMPONENT "HyperHDR") - else() - # Run CMake after target was built to run get_prerequisites on ${TARGET_FILE} - 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(DeployUnix TARGET) - if (EXISTS ${TARGET_FILE}) - include(GetPrerequisites) - - install(FILES "${PROJECT_SOURCE_DIR}/LICENSE" DESTINATION "share/hyperhdr" COMPONENT "HyperHDR") - install(FILES "${PROJECT_SOURCE_DIR}/3RD_PARTY_LICENSES" DESTINATION "share/hyperhdr" COMPONENT "HyperHDR") - - # HyperHDR bin & res - install ( TARGETS hyperhdr DESTINATION "share/hyperhdr/bin" COMPONENT "HyperHDR" ) - install ( DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/linux/service DESTINATION "share/hyperhdr/" COMPONENT "HyperHDR" ) - install ( FILES ${CMAKE_SOURCE_DIR}/cmake/linux/resources/hyperhdr-icon-32px.png DESTINATION "share/hyperhdr/icons" COMPONENT "HyperHDR" ) - install ( FILES ${CMAKE_SOURCE_DIR}/cmake/linux/resources/hyperhdr_128.png DESTINATION "share/hyperhdr/desktop" COMPONENT "HyperHDR" ) - install ( FILES ${CMAKE_SOURCE_DIR}/cmake/linux/resources/hyperhdr.desktop DESTINATION "share/hyperhdr/desktop" COMPONENT "HyperHDR" ) - - - # Our and custom libs - set(PREREQUISITE_LIBS "") - - # Web resources - if (NOT USE_EMBEDDED_WEB_RESOURCES) - if (NOT TARGET webserver-resources) - message(FATAL_ERROR "Could not find compiled resources for the web server. Consider using USE_EMBEDDED_WEB_RESOURCES option" ) - endif() - get_target_property(webserver-resources-path webserver-resources OUTPUT_FILE) - install(FILES ${webserver-resources-path} DESTINATION "share/hyperhdr/lib" COMPONENT "HyperHDR" ) - endif() - - # Copy SMART-X11 lib - if (TARGET smart-x11) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/share/hyperhdr/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - # Copy SMART-PIPEWIRE lib - if (TARGET smart-pipewire) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/share/hyperhdr/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - # Copy UTILS-IMAGE lib - if (TARGET utils-image) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/share/hyperhdr/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - # Copy UTILS-ZSTD lib - if (TARGET utils-zstd) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/share/hyperhdr/lib" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - - #OpenSSL - find_package(OpenSSL) - if(OPENSSL_FOUND) - foreach(openssl_lib ${OPENSSL_LIBRARIES}) - message(STATUS "Adding OpenSSL(1): ${openssl_lib}") - gp_append_unique(PREREQUISITE_LIBS ${openssl_lib}) - get_filename_component(file_canonical ${openssl_lib} REALPATH) - message(STATUS "Adding OpenSSL(2): ${file_canonical}") - gp_append_unique(PREREQUISITE_LIBS ${file_canonical}) - - get_filename_component(rootLib ${openssl_lib} NAME) - get_filename_component(rootPath ${openssl_lib} DIRECTORY) - file(GLOB resultSSL "${rootPath}/${rootLib}*") - foreach(targetlib ${resultSSL}) - message("=>${targetlib}") - gp_append_unique(PREREQUISITE_LIBS ${targetlib}) - endforeach() - endforeach() - else() - message( WARNING "OpenSSL NOT found (https instance will not work)") - endif() - - # Detect the Qt5 plugin directory, source: https://github.com/lxde/lxqt-qtplugin/blob/master/src/CMakeLists.txt - if ( Qt5Core_FOUND ) - get_target_property(QT_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) - execute_process( - COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS - OUTPUT_VARIABLE QT_PLUGINS_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - elseif ( TARGET Qt${QT_VERSION_MAJOR}::qmake ) - get_target_property(QT_QMAKE_EXECUTABLE Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION) - execute_process( - COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS - OUTPUT_VARIABLE QT_PLUGINS_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - endif() - - message(STATUS "QT plugin path: ${QT_PLUGINS_DIR}") - - # Copy CEC lib - if (ENABLE_CEC) - # xrandr - find_library(XRANDR_LIBRARY NAMES Xrandr libXrandr libXrandr.so.2) - if (XRANDR_LIBRARY) - get_filename_component(resolvedXrandr ${XRANDR_LIBRARY} ABSOLUTE) - list (APPEND cecFiles ${resolvedXrandr}) - endif() - - # cec core - foreach(resolved_file_in ${CEC_LIBRARIES}) - message(STATUS "Adding CEC: ${resolved_file_in}") - unset(LIBCEC CACHE) - find_library(LIBCEC NAMES ${resolved_file_in}) - if (LIBCEC) - get_filename_component(resolvedCec ${LIBCEC} ABSOLUTE) - list (APPEND cecFiles ${resolvedCec}) - endif() - endforeach() - - # install cec - foreach(cecFile ${cecFiles}) - FILE(GLOB foundCec "${cecFile}*") - foreach(installCec ${foundCec}) - message(STATUS "Adding CEC: ${installCec}") - gp_append_unique(PREREQUISITE_LIBS ${installCec}) - endforeach() - endforeach() - endif() - - # Create a qt.conf file in 'share/hyperhdr/bin' to override hard-coded search paths in Qt plugins - file(WRITE "${CMAKE_BINARY_DIR}/qt.conf" "[Paths]\nPlugins=../lib/plugins/\n") - install( - FILES "${CMAKE_BINARY_DIR}/qt.conf" - DESTINATION "share/hyperhdr/bin" - COMPONENT "HyperHDR" - ) - - # symlink - install( CODE "EXECUTE_PROCESS(COMMAND ln -sf \"../share/hyperhdr/bin/hyperhdr\" \"${CMAKE_BINARY_DIR}/symlink_hyperhdr\" )" COMPONENT "HyperHDR" ) - install( FILES ${CMAKE_BINARY_DIR}/symlink_hyperhdr DESTINATION "bin" RENAME hyperhdr COMPONENT "HyperHDR" ) - install( CODE "FILE (REMOVE ${CMAKE_BINARY_DIR}/symlink_hyperhdr )" COMPONENT "HyperHDR" ) - - # install CODE - install(CODE "set(TARGET_FILE \"${TARGET_FILE}\")" COMPONENT "HyperHDR") - install(CODE "set(PREREQUISITE_LIBS \"${PREREQUISITE_LIBS}\")" COMPONENT "HyperHDR") - install(CODE "set(QT_PLUGINS_DIR \"${QT_PLUGINS_DIR}\")" COMPONENT "HyperHDR") - install(CODE "set(TEMP_RPATH_DIR \"${CMAKE_CURRENT_BINARY_DIR}/temp_rpath_fix\")" COMPONENT "HyperHDR") - - install(CODE [[ - - set(SYSTEM_LIBS_SKIP - "libc" - "libglib-2" - "libsystemd0" - "libdl" - "libexpat" - "libfontconfig" - "libgcc_s" - "libm" - "libpthread" - "librt" - "libstdc++" - "libudev" - "libz.so" - "libxrender1" - "libxi6" - "libxext6" - "libx11-xcb1" - "libsm" - "libice6" - "libdrm2" - "libxkbcommon0" - "libwacom2" - "libmtdev1" - "libinput10" - "libgudev-1.0-0" - "libffi6" - "libevdev2" - "libuuid1" - "libselinux1" - "libmount1" - "libblkid1" - "libwayland" - "libxcb-icccm4" - "libxcb-image0" - "libxcb-keysyms1" - "libxcb-randr0" - "libxcb-render-util0" - "libxcb-render0" - "libxcb-shape0" - "libxcb-shm0" - "libxcb-sync1" - "libxcb-util0" - "libxcb-xfixes0" - "libxcb-xkb1" - "libxkbcommon-x11-0" - "ld-" - "libasound" - "libblkid" - "libffi" - "libgio-2" - "libgmodule-2" - "libgobject-2" - "libidn2" - "libnghttp" - "libsystemd" - "libpsl" - "libunistring" - "libssh" - "libselinux" - "libevent-2" - "libldap" - "libutils" - ) - - #message(STATUS "Collecting Dependencies for target file: ${TARGET_FILE}") - include(GetPrerequisites) - # Extract dependencies ignoring the system ones - if (NOT CMAKE_CROSSCOMPILING) - # get HyperHDR deps - file(GET_RUNTIME_DEPENDENCIES - RESOLVED_DEPENDENCIES_VAR DEPENDENCIES - EXECUTABLES ${TARGET_FILE} - ) - - # get Systray deps (always present even if it's a dummy implementation) - file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/share/hyperhdr/lib" TYPE SHARED_LIBRARY) - file(GET_RUNTIME_DEPENDENCIES - RESOLVED_DEPENDENCIES_VAR SYS_DEPENDENCIES - EXECUTABLES $) - foreach(systrayLib ${SYS_DEPENDENCIES}) - string(FIND ${systrayLib} "libayatana" _sysindex) - if (${_sysindex} GREATER -1) - list(APPEND DEPENDENCIES ${systrayLib}) - endif() - string(FIND ${systrayLib} "libdbusmenu" _sysDBusindex) - if (${_sysDBusindex} GREATER -1) - list(APPEND DEPENDENCIES ${systrayLib}) - endif() - endforeach() - endif() - - # Copy Qt plugins to 'share/hyperhdr/lib/plugins' - foreach(PLUGIN "tls") - #message(WARNING "Collecting Dependencies for QT plugin folder: ${PLUGIN}") - if(EXISTS ${QT_PLUGINS_DIR}/${PLUGIN}) - file(GLOB files "${QT_PLUGINS_DIR}/${PLUGIN}/*openssl*") - foreach(file ${files}) - file(GET_RUNTIME_DEPENDENCIES - RESOLVED_DEPENDENCIES_VAR QT_DEPENDENCIES - EXECUTABLES ${file} - ) - #message(WARNING "${file} => ${DEPENDENCIES} <= ${QT_DEPENDENCIES}") - list(APPEND DEPENDENCIES ${QT_DEPENDENCIES}) - - file(INSTALL - DESTINATION "${CMAKE_INSTALL_PREFIX}/share/hyperhdr/lib/plugins/${PLUGIN}" - TYPE SHARED_LIBRARY - FILES ${file} - ) - - endforeach() - endif() - endforeach() - - # Append symlink and non-symlink dependencies to the list - foreach(DEPENDENCY ${DEPENDENCIES}) - get_filename_component(resolved ${DEPENDENCY} NAME_WE) - - foreach(myitem ${SYSTEM_LIBS_SKIP}) - string(FIND ${resolved} ${myitem} _index) - if (${_index} EQUAL 0) - break() - endif() - endforeach() - - if (${_index} EQUAL 0) - continue() # Skip system libraries - else() - gp_resolve_item("${TARGET_FILE}" "${DEPENDENCY}" "" "" resolved_file) - get_filename_component(resolved_file ${resolved_file} ABSOLUTE) - gp_append_unique(PREREQUISITE_LIBS ${resolved_file}) - get_filename_component(file_canonical ${resolved_file} REALPATH) - gp_append_unique(PREREQUISITE_LIBS ${file_canonical}) - #message("Basic check added: ${resolved_file} (${resolved})") - endif() - endforeach() - - # Copy dependencies to 'share/hyperhdr/lib/external' - file(MAKE_DIRECTORY ${TEMP_RPATH_DIR}) - foreach(PREREQUISITE_LIB ${PREREQUISITE_LIBS}) - set(FILE_TO_INSTALL ${PREREQUISITE_LIB}) - string(FIND ${PREREQUISITE_LIB} "libproxy" libproxyindex) - string(FIND ${PREREQUISITE_LIB} "libpxbackend" libpxbackendindex) - if((NOT IS_SYMLINK ${PREREQUISITE_LIB}) AND (${libproxyindex} GREATER -1 OR ${libpxbackendindex} GREATER -1)) - get_filename_component(pathingFilename ${PREREQUISITE_LIB} NAME) - set(FILE_TO_INSTALL "${TEMP_RPATH_DIR}/${pathingFilename}") - message("Patching RPATH: ${FILE_TO_INSTALL}") - file(COPY_FILE ${PREREQUISITE_LIB} ${FILE_TO_INSTALL} ) - execute_process ( - COMMAND bash -c "chrpath -d ${FILE_TO_INSTALL}" - OUTPUT_VARIABLE outputResult - ) - endif() - message("Installing: " ${FILE_TO_INSTALL}) - file( - INSTALL - FILES ${FILE_TO_INSTALL} - DESTINATION "${CMAKE_INSTALL_PREFIX}/share/hyperhdr/lib/external" - TYPE SHARED_LIBRARY - ) - endforeach() - ]] COMPONENT "HyperHDR") - else() - # Run CMake after target was built to run get_prerequisites on ${TARGET_FILE} - 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(DeployWindows TARGET) - if(EXISTS ${TARGET_FILE}) - - install ( TARGETS hyperhdr DESTINATION "bin" COMPONENT "HyperHDR" ) - include( InstallRequiredSystemLibraries ) - - message("Collecting Dependencies for target file: ${TARGET_FILE}") - - # Collect the runtime libraries - get_filename_component(COMPILER_PATH "${CMAKE_CXX_COMPILER}" DIRECTORY) - if (Qt_VERSION EQUAL 5) - set(WINDEPLOYQT_PARAMS --no-angle --no-opengl-sw) - else() - set(WINDEPLOYQT_PARAMS --no-opengl-sw) - endif() - - execute_process( - COMMAND "${CMAKE_COMMAND}" -E - env "PATH=${COMPILER_PATH};${QT_BIN_DIR}" "${WINDEPLOYQT_EXECUTABLE}" - --dry-run - ${WINDEPLOYQT_PARAMS} - --list mapping - "${TARGET_FILE}" - OUTPUT_VARIABLE DEPS - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - - # Parse DEPS into a semicolon-separated list. - separate_arguments(DEPENDENCIES WINDOWS_COMMAND ${DEPS}) - string(REPLACE "\\" "/" DEPENDENCIES "${DEPENDENCIES}") - - # Copy dependencies to 'hyperhdr/lib' or 'hyperhdr' - while (DEPENDENCIES) - list(GET DEPENDENCIES 0 src) - list(GET DEPENDENCIES 1 dst) - get_filename_component(dst ${dst} DIRECTORY) - - if (NOT "${dst}" STREQUAL "") - install( - FILES ${src} - DESTINATION "lib/${dst}" - COMPONENT "HyperHDR" - ) - else() - install( - FILES ${src} - DESTINATION "bin" - COMPONENT "HyperHDR" - ) - endif() - - list(REMOVE_AT DEPENDENCIES 0 1) - endwhile() - - # Copy TurboJPEG Libs - install(FILES ${TurboJPEG_INSTALL_LIB} DESTINATION "bin" COMPONENT "HyperHDR" ) - - # Web resources - if (NOT USE_EMBEDDED_WEB_RESOURCES) - if (NOT TARGET webserver-resources) - message(FATAL_ERROR "Could not find compiled resources for the web server. Consider using USE_EMBEDDED_WEB_RESOURCES option" ) - endif() - get_target_property(webserver-resources-path webserver-resources OUTPUT_FILE) - install(FILES ${webserver-resources-path} DESTINATION "lib" COMPONENT "HyperHDR" ) - endif() - - # Copy QMQTT - if (USE_SHARED_LIBS AND TARGET qmqtt) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - # Copy SQLITE3 - if (USE_SHARED_LIBS AND TARGET sqlite3) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - # Copy utils-zstd - if (USE_SHARED_LIBS AND TARGET utils-zstd) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - # Copy utils-image - if (USE_SHARED_LIBS AND TARGET utils-image) - install(CODE [[ file(INSTALL FILES $ DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE SHARED_LIBRARY) ]] COMPONENT "HyperHDR") - endif() - - # Create a qt.conf file in 'bin' to override hard-coded search paths in Qt plugins - file(WRITE "${CMAKE_BINARY_DIR}/qt.conf" "[Paths]\nPlugins=../lib/\n") - install( - FILES "${CMAKE_BINARY_DIR}/qt.conf" - DESTINATION "bin" - COMPONENT "HyperHDR" - ) - - INSTALL(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION bin COMPONENT "HyperHDR") - - install(FILES "${PROJECT_SOURCE_DIR}/LICENSE" DESTINATION bin COMPONENT "HyperHDR") - install(FILES "${PROJECT_SOURCE_DIR}/3RD_PARTY_LICENSES" DESTINATION bin COMPONENT "HyperHDR") - - find_package(OpenSSL) - - get_filename_component(OPENSSL_BASE_DIR "${OPENSSL_INCLUDE_DIR}" DIRECTORY) - message("OpenSSL default path: ${OPENSSL_BASE_DIR}") - - find_file(OPENSSL_SSL - NAMES libssl-3-x64.dll libssl-1_1-x64.dll libssl-1_1.dll - HINTS "${OPENSSL_BASE_DIR}" - PATHS "C:/Program Files/OpenSSL" "C:/Program Files/OpenSSL-Win64" - PATH_SUFFIXES bin - ) - - find_file(OPENSSL_CRYPTO - NAMES libcrypto-3-x64.dll libcrypto-1_1-x64.dll libcrypto-1_1.dll - HINTS "${OPENSSL_BASE_DIR}" - PATHS "C:/Program Files/OpenSSL" "C:/Program Files/OpenSSL-Win64" - PATH_SUFFIXES bin - ) - - if(OPENSSL_SSL AND OPENSSL_CRYPTO) - message( STATUS "OpenSSL found: ${OPENSSL_SSL} ${OPENSSL_CRYPTO}") - install( - FILES ${OPENSSL_SSL} ${OPENSSL_CRYPTO} - DESTINATION "bin" - COMPONENT "HyperHDR" - ) - else() - message( WARNING "OpenSSL NOT found. HyperHDR's https instance and Philips Hue devices will not work.") - endif() - - else() - if (Qt_VERSION EQUAL 5) - get_target_property(QT_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) - get_filename_component(QT_BIN_DIR "${QT_QMAKE_EXECUTABLE}" DIRECTORY) - find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${QT_BIN_DIR}") - else() - get_filename_component(My_Qt6Core_EXECUTABLE_DIR ${QT6_INSTALL_PREFIX}/${QT6_INSTALL_BINS} ABSOLUTE) - find_program(WINDEPLOYQT_EXECUTABLE windeployqt PATHS "${My_Qt6Core_EXECUTABLE_DIR}" NO_DEFAULT_PATH) - if (NOT WINDEPLOYQT_EXECUTABLE) - find_program(WINDEPLOYQT_EXECUTABLE windeployqt) - endif() - endif() - - if (WINDEPLOYQT_EXECUTABLE AND (NOT CMAKE_GITHUB_ACTION)) - set(WINDEPLOYQT_PARAMS_RUNTIME --verbose 0 --no-compiler-runtime --no-opengl-sw --no-system-d3d-compiler) - message(STATUS "Found windeployqt: ${WINDEPLOYQT_EXECUTABLE} PATH_HINT:${My_Qt6Core_EXECUTABLE_DIR}${QT_BIN_DIR}") - add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${WINDEPLOYQT_EXECUTABLE} ${WINDEPLOYQT_PARAMS_RUNTIME} "$") - add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TurboJPEG_INSTALL_LIB} $) - endif() - - add_custom_command( - TARGET ${TARGET} POST_BUILD - COMMAND "${CMAKE_COMMAND}" "-DTARGET_FILE=$" - ARGS ${CMAKE_SOURCE_DIR} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - VERBATIM - ) - endif() -endmacro() diff --git a/cmake/linux/arch/INSTALL b/cmake/linux/arch/INSTALL index f0042b374..6a301a5fa 100644 --- a/cmake/linux/arch/INSTALL +++ b/cmake/linux/arch/INSTALL @@ -1,264 +1,89 @@ pre_install() { - echo "Preparing to install HyperHDR..." - - # search for users in system, returns first entry - FOUND_USR=`who | grep -o -m1 '^\w*\b'` || "root" - - # stop running daemon before we install - if pgrep hyperhdr > /dev/null 2>&1 - then - if grep -m1 systemd /proc/1/comm > /dev/null - then - echo "Stopping HyperHDR daemon: systemd" - # systemd - systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null - - elif [ -e /usr/bin/initctl ] - then - echo "Stopping HyperHDR daemon: upstart" - # upstart - initctl stop hyperhdr - - else - echo "Stopping HyperHDR daemon: sysV" - # sysV - service hyperhdr stop 2>/dev/null - fi - fi - - # In case we don't use a service kill all instances - killall hyperhdr 2> /dev/null - - # overwrite last return code - exit 0 + echo "Preparing to install HyperHDR..." + FOUND_USR=$(who | grep -o -m1 '^\w*\b' || echo "root") + if pgrep hyperhdr > /dev/null 2>&1; then + if grep -m1 systemd /proc/1/comm > /dev/null; then + systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null + fi + fi + killall hyperhdr 2> /dev/null } -post_install() { - xdg-icon-resource forceupdate --theme hicolor &> /dev/null - - install_file() - { - src="$1" - dest="$2" - - if [ ! -e "$dest" ] - then - cp "$src" "${dest}" - return 1 - else - echo "Service file already exists, skip creation" - return 0 - fi - } - - - - #check system - CPU_RPI=`grep -m1 -c 'BCM2708\|BCM2709\|BCM2710\|BCM2835\|BCM2836\|BCM2837\|BCM2711' /proc/cpuinfo` - CPU_X32X64=`uname -m | grep 'x86_32\|i686\|x86_64' | wc -l` - - #Check for a bootloader as Berryboot - BOOT_BERRYBOOT=$(grep -m1 -c '\(/var/media\|/media/pi\)/berryboot' /etc/mtab) - - #get current system ip - if command -v hostname &> /dev/null - then - NET_IP=`hostname -s | cut -d " " -f1` - else - NET_IP=`/sbin/ip route get 1 | awk '{print $(NF-2);exit}'` - fi - - # search for users in system, returns first entry - FOUND_USR=`who | grep -o -m1 '^\w*\b'` || "root" - - # determine if we should use a service - ENABLE_XSYS=0 - ENABLE_SERVICE=0 - STARTUP_MSG="Service is NOT enabled by default for GUI or non-systemd OS" - - if [ $CPU_RPI -eq 1 ] || [ -z "${DISPLAY}" ]; then - ENABLE_SERVICE=1 - STARTUP_MSG="HyperHDR is installed as a service and starts automatically" - fi - - start_msg="" - restart_msg="" - - if grep -m1 systemd /proc/1/comm > /dev/null - then - # systemd - if [ -z "${DISPLAY}" ]; then - echo "HyperHDR is installed as a service and starts automatically" - ENABLE_SERVICE=1 - else - echo "Init daemon: GUI detected (service is NOT enabled by default, you can run HyperHDR as an application or service with 'systemctl enable (and next: start) hyperhdr@${FOUND_USR}.service')" - ENABLE_SERVICE=0 - ENABLE_XSYS=1 - fi - - install_file /usr/share/hyperhdr/service/hyperhdr.systemd /usr/lib/systemd/system/hyperhdr@.service - - if [ $ENABLE_SERVICE -eq 1 ]; then - systemctl enable hyperhdr"@${FOUND_USR}".service - start_msg="systemctl start hyperhdr for user ${FOUND_USR}" - systemctl start hyperhdr"@${FOUND_USR}" - fi - - elif [ -e /usr/bin/initctl ] - then - # upstart - if [ $ENABLE_SERVICE -eq 1 ]; then - echo "Init daemon: upstart (service is enabled by default)" - install_file /usr/share/hyperhdr/service/hyperhdr.initctl /etc/init/hyperhdr.conf && initctl reload-configuration - start_msg="initctl start hyperhdr" - initctl start hyperhdr - else - echo "Init daemon: upstart (service is NOT enabled by default)" - fi - - else - # sysV - if [ $ENABLE_SERVICE -eq 1 ]; then - echo "Init daemon: sysV (enabled by default)" - install_file /usr/share/hyperhdr/service/hyperhdr.init /etc/init.d/hyperhdr && chmod +x /etc/init.d/hyperhdr && update-rc.d hyperhdr defaults 98 02 - start_msg="service hyperhdr start" - service hyperhdr start - else - echo "Init daemon: sysV (service is NOT enabled by default)" - fi - fi - - #cleanup - rm -r /usr/share/hyperhdr/service - - #link binarys and set exec bit - BINSP=/usr/share/hyperhdr/bin - BINTP=/usr/bin - chmod +x -R $BINSP - ln -fs $BINSP/hyperhdr $BINTP/hyperhdr - - # install desktop icons - echo "Install HyperHDR desktop icons" - mkdir /usr/share/pixmaps/hyperhdr 2>/dev/null - cp /usr/share/hyperhdr/desktop/*.png /usr/share/pixmaps/hyperhdr 2>/dev/null - desktop-file-install /usr/share/hyperhdr/desktop/hyperhdr.desktop 2>/dev/null - - # cleanup desktop icons - rm -r /usr/share/hyperhdr/desktop 2>/dev/null - - #Check, if dtparam=spi=on is in place - if [ $CPU_RPI -eq 1 ]; then - BOOT_DIR="/boot" - if [ $BOOT_BERRYBOOT -eq 1 ]; then - BOOT_DIR=$(sed -ne "s#/dev/mmcblk0p1 \([^ ]*\) vfat rw,.*#\1#p" /etc/mtab) - fi - if [ -z "$BOOT_DIR" -o ! -f "$BOOT_DIR/config.txt" ]; then - echo 'Warning: RPi using BERRYBOOT found but can not locate where config.txt is to enable SPI. (BOOT_DIR='"$BOOT_DIR)" - SPIOK=1 # Not sure if OK, but don't ask to reboot - else - SPIOK=`grep '^\dtparam=spi=on' "$BOOT_DIR/config.txt" | wc -l` - if [ $SPIOK -ne 1 ]; then - echo 'Raspberry Pi found, but SPI is not set, we write "dtparam=spi=on" to '"$BOOT_DIR/config.txt" - sed -i '$a dtparam=spi=on' "$BOOT_DIR/config.txt" - REBOOTMESSAGE="Restart Raspberry Pi, SPI has been enabled in $BOOT_DIR/config.txt" - fi - fi - fi - - echo ${start_msg} - - printf "\n +-----------------------------------------------------------------------+" - printf "\n | \033[32;1mHyperHDR has been installed/updated!\033[0m |" - printf "\n +-----------------------------------------------------------------------+" - printf "\n | For configuration, visit with your browser: \033[37;1m%13s:%s\033[0m |" "$NET_IP" "8090" - printf "\n | If already used by another service try: \033[37;1m%13s:%s\033[0m |" "$NET_IP" "8091" - printf "\n | Start the service: \033[37;1msudo systemctl start hyperhdr@%-12s\033[0m |" "$FOUND_USR" - printf "\n | Stop the service: \033[37;1msudo systemctl stop hyperhdr@%-12s\033[0m |" "$FOUND_USR" - printf "\n | Troubleshooting? Run HyperHDR manually: \033[37;1m/usr/bin/hyperhdr\033[0m |" - printf "\n +-----------------------------------------------------------------------+" - case "$STARTUP_MSG" in - *"HyperHDR is installed as a service"*) - printf "\n | \033[32;1m%-67s\033[0m |" "$STARTUP_MSG";; - *) printf "\n | \033[31;1m%-67s\033[0m |" "$STARTUP_MSG" - esac - [ -z "$REBOOTMESSAGE" ] || printf "\n | \033[31;1m%-67s\033[0m |" "$REBOOTMESSAGE" - printf "\n +-----------------------------------------------------------------------+" - printf "\n | Webpage: \033[36;1mhttps://hyperhdr.eu\033[0m |" - printf "\n | GitHub: \033[36;1mhttps://github.com/awawa-dev/HyperHDR\033[0m |" - printf "\n +-----------------------------------------------------------------------+\n" - - if command -v update-desktop-database &> /dev/null - then - update-desktop-database -q - fi - +pre_upgrade() { + pre_install } -pre_upgrade() { - pre_install +post_install() { + echo "Finalizing HyperHDR setup" + + NET_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7}' | head -n 1) + [ -z "$NET_IP" ] && NET_IP=$(hostname -I 2>/dev/null | cut -d " " -f1) + [ -z "$NET_IP" ] && NET_IP="127.0.0.1" + + FOUND_USR=$(who | grep -o -m1 '^\w*\b' || echo "root") + + ENABLE_SERVICE=0 + STARTUP_MSG="Service is NOT enabled by default for GUI OS" + REBOOTMESSAGE="" + start_msg="" + + if grep -m1 systemd /proc/1/comm > /dev/null; then + if [ -z "${DISPLAY}" ]; then + echo "Init daemon: systemd (service is enabled by default for console systems)" + ENABLE_SERVICE=1 + STARTUP_MSG="HyperHDR is installed as a service and starts automatically" + else + echo "Init daemon: GUI detected (service is NOT enabled by default)" + ENABLE_SERVICE=0 + fi + + systemctl daemon-reload + + if [ $ENABLE_SERVICE -eq 1 ]; then + systemctl enable --now "hyperhdr@${FOUND_USR}.service" 2>/dev/null || true + start_msg="systemctl start hyperhdr for user ${FOUND_USR}" + fi + else + echo "Warning: No systemd detected. Service management will be manual." + fi + + echo "${start_msg}" + + printf "\n +-----------------------------------------------------------------------+" + printf "\n | \033[32;1mHyperHDR has been installed/updated!\033[0m |" + printf "\n +-----------------------------------------------------------------------+" + printf "\n | For configuration, visit with your browser: \033[37;1m%13s:%s\033[0m |" "$NET_IP" "8090" + printf "\n | If already used by another service try: \033[37;1m%13s:%s\033[0m |" "$NET_IP" "8091" + printf "\n | Start the service: \033[37;1msudo systemctl start hyperhdr@%-12s\033[0m |" "$FOUND_USR" + printf "\n | Stop the service: \033[37;1msudo systemctl stop hyperhdr@%-12s\033[0m |" "$FOUND_USR" + printf "\n | Troubleshooting? Run HyperHDR manually: \033[37;1m/usr/bin/hyperhdr\033[0m |" + printf "\n +-----------------------------------------------------------------------+" + case "$STARTUP_MSG" in + *"HyperHDR is installed as a service"*) + printf "\n | \033[32;1m%-67s\033[0m |" "$STARTUP_MSG";; + *) printf "\n | \033[31;1m%-67s\033[0m |" "$STARTUP_MSG" + esac + [ -z "$REBOOTMESSAGE" ] || printf "\n | \033[31;1m%-67s\033[0m |" "$REBOOTMESSAGE" + printf "\n +-----------------------------------------------------------------------+" + printf "\n | Webpage: \033[36;1mhttps://hyperhdr.eu\033[0m |" + printf "\n | GitHub: \033[36;1mhttps://github.com/awawa-dev/HyperHDR\033[0m |" + printf "\n +-----------------------------------------------------------------------+\n" } post_upgrade() { - post_install + post_install } pre_remove() { - echo "Preparing to uninstall HyperHDR" - - # search for users in system, returns first entry - FOUND_USR=`who | grep -o -m1 '^\w*\b'` || "root" - - # stop running daemon before we delete it - HYPERHDR_RUNNING=false - pgrep hyperhdr > /dev/null 2>&1 && HYPERHDR_RUNNING=true - - if grep -m1 systemd /proc/1/comm > /dev/null - then - echo "Stopping HyperHDR daemon: systemd" - # systemd - $HYPERHDR_RUNNING && systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null - # disable user specific symlink - echo "Disabling service and removing entry" - systemctl -q disable hyperhdr"@${FOUND_USR}" - - rm -v /usr/lib/systemd/system/hyperhdr@.service 2>/dev/null - - elif [ -e /usr/bin/initctl ] - then - echo "Stopping HyperHDR daemon: upstart" - # upstart - $HYPERHDR_RUNNING && initctl stop hyperhdr - echo "Remove upstart service" - rm -v /etc/init/hyperhdr* 2>/dev/null - initctl reload-configuration - - else - echo "Stopping HyperHDR daemon: sysV" - # sysV - $HYPERHDR_RUNNING && service hyperhdr stop 2>/dev/null - echo "Remove sysV service" - update-rc.d -f hyperhdr remove - rm /etc/init.d/hyperhdr* 2>/dev/null - fi - - # In case we don't use a service kill all instances - killall hyperhdr 2> /dev/null - - # delete desktop icons; desktop-file-edit is a workaround to hide the entry and delete it afterwards manual. - # TODO Better way for deletion and keep the desktop in sync without logout/login or desktop dependend cmds? - echo "Deleting HyperHDR desktop icons" - desktop-file-edit --set-key=NoDisplay --set-value=true /usr/share/applications/hyperhdr.desktop 2>/dev/null - rm -v /usr/share/applications/hyperhdr* 2>/dev/null - rm -rv /usr/share/pixmaps/hyperhdr 2>/dev/null - - exit 0 -} - -post_remove() { - xdg-icon-resource forceupdate --theme hicolor &> /dev/null - - if command -v update-desktop-database &> /dev/null - then - update-desktop-database -q - fi + echo "Preparing to uninstall HyperHDR" + FOUND_USR=$(who | grep -o -m1 '^\w*\b' || echo "root") + HYPERHDR_RUNNING=false + pgrep hyperhdr > /dev/null 2>&1 && HYPERHDR_RUNNING=true + + if grep -m1 systemd /proc/1/comm > /dev/null; then + $HYPERHDR_RUNNING && systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null + systemctl -q disable hyperhdr"@${FOUND_USR}" 2>/dev/null + systemctl daemon-reload + fi + killall hyperhdr 2> /dev/null } diff --git a/cmake/linux/arch/PKGBUILD b/cmake/linux/arch/PKGBUILD index 770b07381..4d505688f 100644 --- a/cmake/linux/arch/PKGBUILD +++ b/cmake/linux/arch/PKGBUILD @@ -6,12 +6,16 @@ url="https://github.com/awawa-dev/HyperHDR" license=('MIT') arch=('x86_64') install=INSTALL -depends=('xz' 'glibc>={GLIBC_VERSION}') +depends=('xz' 'glibc>={GLIBC_VERSION}') # optdepends=('gtk3') # not needed fot Github Action # source=("git+https://github.com/awawa-dev/HyperHDR.git") # md5sums=('SKIP') +prepare() { + sed -i 's|BUILD_WITH_INSTALL_RPATH FALSE|BUILD_WITH_INSTALL_RPATH TRUE|' ../sources/hyperhdr/CMakeLists.txt +} + build() { export LDFLAGS=${LDFLAGS/-Wl,-z,pack-relative-relocs/} cmake -B build -S .. \ @@ -19,6 +23,8 @@ build() { -DCMAKE_INSTALL_PREFIX='/usr' \ -Wno-dev {BUILD_OPTION} cmake --build build + mkdir -p build/lib/hyperhdr + cp -P build/lib/*.so* build/lib/hyperhdr/ 2>/dev/null || true } package() { @@ -26,5 +32,5 @@ package() { rm -rf $pkgdir/usr/bin/flatc rm -rf $pkgdir/usr/cmake rm -rf $pkgdir/usr/include - rm -rf $pkgdir/usr/lib + find "$pkgdir/usr/lib" -maxdepth 1 -mindepth 1 ! -name "hyperhdr" ! -name "systemd" -exec rm -rf {} + } diff --git a/cmake/linux/debian/postinst b/cmake/linux/debian/postinst index ecaec4269..176150bf6 100644 --- a/cmake/linux/debian/postinst +++ b/cmake/linux/debian/postinst @@ -1,133 +1,70 @@ #!/bin/sh -install_file() -{ - src="$1" - dest="$2" - - if [ ! -e "$dest" ] - then - cp "$src" "${dest}" - return 1 - else - echo "Service file already exists, skip creation" - return 0 - fi -} - - echo "Finalizing HyperHDR setup" -#check system -CPU_RPI=`grep -m1 -c 'BCM2708\|BCM2709\|BCM2710\|BCM2835\|BCM2836\|BCM2837\|BCM2711' /proc/cpuinfo` -CPU_X32X64=`uname -m | grep 'x86_32\|i686\|x86_64' | wc -l` - -#Check for a bootloader as Berryboot -BOOT_BERRYBOOT=$(grep -m1 -c '\(/var/media\|/media/pi\)/berryboot' /etc/mtab) - -#get current system ip +# === Podstawowe informacje systemowe === +if [ -f /proc/device-tree/model ] && grep -q "Raspberry Pi" /proc/device-tree/model; then + CPU_RPI=1 +else + CPU_RPI=0 +fi NET_IP=`hostname -I | cut -d " " -f1` - -# search for users in system, returns first entry FOUND_USR=`who | grep -o -m1 '^\w*\b'` || "root" -# determine if we should use a service -ENABLE_XSYS=0 ENABLE_SERVICE=0 -STARTUP_MSG="Service is NOT enabled by default for GUI or non-systemd OS" +STARTUP_MSG="Service is NOT enabled by default for GUI OS" +REBOOTMESSAGE="" if [ $CPU_RPI -eq 1 ]; then - ENABLE_SERVICE=1 - STARTUP_MSG="HyperHDR is installed as a service and starts automatically" + ENABLE_SERVICE=1 + STARTUP_MSG="HyperHDR is installed as a service and starts automatically" fi start_msg="" -restart_msg="" -if grep -m1 systemd /proc/1/comm > /dev/null -then - # systemd - if [ -z "${DISPLAY}" ]; then - STARTUP_MSG="HyperHDR is installed as a service and starts automatically" - echo "Init daemon: systemd (service is enabled by default for console systems)" - ENABLE_SERVICE=1 - else - echo "Init daemon: GUI detected (service is NOT enabled by default, you can run HyperHDR as an application or service with 'systemctl enable (and next: start) hyperhdr@${FOUND_USR}.service')" - ENABLE_SERVICE=0 - ENABLE_XSYS=1 - fi - - install_file /usr/share/hyperhdr/service/hyperhdr.systemd /etc/systemd/system/hyperhdr@.service - - if [ $ENABLE_SERVICE -eq 1 ]; then - systemctl enable hyperhdr"@${FOUND_USR}".service - start_msg="systemctl start hyperhdr for user ${FOUND_USR}" - systemctl start hyperhdr"@${FOUND_USR}" - fi - -elif [ -e /sbin/initctl ] -then - # upstart - if [ $ENABLE_SERVICE -eq 1 ]; then - echo "Init daemon: upstart (service is enabled by default)" - install_file /usr/share/hyperhdr/service/hyperhdr.initctl /etc/init/hyperhdr.conf && initctl reload-configuration - start_msg="initctl start hyperhdr" - initctl start hyperhdr - else - echo "Init daemon: upstart (service is NOT enabled by default)" - fi - -else - # sysV - if [ $ENABLE_SERVICE -eq 1 ]; then - echo "Init daemon: sysV (enabled by default)" - install_file /usr/share/hyperhdr/service/hyperhdr.init /etc/init.d/hyperhdr && chmod +x /etc/init.d/hyperhdr && update-rc.d hyperhdr defaults 98 02 - start_msg="service hyperhdr start" - service hyperhdr start - else - echo "Init daemon: sysV (service is NOT enabled by default)" - fi +# === systemd (jedyny wspierany init) === +if grep -m1 systemd /proc/1/comm > /dev/null; then + if [ -z "${DISPLAY}" ]; then + echo "Init daemon: systemd (service is enabled by default for console systems)" + ENABLE_SERVICE=1 + STARTUP_MSG="HyperHDR is installed as a service and starts automatically" + else + echo "Init daemon: GUI detected (service is NOT enabled by default)" + ENABLE_SERVICE=0 + fi + + # instalujemy szablon usługi + systemctl daemon-reload + + if [ $ENABLE_SERVICE -eq 1 ]; then + systemctl enable --now "hyperhdr@${FOUND_USR}.service" 2>/dev/null || true + start_msg="systemctl start hyperhdr for user ${FOUND_USR}" + fi +else + echo "Warning: No systemd detected. Service management will be manual." fi -#cleanup -rm -r /usr/share/hyperhdr/service - -#link binarys and set exec bit -BINSP=/usr/share/hyperhdr/bin -BINTP=/usr/bin -chmod +x -R $BINSP -ln -fs $BINSP/hyperhdr $BINTP/hyperhdr - -# install desktop icons -echo "Install HyperHDR desktop icons" -mkdir /usr/share/pixmaps/hyperhdr 2>/dev/null -cp /usr/share/hyperhdr/desktop/*.png /usr/share/pixmaps/hyperhdr 2>/dev/null -desktop-file-install /usr/share/hyperhdr/desktop/hyperhdr.desktop 2>/dev/null - -# cleanup desktop icons -rm -r /usr/share/hyperhdr/desktop 2>/dev/null - -#Check, if dtparam=spi=on is in place +# === SPI dla Raspberry Pi === if [ $CPU_RPI -eq 1 ]; then - BOOT_DIR="/boot" - if [ $BOOT_BERRYBOOT -eq 1 ]; then - BOOT_DIR=$(sed -ne "s#/dev/mmcblk0p1 \([^ ]*\) vfat rw,.*#\1#p" /etc/mtab) - fi - if [ -z "$BOOT_DIR" -o ! -f "$BOOT_DIR/config.txt" ]; then - echo 'Warning: RPi using BERRYBOOT found but can not locate where config.txt is to enable SPI. (BOOT_DIR='"$BOOT_DIR)" - SPIOK=1 # Not sure if OK, but don't ask to reboot - else - SPIOK=`grep '^\dtparam=spi=on' "$BOOT_DIR/config.txt" | wc -l` - if [ $SPIOK -ne 1 ]; then - echo 'Raspberry Pi found, but SPI is not set, we write "dtparam=spi=on" to '"$BOOT_DIR/config.txt" - sed -i '$a dtparam=spi=on' "$BOOT_DIR/config.txt" - REBOOTMESSAGE="Restart Raspberry Pi, SPI has been enabled in $BOOT_DIR/config.txt" - fi - fi + if [ -f "/boot/firmware/config.txt" ]; then + BOOT_DIR="/boot/firmware" + else + BOOT_DIR="/boot" + fi + + if [ -f "$BOOT_DIR/config.txt" ]; then + SPIOK=`grep '^\dtparam=spi=on' "$BOOT_DIR/config.txt" | wc -l` + if [ $SPIOK -ne 1 ]; then + echo "Raspberry Pi found – enabling SPI in $BOOT_DIR/config.txt" + sed -i '$a dtparam=spi=on' "$BOOT_DIR/config.txt" + REBOOTMESSAGE="Restart Raspberry Pi – SPI has been enabled in $BOOT_DIR/config.txt" + fi + fi fi -echo ${start_msg} +echo "${start_msg}" +# === Komunikaty końcowe === printf "\n +-----------------------------------------------------------------------+" printf "\n | \033[32;1mHyperHDR has been installed/updated!\033[0m |" printf "\n +-----------------------------------------------------------------------+" diff --git a/cmake/linux/debian/preinst b/cmake/linux/debian/preinst index 32e9140f5..ab40fb1e8 100644 --- a/cmake/linux/debian/preinst +++ b/cmake/linux/debian/preinst @@ -1,34 +1,10 @@ #!/bin/sh - echo "Preparing to install HyperHDR..." - -# search for users in system, returns first entry FOUND_USR=`who | grep -o -m1 '^\w*\b'` || "root" - -# stop running daemon before we install -if pgrep hyperhdr > /dev/null 2>&1 -then - if grep -m1 systemd /proc/1/comm > /dev/null - then - echo "Stopping HyperHDR daemon: systemd" - # systemd - systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null - - elif [ -e /sbin/initctl ] - then - echo "Stopping HyperHDR daemon: upstart" - # upstart - initctl stop hyperhdr - - else - echo "Stopping HyperHDR daemon: sysV" - # sysV - service hyperhdr stop 2>/dev/null - fi +if pgrep hyperhdr > /dev/null 2>&1; then + if grep -m1 systemd /proc/1/comm > /dev/null; then + systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null + fi fi - -# In case we don't use a service kill all instances killall hyperhdr 2> /dev/null - -# overwrite last return code exit 0 diff --git a/cmake/linux/debian/prerm b/cmake/linux/debian/prerm index 38ae4f282..dd5c116cf 100644 --- a/cmake/linux/debian/prerm +++ b/cmake/linux/debian/prerm @@ -1,51 +1,13 @@ #!/bin/sh - echo "Preparing to uninstall HyperHDR" - -# search for users in system, returns first entry FOUND_USR=`who | grep -o -m1 '^\w*\b'` || "root" - -# stop running daemon before we delete it HYPERHDR_RUNNING=false pgrep hyperhdr > /dev/null 2>&1 && HYPERHDR_RUNNING=true -if grep -m1 systemd /proc/1/comm > /dev/null -then - echo "Stopping HyperHDR daemon: systemd" - # systemd - $HYPERHDR_RUNNING && systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null - # disable user specific symlink - echo "Disabling service and removing entry" - systemctl -q disable hyperhdr"@${FOUND_USR}" - - rm -v /etc/systemd/system/hyperhdr@.service 2>/dev/null - -elif [ -e /sbin/initctl ] -then - echo "Stopping HyperHDR daemon: upstart" - # upstart - $HYPERHDR_RUNNING && initctl stop hyperhdr - echo "Removing upstart service" - rm -v /etc/init/hyperhdr* 2>/dev/null - initctl reload-configuration - -else - echo "Stopping HyperHDR daemon: sysV" - # sysV - $HYPERHDR_RUNNING && service hyperhdr stop 2>/dev/null - echo "Removing sysV service" - update-rc.d -f hyperhdr remove - rm /etc/init.d/hyperhdr* 2>/dev/null +if grep -m1 systemd /proc/1/comm > /dev/null; then + $HYPERHDR_RUNNING && systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null + systemctl -q disable hyperhdr"@${FOUND_USR}" 2>/dev/null + systemctl daemon-reload 2>/dev/null || true fi - -# In case we don't use a service kill all instances killall hyperhdr 2> /dev/null - -# delete desktop icons; desktop-file-edit is a workaround to hide the entry and delete it afterwards manual. -# TODO Better way for deletion and keep the desktop in sync without logout/login or desktop dependend cmds? -echo "Deleting HyperHDR desktop icons" -desktop-file-edit --set-key=NoDisplay --set-value=true /usr/share/applications/hyperhdr.desktop 2>/dev/null -rm -v /usr/share/applications/hyperhdr* 2>/dev/null -rm -rv /usr/share/pixmaps/hyperhdr 2>/dev/null - exit 0 diff --git a/cmake/linux/resources/hyperhdr.desktop b/cmake/linux/resources/hyperhdr.desktop index e35d11edf..2ce68a49d 100644 --- a/cmake/linux/resources/hyperhdr.desktop +++ b/cmake/linux/resources/hyperhdr.desktop @@ -2,7 +2,7 @@ Name=HyperHDR GenericName=HyperHDR Ambient Lighting Comment=Real-time ambient lighting system for TVs, monitors and LEDs -Icon=/usr/share/pixmaps/hyperhdr/hyperhdr_128.png +Icon=hyperhdr Terminal=false TryExec=hyperhdr Exec=hyperhdr diff --git a/cmake/linux/rpm/%post b/cmake/linux/rpm/%post new file mode 100644 index 000000000..86244b7b7 --- /dev/null +++ b/cmake/linux/rpm/%post @@ -0,0 +1,64 @@ +#!/bin/sh + +echo "Finalizing HyperHDR setup" + +# === Podstawowe informacje systemowe === +# Alternatywa dla hostname -I (Fedora często nie ma tego preinstalowanego w tej formie) +NET_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7}' | head -n 1) +[ -z "$NET_IP" ] && NET_IP=$(hostname -I 2>/dev/null | cut -d " " -f1) +[ -z "$NET_IP" ] && NET_IP="127.0.0.1" + +FOUND_USR="${SUDO_USER:-$(who | grep -o -m1 '^[a-zA-Z0-9]*' | head -1)}" +[ -z "$FOUND_USR" ] && FOUND_USR="root" + +ENABLE_SERVICE=0 +STARTUP_MSG="Service is NOT enabled by default for GUI OS" +REBOOTMESSAGE="" +start_msg="" + +# === systemd (jedyny wspierany init) === +if grep -m1 systemd /proc/1/comm > /dev/null; then + if [ -z "${DISPLAY}" ]; then + echo "Init daemon: systemd (service is enabled by default for console systems)" + ENABLE_SERVICE=1 + STARTUP_MSG="HyperHDR is installed as a service and starts automatically" + else + echo "Init daemon: GUI detected (service is NOT enabled by default)" + ENABLE_SERVICE=0 + fi + + # instalujemy szablon usługi + systemctl daemon-reload + + if [ $ENABLE_SERVICE -eq 1 ]; then + systemctl enable --now "hyperhdr@${FOUND_USR}.service" 2>/dev/null || true + start_msg="systemctl start hyperhdr for user ${FOUND_USR}" + fi +else + echo "Warning: No systemd detected. Service management will be manual." +fi + +echo "${start_msg}" + +# === Komunikaty końcowe === +printf "\n +-----------------------------------------------------------------------+" +printf "\n | HyperHDR has been installed/updated! |" +printf "\n +-----------------------------------------------------------------------+" +printf "\n | For configuration, visit with your browser: %%13s:%%s |" "$NET_IP" "8090" +printf "\n | If already used by another service try: %%13s:%%s |" "$NET_IP" "8091" +printf "\n | Start the service: sudo systemctl start hyperhdr@%%-12s |" "$FOUND_USR" +printf "\n | Stop the service: sudo systemctl stop hyperhdr@%%-12s |" "$FOUND_USR" +printf "\n | Troubleshooting? Run HyperHDR manually: /usr/bin/hyperhdr |" +printf "\n +-----------------------------------------------------------------------+" +case "$STARTUP_MSG" in + *"HyperHDR is installed as a service"*) + printf "\n | %%-67s |" "$STARTUP_MSG";; + *) printf "\n | %%-67s |" "$STARTUP_MSG" +esac +[ -z "$REBOOTMESSAGE" ] || printf "\n | %%-67s |" "$REBOOTMESSAGE" +printf "\n +-----------------------------------------------------------------------+" +printf "\n | Webpage: https://hyperhdr.eu |" +printf "\n | GitHub: https://github.com/awawa-dev/HyperHDR |" +printf "\n +-----------------------------------------------------------------------+\n" + +exit 0 diff --git a/cmake/linux/rpm/%pre b/cmake/linux/rpm/%pre new file mode 100644 index 000000000..1911e1873 --- /dev/null +++ b/cmake/linux/rpm/%pre @@ -0,0 +1,11 @@ +#!/bin/sh + +echo "Preparing to install HyperHDR..." +FOUND_USR=$(who | grep -o -m1 '^\w*\b' || echo "root") +if pgrep hyperhdr > /dev/null 2>&1; then + if grep -m1 systemd /proc/1/comm > /dev/null; then + systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null + fi +fi +killall hyperhdr 2> /dev/null +exit 0 diff --git a/cmake/linux/rpm/%preun b/cmake/linux/rpm/%preun new file mode 100644 index 000000000..868c2bf4d --- /dev/null +++ b/cmake/linux/rpm/%preun @@ -0,0 +1,16 @@ +#!/bin/sh + +if [ $1 -eq 0 ]; then + echo "Preparing to uninstall HyperHDR" + FOUND_USR=$(who | grep -o -m1 '^\w*\b' || echo "root") + HYPERHDR_RUNNING=false + pgrep hyperhdr > /dev/null 2>&1 && HYPERHDR_RUNNING=true + + if grep -m1 systemd /proc/1/comm > /dev/null; then + $HYPERHDR_RUNNING && systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null + systemctl -q disable hyperhdr"@${FOUND_USR}" 2>/dev/null + systemctl daemon-reload + fi + killall hyperhdr 2> /dev/null +fi +exit 0 diff --git a/cmake/linux/rpm/postinst b/cmake/linux/rpm/postinst deleted file mode 100644 index f091ba954..000000000 --- a/cmake/linux/rpm/postinst +++ /dev/null @@ -1,156 +0,0 @@ -#!/bin/sh - -install_file() -{ - src="$1" - dest="$2" - - if [ ! -e "$dest" ] - then - cp "$src" "${dest}" - return 1 - else - echo "Service file already exists, skip creation" - return 0 - fi -} - - -echo "Finalizing HyperHDR setup" - -#check system -CPU_RPI=`grep -m1 -c 'BCM2708\|BCM2709\|BCM2710\|BCM2835\|BCM2836\|BCM2837\|BCM2711' /proc/cpuinfo` -CPU_X32X64=`uname -m | grep 'x86_32\|i686\|x86_64' | wc -l` - -#Check for a bootloader as Berryboot -BOOT_BERRYBOOT=$(grep -m1 -c '\(/var/media\|/media/pi\)/berryboot' /etc/mtab) - -#get current system ip -NET_IP=`hostname -I | cut -d " " -f1` - -# search for users in system, returns first entry -FOUND_USR=`who | grep -o -m1 '^\w*\b'` || "root" - -# determine if we should use a service -ENABLE_XSYS=0 -ENABLE_SERVICE=0 -STARTUP_MSG="Service is NOT enabled by default for GUI or non-systemd OS" - -if [ $CPU_RPI -eq 1 ]; then - ENABLE_SERVICE=1 - STARTUP_MSG="HyperHDR is installed as a service and starts automatically" -fi - -start_msg="" -restart_msg="" - -if grep -m1 systemd /proc/1/comm > /dev/null -then - # systemd - if [ -z "${DISPLAY}" ]; then - echo "HyperHDR is installed as a service and starts automatically" - ENABLE_SERVICE=1 - else - echo "Init daemon: GUI detected (service is NOT enabled by default, you can run HyperHDR as an application or service with 'systemctl enable (and next: start) hyperhdr@${FOUND_USR}.service')" - ENABLE_SERVICE=0 - ENABLE_XSYS=1 - fi - - install_file /usr/share/hyperhdr/service/hyperhdr.systemd /etc/systemd/system/hyperhdr@.service - - if [ $ENABLE_SERVICE -eq 1 ]; then - systemctl enable hyperhdr"@${FOUND_USR}".service - start_msg="systemctl start hyperhdr for user ${FOUND_USR}" - systemctl start hyperhdr"@${FOUND_USR}" - fi - -elif [ -e /sbin/initctl ] -then - # upstart - if [ $ENABLE_SERVICE -eq 1 ]; then - echo "Init daemon: upstart (service is enabled by default)" - install_file /usr/share/hyperhdr/service/hyperhdr.initctl /etc/init/hyperhdr.conf && initctl reload-configuration - start_msg="initctl start hyperhdr" - initctl start hyperhdr - else - echo "Init daemon: upstart (service is NOT enabled by default)" - fi - -else - # sysV - if [ $ENABLE_SERVICE -eq 1 ]; then - echo "Init daemon: sysV (enabled by default)" - install_file /usr/share/hyperhdr/service/hyperhdr.init /etc/init.d/hyperhdr && chmod +x /etc/init.d/hyperhdr && update-rc.d hyperhdr defaults 98 02 - start_msg="service hyperhdr start" - service hyperhdr start - else - echo "Init daemon: sysV (service is NOT enabled by default)" - fi -fi - -#cleanup -rm -r /usr/share/hyperhdr/service - -#link binarys and set exec bit -BINSP=/usr/share/hyperhdr/bin -BINTP=/usr/bin -chmod +x -R $BINSP -ln -fs $BINSP/hyperhdr $BINTP/hyperhdr - -# install desktop icons -echo "Install HyperHDR desktop icons" -mkdir /usr/share/pixmaps/hyperhdr 2>/dev/null -cp /usr/share/hyperhdr/desktop/*.png /usr/share/pixmaps/hyperhdr 2>/dev/null -desktop-file-install /usr/share/hyperhdr/desktop/hyperhdr.desktop 2>/dev/null - -# cleanup desktop icons -rm -r /usr/share/hyperhdr/desktop 2>/dev/null - -#Check, if dtparam=spi=on is in place -if [ $CPU_RPI -eq 1 ]; then - BOOT_DIR="/boot" - if [ $BOOT_BERRYBOOT -eq 1 ]; then - BOOT_DIR=$(sed -ne "s#/dev/mmcblk0p1 \([^ ]*\) vfat rw,.*#\1#p" /etc/mtab) - fi - if [ -z "$BOOT_DIR" -o ! -f "$BOOT_DIR/config.txt" ]; then - echo 'Warning: RPi using BERRYBOOT found but can not locate where config.txt is to enable SPI. (BOOT_DIR='"$BOOT_DIR)" - SPIOK=1 # Not sure if OK, but don't ask to reboot - else - SPIOK=`grep '^\dtparam=spi=on' "$BOOT_DIR/config.txt" | wc -l` - if [ $SPIOK -ne 1 ]; then - echo 'Raspberry Pi found, but SPI is not set, we write "dtparam=spi=on" to '"$BOOT_DIR/config.txt" - sed -i '$a dtparam=spi=on' "$BOOT_DIR/config.txt" - REBOOTMESSAGE="Restart Raspberry Pi, SPI has been enabled in $BOOT_DIR/config.txt" - fi - fi -fi - -if command -v firewall-cmd &> /dev/null -then - echo "Firewall: opening port 8090" - firewall-cmd --add-port=8090/tcp -fi - -echo ${start_msg} - -printf "\n +-----------------------------------------------------------------------+" -printf "\n | \033[32;1mHyperHDR has been installed/updated!\033[0m |" -printf "\n +-----------------------------------------------------------------------+" -printf "\n | For configuration, visit with your browser: \033[37;1m%13s:%s\033[0m |" "$NET_IP" "8090" -printf "\n | If already used by another service try: \033[37;1m%13s:%s\033[0m |" "$NET_IP" "8091" -printf "\n | Start the service: \033[37;1msudo systemctl start hyperhdr@%-12s\033[0m |" "$FOUND_USR" -printf "\n | Stop the service: \033[37;1msudo systemctl stop hyperhdr@%-12s\033[0m |" "$FOUND_USR" -printf "\n | Troubleshooting? Run HyperHDR manually: \033[37;1m/usr/bin/hyperhdr\033[0m |" -printf "\n +-----------------------------------------------------------------------+" -case "$STARTUP_MSG" in - *"HyperHDR is installed as a service"*) - printf "\n | \033[32;1m%-67s\033[0m |" "$STARTUP_MSG";; - *) printf "\n | \033[31;1m%-67s\033[0m |" "$STARTUP_MSG" -esac -[ -z "$REBOOTMESSAGE" ] || printf "\n | \033[31;1m%-67s\033[0m |" "$REBOOTMESSAGE" -printf "\n +-----------------------------------------------------------------------+" -printf "\n | Webpage: \033[36;1mhttps://hyperhdr.eu\033[0m |" -printf "\n | GitHub: \033[36;1mhttps://github.com/awawa-dev/HyperHDR\033[0m |" -printf "\n +-----------------------------------------------------------------------+\n" - -exit 0 diff --git a/cmake/linux/rpm/preinst b/cmake/linux/rpm/preinst deleted file mode 100644 index 32e9140f5..000000000 --- a/cmake/linux/rpm/preinst +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -echo "Preparing to install HyperHDR..." - -# search for users in system, returns first entry -FOUND_USR=`who | grep -o -m1 '^\w*\b'` || "root" - -# stop running daemon before we install -if pgrep hyperhdr > /dev/null 2>&1 -then - if grep -m1 systemd /proc/1/comm > /dev/null - then - echo "Stopping HyperHDR daemon: systemd" - # systemd - systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null - - elif [ -e /sbin/initctl ] - then - echo "Stopping HyperHDR daemon: upstart" - # upstart - initctl stop hyperhdr - - else - echo "Stopping HyperHDR daemon: sysV" - # sysV - service hyperhdr stop 2>/dev/null - fi -fi - -# In case we don't use a service kill all instances -killall hyperhdr 2> /dev/null - -# overwrite last return code -exit 0 diff --git a/cmake/linux/rpm/prerm b/cmake/linux/rpm/prerm deleted file mode 100644 index 4c55df23f..000000000 --- a/cmake/linux/rpm/prerm +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/sh - -echo "Preparing to uninstall HyperHDR" - -# search for users in system, returns first entry -FOUND_USR=`who | grep -o -m1 '^\w*\b'` || "root" - -# stop running daemon before we delete it -HYPERHDR_RUNNING=false -pgrep hyperhdr > /dev/null 2>&1 && HYPERHDR_RUNNING=true - -if grep -m1 systemd /proc/1/comm > /dev/null -then - echo "Stopping HyperHDR daemon: systemd" - # systemd - $HYPERHDR_RUNNING && systemctl stop hyperhdr"@${FOUND_USR}" 2> /dev/null - # disable user specific symlink - echo "Disabling service and removing entry" - systemctl -q disable hyperhdr"@${FOUND_USR}" - - rm -v /etc/systemd/system/hyperhdr@.service 2>/dev/null - -elif [ -e /sbin/initctl ] -then - echo "Stopping HyperHDR daemon: upstart" - # upstart - $HYPERHDR_RUNNING && initctl stop hyperhdr - echo "Removing upstart service" - rm -v /etc/init/hyperhdr* 2>/dev/null - initctl reload-configuration - -else - echo "Stopping HyperHDR daemon: sysV" - # sysV - $HYPERHDR_RUNNING && service hyperhdr stop 2>/dev/null - echo "Removing sysV service" - update-rc.d -f hyperhdr remove - rm /etc/init.d/hyperhdr* 2>/dev/null -fi - -# In case we don't use a service kill all instances -killall hyperhdr 2> /dev/null - -# delete desktop icons; desktop-file-edit is a workaround to hide the entry and delete it afterwards manual. -# TODO Better way for deletion and keep the desktop in sync without logout/login or desktop dependend cmds? -echo "Deleting HyperHDR desktop icons" -desktop-file-edit --set-key=NoDisplay --set-value=true /usr/share/applications/hyperhdr.desktop 2>/dev/null -rm -v /usr/share/applications/hyperhdr* 2>/dev/null -rm -rv /usr/share/pixmaps/hyperhdr 2>/dev/null - -if command -v firewall-cmd &> /dev/null -then - echo "Firewall: closing port 8090" - firewall-cmd --remove-port=8090/tcp -fi - -exit 0 diff --git a/cmake/linux/service/hyperhdr.init b/cmake/linux/service/hyperhdr.init deleted file mode 100644 index 8d68f6f43..000000000 --- a/cmake/linux/service/hyperhdr.init +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -# Hyperhdr daemon service -# description: HyperHdr daemon -# processname: hyperhdr -### BEGIN INIT INFO -# Provides: HyperHdr -# Required-Start: $remote_fs $syslog -# Required-Stop: $remote_fs $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: HyperHdr Ambilight init.d Service. -# Description: HyperHdr Ambilight init.d Service. -### END INIT INFO - -DAEMON=hyperhdr -DAEMON_PATH="/usr/bin" - -NAME=$DAEMON -DESC="HyperHdr ambilight server" -PIDFILE=/var/run/$NAME.pid -SCRIPTNAME=/etc/init.d/$NAME -case "$1" in -start) - if [ $(pgrep -xl $NAME |wc -l) = 1 ] - then - printf "%-50s\n" "Already running..." - exit 1 - else - printf "%-50s" "Starting $NAME..." - cd $DAEMON_PATH - PID=`$DAEMON > /dev/null 2>&1 & echo $!` - #echo "Saving PID" $PID " to " $PIDFILE - if [ -z $PID ]; then - printf "%s\n" "Fail" - else - echo $PID > $PIDFILE - printf "%s\n" "Ok" - fi - fi -;; -status) - printf "%-50s" "Checking $NAME..." - if [ -f $PIDFILE ]; then - PID=`cat $PIDFILE` - if [ -z "`ps axf | grep ${PID} | grep -v grep`" ]; then - printf "%s\n" "Process dead but pidfile exists" - else - echo "Running" - fi - else - printf "%s\n" "Service not running" - fi -;; -stop) - if [ -f $PIDFILE ] - then - printf "%-50s" "Stopping $NAME" - PID=`cat $PIDFILE` - cd $DAEMON_PATH - if [ -f $PIDFILE ]; then - kill $PID - printf "%s\n" "Ok" - rm -f $PIDFILE - else - printf "%s\n" "pidfile not found" - fi - else - printf "%-50s\n" "No PID file $NAME not running?" - fi -;; - -restart) - $0 stop - $0 start -;; - -*) - echo "Usage: $0 {status|start|stop|restart}" - exit 1 -esac - -exit 0 diff --git a/cmake/linux/service/hyperhdr.initctl b/cmake/linux/service/hyperhdr.initctl deleted file mode 100644 index ce9c0acf2..000000000 --- a/cmake/linux/service/hyperhdr.initctl +++ /dev/null @@ -1,11 +0,0 @@ -## Hyperhdr daemon initctl script - -description "hyperhdr" -author "poljvd & tvdzwan" - -start on (runlevel [2345]) -stop on (runlevel [!2345]) - -respawn - -exec /usr/bin/hyperhdr diff --git a/cmake/linux/service/hyperhdr.systemd b/cmake/linux/service/hyperhdr@.service similarity index 85% rename from cmake/linux/service/hyperhdr.systemd rename to cmake/linux/service/hyperhdr@.service index 6b4c61330..5ffff2a11 100644 --- a/cmake/linux/service/hyperhdr.systemd +++ b/cmake/linux/service/hyperhdr@.service @@ -4,7 +4,6 @@ After=network.target [Service] ExecStart=/usr/bin/hyperhdr -WorkingDirectory=/usr/share/hyperhdr/bin User=%i TimeoutStopSec=5 KillMode=mixed diff --git a/cmake/packages.cmake b/cmake/packages.cmake index 745caccac..ef3e39e27 100644 --- a/cmake/packages.cmake +++ b/cmake/packages.cmake @@ -69,7 +69,9 @@ SET ( CPACK_PACKAGE_VERSION_MINOR "${HYPERHDR_VERSION_MINOR}") SET ( CPACK_PACKAGE_VERSION_PATCH "${HYPERHDR_VERSION_PATCH}") if(USE_STANDARD_INSTALLER_NAME AND UNIX AND NOT APPLE) - string(REPLACE "." ";" HYPERHDR_VERSION_LIST ${HYPERHDR_VERSION}) + string(REPLACE "-alpha." "alpha" COMPAT_VERSION "${HYPERHDR_VERSION}") + string(REPLACE "-beta." "beta" COMPAT_VERSION "${COMPAT_VERSION}") + string(REPLACE "." ";" HYPERHDR_VERSION_LIST ${COMPAT_VERSION}) list(LENGTH HYPERHDR_VERSION_LIST HYPERHDR_VERSION_LIST_LEN) if (HYPERHDR_VERSION_LIST_LEN EQUAL 3) list(GET HYPERHDR_VERSION_LIST 2 H_ELEM_2) @@ -121,9 +123,9 @@ SET ( CPACK_RPM_PACKAGE_LICENSE "MIT") SET ( CPACK_RPM_PACKAGE_GROUP "Applications") SET ( CPACK_RPM_PACKAGE_REQUIRES "xz" ) SET ( CPACK_RPM_PACKAGE_AUTOREQPROV 0 ) -SET ( CPACK_RPM_PRE_INSTALL_SCRIPT_FILE "${CMAKE_SOURCE_DIR}/cmake/linux/rpm/preinst" ) -SET ( CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_SOURCE_DIR}/cmake/linux/rpm/postinst" ) -SET ( CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE "${CMAKE_SOURCE_DIR}/cmake/linux/rpm/prerm" ) +SET ( CPACK_RPM_PRE_INSTALL_SCRIPT_FILE "${CMAKE_SOURCE_DIR}/cmake/linux/rpm/%pre" ) +SET ( CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_SOURCE_DIR}/cmake/linux/rpm/%post") +SET ( CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE "${CMAKE_SOURCE_DIR}/cmake/linux/rpm/%preun" ) SET ( CPACK_RPM_SPEC_MORE_DEFINE "%define _build_id_links none" ) if ( ENABLE_SYSTRAY ) SET( CPACK_RPM_PACKAGE_SUGGESTS "gtk3") @@ -138,10 +140,32 @@ if ( UNIX AND NOT APPLE ) string(CONCAT CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES}, glibc >= ${GLIBC_VERSION}" ) endif() + if(NOT ENABLE_DEPENDENCY_PACKAGING) + message("Adding system runtime dependencies (ENABLE_DEPENDENCY_PACKAGING=OFF)") + + set(HYPERHDR_DEB_RUNTIME_DEPS + "libasound2 | libasound2t64, libayatana-appindicator3-1, libegl1, libgl1, libglvnd0, libglx0, libgtk-3-0 | libgtk-3-0t64, liblzma5, libpipewire-0.3-0, libssl3 | libssl3t64 | libssl1.1, libsystemd0, libturbojpeg0, libftdi1 | libftdi1-2, libusb-1.0-0, libx11-6, libzstd1, libqt6core6, libqt6network6, libqt6serialport6" + ) + + string(CONCAT CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, ${HYPERHDR_DEB_RUNTIME_DEPS}") + + set(HYPERHDR_RPM_RUNTIME_DEPS + "alsa-lib, libayatana-appindicator-gtk3, libftdi, gtk3, libX11, libglvnd, mesa-libEGL, mesa-libGL, libusb1, libzstd, openssl-libs, pipewire-libs, qt6-qtbase, qt6-qtserialport, systemd-libs, turbojpeg, xz-libs, hicolor-icon-theme" + ) + + string(CONCAT CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES}, ${HYPERHDR_RPM_RUNTIME_DEPS}") + + if(ENABLE_CEC) + string(CONCAT CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libcec7 | libcec6 | libcec4 | libcec-dev") + string(CONCAT CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES}, libcec") + endif() + endif() + message("DEB deps: ${CPACK_DEBIAN_PACKAGE_DEPENDS}") message("RPM deps: ${CPACK_RPM_PACKAGE_REQUIRES}") endif() + #if(BUILD_ARCHIVES) SET ( CPACK_DEBIAN_COMPRESSION_TYPE "xz" ) SET ( CPACK_RPM_COMPRESSION_TYPE "xz" ) diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index 1f011cfcd..d52ac4916 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -32,7 +32,6 @@ install( set_target_properties(sqlite3 PROPERTIES OUTPUT_NAME sqlite3 - PUBLIC_HEADER sqlite3.h ) target_compile_definitions(sqlite3 PUBLIC @@ -86,7 +85,7 @@ endif() if(ENABLE_WS281XPWM) file(READ "${CMAKE_CURRENT_SOURCE_DIR}/rpi_ws281x/CMakeLists.txt" FILE_CONTENTS) - string(REPLACE "if(BUILD_SHARED)" "if(USE_SHARED_LIBS)" FILE_CONTENTS "${FILE_CONTENTS}") + string(REPLACE "if(BUILD_SHARED)" "if(USE_SHARED_LIBS AND ENABLE_DEPENDENCY_PACKAGING)" FILE_CONTENTS "${FILE_CONTENTS}") string(REPLACE "configure_file(version.h.in version.h)" [=[configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/version.h)]=] FILE_CONTENTS "${FILE_CONTENTS}") file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/rpi_ws281x/CMakeLists.txt" "${FILE_CONTENTS}") diff --git a/sources/hyperhdr/CMakeLists.txt b/sources/hyperhdr/CMakeLists.txt index 9cf82ed4e..47f3198b3 100644 --- a/sources/hyperhdr/CMakeLists.txt +++ b/sources/hyperhdr/CMakeLists.txt @@ -141,14 +141,27 @@ if (ENABLE_SOUNDCAPMACOS) endif () # rules for installers -include(${OUR_CMAKE_MODULES}/../installers.cmake) - -if (APPLE) - DeployApple("hyperhdr") -elseif (NOT WIN32) # Unix - DeployUnix("hyperhdr") +if (APPLE) # macOS + include(${OUR_CMAKE_MODULES}/../installer_macos.cmake) + InstallerMacOS("hyperhdr") +elseif (NOT WIN32) # Linux + + if(ENABLE_DEPENDENCY_PACKAGING) + set(rpath_libs_dir "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}/hyperhdr:$ORIGIN/../${CMAKE_INSTALL_LIBDIR}/hyperhdr/external:$ORIGIN/../${CMAKE_INSTALL_LIBDIR}/hyperhdr/external/plugins") + else() + set(rpath_libs_dir "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}/hyperhdr") + endif() + + set_target_properties(hyperhdr PROPERTIES + INSTALL_RPATH "${rpath_libs_dir}" + BUILD_WITH_INSTALL_RPATH FALSE + INSTALL_RPATH_USE_LINK_PATH FALSE) + + include(${OUR_CMAKE_MODULES}/../installer_linux.cmake) + InstallerLinux("hyperhdr") elseif(WIN32) # Windows - DeployWindows("hyperhdr") + include(${OUR_CMAKE_MODULES}/../installer_windows.cmake) + InstallerWindows("hyperhdr") endif () if(USE_PRECOMPILED_HEADERS AND COMMAND target_precompile_headers AND WIN32) diff --git a/sources/hyperhdr/SystrayHandler.cpp b/sources/hyperhdr/SystrayHandler.cpp index 58d4b1f43..cd2ab7bbd 100644 --- a/sources/hyperhdr/SystrayHandler.cpp +++ b/sources/hyperhdr/SystrayHandler.cpp @@ -193,7 +193,7 @@ static void loadSvg(std::unique_ptr& menu, QString filename, [[mayb destFilename.replace(".svg", ".png"); } - QString fullPath = rootFolder + "/icons/" + destFilename; + QString fullPath = rootFolder + "/systray-icons/" + destFilename; QFileInfo iconFile(fullPath); if (!iconFile.exists()) @@ -201,7 +201,17 @@ static void loadSvg(std::unique_ptr& menu, QString filename, [[mayb QDir().mkpath(iconFile.absolutePath()); std::vector ar; - utils_image::svg2png(preloadSvg(filename).toStdString(), iconDim, iconDim, ar); + + QString svgData = preloadSvg(filename); + + if (filename.contains("clear.svg", Qt::CaseInsensitive)) { + svgData.replace("fill=\"black\"", QString("fill=\"#FFFF00\"")); + } + else if (filename.contains("settings.svg", Qt::CaseInsensitive)) { + svgData.replace("fill=\"black\"", QString("fill=\"#00FF00\"")); + } + + utils_image::svg2png(svgData.toStdString(), iconDim, iconDim, ar); QFile newIcon(fullPath); newIcon.open(QIODevice::WriteOnly); diff --git a/sources/hyperhdr/main.cpp b/sources/hyperhdr/main.cpp index c7ee7fe49..9044b4713 100644 --- a/sources/hyperhdr/main.cpp +++ b/sources/hyperhdr/main.cpp @@ -110,7 +110,13 @@ QCoreApplication* createApplication(bool& isGuiApp, int& argc, char* argv[]) QCoreApplication* app = new QCoreApplication(argc, argv); QCoreApplication::setApplicationName("HyperHDR"); QCoreApplication::setApplicationVersion(HYPERHDR_VERSION); - // add optional library path + + // add optional library path + #ifdef PORTABLE_LIB_FOLDER + const QString base = QDir(QCoreApplication::applicationDirPath()).filePath(PORTABLE_LIB_FOLDER) + "/external"; + for (const auto& p : { base, base + "/plugins" }) + if (QDir(p).exists()) QCoreApplication::addLibraryPath(p); + #endif QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + "/../lib"); return app; diff --git a/sources/webserver/FileServer.cpp b/sources/webserver/FileServer.cpp index 71e5d9e1f..ea36ffc47 100644 --- a/sources/webserver/FileServer.cpp +++ b/sources/webserver/FileServer.cpp @@ -2,7 +2,7 @@ * * MIT License * -* Copyright (c) 2020-2025 awawa-dev +* Copyright (c) 2020-2026 awawa-dev * * Project homesite: https://github.com/awawa-dev/HyperHDR * @@ -62,7 +62,11 @@ FileServer::FileServer(): #if defined(USE_EMBEDDED_WEB_RESOURCES) Q_INIT_RESOURCE(web_resources); #else - _resourcePath = QDir(qApp->applicationDirPath()).filePath("../lib/web_resources.rcc"); + #ifdef WEB_RESOURCES_FOLDER + _resourcePath = QDir(QCoreApplication::applicationDirPath()).filePath(QString(WEB_RESOURCES_FOLDER) + "/web_resources.rcc"); + #else + _resourcePath = QDir(qApp->applicationDirPath()).filePath("../lib/web_resources.rcc"); + #endif if (!QResource::registerResource(_resourcePath)) { Error(_log, "Could not initialize web server resources: {:s}", (_resourcePath)); diff --git a/www/js/settings.js b/www/js/settings.js index fd73a00ee..d7eecc4b7 100644 --- a/www/js/settings.js +++ b/www/js/settings.js @@ -119,7 +119,10 @@ function compareHyperHdrVersion(compareA, compareB) console.log(`Invalid length: A:${valueA.length} B:${valueB.length}`); return true; } - + + if (valueA.length >= 4) valueA[2] += valueA[3]; + if (valueB.length >= 4) valueB[2] += valueB[3]; + var finalA = ""; for (var i = 0; i < valueA[2].length; i++) if (!isNaN(valueA[2][i]))