CI: Linux bundle built in the Steam Runtime sniper container (glibc floor 2.38 -> 2.31), SDL2 2.30.0 from source (D572)

This commit is contained in:
James Dansereau committed 2026-10-07 08:39:34 -04:00
1 parent 1d75c4c849
commit 9f1cfe909e
5 files changed
+65 -18

No files matched your search

+2 -2
View File
@@ -127,7 +127,8 @@ and controller-only sessions.
Each contains the engine executable, a README, license texts, and the
one-time asset tool. **No ROM, no game assets.** The Windows bundle carries
its runtime DLLs and the Linux bundle carries SDL2, so nothing needs to be
installed first.
installed first. The Linux bundle runs on glibc 2.31 or newer (Ubuntu 20.04+,
Debian 11+, SteamOS).
### Running it
@@ -157,7 +158,6 @@ Full steps, controls and troubleshooting are in the bundled `README.md`.
| Issue | Impact | Workaround |
|---|---|---|
| PAL and JP ROMs aren't supported in release packages | NTSC-U only | Use an NTSC-U ROM. Both regions convert, build and boot from source; packaging is still open |
| The Linux tarball needs glibc 2.38 or newer | Won't start on older distros (Ubuntu 22.04, Debian 12, Fedora 38 and earlier) | Use a newer distro, or build from source |
| Changing aspect ratio inside a level can briefly glitch the gun/hand model, rarely | Cosmetic, one-off | Change the ratio from the front-end PC Options, or accept it |
| No macOS or ARM builds | Platform | — |
| Saves from v0.4.0 and earlier can hold fake unlocks from `All unlocked` | Save data | Not repaired automatically. Since v0.5.0 the option never writes the save; keep a backup of `data/ge007.eep` from before you used it |
+40 -14
View File
@@ -171,21 +171,32 @@ jobs:
# here is a "does it compile + link" signal only, not a runtime claim.
# Not a required check yet; flip it to required once it is reliably green.
#
# Toolchain: ubuntu-24.04 + gcc-14. The port is developed on MinGW GCC 16;
# pinning a recent GCC here keeps the first bring-up focused on real
# portability gaps rather than a decade of accumulated old-GCC pedantry.
# (A "does it build on the GCC a typical distro ships" pass can come later.)
# Toolchain: Steam Runtime 3 "sniper" SDK container (Debian 11 base,
# glibc 2.31) + its gcc-14. Building against the old glibc is what sets the
# tarball's floor: the ubuntu-24.04 build needed glibc 2.38 (C23
# __isoc23_* symbols), so it refused to start on Ubuntu 22.04 / Debian 12.
# The image is pinned by version AND digest.
# SDL2 is built from source (2.30.0, the version the 24.04 build bundled
# and every Linux/Deck test used): the SDK's own libSDL2 is sdl2-compat,
# which needs SDL3 at runtime. pip is bootstrapped from a hash-pinned
# get-pip.py: Debian 11's security archive no longer serves python3-pip.
linux-build:
runs-on: ubuntu-24.04
container:
image: registry.gitlab.steamos.cloud/steamrt/sniper/sdk:3.0.20260805.254768@sha256:1c33c507bc75d012e77df5727f93b0d5b8c3f7c8d4142ba5f7a16882cc92e014
env:
CC: gcc-14
CXX: g++-14
# CMakeLists.txt opt-in enables CMAKE_{C,CXX}_COMPILER_LAUNCHER=ccache
# when ccache is on PATH (b4de1c68, speed-ups plan Step 5). Game
# sources are frozen (1:1 with the decomp), so after the first run only
# touched port/ files miss cache -- near-total hit rate.
CCACHE_DIR: ${{ github.workspace }}/.ccache
# touched port/ files miss cache -- near-total hit rate. CCACHE_DIR is
# set in a step: in a container job ${{ github.workspace }} is the
# host path, not the container's.
CCACHE_MAXSIZE: 500M
SDL2_VERSION: 2.30.0
SDL2_SHA256: 36e2e41557e0fa4a1519315c0f5958a87ccb27e25c51776beb6f1239526447b0
GET_PIP_SHA256: 95c0ae79ccf9ac1e47e4187f49081d6ae1f45997afd4549e14f37337cbcfd766
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
@@ -193,18 +204,33 @@ jobs:
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential gcc-14 g++-14 cmake python3 \
python3-pip libsdl2-dev zlib1g-dev libgl1-mesa-dev ccache patchelf
echo "CCACHE_DIR=$GITHUB_WORKSPACE/.ccache" >> "$GITHUB_ENV"
apt-get update
apt-get install -y patchelf
curl -fsSL -o /tmp/get-pip.py https://bootstrap.pypa.io/pip/3.9/get-pip.py
echo "$GET_PIP_SHA256 /tmp/get-pip.py" | sha256sum -c
python3 /tmp/get-pip.py --quiet
- name: Build SDL2 ${{ env.SDL2_VERSION }} from source
run: |
curl -fsSL -o /tmp/sdl2.tar.gz \
"https://github.com/libsdl-org/SDL/releases/download/release-$SDL2_VERSION/SDL2-$SDL2_VERSION.tar.gz"
echo "$SDL2_SHA256 /tmp/sdl2.tar.gz" | sha256sum -c
tar xzf /tmp/sdl2.tar.gz -C /tmp
cmake -S "/tmp/SDL2-$SDL2_VERSION" -B /tmp/sdl-build -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local -DSDL_STATIC=OFF -DSDL_TEST=OFF
cmake --build /tmp/sdl-build -j"$(nproc)"
cmake --install /tmp/sdl-build
ldconfig
- name: Restore ccache
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ${{ env.CCACHE_DIR }}
key: ccache-linux-${{ hashFiles('CMakeLists.txt') }}-${{ github.sha }}
path: .ccache
key: ccache-linux-sniper-${{ hashFiles('CMakeLists.txt') }}-${{ github.sha }}
restore-keys: |
ccache-linux-${{ hashFiles('CMakeLists.txt') }}-
ccache-linux-
ccache-linux-sniper-${{ hashFiles('CMakeLists.txt') }}-
ccache-linux-sniper-
- name: Regenerate ROM-asset symbol file (US)
run: python3 scripts/gen_romassets.py u
@@ -217,7 +243,7 @@ jobs:
- name: Freeze asset converter (PyInstaller)
run: |
python3 -c "import PyInstaller, sys; sys.exit(PyInstaller.__version__ != '6.22.3')" 2>/dev/null \
|| python3 -m pip install --quiet --break-system-packages pyinstaller==6.22.3
|| python3 -m pip install --quiet pyinstaller==6.22.3
python3 -m PyInstaller --onefile --noconfirm --clean \
--name ge007-convert \
--distpath tools_pc/dist/prepare-assets \
+2 -2
View File
@@ -92,8 +92,8 @@ project is as much a study of that process as it is a port. See
download carries its own runtime libraries and the one-time asset tool (no
Python, no emulator).
**Linux / Steam Deck:** 64-bit x86 Linux with glibc 2.38 or newer (Ubuntu
24.04+, Fedora 39+, Debian 13+, current SteamOS or Arch). SDL2 is bundled, so
**Linux / Steam Deck:** 64-bit x86 Linux with glibc 2.31 or newer (Ubuntu
20.04+, Debian 11+, Fedora 32+, SteamOS). SDL2 is bundled, so
the tarball runs as-is; it sideloads onto a Steam Deck with nothing installed.
**Both:** a GPU with OpenGL 3.0 drivers (practically any PC GPU from the last
+1
View File
@@ -314,6 +314,7 @@ D568,FIXED,F10 dropdown popup drawn empty and misplaced for a long list on a mid
D569,?,Crosshair color follows the PD port:,CHANGED 2026-10-06 (maintainer request; old presets migrate to Custom RGB)
D570,FIXED,Scaled crosshair (Crosshair size != 100%) showed a faint copy of the top bar's tip under the bottom bar (WRAP tile flags) —,FIXED 2026-10-06 (port only:
D571,?,"Project icon restyled to the in-game sight red as pixel art (exe, window, favicon) —",CHANGED 2026-10-06 (maintainer request; make_icon.py; social preview unchanged)
D572,?,Linux tarball glibc floor lowered from 2.38 to 2.31:,CHANGED 2026-10-07 (maintainer request; packaging only; X220 glibc 2.36 fresh install PASS)
D407,CLOSED,Tanks cannot be boarded/exited on PC —,CLOSED (2026-09-28 bookkeeping:
D408,FIXED,Game.SkipIntro skips the post-mission failure dossier:,FIXED 2026-09-30 (SkipIntro hook gated to first boot; live dossier check owed).
D415,FIXED,"Shooting a light fixture does not ""kill"" its flickering light (Bunker, Caverns):",FIXED (2026-09-29 bookkeeping:
1 # GENERATED by tools_pc/gen_findings_index.py -- do not hand-edit.
314 D569
315 D570
316 D571
317 D572
318 D407
319 D408
320 D415
+20
View File
@@ -722,6 +722,7 @@ covers D24–D69; the log continues in §H (D32 procedure, D70–D121).
| D569 | **Crosshair color follows the PD port: Original or Custom RGB, left/right stepper, 0-255 sliders** — full `## D569` entry at file tail | CHANGED 2026-10-06 (maintainer request; old presets migrate to Custom RGB) |
| D570 | **Scaled crosshair (Crosshair size != 100%) showed a faint copy of the top bar's tip under the bottom bar (WRAP tile flags)** — full `## D570` entry at file tail | FIXED 2026-10-06 (port only: CLAMP when scaled in `gunDrawSight` + F10 pointer; 100% unchanged, Dam gate PASS) |
| D571 | **Project icon restyled to the in-game sight red as pixel art (exe, window, favicon)** — full `## D571` entry at file tail | CHANGED 2026-10-06 (maintainer request; make_icon.py; social preview unchanged) |
| D572 | **Linux tarball glibc floor lowered from 2.38 to 2.31: CI builds in the Steam Runtime sniper container with SDL2 2.30.0 from source** — full `## D572` entry at file tail | CHANGED 2026-10-07 (maintainer request; packaging only; X220 glibc 2.36 fresh install PASS) |
| D407 | **Tanks cannot be boarded/exited on PC — the v0.4.0 use/reload split (D378/D393) removed the B-button tap the engine's tank handlers in `bondview2.c` consume (user report 2026-09-28, Runway/Streets)** — full `## D407` entry at file tail | **CLOSED (2026-09-28 bookkeeping: tank board/exit accepted by the user; shipped in v0.4.0).** Earlier: PARTIAL (fix landed in v0.4.0, port-only): present `GE_CONT_B` on the use (E / pad A) rising edge only while `g_PlayerIsInTank == 1` or `g_BondCanEnterTank != 0`; E keeps its D378 no-reload-fallback semantics elsewhere, N64 layout unaffected. D407(b) same cycle: front PC Options page-edge highlight clamp + mouse-wheel / W-S paging (wheel queue consumed on the menu, D223); its wheel mapping shipped inverted and was fixed to match W/S (wheel up = step up). D407(c): board-animation lockout, menu-accept B gate in tank states, in-tank aim routed through the legacy velocity stick + `Input.TankAimScale` knob. RESOLVED 2026-09-28: all port-only (src/game zero-diff), 10 TANKDBG probes stripped, release binary verified clean, user live tank drive signed off (board + exit OK, aim feel good). |
| D408 | **`Game.SkipIntro` skips the post-mission failure dossier: with it on, entering a level then aborting (watch Z+A) or dying (KIA) returns straight to the menus — no REPORT / "Mission status: KILLED IN ACTION / ABORTED" screen** (user report 2026-09-28; save/AllUnlocked ruled out) — full `## D408` entry at file tail | FIXED 2026-09-30 (SkipIntro hook gated to first boot; live dossier check owed). |
| D415 | **Shooting a light fixture does not "kill" its flickering light (Bunker, Caverns): the fixture takes the hit but the flicker keeps going (community report, issue #87 comment by the reporter, 2026-09-28, 00 Agent playthrough of v0.4.0).** — full `## D415` entry at file tail | FIXED (2026-09-29 bookkeeping: root-caused and fixed as D430 + D431, user-verified vs GEPD/1964 on Caverns 2026-09-29; #119). Earlier: ROOT-CAUSED as D430 (see there); fix in tree, live check owed. |
@@ -18390,3 +18391,22 @@ capture data). Outputs regenerated: exe `.ico`, `docs/favicon.ico` (byte copy),
`docs/img/icon/ge007-icon.png`, `port/fast3d/ge007_icon.h` (now written with LF).
`--check` passes; two runs byte-identical. The social preview card is unchanged
(maintainer decision).
## D572: Linux tarball glibc floor 2.38 -> 2.31 (Steam Runtime sniper build) — CHANGED 2026-10-07 (maintainer request)
The `linux-build` CI job built on `ubuntu-24.04`, so the game and its bundled
SDL linked GCC's C23 `__isoc23_strtol`/`__isoc23_sscanf` redirects
(`GLIBC_2.38`): the release tarball refused to start on Ubuntu 22.04, Debian 12,
Fedora 38 and older (seen on the X220, Fedora 37 / glibc 2.36). The job now runs
in the Steam Runtime 3 "sniper" SDK container (Debian 11, glibc 2.31), pinned by
version + digest, with the SDK's gcc-14 (same compiler as before). Two SDK
gaps: its `libSDL2-2.0.so.0` is sdl2-compat (aborts with "Failed loading SDL3
library" unless SDL3 is shipped too), so SDL2 2.30.0 — the version the 24.04
build bundled and every Linux/Deck test ran — is built from the hash-pinned
upstream tarball (X11, Wayland+libdecor, PipeWire, Pulse, ALSA, udev, HIDAPI,
D-Bus/IBus all compiled in, dynamically loaded); and Debian 11's security archive
no longer serves `python3-pip`, so pip comes from a hash-pinned `get-pip.py`
(PyInstaller 6.22.3 supports the SDK's Python 3.9). Result: game `GLIBC_2.29`,
SDL `GLIBC_2.4`, `ge007-convert` built against 2.31. Verified: the container
build run by hand on the X220 (podman) — fresh install there (ROM only ->
converter -> boot -> clean quit, exit 0). No source changes; packaging only.