From 9f1cfe909e7ff9ec42d5614f5b1b188e74ac75bf Mon Sep 17 00:00:00 2001 From: James Dansereau <106631954+jkdansereau@users.noreply.github.com> Date: Wed, 7 Oct 2026 08:39:34 -0400 Subject: [PATCH] CI: Linux bundle built in the Steam Runtime sniper container (glibc floor 2.38 -> 2.31), SDL2 2.30.0 from source (D572) --- .github/release-notes.md | 4 +-- .github/workflows/ci.yml | 54 +++++++++++++++++++++++++++---------- README.md | 4 +-- docs/dev/findings-index.csv | 1 + docs/dev/findings.md | 20 ++++++++++++++ 5 files changed, 65 insertions(+), 18 deletions(-) diff --git a/.github/release-notes.md b/.github/release-notes.md index 8c5254c7..e56e369c 100644 --- a/.github/release-notes.md +++ b/.github/release-notes.md @@ -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 | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f19d3d6a..6448842f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 \ diff --git a/README.md b/README.md index e74120a3..cd3b4535 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/docs/dev/findings-index.csv b/docs/dev/findings-index.csv index e02d3ed6..cce883b3 100644 --- a/docs/dev/findings-index.csv +++ b/docs/dev/findings-index.csv @@ -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: diff --git a/docs/dev/findings.md b/docs/dev/findings.md index 75c85bca..d3400730 100644 --- a/docs/dev/findings.md +++ b/docs/dev/findings.md @@ -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.