From 88ac2fc3f22911d695e74b708cc092adf70fc6c2 Mon Sep 17 00:00:00 2001 From: Tachikoma Date: Mon, 3 Aug 2026 16:17:41 -0400 Subject: [PATCH] Install the build dependencies CI has been missing since run #2 Every job in ci.yaml has failed on every run since #2, on main and on every branch, for two reasons that have nothing to do with any of the code under test. moreutils, for errno(1). deps/libakerror/scripts/generrno.sh shells out to it to generate its errno name table and to stamp AKERR_LAST_ERRNO_VALUE into the generated akerror.h. The runner does not have it, and its absence does not fail the build -- which is what made this expensive to find. The script prints "errno: command not found", emits an empty akerr_init_errno() so no errno ever gets a name, and substitutes an empty AKERR_LAST_ERRNO_VALUE, so every code in libakerror's reserved band collapses from (134 + n) to ( + n), i.e. to n. AKERR_OUTOFBOUNDS is (AKERR_LAST_ERRNO_VALUE + 2) and therefore becomes literally 2, so ERR(2) answers "Out Of Bounds Error" where ENOENT's "No such file or directory" belongs. That is the docs_examples failure at docs/15-error-codes.md:105, and it took cmake_build, sanitizers and coverage down with it; mutation_test then aborted on "baseline is not green" because the same suite is its baseline. Reproduced locally by shimming errno(1) out of PATH: identical failure, same test #47, same two lines of diff. With errno present the suite is 112/112. The nine X11 dev packages, for akgl_build, which has never once been green. SDL_X11 and its sub-options default ON on Linux, and CheckX11() calls SDL_missing_dependency() -- a hard CMake error, not a downgrade -- for any whose header is absent. The runner has libx11-dev but none of the extension packages, so configuration stopped at the first of them: "Couldn't find dependency package for XCURSOR". The list is SDL's own, from deps/SDL/docs/README-linux.md, reduced to the X11 entries; the audio, Wayland, KMSDRM and Vulkan backends all degrade to "not found" and skip themselves rather than erroring, so they cost nothing to leave out. Turning the missing options OFF would also configure and is the wrong answer -- the point of that job is that an AKGL build is a real SDL program. The tests still run headless under SDL_VIDEODRIVER=dummy. release.yaml's full_mutation job builds the same tree and gets moreutils for the same reason. No source file changes. The port itself was never the problem. Co-Authored-By: Claude Opus 5 (1M context) --- .gitea/workflows/ci.yaml | 48 ++++++++++++++++++++++++++++++----- .gitea/workflows/release.yaml | 6 ++++- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index fc901c4..f260604 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -26,10 +26,24 @@ jobs: # skipped for the same reason: our CMakeLists declares akerror::akerror # first and libakstdlib guards on if(NOT TARGET ...). submodules: true + # moreutils is load-bearing, not incidental: it supplies errno(1), which + # deps/libakerror/scripts/generrno.sh shells out to at build time to + # generate its errno name table and to stamp AKERR_LAST_ERRNO_VALUE into + # the generated akerror.h. + # + # Its absence does not fail the build, which is what made this expensive to + # find. The script prints "errno: command not found" twice, emits an empty + # akerr_init_errno() so no errno ever gets a name, and substitutes an empty + # AKERR_LAST_ERRNO_VALUE -- so every code in libakerror's reserved band + # collapses from (134 + n) to ( + n), i.e. to n. AKERR_OUTOFBOUNDS is + # (AKERR_LAST_ERRNO_VALUE + 2), so it becomes literally 2, and ERR(2) + # answers "Out Of Bounds Error" where ENOENT's "No such file or directory" + # belongs. That is the docs_examples failure at docs/15-error-codes.md:105 + # that this job carried on every run since #2. - name: dependencies run: | sudo apt-get update -y - sudo apt-get install -y cmake gcc + sudo apt-get install -y cmake gcc moreutils - name: build run: | cmake -S . -B build @@ -74,7 +88,7 @@ jobs: - name: dependencies run: | sudo apt-get update -y - sudo apt-get install -y cmake gcc + sudo apt-get install -y cmake gcc moreutils # The whole suite under ASan and UBSan, golden files included. This is the # gate libakstdlib's TODO.md section 1 calls its highest-value missing item # -- worth having here from the start, because this library is all fixed @@ -98,7 +112,7 @@ jobs: - name: dependencies run: | sudo apt-get update -y - sudo apt-get install -y cmake gcc gcovr + sudo apt-get install -y cmake gcc gcovr moreutils # The gate is a ratchet, not a target: src/ sits at 94.6% of lines and # 98.6% of functions, so 90 fails on a real regression (a test deleted, or # new untested code added) without tripping over rounding. @@ -172,11 +186,33 @@ jobs: # for deps/SDL_ttf/external/freetype, which the checkout above # deliberately does not clone. Installing two dev packages is much cheaper # than cloning freetype and harfbuzz. + # + # The X11 dev packages are the other half, and they are what this job has + # been dying on since run #2 -- it has never once been green. SDL_X11 and + # its nine sub-options default ON on Linux, and CheckX11() in + # deps/SDL/cmake/sdlchecks.cmake calls SDL_missing_dependency() -- a hard + # CMake error, not a downgrade -- for any one of them whose header is + # absent. The runner image carries libx11-dev (X11/XKBlib.h resolved) but + # none of the extension packages, so configuration stopped at the first of + # the nine: "Couldn't find dependency package for XCURSOR". + # + # Turning the missing ones OFF would also configure, and is the wrong + # answer: the point of this job is that an AKGL build is a real SDL + # program, and a real SDL program on Linux builds the X11 backend. The + # tests still run headless under SDL_VIDEODRIVER=dummy -- see the env block + # below -- so this buys a faithful build, not a display. + # + # The list is SDL's own, from deps/SDL/docs/README-linux.md, reduced to the + # X11 entries: the audio, Wayland, KMSDRM and Vulkan backends all degrade + # to "not found" and skip themselves rather than erroring, so they cost + # nothing to leave out. Nine packages, all in noble. - name: dependencies run: | sudo apt-get update -y - sudo apt-get install -y cmake gcc g++ pkg-config \ - libfreetype-dev libharfbuzz-dev + sudo apt-get install -y cmake gcc g++ pkg-config moreutils \ + libfreetype-dev libharfbuzz-dev \ + libx11-dev libxext-dev libxcursor-dev libxi-dev libxfixes-dev \ + libxrandr-dev libxss-dev libxtst-dev libxkbcommon-dev # The akgl-backed half: the text sink and the graphics, audio and input # backends, the standalone SDL frontend, and the two suites that drive # them against a real software renderer and read the pixels back. @@ -256,7 +292,7 @@ jobs: - name: dependencies run: | sudo apt-get update -y - sudo apt-get install -y cmake gcc python3 + sudo apt-get install -y cmake gcc python3 moreutils # Verify the tests actually catch bugs: break the library many ways and # confirm the suite fails. This matters more here than in an ordinary C # library, because the akerror control-flow macros expand at their call diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index dac235e..f2e6537 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -70,10 +70,14 @@ jobs: # corpus is part of what kills mutants and it is checked in now, so # that is libakerror and libakstdlib and nothing else. submodules: true + # moreutils for errno(1), which deps/libakerror's scripts/generrno.sh needs + # to generate its errno table. Without it the generated table is empty and + # every AKERR_* code collapses onto a low integer -- see the long note on + # ci.yaml's cmake_build job for what that breaks and how it presents. - name: dependencies run: | sudo apt-get update -y - sudo apt-get install -y cmake gcc python3 + sudo apt-get install -y cmake gcc python3 moreutils # The whole akbasic-owned src/ tree. ci.yaml runs a two-file subset on every # push; this is the one that actually covers the interpreter. #