Skip to content

Commit 2af3418

Browse files
mcpp 2026.9.26.1 as the measured client, and the graph's own Linux targets in the openkal measurement (#469)
Pins move, with no registration in this change (openkal-musl 0.19.2 and openkal-llvm-runtime 0.15.2 were registered in #467 and #468 and resolved from the published index before anything here named them): - validate.yml and openkal-compat.yml install mcpp 2026.9.26.1, and index.toml's latest_mcpp names it. min_mcpp does not move: the release changes no descriptor grammar. - tests/openkal/pins.toml: runtime 0.15.2 (which pins openkal-musl 0.19.2 exactly), mcpp 2026.9.26.1, and two targets, x86_64-linux-musl and aarch64-linux-musl. From mcpp 2026.9.26.1 a link over the graph's C library searches no host library directory (mcpp-community/mcpp#696); before it, a member's `-lm` on x86_64-linux-musl linked the host's glibc objects without a diagnostic. Neither target was measured here, which is why neither showed. - compat.py: a Linux image of the host's own architecture runs without a runner (`host_executes`), so x86_64-linux-musl is measured as run rather than `--no-run`; aarch64-linux-musl runs under qemu-aarch64, which the workflow now installs. Three selftest cases state the rule. - compat.libaio, compat.libdrm and compat.libinput: the comments that blamed `c_standard = "gnu11"` itself now name the defect (a dependency's own C standard was dropped up to mcpp 2026.9.25.1, mcpp-community/mcpp#695) and keep the `-D` spellings, which work under every engine this index admits. Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
1 parent d7872cc commit 2af3418

9 files changed

Lines changed: 109 additions & 29 deletions

File tree

‎.github/workflows/openkal-compat.yml‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ env:
3838
# run if this drifts from pins.toml. See the comment beside `mcpp` in
3939
# pins.toml for why this pin, not just validate.yml's, is gated by the
4040
# index floor.
41-
MCPP_VERSION: "2026.9.21.3"
41+
MCPP_VERSION: "2026.9.26.1"
4242
# CROSS-VALIDATION BEFORE A RELEASE, NOT AFTER IT.
4343
#
4444
# Empty in an ordinary run, so this measurement keeps using the RELEASED
@@ -140,16 +140,18 @@ jobs:
140140
# The Windows cross headers of the host are installed deliberately. A
141141
# graph that reached them would build differently with them present, so a
142142
# result that is the same here and on a runner without them is evidence
143-
# that the graph is closed. Wine runs the Windows members' tests.
144-
- name: Host headers the graph must not reach, and a runner for Windows
143+
# that the graph is closed. Wine runs the Windows members' tests, and
144+
# qemu-aarch64 the aarch64-linux-musl members' (tests/openkal/pins.toml).
145+
- name: Host headers the graph must not reach, and runners for Windows and aarch64
145146
if: steps.select.outputs.members != ''
146147
shell: bash
147148
run: |
148149
sudo apt-get update -qq
149-
sudo apt-get install -y -qq mingw-w64 wine64 > /dev/null
150+
sudo apt-get install -y -qq mingw-w64 wine64 qemu-user > /dev/null
150151
ls /usr/x86_64-w64-mingw32/include/windows.h
151152
command -v wine || sudo ln -s "$(command -v wine64)" /usr/local/bin/wine
152153
wine --version
154+
qemu-aarch64 --version | head -1
153155
154156
- name: The pins agree with this workflow
155157
if: steps.select.outputs.members != ''

‎.github/workflows/validate.yml‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,20 @@ env:
313313
# cache epoch moves from 3 to 4 in the same release, so the first run is cold.
314314
#
315315
# `index.toml` min_mcpp does not move: no descriptor grammar changed.
316-
MCPP_VERSION: "2026.9.25.1"
316+
# ── 2026-09-26: raised 2026.9.25.1 -> 2026.9.26.1 ─────────────────────────
317+
#
318+
# 2026.9.26.1 changes three things a member's build can see
319+
# (mcpp-community/mcpp#693-#696): a package's `c_standard` reaches that
320+
# package's own C units and no one else's; a link over a graph-supplied C
321+
# library searches no host library directory; and paths are held as UTF-8,
322+
# so a project in a directory whose name is not ASCII builds on Windows. The
323+
# three descriptors that spell `-D_GNU_SOURCE` because a dependency's
324+
# `gnu11` used to be dropped keep the define, which works under every engine
325+
# this index admits. The raise is the measurement of that on every member
326+
# and platform.
327+
#
328+
# `index.toml` min_mcpp does not move: no descriptor grammar changed.
329+
MCPP_VERSION: "2026.9.26.1"
317330

318331
jobs:
319332
lint:

‎docs/openkal-compat.md‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,15 @@ change can affect:
175175
Adding a member therefore measures that member, not the whole list. The
176176
workflow does not block a merge unless the comparison below is enabled.
177177

178-
The targets are `x86_64-linux-gnu` and `x86_64-windows-musl`. The Windows
179-
target is named for the C environment the graph presents there, which is
180-
musl's, not MinGW's. Results measured before 2026-09-23 are recorded as
181-
`x86_64-windows-gnu`, the name that target had then.
178+
The targets are `x86_64-linux-gnu`, `x86_64-windows-musl`, `x86_64-linux-musl`
179+
and `aarch64-linux-musl`. The Windows target is named for the C environment the
180+
graph presents there, which is musl's, not MinGW's. Results measured before
181+
2026-09-23 are recorded as `x86_64-windows-gnu`, the name that target had then.
182+
The two `linux-musl` targets joined on 2026-09-26, with mcpp 2026.9.26.1: a link
183+
over the graph's C library searches no host library directory from that release
184+
(mcpp-community/mcpp#696), and these are the targets where that link is the
185+
graph's own. `x86_64-linux-musl` runs on the host as it is, and
186+
`aarch64-linux-musl` runs under qemu-aarch64.
182187

183188
It installs the Windows cross toolchain's host headers on purpose. A build that
184189
reached the host's headers would change its result when they are present, so a

‎index.toml‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,12 @@
103103
# The pull request that moves validate.yml's pin to 2026.9.25.1 runs every
104104
# member on every platform with that release, which is what "known good"
105105
# means for this hint. The release changes no descriptor grammar.
106+
# ── 2026-09-26: latest_mcpp -> 2026.9.26.1, min_mcpp unchanged ─────────────
107+
#
108+
# Moved in the pull request that moves validate.yml's pin and the openkal
109+
# measurement's pin to 2026.9.26.1, which run every member on every platform
110+
# with it. The release changes no descriptor grammar.
106111
[index]
107112
spec = "1"
108113
min_mcpp = "2026.9.18.3"
109-
latest_mcpp = "2026.9.25.1"
114+
latest_mcpp = "2026.9.26.1"

‎pkgs/c/compat.libaio.lua‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222
-- `_body_io_syscall` macro), and `sigset_t` never arrives, so even the PUBLIC
2323
-- header fails to parse at `io_pgetevents(…, sigset_t *sigmask)`. Upstream
2424
-- never hits this because its Makefile compiles in the compiler's default gnu
25-
-- mode. Declaring `c_standard = "gnu11"` looks like the tidier fix and is a
26-
-- trap: mcpp 2026.8.27.2 accepts the string and still emits `-std=c11`
27-
-- (verified in the emitted compile_commands.json), so the build fails exactly
28-
-- as if nothing had been declared. The define is the spelling that actually
29-
-- takes effect.
25+
-- mode. `c_standard = "gnu11"` is the declaration upstream's build implies,
26+
-- and mcpp up to 2026.9.25.1 did not apply it to a package in the dependency
27+
-- position: the root's value reached every C unit of the graph and a
28+
-- dependency's own was dropped, so the build failed exactly as if nothing had
29+
-- been declared (verified in the emitted compile_commands.json under
30+
-- 2026.8.27.2). mcpp 2026.9.26.1 applies it (mcpp-community/mcpp#695); the
31+
-- define stays because it works under every engine this index admits.
3032
--
3133
-- Two further GNU-isms ride along and are fine under plain `-std=c11` because
3234
-- gcc/clang only diagnose them under -pedantic: `syscall.h`'s named-variadic

‎pkgs/c/compat.libdrm.lua‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,11 @@ package = {
110110
import_std = false,
111111
c_standard = "c11",
112112

113-
-- `c_standard = "gnu11"` is accepted and silently emits -std=c11, so
114-
-- _GNU_SOURCE has to be spelled out. Without it O_CLOEXEC, `asprintf`
115-
-- and `major`/`minor` are hidden and xf86drm.c does not compile.
113+
-- _GNU_SOURCE is spelled out because mcpp up to 2026.9.25.1 dropped a
114+
-- dependency's own `c_standard = "gnu11"` (mcpp-community/mcpp#695;
115+
-- applied from 2026.9.26.1), and the define works under every engine
116+
-- this index admits. Without it O_CLOEXEC, `asprintf` and
117+
-- `major`/`minor` are hidden and xf86drm.c does not compile.
116118
-- -fPIC because this becomes a .so; -fvisibility=hidden to match
117119
-- upstream's `gnu_symbol_visibility : 'hidden'`, so only the symbols
118120
-- libdrm_macros.h marks drm_public are exported.

‎pkgs/c/compat.libinput.lua‎

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,11 @@ package = {
7575
language = "c++23",
7676
import_std = false,
7777
-- Upstream asks for `c_std=gnu99` and means it — see the `typeof`
78-
-- note in cflags. `c_standard = "gnu11"` was tried here first and is
79-
-- NOT the fix: mcpp accepts the string and still emits `-std=c11`, so
80-
-- the descriptor would claim a dialect the compiler never sees.
78+
-- note in cflags. `c_standard = "gnu11"` was tried here first, when
79+
-- mcpp (up to 2026.9.25.1) applied only the root package's value and
80+
-- dropped a dependency's own (mcpp-community/mcpp#695, fixed in
81+
-- 2026.9.26.1); the defines below work under every engine this index
82+
-- admits, so they stay.
8183
c_standard = "c11",
8284

8385
-- `"*"` is the package ROOT, and it is here for exactly one file:
@@ -240,10 +242,11 @@ package = {
240242
-- damage lands as `-Wint-conversion` errors in a dozen unrelated
241243
-- files that never mention typeof.
242244
--
243-
-- This is a `-D` rather than `c_standard = "gnu11"` because the
244-
-- gnu dialects do not reach the compiler: mcpp accepts the string
245-
-- and still emits `-std=c11`. Measured, not assumed — gnu11 was
246-
-- set here and these exact errors survived it.
245+
-- This is a `-D` rather than `c_standard = "gnu11"` because a
246+
-- dependency's own C standard did not reach the compiler before
247+
-- mcpp 2026.9.26.1 (mcpp-community/mcpp#695): gnu11 was set here
248+
-- and these exact errors survived it. The `-D` works under every
249+
-- engine this index admits.
247250
--
248251
-- Safe because `__typeof__` IS `typeof`, always available in any
249252
-- dialect, and nothing can be named `typeof` in code that expects

‎tests/openkal/compat.py‎

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,20 @@ def host_triple() -> str:
101101
return f"{arch}-{system}"
102102

103103

104+
def host_executes(target: str, host: str | None = None) -> bool:
105+
"""Whether this host runs the target's programs itself, with no runner.
106+
107+
A Linux host executes a Linux image of its own architecture whatever C
108+
library the image carries: an `x86_64-linux-musl` program is a static
109+
image, and mcpp runs it on an `x86_64-linux-gnu` machine as it is (`mcpp
110+
test --target x86_64-linux-musl` needs no runner). Measured with `--no-run`
111+
instead, such a cell would record `builds` for a member that runs."""
112+
h = (host or host_triple()).split("-")
113+
t = target.split("-")
114+
return len(h) >= 2 and len(t) >= 2 and h[1] == "linux" and t[1] == "linux" \
115+
and h[0] == t[0]
116+
117+
104118
def packages_of(manifest: dict) -> list[str]:
105119
"""The index packages a member depends upon, as `namespace.name`."""
106120
found: list[str] = []
@@ -241,7 +255,8 @@ def measure(member: str, target: str, pins: dict) -> dict:
241255
toolchain = pins["toolchain"]
242256
native = target == host_triple()
243257
runner = (pins.get("runners") or {}).get(target)
244-
can_run = bool(native or (runner and shutil.which(runner[0])))
258+
can_run = bool(native or host_executes(target)
259+
or (runner and shutil.which(runner[0])))
245260
cmd = command_for(target, toolchain, native, can_run)
246261
proc = subprocess.run(cmd, cwd=work, capture_output=True, text=True,
247262
timeout=pins.get("timeout", 3600))
@@ -533,6 +548,14 @@ def cmd_selftest(_args: argparse.Namespace) -> int:
533548
("the host names no target and runs them",
534549
command_for("x86_64-linux-gnu", "llvm@22.1.8", True, True),
535550
["mcpp", "test", "--toolchain", "llvm@22.1.8"]),
551+
# A static musl image of the host's own architecture is run as it
552+
# is; a runner is for what the host cannot execute.
553+
("a Linux image of the host's architecture runs without a runner",
554+
host_executes("x86_64-linux-musl", "x86_64-linux-gnu"), True),
555+
("another architecture needs a runner",
556+
host_executes("aarch64-linux-musl", "x86_64-linux-gnu"), False),
557+
("and so does another system",
558+
host_executes("x86_64-windows-musl", "x86_64-linux-gnu"), False),
536559
]
537560

538561
# `select` decides how much of a pull request's four-hour matrix runs. It

‎tests/openkal/pins.toml‎

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# `runtime` is the C++ runtime for openkal; it pins openkal-musl exactly, and
55
# openkal-musl selects the openkal implementation for each target, so this one
66
# version names the whole graph.
7-
runtime = "0.15.1"
7+
runtime = "0.15.2"
88
toolchain = "llvm@22.1.8"
99
# `mcpp` here moves together with index.toml's `min_mcpp` and
1010
# .github/workflows/openkal-compat.yml's own MCPP_VERSION (that workflow
@@ -18,6 +18,28 @@ toolchain = "llvm@22.1.8"
1818
# index requires mcpp >= 2026.9.18.1 but this is mcpp 2026.9.17.3 [E0006]"
1919
# before a single line of the member's own source is read.
2020
#
21+
# 2026-09-26 (fourth move): `runtime` -> 0.15.2 and `mcpp` -> 2026.9.26.1,
22+
# AND THE GRAPH'S OWN LINUX TARGETS JOIN THE MEASUREMENT.
23+
#
24+
# mcpp 2026.9.26.1 links a program over a graph-supplied C library with no
25+
# host library directory in its search (mcpp-community/mcpp#696). Before it,
26+
# clang derived `/usr/lib/x86_64-linux-gnu` and its siblings for such a link,
27+
# so a member's `-lm` on x86_64-linux-musl linked the HOST's glibc objects into
28+
# a musl image without a diagnostic, and on aarch64-linux-musl failed on the
29+
# host's x86_64 linker script. Neither target was measured here, which is why
30+
# neither showed: the two rows measure exactly that link.
31+
#
32+
# 0.15.2 pins openkal-musl 0.19.2, which ships musl's eight empty archives
33+
# (`libm.a`, `libpthread.a`, ...), so those names are answered by the graph.
34+
# The runtime pins openkal-musl exactly, so `runtime` alone names the whole
35+
# graph, as the header above says. mcpp moves in the same change because the
36+
# rows mean nothing under an engine that still searches the host.
37+
#
38+
# x86_64-linux-musl runs natively; aarch64-linux-musl runs under
39+
# qemu-aarch64, which openkal-compat.yml installs. Every link was registered,
40+
# published and verified resolvable from the PUBLISHED index before this pin
41+
# moved (#467, #468).
42+
2143
# 2026-09-21 (third move): `runtime` -> 0.15.1, AND THIS ONE IS A WINDOWS FIX
2244
# REACHING THE MEASUREMENT THROUGH FOUR PACKAGES.
2345
#
@@ -114,16 +136,19 @@ toolchain = "llvm@22.1.8"
114136
# openkal-musl 0.16.0 and openkal-llvm-runtime 0.12.0), because a pin that
115137
# moves onto an unreachable or divergent asset fails every member at once and
116138
# reports it as a compatibility result.
117-
mcpp = "2026.9.21.3"
139+
mcpp = "2026.9.26.1"
118140

119141
# The Windows target is named for the C environment the graph presents there,
120142
# which is musl's (openkal-musl declares `[c-abi] presents = "posix"`), not
121143
# MinGW's: `x86_64-windows-gnu` read as a mingw-w64 build, which this graph
122144
# has never been. Results measured before 2026-09-23 are recorded under that
123145
# older name.
124-
targets = ["x86_64-linux-gnu", "x86_64-windows-musl"]
146+
targets = ["x86_64-linux-gnu", "x86_64-windows-musl", "x86_64-linux-musl", "aarch64-linux-musl"]
125147

126148
# A target that is not the host is tested through its runner when the runner is
127149
# on PATH, and built otherwise.
128150
[runners]
129151
x86_64-windows-musl = ["wine"]
152+
# x86_64-linux-musl needs none: a Linux host runs a Linux image of its own
153+
# architecture as it is (compat.py `host_executes`).
154+
aarch64-linux-musl = ["qemu-aarch64"]

0 commit comments

Comments
 (0)