The docs already told users where to get it — the Bazzite sysext, an Arch package, a NixOS option — and none of the three were true. `rpm.yml` built the sysext without ever passing `--gamescope`, `arch.yml` did not know the PKGBUILD existed, and the nix derivation had never been evaluated once. Evaluating it found its central assumption wrong: `gamescope.unwrapped` does not exist on current nixpkgs, where `gamescope` IS the buildable derivation, so the override threw on every build. It now prefers `.unwrapped` where a future nixpkgs wraps it and checks the RESULT is patchable — `overrideAttrs` on a symlinkJoin succeeds and does nothing, which would install an UNPATCHED gamescope under a name the host reads as a promise of HDR. Both it and the PKGBUILD had also drifted to a stale patch list: two patches named where three exist, one of them under the level-1 filename retired when the cursor patch landed. Both read the patch directory now, so the list cannot go stale again. The PKGBUILD additionally delegates the whole build to `build-punktfunk-gamescope.sh` rather than re-deriving the meson invocation — its copy had already lost `force_fallback_for=wlroots`, and unlike Fedora 43, Arch ships wlroots, so that package would have linked it shared and shipped a binary that starts only on machines carrying the dev library. It asserts its own pinned rev matches the script's, the one thing makepkg needs statically. Both CI builds are cached on `packaging/gamescope/**`, which is the only reason this is affordable: that tree depends on nothing else in the repo, so a normal push restores a binary instead of spending ten minutes on someone else's C++. And both are best-effort. punktfunk works without this binary — SDR on the gamescope backend, which is what every release before this one did — so a hiccup building gamescope must not cost the packages those workflows exist to publish. A failure warns and is never cached, so the next run retries. `rpm.yml` also installs Fedora's own gamescope for its runtime libraries: the sysext verifies our binary by executing `--version`, and on a cache hit nothing else in the job would have pulled libavif/luajit/seatd in. Verified by evaluating and patch-phase-building the nix derivation against nixos-unstable: all three patches apply to nixpkgs' already-patched 3.16.25 tree, and the banner stamps +pfhdr2. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
89 lines
4.8 KiB
Bash
89 lines
4.8 KiB
Bash
# Maintainer: unom <packages@unom.io>
|
|
#
|
|
# gamescope + punktfunk's `pipewire-hdr` patches, installed as `punktfunk-gamescope`.
|
|
#
|
|
# Standalone on purpose (its own pkgbase, not part of ../arch/PKGBUILD): it is an OPTIONAL
|
|
# companion — punktfunk works without it, just SDR on the gamescope backend — and it is a C++
|
|
# meson build with a completely different dependency set from the Rust workspace. Installing it
|
|
# does not touch the distro's own `gamescope`; the host resolves `PUNKTFUNK_GAMESCOPE_BIN` >
|
|
# `punktfunk-gamescope` > `gamescope`, so the mere presence of this package is what enables HDR.
|
|
#
|
|
# makepkg -si
|
|
#
|
|
# See ../README.md (packaging/gamescope/README.md) for what the patches do and why.
|
|
pkgname=punktfunk-gamescope
|
|
# `_gsver` is the upstream gamescope this is built from; `pkgrel` moves when only our patches do.
|
|
# `_gsrev` MUST name the same commit as GAMESCOPE_REV in build-punktfunk-gamescope.sh — makepkg
|
|
# needs it statically here, so it is the one thing that cannot be shared; build() asserts it.
|
|
# The `.pfhdrN` suffix is the patch-set revision the binary stamps into its banner (see README.md);
|
|
# bump it with the marker so pacman sees a new version when only our patches moved.
|
|
_gsver=3.16.25
|
|
_gsrev=8c676c399c761e4540587f61004c957993d12fea
|
|
pkgver="${_gsver}.pfhdr2"
|
|
pkgrel=1
|
|
pkgdesc="gamescope with 10-bit BT.2020/PQ PipeWire capture, for punktfunk HDR streaming"
|
|
arch=('x86_64' 'aarch64')
|
|
url="https://git.unom.io/unom/punktfunk"
|
|
license=('BSD-2-Clause')
|
|
# NOT a `provides`/`conflicts` of gamescope: this ships a differently-named binary and is meant to
|
|
# sit BESIDE the distro package (a Steam Deck's gaming session keeps using its own gamescope).
|
|
optdepends=('punktfunk-host: the streaming host that uses it')
|
|
# Mirrors Arch's own `gamescope` package. Keep in step with it when that one moves — this builds
|
|
# the same tree, so a dependency it grows is one this needs too.
|
|
depends=('glslang' 'libcap' 'libdrm' 'libinput' 'libx11' 'libxcomposite' 'libxdamage'
|
|
'libxext' 'libxkbcommon' 'libxmu' 'libxrender' 'libxres' 'libxtst' 'libxxf86vm'
|
|
'libavif' 'libdecor' 'hwdata' 'luajit' 'pipewire' 'seatd' 'sdl2-compat'
|
|
'vulkan-icd-loader' 'wayland' 'xcb-util-errors' 'xcb-util-wm' 'xorg-xwayland')
|
|
makedepends=('git' 'meson' 'ninja' 'cmake' 'glm' 'vulkan-headers' 'wayland-protocols'
|
|
'benchmark' 'libxcursor')
|
|
# Only the upstream tree is a `source=`. The patches are NOT listed: they are applied by the shared
|
|
# build script out of `patches/` beside this file, which is what keeps this package from drifting
|
|
# from the sysext / by-hand builds (a stale filename here used to mean a silently different binary).
|
|
# The submodules are pinned by the rev, so the git source is reproducible; `#commit=` makes makepkg
|
|
# check it out and `--recurse-submodules` pulls wlroots/vkroots/libliftoff/… with it.
|
|
source=("git+https://github.com/ValveSoftware/gamescope.git#commit=${_gsrev}")
|
|
# SKIP: the commit hash above IS the integrity check.
|
|
sha256sums=('SKIP')
|
|
options=('!lto' '!debug')
|
|
install="${pkgname}.install"
|
|
|
|
prepare() {
|
|
cd gamescope
|
|
git submodule update --init --recursive --depth 1
|
|
}
|
|
|
|
build() {
|
|
# ONE recipe. The patch set, the meson options and — load-bearing for a package — the
|
|
# `force_fallback_for` that keeps wlroots STATIC all live in the shared script. Arch has
|
|
# `wlroots` in its repos, so a plain `arch-meson` here would link it shared and ship a
|
|
# punktfunk-gamescope that dies with `libwlroots-0.19.so: cannot open shared object file` on
|
|
# every machine that installs the package but not that dev library.
|
|
#
|
|
# `$startdir` is this file's directory: the package is built from the punktfunk checkout
|
|
# (`makepkg -si` in packaging/gamescope), which is the only documented way to build it.
|
|
grep -q "^GAMESCOPE_REV=\"${_gsrev}\"" "${startdir}/build-punktfunk-gamescope.sh" || {
|
|
echo "PKGBUILD _gsrev drifted from GAMESCOPE_REV in build-punktfunk-gamescope.sh" >&2
|
|
return 1
|
|
}
|
|
bash "${startdir}/build-punktfunk-gamescope.sh" \
|
|
--srcdir "${srcdir}/gamescope" \
|
|
--destdir "${srcdir}/stage" \
|
|
--prefix /usr \
|
|
--jobs "$(nproc)"
|
|
# The marker is the host's whole HDR detection (`gamescope_patch_level`) — a build that lost the
|
|
# stamp would install a package that promises nothing and says so nowhere.
|
|
"${srcdir}/stage/usr/bin/punktfunk-gamescope" --version 2>&1 | grep -q '+pfhdr' || {
|
|
echo "built binary carries no +pfhdr marker" >&2
|
|
return 1
|
|
}
|
|
}
|
|
|
|
package() {
|
|
# ONLY the compositor, under our own name: a full `meson install` would also lay down
|
|
# gamescopectl / gamescopereaper / gamescopestream and the WSI layer, colliding file-for-file
|
|
# with the distro's `gamescope` package. The host only ever execs the compositor.
|
|
install -Dm755 "${srcdir}/stage/usr/bin/punktfunk-gamescope" \
|
|
"${pkgdir}/usr/bin/punktfunk-gamescope"
|
|
install -Dm644 gamescope/LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
|
|
}
|