# 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"
}
