From 465c1072a38f0a28f0a81434ca290d4bb77f8ee6 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 15 May 2026 17:13:32 +0200 Subject: [PATCH] Add sunshine --- pkgbuilds/sunshine/.omarchy/package.json | 4 + pkgbuilds/sunshine/PKGBUILD | 184 +++++++++++++++++++++++ pkgbuilds/sunshine/sunshine.install | 23 +++ 3 files changed, 211 insertions(+) create mode 100644 pkgbuilds/sunshine/.omarchy/package.json create mode 100644 pkgbuilds/sunshine/PKGBUILD create mode 100644 pkgbuilds/sunshine/sunshine.install diff --git a/pkgbuilds/sunshine/.omarchy/package.json b/pkgbuilds/sunshine/.omarchy/package.json new file mode 100644 index 0000000..e135a13 --- /dev/null +++ b/pkgbuilds/sunshine/.omarchy/package.json @@ -0,0 +1,4 @@ +{ + "source": "aur", + "upstream_commit": "25d6084936ff14a3b2fdb8c151cda4e579803079" +} diff --git a/pkgbuilds/sunshine/PKGBUILD b/pkgbuilds/sunshine/PKGBUILD new file mode 100644 index 0000000..01507e1 --- /dev/null +++ b/pkgbuilds/sunshine/PKGBUILD @@ -0,0 +1,184 @@ +# Edit on github: https://github.com/LizardByte/Sunshine/blob/master/packaging/linux/Arch/PKGBUILD +# Reference: https://wiki.archlinux.org/title/PKGBUILD + +## options +: "${_run_unit_tests:=false}" # if set to true; unit tests will be executed post build; useful in CI +: "${_support_headless_testing:=false}" +: "${_use_cuda:=detect}" # nvenc + +: "${_commit:=86188d47a7463b0f73b35de18a628353adeaa20e}" + +pkgname='sunshine' +pkgver=2025.924.154138 +pkgrel=3 +pkgdesc="Self-hosted game stream host for Moonlight" +arch=('x86_64' 'aarch64') +url=https://app.lizardbyte.dev/Sunshine +license=('GPL-3.0-only') +install=sunshine.install + +# this variable remains for future cases where we need an older version of gcc for cuda compatibility +_gcc_version=15 +_versioned_gcc=false # set to true if we need a versioned gcc, e.g. gcc14 + +_gcc_dep_suffix="" +_gcc_env_suffix="" +if [ "${_versioned_gcc}" == true ]; then + _gcc_dep_suffix="${_gcc_version}" + _gcc_env_suffix="-${_gcc_version}" +fi + +depends=( + 'avahi' + 'curl' + 'libayatana-appindicator' + 'libcap' + 'libdrm' + 'libevdev' + 'libmfx' + 'libnotify' + 'libpulse' + 'libva' + 'libx11' + 'libxcb' + 'libxfixes' + 'libxrandr' + 'libxtst' + 'miniupnpc' + 'numactl' + 'openssl' + 'opus' + 'udev' + 'which' +) + +makedepends=( + 'appstream' + 'appstream-glib' + 'cmake' + 'desktop-file-utils' + "gcc${_gcc_dep_suffix}" + 'git' + 'make' + 'nodejs' + 'npm' +) + +optdepends=( + 'libva-mesa-driver: AMD GPU encoding support' +) + +provides=() +conflicts=() + +source=("$pkgname::git+https://github.com/LizardByte/Sunshine.git#commit=${_commit}") +sha256sums=('SKIP') + +# Options Handling +if [[ "${_use_cuda::1}" == "d" ]] && pacman -Qi cuda &> /dev/null; then + _use_cuda=true +fi + +if [[ "${_use_cuda::1}" == "t" ]]; then + optdepends+=( + 'cuda: Nvidia GPU encoding support' + ) +fi + +if [[ "${_support_headless_testing::1}" == "t" ]]; then + optdepends+=( + 'xorg-server-xvfb: Virtual X server for headless testing' + ) +fi + +# Ensure makedepends, checkdepends, optdepends are sorted +if [ -n "${makedepends+x}" ]; then + mapfile -t tmp_array < <(printf '%s\n' "${makedepends[@]}" | sort) + makedepends=("${tmp_array[@]}") + unset tmp_array +fi + +if [ -n "${optdepends+x}" ]; then + mapfile -t tmp_array < <(printf '%s\n' "${optdepends[@]}" | sort) + optdepends=("${tmp_array[@]}") + unset tmp_array +fi + +prepare() { + cd "$pkgname" + git submodule update --recursive --init +} + +build() { + export BRANCH="master" + export BUILD_VERSION="2025.924.154138" + export COMMIT="${_commit}" + + export CC="gcc${_gcc_env_suffix}" + export CXX="g++${_gcc_env_suffix}" + + export CFLAGS="${CFLAGS/-Werror=format-security/}" + export CXXFLAGS="${CXXFLAGS/-Werror=format-security/}" + + export MAKEFLAGS="${MAKEFLAGS:--j$(nproc)}" + + local _cmake_options=( + -S "$pkgname" + -B build + -Wno-dev + -D BUILD_DOCS=OFF + -D BUILD_WERROR=ON + -D CMAKE_INSTALL_PREFIX=/usr + -D SUNSHINE_COMPILE_OPTIONS="-Wno-uninitialized" + -D SUNSHINE_EXECUTABLE_PATH=/usr/bin/sunshine + -D SUNSHINE_ASSETS_DIR="share/sunshine" + -D SUNSHINE_PUBLISHER_NAME='LizardByte' + -D SUNSHINE_PUBLISHER_WEBSITE='https://app.lizardbyte.dev' + -D SUNSHINE_PUBLISHER_ISSUE_URL='https://app.lizardbyte.dev/support' + ) + + if [[ "${_use_cuda::1}" != "t" ]]; then + _cmake_options+=(-DSUNSHINE_ENABLE_CUDA=OFF -DCUDA_FAIL_ON_MISSING=OFF) + else + # If cuda has just been installed, its variables will not be available in the environment + # therefore, set them manually to the expected values on Arch Linux + if [ -z "${CUDA_PATH:-}" ] && pacman -Qi cuda &> /dev/null; then + local _cuda_gcc_version + _cuda_gcc_version="$(LC_ALL=C pacman -Si cuda | grep -Pom1 '^Depends On\s*:.*\bgcc\K[0-9]+\b')" + + export CUDA_PATH=/opt/cuda + export NVCC_CCBIN="/usr/bin/g++-${_cuda_gcc_version}" + fi + fi + + if [[ "${_run_unit_tests::1}" != "t" ]]; then + _cmake_options+=(-DBUILD_TESTS=OFF) + fi + + cmake "${_cmake_options[@]}" + + appstreamcli validate "build/dev.lizardbyte.app.Sunshine.metainfo.xml" + appstream-util validate "build/dev.lizardbyte.app.Sunshine.metainfo.xml" + desktop-file-validate "build/dev.lizardbyte.app.Sunshine.desktop" + desktop-file-validate "build/dev.lizardbyte.app.Sunshine.terminal.desktop" + + make -C build +} + +check() { + cd "${srcdir}/build" + ./sunshine --version + + if [[ "${_run_unit_tests::1}" == "t" ]]; then + export CC="gcc${_gcc_env_suffix}" + export CXX="g++${_gcc_env_suffix}" + + cd "${srcdir}/build/tests" + ./test_sunshine --gtest_color=yes + fi +} + +package() { + export MAKEFLAGS="${MAKEFLAGS:--j$(nproc)}" + make -C build install DESTDIR="$pkgdir" +} diff --git a/pkgbuilds/sunshine/sunshine.install b/pkgbuilds/sunshine/sunshine.install new file mode 100644 index 0000000..d7b8773 --- /dev/null +++ b/pkgbuilds/sunshine/sunshine.install @@ -0,0 +1,23 @@ +do_setcap() { + setcap cap_sys_admin+p $(readlink -f usr/bin/sunshine) +} + +do_udev_reload() { + udevadm control --reload-rules + udevadm trigger --property-match=DEVNAME=/dev/uinput + udevadm trigger --property-match=DEVNAME=/dev/uhid + modprobe uinput || true + modprobe uhid || true +} + +post_install() { + do_setcap + do_udev_reload + modprobe uhid +} + +post_upgrade() { + do_setcap + do_udev_reload + modprobe uhid +}