Skip to content

2026.11.11.1: five rows the platform's own data serves - #924

Open
Sunrisepeak wants to merge 15 commits into
mainfrom
feat/2026.11.11.1-cross-rows
Open

Sunrisepeak wants to merge 15 commits into
mainfrom
feat/2026.11.11.1-cross-rows

Conversation

@Sunrisepeak

@Sunrisepeak Sunrisepeak commented Nov 11, 2026 •

Copy link
Copy Markdown
Member

2026.11.11.1 — five rows the platform's own data serves

The cross rows read their payloads, not a host list

aarch64-linux-gnu takes its C library from the sysroot payload its row declares (xim:aarch64-linux-gnu-sysroot, glibc 2.44 with the kernel headers, libgcc and libc++ inside; the package root is the sysroot), so the row is built wherever that payload is published — an x86_64 Linux host included — and host_can_serve reads the declaration instead of refusing every arch-crossing glibc target. When such a base package serves the target, the host contributes nothing to the link: the payload's own -B/-L words, its loader named sysroot-relative, its compiler_runtime_dir resource directory on the C link exactly as on the C++ one, --sysroot naming the package root the payload's own manifest states it is — and the host's runtime directories, -latomic and runtime-closure rules all step aside the way they already did for graph-supplied C libraries (measured on the way: the host payload's x86_64 libatomic.a resolved ahead of the target's and the linker called it incompatible with aarch64linux). A plain C program cross-builds as a dynamic ELF and, under qemu-aarch64 -L <payload>, runs with its exit code intact (e2e 1076; the recipe — aarch64-linux-gnu-sysroot 2.44.3 revision 2 — lands in the package index beside this release).

The Windows resource compile finds the Windows headers a row declares

A row whose system the graph supplies — x86_64-windows-musl over openkal — has no paired payload, and its llvm binary carries no Windows headers, so winres.h reached neither include source the toolchain states. The MinGW-w64 sysroot payload a platform row declares for that architecture's GNU-ABI identity has them; the resource compile now resolves that payload's include through the row's own channel and probes relative to what it resolves to — never PATH (e2e 1075). The default rows keep exactly the include sources they had.

A program of another system that dies at once names the runner

The kernel maps a static ELF of its own architecture without reading the system the ELF names — FreeBSD's OSABI byte is not a question Linux asks — so a FreeBSD artifact on a Linux host starts, states its first kernel interface call in FreeBSD's vocabulary, and dies by signal, with 128 + signal the only fact distinguishing that death from a crash in a working program. Such a launch now runs as a child (the engine, having become the program on POSIX, can observe nothing about itself), the death is named with the [target.<triple>] runner declaration, and the status is returned unchanged: 139 stays 139 (e2e 1077). Native and cross-arch launches keep the launch they always had; a native signal death is the program's own and is never interpreted.

pack --systems all answers with the platform's data

This machine's system, every system a platform defines a row of for the architecture, and every system the platform's runner states a host of (runner.hosts) — FreeBSD's among them. A FreeBSD runner is built as <arch>-freebsd-musl over the platform's hosted arrangement, the same static identity a FreeBSD request takes (e2e 1078). Without --systems the pack is unchanged: the packing machine's runner alone.

longjmp joins threads and exceptions in [target.<selector>.abi]

How sigsetjmp/siglongjmp cross the WebAssembly boundary on an Emscripten row: "wasm" renders -sSUPPORT_LONGJMP=wasm on every C and C++ translation unit and the link; "js" states the toolchain's default model. Declared on any other row the member is refused naming that fact (e2e 1079). With the default JavaScript model a non-local exit over two call levels reads past the module's stack and dies at run time while the build succeeds — the flag is what makes the pair work. A deep exit also wants -sSTACK_SIZE; that is a project knob, not an ABI fact, and the engine does not render it.


Stability-neutral: every default behavior is unchanged; each capability appears only where it previously failed. No host is named in the engine — the hosts a row serves are data in the platform table.

Sunrisepeak and others added 15 commits November 12, 2026 04:45
The cross rows read their payloads, not a host list: aarch64-linux-gnu
takes its C library from the sysroot payload its row declares, and when
such a base package serves the target the host contributes nothing to
the link -- the base's own -B/-L words, its loader named sysroot-
relative, its compiler_runtime_dir resource directory on the C link
exactly as on the C++ one, and --sysroot naming the package root the
payload's own manifest states it is. host_can_serve reads the
declaration instead of refusing every arch-crossing glibc target; the
runtime-closure rules state the premise they always had (the loader is
the payload's; a process on this machine is not the one that would load
it). Measured end to end: a plain C program builds as a dynamic aarch64
ELF and runs under qemu-aarch64 -L <payload> with its exit code intact
(e2e 1076).

A row whose system the graph supplies compiles its resources with the
Windows headers the rows declare (e2e 1075); a program of another
system that dies at once names the runner and returns its status
unchanged (1077); pack --systems all answers with the platform's own
data, FreeBSD's runner among them (1078, 986); longjmp joins threads
and exceptions as the third abi member, the Emscripten long-jump model
(1079).

Stability-neutral: every default behavior is unchanged; each capability
appears only where it previously failed. No host is named in the
engine.
The corrective r2 repack lands in the package index under the same
version key (openxlings/xpkgindex-update#9), so no pin or doc names
-r2 and the arm/macos/windows legs resolved a package that does not
exist. runner_lookup's SIGBUS cases lose their #ifdef guards: POSIX
defines the signal everywhere mcpp builds, and the include gate keeps
module code conditional-free.
The engine includes no headers (the include-region rule); the C
library's macros arrive as constants through mcpplibs.mwrap.libc, so
the death classification takes the three signals the wrap carries.
SIGBUS is not among them -- its typical cause here, a stack the kernel
never grew, arrives as SIGSEGV on the systems that report it.
- polyglot holds FreeBSD's program beside Linux's (G5 made --systems all
  name it; the assembler's whitelist was the half that lagged) and refuses
  a system it has no uname pattern for, not FreeBSD
- 299 accepts a row whose payload package this home cannot install: the
  row resolved, the package is the index's to give, and the refusal's
  subject names the row -- the claim is completion, as it always was
- the MinGW headers are read only where the toolchain's own include
  sources found nothing, standing payloads before fetched ones: an MSVC
  or GNU-ABI project no longer fetches a payload its link will not read
  (measured on the upgrade lane: mingw-w64-sysroot, 21.3 MB, first run)
- pack_modes states 'all' host-aware: the machine asking is one of the
  facts, and the suite runs on four hosts
- 1076 is excused in the coverage table: no hosted shard installs the
  sysroot payload, and the test skips rather than guesses
…cketed row

The resource scan resolved the MinGW-w64 sysroot payload unconditionally
(gdb, a fresh home, why --target x86_64-windows-gnu): the compiler step had
been gated since the last push, the scan step had not, so every PE prepare
fetched 21.3 MB its link would not read -- measured on the upgrade lane's
first run. Both sites now share one sentence: llvm-rc, a row whose Windows
headers are not the machine's own (a located MSVC SDK states that they
are), the toolchain's own include sources found nothing, standing payloads
before fetched ones.

299's row extraction now also reads the bracketed subject of the base
refusal ([target.aarch64-linux-gnu].sysroot = ...), the form the payload
refusal takes; the single-quoted form it alone read before stays first.
…t systems consume

A synthesis of what the merged round established and what the families after
it use: rows, payloads, runners as data; the ABI layering beneath one C
library ported once; corrective revisions; the disk-image asset class and
its harness; the semantic plane stated as the program's own. No behaviour
changes -- this names what is already gated green.
…ne architecture as its reference

The version the PR will release under is dated for its merge day, and every
comment that cites its introducing release follows it.

The architecture record names what the round established and what the
families after it consume: rows, payloads and runners as data; one C library
above one kernel-ABI specification, ported once; layer vocabulary the rows,
payloads and requirement side already share; corrective revisions; the
disk-image asset class and the harness that boots it; the semantic plane
stated as the program's own. It adds no behaviour -- it names what the gates
already hold green.
The exception belonged to the window where no hosted shard could install
xim:aarch64-linux-gnu-sysroot; the index PR is merged, every shard that
declares the payload's capabilities runs the test for real, and a test
that runs does not belong in the table.
…tes through the flags it renders

The key is a contract between releases: an engine of one release finds a
project's graph current through it, and 1068's inner build -- the subos's
own engine -- is that reader by design. A field for the new member made
every plan another release wrote look foreign, and the self-host shard
measured it twice (1068, 1069). The member needs no field: it reaches the
compile line through dialect_cxxflags, which the key already lists, and
1079 round-trips it unchanged. Threads and exceptions keep their fields --
they are switches that render no flag of their own.
…: the clang-tidy 400-line gate under src/build/prepare (the predicates the block already named)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant