chore: migrate to qt tray for all platforms (#5260)

This commit is contained in:
Dave Lane
2026-07-28 22:22:43 -04:00
committed by GitHub
parent e2074c6d62
commit 089f15d4b6
16 changed files with 113 additions and 27 deletions

View File

@@ -14,6 +14,13 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64")
list(APPEND SUNSHINE_COMPILE_OPTIONS -Wno-dll-attribute-on-redeclaration) # Boost
list(APPEND SUNSHINE_COMPILE_OPTIONS -Wno-unknown-warning-option) # ViGEmClient
list(APPEND SUNSHINE_COMPILE_OPTIONS -Wno-unused-variable) # Boost
# Qt's static qwindows plugin and MinGW's Windowsapp import library both provide the
# UiaRaiseNotificationEvent import thunk on ARM64. Keep both required libraries while
# permitting lld to coalesce their identical definitions.
if(SUNSHINE_USE_STATIC_QT AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
list(APPEND SUNSHINE_LINK_OPTIONS -Wl,--allow-multiple-definition)
endif()
endif()
# see gcc bug 98723

View File

@@ -25,7 +25,49 @@ add_subdirectory("${CMAKE_SOURCE_DIR}/third-party/lizardbyte-common")
add_subdirectory("${CMAKE_SOURCE_DIR}/third-party/libdisplaydevice")
if(SUNSHINE_ENABLE_TRAY)
if(SUNSHINE_USE_STATIC_QT)
set(_sunshine_find_library_suffixes "${CMAKE_FIND_LIBRARY_SUFFIXES}")
set(_sunshine_import_library_suffix "${CMAKE_IMPORT_LIBRARY_SUFFIX}")
set(_sunshine_pkg_config_argn "${PKG_CONFIG_ARGN}")
set(_sunshine_disable_find_package_harfbuzz "${CMAKE_DISABLE_FIND_PACKAGE_harfbuzz}")
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
set(CMAKE_IMPORT_LIBRARY_SUFFIX ".a")
set(PKG_CONFIG_ARGN --static)
# HarfBuzz's config-file target omits dependencies needed by its static archive.
# Use Qt's pkg-config fallback so --static supplies the complete link interface.
set(CMAKE_DISABLE_FIND_PACKAGE_harfbuzz TRUE)
# CMake's FindTIFF module does not propagate dependencies of the static archive.
# Provide its standard target from pkg-config before Qt imports the TIFF plugin.
find_package(PkgConfig REQUIRED)
pkg_check_modules(SUNSHINE_STATIC_TIFF REQUIRED IMPORTED_TARGET libtiff-4)
add_library(TIFF::TIFF INTERFACE IMPORTED)
target_link_libraries(TIFF::TIFF INTERFACE PkgConfig::SUNSHINE_STATIC_TIFF)
set(_sunshine_module_path "${CMAKE_MODULE_PATH}")
find_package(Qt6 REQUIRED COMPONENTS Widgets Svg)
get_target_property(_sunshine_qt_core_type Qt6::Core TYPE)
if(NOT _sunshine_qt_core_type STREQUAL "STATIC_LIBRARY")
message(FATAL_ERROR "SUNSHINE_USE_STATIC_QT requires a static Qt 6 installation.")
endif()
set(CMAKE_MODULE_PATH "${_sunshine_module_path}")
endif()
add_subdirectory("${CMAKE_SOURCE_DIR}/third-party/tray")
if(SUNSHINE_USE_STATIC_QT)
set(CMAKE_FIND_LIBRARY_SUFFIXES "${_sunshine_find_library_suffixes}")
set(CMAKE_IMPORT_LIBRARY_SUFFIX "${_sunshine_import_library_suffix}")
set(PKG_CONFIG_ARGN "${_sunshine_pkg_config_argn}")
set(CMAKE_DISABLE_FIND_PACKAGE_harfbuzz "${_sunshine_disable_find_package_harfbuzz}")
unset(_sunshine_disable_find_package_harfbuzz)
unset(_sunshine_find_library_suffixes)
unset(_sunshine_import_library_suffix)
unset(_sunshine_module_path)
unset(_sunshine_pkg_config_argn)
unset(_sunshine_qt_core_type)
endif()
endif()
# common dependencies

View File

@@ -154,17 +154,6 @@ if(${SUNSHINE_TRAY} STREQUAL 1)
# Icons used by the Qt tray backend are no longer installed to the hicolor icon theme,
# because Qt6 will not allow icons not part of the theme... so we will use icons from our web directory instead
set(CPACK_DEBIAN_PACKAGE_DEPENDS "\
${CPACK_DEBIAN_PACKAGE_DEPENDS}, \
libnotify4"
)
set(CPACK_RPM_PACKAGE_REQUIRES "\
${CPACK_RPM_PACKAGE_REQUIRES}, \
libnotify >= 0.8.0"
)
list(APPEND CPACK_FREEBSD_PACKAGE_DEPS
devel/libnotify
)
if(TRAY_QT_VERSION EQUAL 6)
set(CPACK_DEBIAN_PACKAGE_DEPENDS "\
${CPACK_DEBIAN_PACKAGE_DEPENDS}, \

View File

@@ -22,6 +22,26 @@ else()
BUNDLE DESTINATION .
COMPONENT Runtime)
if(SUNSHINE_ENABLE_TRAY)
# Import Qt in this directory so its deployment commands and targets are visible here.
set(_sunshine_module_path "${CMAKE_MODULE_PATH}")
find_package(Qt6 REQUIRED COMPONENTS Core)
set(CMAKE_MODULE_PATH "${_sunshine_module_path}")
unset(_sunshine_module_path)
qt6_generate_deploy_script(
TARGET sunshine
OUTPUT_SCRIPT SUNSHINE_QT_DEPLOY_SCRIPT
CONTENT "
qt6_deploy_runtime_dependencies(
EXECUTABLE \"$<TARGET_FILE_NAME:sunshine>.app\"
NO_APP_STORE_COMPLIANCE
NO_TRANSLATIONS
DEPLOY_TOOL_OPTIONS -no-codesign
)")
install(SCRIPT "${SUNSHINE_QT_DEPLOY_SCRIPT}" COMPONENT Runtime)
endif()
install(FILES "${APPLE_PLIST_FILE}"
DESTINATION "${MAC_BUNDLE_CONTENTS}"
COMPONENT Runtime)
@@ -44,6 +64,18 @@ else()
message(STATUS \"Running fixup_bundle for: \${_app}\")
include(BundleUtilities)
set(BU_CHMOD_BUNDLE_ITEMS TRUE)
# Resolve @rpath items that Qt already deployed into the app bundle.
function(gp_resolve_item_override context item exepath dirs resolved_item_var resolved_var)
if(\"\${item}\" MATCHES \"^@rpath/(.+)$\")
set(_embedded_item \"\${_app}/Contents/Frameworks/\${CMAKE_MATCH_1}\")
if(EXISTS \"\${_embedded_item}\")
set(\${resolved_item_var} \"\${_embedded_item}\" PARENT_SCOPE)
set(\${resolved_var} TRUE PARENT_SCOPE)
endif()
endif()
endfunction()
fixup_bundle(\"\${_app}\" \"\" \"\")
# Remove Finder/resource-fork metadata that breaks codesign.
@@ -61,12 +93,13 @@ else()
# SHOULD_SIGN is set only when publish_release is true or when manually building
if(\"\$ENV{SHOULD_SIGN}\" STREQUAL \"true\")
# Sign anything inside Contents/Frameworks
# Sign bundled frameworks and plugins before signing the app itself.
set(_fw_dir \"\${_app}/Contents/Frameworks\")
if(EXISTS \"\${_fw_dir}\")
file(GLOB_RECURSE _sign_items
\"\${_fw_dir}/*.framework\"
\"\${_fw_dir}/*.dylib\"
\"\${_app}/Contents/PlugIns/*.dylib\"
)
foreach(item IN LISTS _sign_items)

View File

@@ -18,6 +18,11 @@ option(SUNSHINE_CONFIGURE_ONLY "Configure special files only, then exit." OFF)
option(SUNSHINE_ENABLE_TRAY "Enable system tray icon." ON)
if(WIN32)
option(SUNSHINE_USE_STATIC_QT
"Require static Qt libraries and their static third-party dependencies." OFF)
endif()
option(SUNSHINE_SYSTEM_VULKAN_HEADERS "Use system installation of vulkan-headers rather than the submodule." OFF)
option(SUNSHINE_SYSTEM_WAYLAND_PROTOCOLS "Use system installation of wayland-protocols rather than the submodule." OFF)