From 39869031be1edcb891a18e3b4c1186510033dae9 Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Sun, 9 Aug 2026 09:22:20 +0200 Subject: [PATCH] fix(ci): the gamescope RPM and .deb never built, and a warning let the tag ship anyway MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v0.26.0's notes and docs-site say the patched gamescope is now installable on Fedora and on Debian/Ubuntu. Neither package exists on the release. Both builds failed inside best-effort steps that emit `::warning::` and return 0, so every job stayed green and the only evidence was a warning nobody reads. Arch built fine, which is why it is the sole gamescope package attached. Two distinct missing build deps, same root cause: `dnf builddep gamescope` / `apt-get build-dep gamescope` resolve the DISTRO'S OLDER PACKAGED gamescope, which does not need what the pinned master tree needs. Fedora (f43 AND f44) /usr/sbin/ld: cannot find -lstdc++ have you installed the static version of the stdc++ library ? ERROR: Compiler sccache c++ cannot compile programs. build-punktfunk-gamescope.sh appends `-static-libstdc++ -static-libgcc` to LDFLAGS deliberately, so the binary still starts on SteamOS's older libstdc++. Without libstdc++-static that trips meson's very FIRST sanity check, so nothing builds at all. Debian/Ubuntu noble protocol/meson.build:7:17: ERROR: Neither a subproject directory nor a wayland-protocols.wrap file was found. The tree carries no wrap fallback for wayland-protocols. Both proven deps are installed WITHOUT `|| true` so a rename is loud. The remaining Arch makedepends the older packaged gamescope may not pull (glm, cmake, libXcursor, wayland-protocols-devel on Fedora) stay best-effort, since meson finds fallbacks and a name that moves between releases should not fail the job. And the part that actually matters: on `refs/tags/v*` a missing gamescope is now an ERROR, not a warning. A release must not be able to make a claim its own CI silently dropped. Gated in two places per platform — the build step, and the packaging step that is authoritative and also covers the cache path (the build step is skipped entirely on a cache hit, so a stale cache would otherwise reach packaging and skip in silence). Canary keeps the old best-effort behaviour. Deliberately NOT gated: the sysext leg. The notes make no claim about gamescope inside the sysext, and with the build fixed gs-cache is populated so it gets the binary anyway — gating it would add release-blocking risk with no matching promise. ⚠ Verification is CI itself: both YAML files parse, and every gamescope-touching `run:` block is `bash -n` clean with the matrix placeholders substituted. The dep names cannot be proven from macOS; the rpm and deb legs on the next tag are the proof, and they are now hard-gated, so a wrong name fails loudly instead of shipping another empty promise. --- .gitea/workflows/deb.yml | 28 ++++++++++++++++++++++++++++ .gitea/workflows/rpm.yml | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/.gitea/workflows/deb.yml b/.gitea/workflows/deb.yml index 2e95f73c..ea349dff 100644 --- a/.gitea/workflows/deb.yml +++ b/.gitea/workflows/deb.yml @@ -344,10 +344,31 @@ jobs: apt-get update apt-get install -y --no-install-recommends meson ninja-build glslc git || true apt-get build-dep -y gamescope || true + # NOT best-effort. `build-dep gamescope` resolves the distro's much older packaged + # gamescope — where noble has one at all — so it misses what the master tree needs, and + # wayland-protocols is the gap that actually stops the build: meson dies in + # protocol/meson.build with "Neither a subproject directory nor a wayland-protocols.wrap + # file was found", because the tree has no wrap fallback for it. That is what happened on + # the v0.26.0 tag: the step warned and skipped, the job stayed green, and the release + # shipped with no gamescope .deb while the notes said it had one. + apt-get install -y --no-install-recommends wayland-protocols + # The remaining Arch makedepends the older packaged gamescope does not necessarily pull. + # Best-effort: meson falls back or does without, and a name that moves between Ubuntu + # releases should not fail the job. (No libstdc++ static package is needed here — g++ + # ships libstdc++.a, which is why only Fedora tripped the sanity check.) + apt-get install -y --no-install-recommends libglm-dev cmake libxcursor-dev || true if bash packaging/gamescope/build-punktfunk-gamescope.sh \ --destdir "$PWD/gs-stage" --prefix /usr --jobs "$(nproc)"; then install -Dm0755 gs-stage/usr/bin/punktfunk-gamescope gs-cache/punktfunk-gamescope else + # Best-effort on canary, HARD on a stable tag — same reasoning as rpm.yml. A warning + # here is what let v0.26.0 promise an apt-installable gamescope that was never built. + case "$GITHUB_REF" in + refs/tags/v*) + echo "::error::punktfunk-gamescope failed to build on noble — a stable tag must not ship without it (the release notes and docs-site say it is installable)" + exit 1 + ;; + esac echo "::warning::punktfunk-gamescope failed to build on noble — no .deb this run (gamescope sessions stay SDR)" fi @@ -357,6 +378,13 @@ jobs: if [ -x gs-cache/punktfunk-gamescope ] && gs-cache/punktfunk-gamescope --version >/dev/null 2>&1; then bash packaging/debian/build-gamescope-deb.sh --binary gs-cache/punktfunk-gamescope else + # Authoritative, and covers the cache path the build step skips — same as rpm.yml. + case "$GITHUB_REF" in + refs/tags/v*) + echo "::error::no usable punktfunk-gamescope — a stable tag must not ship without its .deb" + exit 1 + ;; + esac echo "::warning::no usable punktfunk-gamescope — skipping its .deb" fi diff --git a/.gitea/workflows/rpm.yml b/.gitea/workflows/rpm.yml index 675395c6..507bcab0 100644 --- a/.gitea/workflows/rpm.yml +++ b/.gitea/workflows/rpm.yml @@ -206,10 +206,33 @@ jobs: dnf -y install dnf-plugins-core meson ninja-build glslc || true dnf builddep -y gamescope || true dnf -y install xorg-x11-server-Xwayland-devel || true + # NOT best-effort: build-punktfunk-gamescope.sh appends `-static-libstdc++` to LDFLAGS + # (so the binary still starts on SteamOS's older libstdc++ — see its comment), and + # without the static library meson's very FIRST sanity check dies with + # "cannot find -lstdc++ / have you installed the static version", so nothing builds at + # all. That is what happened on the v0.26.0 tag: both Fedora bases warned and skipped, + # the job stayed green, and the release shipped with no gamescope RPM while the notes + # said it had one. A rename here must be LOUD, hence no `|| true`. + dnf -y install libstdc++-static + # The rest of the Arch package's makedepends that Fedora's older packaged gamescope does + # not necessarily pull. Best-effort: unlike the static runtime, meson finds fallbacks or + # does without, and a name that moves between Fedora releases should not fail the job. + dnf -y install wayland-protocols-devel glm-devel cmake libXcursor-devel || true if bash packaging/gamescope/build-punktfunk-gamescope.sh \ --destdir "$PWD/gs-stage" --prefix /usr --jobs "$(nproc)"; then install -Dm0755 gs-stage/usr/bin/punktfunk-gamescope gs-cache/punktfunk-gamescope else + # Best-effort on canary, HARD on a stable tag. A `::warning::` here is what let + # v0.26.0 publish release notes promising a Fedora gamescope package that did not + # exist: the step "succeeded", the job was green, and the only evidence was a warning + # nobody reads. A release must not be able to make a claim its own CI silently + # dropped, so on `refs/tags/v*` this is an error. + case "$GITHUB_REF" in + refs/tags/v*) + echo "::error::punktfunk-gamescope failed to build for f${{ matrix.fedver }} — a stable tag must not ship without it (the release notes and docs-site say it is installable)" + exit 1 + ;; + esac echo "::warning::punktfunk-gamescope failed to build for f${{ matrix.fedver }} — the sysext ships without it (gamescope sessions stay SDR)" fi @@ -227,6 +250,15 @@ jobs: --binary gs-cache/punktfunk-gamescope \ --release "$PF_RELEASE" else + # The authoritative "does this package exist" decision, and the one that also covers + # the cache path — the build step above is skipped entirely on a cache hit, so a stale + # or empty cache would otherwise reach here and skip in silence on a release. + case "$GITHUB_REF" in + refs/tags/v*) + echo "::error::no usable punktfunk-gamescope for f${{ matrix.fedver }} — a stable tag must not ship without its RPM" + exit 1 + ;; + esac echo "::warning::no usable punktfunk-gamescope for f${{ matrix.fedver }} — skipping its RPM" fi