38b7507440
Three changes to make a reproducible Fedora KDE host install: - ci/fedora-rpm.Dockerfile: parameterize the Fedora base (ARG FEDORA_VERSION, default 43) so the same builder produces the Bazzite (F43, libavcodec.so.61) and Fedora 44 (libavcodec.so.62) RPMs. A binary RPM is soname-coupled to its base, so each target Fedora needs its own build/channel. - spec: install punktfunk-kde-session.service (was in the tree but never packaged) with its ExecStart repointed from the dev source tree to the installed run-headless-kde.sh. This is the headless `kwin --virtual` session (KWIN_WAYLAND_NO_PERMISSION_CHECKS=1) the kwin backend needs — an interactive Plasma session refuses to hand its privileged zkde_screencast protocol to an external client, so a dedicated session is required. Not enabled by default (kwin hosts opt in). - ship packaging/kde/host.env as host.env.kde — the ready KWin appliance config (wayland-kde). Validated live on a Fedora 44 KDE box (RTX 4090): KWin virtual output + zero-copy dmabuf->CUDA->NVENC. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
57 lines
3.5 KiB
Docker
57 lines
3.5 KiB
Docker
# CI builder for the punktfunk RPM. The Fedora version is parameterized so one Dockerfile
|
|
# serves every target whose ffmpeg soname must match: Fedora 43 == Bazzite's base (group
|
|
# "bazzite"), Fedora 44 == the Fedora KDE spin (group "fedora-44"). The RPM's auto-generated
|
|
# library Requires (e.g. libavcodec.so.NN) pin to exactly what the chosen base — and thus the
|
|
# target — ships. Used by .gitea/workflows/rpm.yml; built+pushed by .gitea/workflows/docker.yml.
|
|
#
|
|
# docker build --build-arg FEDORA_VERSION=43 -f ci/fedora-rpm.Dockerfile -t punktfunk-fedora-rpm ci
|
|
# docker build --build-arg FEDORA_VERSION=44 -f ci/fedora-rpm.Dockerfile -t punktfunk-fedora44-rpm ci
|
|
#
|
|
# Mirrors ci/rust-ci.Dockerfile (the Ubuntu workspace builder) for the rpmbuild side.
|
|
ARG FEDORA_VERSION=43
|
|
FROM fedora:${FEDORA_VERSION}
|
|
|
|
# RPM Fusion (free + nonfree) provides the NVENC-capable ffmpeg-devel the host links against.
|
|
RUN dnf -y install \
|
|
"https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm" \
|
|
"https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm" \
|
|
&& dnf -y install \
|
|
# rpmbuild + source-tarball tooling; nodejs runs the Gitea Actions JS (checkout/cache)
|
|
rpm-build rpmdevtools systemd-rpm-macros git tar gzip nodejs \
|
|
# build toolchain + bindgen
|
|
gcc gcc-c++ clang clang-devel cmake nasm pkgconf-pkg-config curl ca-certificates \
|
|
# ffmpeg (NVENC), capture/audio/display link deps
|
|
ffmpeg-devel pipewire-devel wayland-devel libxkbcommon-devel opus-devel \
|
|
mesa-libGL-devel mesa-libgbm-devel \
|
|
# punktfunk-client link deps (GTK4 shell + SDL3 gamepads)
|
|
gtk4-devel libadwaita-devel SDL3-devel \
|
|
&& dnf clean all
|
|
|
|
# libcuda link stub — the zerocopy path links a fixed set of cuXxx driver symbols, but CI has
|
|
# no GPU and never RUNS CUDA. Rather than drag in the NVIDIA userspace stack, synthesize a stub
|
|
# libcuda.so.1 that just defines those symbols (the SAME approach the Ubuntu image takes with the
|
|
# real driver lib, minus the driver). On Bazzite the real driver provides libcuda.so.1 at runtime.
|
|
# The symbol list is `nm -D --undefined-only` of the built host binary; a new cu* call would fail
|
|
# the link with a clear "undefined reference", flagging this list to update.
|
|
RUN set -eux; : > /tmp/cuda_stub.c; \
|
|
for s in cuCtxCreate_v2 cuCtxSetCurrent cuCtxSynchronize cuDestroyExternalMemory \
|
|
cuDeviceGet cuExternalMemoryGetMappedBuffer cuGraphicsGLRegisterImage \
|
|
cuGraphicsMapResources cuGraphicsSubResourceGetMappedArray cuGraphicsUnmapResources \
|
|
cuGraphicsUnregisterResource cuImportExternalMemory cuInit cuMemAllocPitch_v2 \
|
|
cuMemcpy2D_v2 cuMemFree_v2; do \
|
|
echo "int $s(void){return 0;}" >> /tmp/cuda_stub.c; \
|
|
done; \
|
|
gcc -shared -fPIC -Wl,-soname,libcuda.so.1 -o /usr/lib64/libcuda.so.1 /tmp/cuda_stub.c; \
|
|
ln -sf libcuda.so.1 /usr/lib64/libcuda.so; \
|
|
rm -f /tmp/cuda_stub.c; ldconfig; test -e /usr/lib64/libcuda.so
|
|
|
|
# Rustup (not Fedora's packaged rust) so rust-toolchain.toml's pinned channel resolves, matching
|
|
# the Ubuntu builder. Shared location so jobs running as any uid can use it.
|
|
ENV RUSTUP_HOME=/usr/local/rustup \
|
|
CARGO_HOME=/usr/local/cargo \
|
|
PATH=/usr/local/cargo/bin:$PATH
|
|
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
|
| sh -s -- -y --no-modify-path --profile minimal \
|
|
&& chmod -R a+w "$RUSTUP_HOME" "$CARGO_HOME" \
|
|
&& rustc --version && cargo --version
|