From 1b28a7f7f1e7e82774e79dba42a4c36b6e65cb32 Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Fri, 14 Aug 2026 12:03:55 +0200 Subject: [PATCH] fix(ci): the gamescope deb image never needed x11-xcb until we started building the WSI layer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The v0.28.1 deb leg failed for real, and the package it costs is the whole punktfunk-gamescope .deb: gamescope/layer/meson.build:3:14: ERROR: Dependency "x11-xcb" not found, tried pkgconfig Not a flake and not the pin. v0.28.1 flipped `-Denable_gamescope_wsi_layer=true` in build-punktfunk-gamescope.sh (it was off before, on the recorded and false premise that the layer is version-independent of the compositor). The layer is a separate meson subdir with its own dependency set, and it wants x11-xcb — which the compositor never did. So an image that had been sufficient for every previous release stopped being sufficient the moment the layer started building, and nothing named the new dep anywhere. Debian is the only channel that has to name it: Arch's libx11 and Fedora's libX11-devel both ship x11-xcb.pc themselves, which is why arch.yml and rpm.yml build the same tree fine and only the trixie image came up short. Asserted as well as installed. The image already asserts the wayland-server floor at build time, on the argument that the one version deciding whether the image can do its job should fail loudly HERE rather than inside a deb.yml run — and this is the same class, only worse: a missing x11-xcb does not fail the compositor build, it fails the layer's, and the layer is the only route to an HDR10 swapchain for a nested game. Losing it silently produces a package that looks completely healthy and denies every game HDR, which is precisely the failure v0.28.1 exists to end. The assertion means the next dependency the layer grows fails at image build instead of mid-release. ORDERING, for whoever lands this: docker.yml rebuilds the image on a push to main (its key hashes the ci/ tree, so this change busts it), and deb.yml's gamescope job consumes `:latest`. Let the image publish before the deb job that needs it runs — on a release cut that means merging this, letting docker.yml finish, and only then pushing the tag. The failed job saved no cache, so the tag run rebuilds against the new image rather than restoring the broken state. NOT verified locally: no Docker on this machine, so the image was not built and the layer was not compiled here. The package name is confirmed against Debian's own package index (libx11-xcb-dev ships x11-xcb.pc, and exists in trixie), and the assertion added here is what proves it in CI — if the name were wrong the image build fails loudly instead of the deb leg failing quietly. --- ci/gamescope-trixie.Dockerfile | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ci/gamescope-trixie.Dockerfile b/ci/gamescope-trixie.Dockerfile index 113cf817..1a409bbf 100644 --- a/ci/gamescope-trixie.Dockerfile +++ b/ci/gamescope-trixie.Dockerfile @@ -51,6 +51,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libxdamage-dev libxcomposite-dev libxrender-dev libxext-dev libxxf86vm-dev \ libxtst-dev libx11-dev libxres-dev libxmu-dev libxcursor-dev libxi-dev \ libxfixes-dev libxkbcommon-dev libxkbcommon-x11-dev libcap-dev libdrm-dev \ + # x11-xcb is needed by the VULKAN WSI LAYER (layer/meson.build), not by the compositor — so it + # was not missed until v0.28.1 started building the layer beside the binary. Debian is the only + # channel that needs it named: Arch's libx11 and Fedora's libX11-devel both carry x11-xcb.pc + # themselves, while Debian splits it into its own -dev package. + libx11-xcb-dev \ libinput-dev libudev-dev libpipewire-0.3-dev libseat-dev libsdl2-dev \ libluajit-5.1-dev libavif-dev libdecor-0-dev hwdata libglm-dev libbenchmark-dev \ libvulkan-dev libxcb1-dev libxcb-composite0-dev libxcb-xfixes0-dev libxcb-res0-dev \ @@ -66,3 +71,13 @@ RUN set -eux; \ pkg-config --atleast-version=1.23.1 wayland-server \ || { echo "wayland-server $have < 1.23.1 — the vendored wlroots will not configure" >&2; exit 1; }; \ echo "wayland-server $have — OK" + +# The layer's own floor, asserted for the same reason: a missing x11-xcb does not fail the +# COMPOSITOR build, it fails `layer/meson.build` — and the layer is the only route to an HDR10 +# swapchain for a nested game, so losing it silently ships a package that looks healthy and denies +# every game HDR. This is exactly how v0.28.1's deb leg broke, one release after the layer was +# added; assert it here so the next dep the layer grows fails at image build, not mid-release. +RUN set -eux; \ + pkg-config --exists x11-xcb \ + || { echo "x11-xcb absent — the Vulkan WSI layer will not configure (need libx11-xcb-dev)" >&2; exit 1; }; \ + echo "x11-xcb $(pkg-config --modversion x11-xcb) — OK" -- 2.54.0