Skip to content

Commit f464fca

Browse files
committed
mcpp 2026.9.26.1 as the measured client, and the graph's own Linux targets in the openkal measurement
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.
1 parent d7872cc commit f464fca

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)