Skip to content

2026.11.9.1: targets and providers; a platform defines rows; mcpp#911 G1–G12, B1–B3; tests are mtest's - #912

Merged
Sunrisepeak merged 45 commits into
mainfrom
release/2026.11.9.1
Nov 9, 2026
Merged

Sunrisepeak merged 45 commits into
mainfrom
release/2026.11.9.1

Conversation

@Sunrisepeak

@Sunrisepeak Sunrisepeak commented Nov 9, 2026 •

Copy link
Copy Markdown
Member

Summary

The target model of .agents/docs/2026-11-09-target-model-design.md (SPEC-016), and the items of #911 as evaluated in the design's §19 (an item is taken when it is generic and necessary; the decisions table records what was not taken and why).

  • A request is a pattern; the identity is selected. Rows and providers are data compiled into the engine; the candidates of a request are ordered by priority, row and provider name, and the first available here is taken. [target.<selector>.priority], builtin:<name>, mcpp why target, the build record's {request, identity, provider, priority, fallback}, MCPP_TARGET_PROVIDER, and [target."<request>"] in mcpp.lock with --locked.
  • The identity follows the C library when the request names no env; an explicit identity is kept and a disagreement with the graph is reported.
  • A platform defines rows and providers ([[platform.define]], [[platform.provider]]; G1), states hosted C (G3), links any row with the compiler driver (G4); foreign artifacts are not judged here (G5) and are built, not run, until a runner states how (G11); target-independent source artifacts serve every target (G6); its rows pack and carry (G10). Reading a platform's manifest checks its statement against the rows; mcpp why platform lists what it serves; mcpp new --template platform.
  • Every flag names its layer (mcpp why flags; G2). A row's defaults are not replaced in place: a machine that differs is another row. i686-none-elf (G12).
  • Capability defaults for ordinary packages (G7); the patch root (G8: mcpp why deps states each package's root, git diff writes the patch); per-artifact compile variants [targets.<name>.build] (G9).
  • clang pairs with the MinGW-w64 payload for x86_64-windows-gnu, import std included.
  • References: a git reference follows the default branch; git+<url>#tag= on the command line; at most one ref.
  • Pack: quoted target keys (B1), the platform's artifact names stand (B2), several programs (B3, --all-programs).
  • Tests: a test keeps what it reaches (--gc-sections, [test] link), a protocol program runs as a process per file of its cases ([test] split), a run is kept in the mtest store ([test] store), an archive's tests run by the same runner, a pattern names a part; the package under test stands for itself in its tests' graph (a framework that uses it, mtest and mcpplibs.os, is built against it). mcpp's unit tests are one directory program of mtest cases (mtest 0.5.2, mcpplibs.os 0.4.1).
  • A graph's C library leads a Mach-O image's link: the loader runs initialisers in link order before the entry, and openkal-musl is brought up by one of its own; a global constructor that allocated stopped before the library was up (every mcpplibs.os test on hosted macOS, e2e 1053).
  • Fixes found by the target matrix: x86_64-windows-gnu with llvm where the MinGW payload is absent is host-cannot-serve; the expected table states the cells the target model changes, measured on the four hosts.
  • CI: the bootstrap mcpp and the e2e mtest are installed by xlings (GLOBAL, then CN) and then from the release itself; a release asset falls back to the API; the pr set's left-out scripts are reported unaffected to the coverage check; the function-size gate holds.

Tests

Co-authored-by: speak-agent [email protected]

Sunrisepeak and others added 28 commits November 9, 2026 04:39
…ild.mcpp into static tables

The snapshot keeps every existing row's facts; it changes where the data adds:
the musl rows of macOS, the i686-none-elf row (#911 G12), and the platform of
x86_64-windows-musl, whose default provider is now openkal-platform.

Co-authored-by: speak-agent <[email protected]>
Each GoogleTest TEST is a UTest object named Suite/Case; a fixture is a case
that derives from it; a message reads what holds only when the expectation
failed; a test that starts copies of itself names the case to run and clears
the protocol for the copy; GoogleTest's stderr capture is mcpplibs.os 0.4.1's
stdio::capture.

Co-authored-by: speak-agent <[email protected]>
mcpp.toolchain.target_rows holds the built-in rows and the rows a platform
defines; the parser accepts a defined os and env, and a defined row answers the
triple's format, family, clang triple and naming. mcpp.toolchain.target_select
orders the candidates of a request by priority, row and name, keeps those a
declared family or a named provider allows, and takes the first available on
the host.

Co-authored-by: speak-agent <[email protected]>
Co-authored-by: speak-agent <[email protected]>
The request is a pattern: the selection gives the row and the provider whose
toolchain, C library, linkage and platform the build uses; a declared family,
builtin:<name> and a chosen platform package restrict it, and
[target.<selector>.priority] reorders it. The report reads
request → identity (clang triple), with the reason when the first candidate was
not available here. A hosted platform entry serves its system whatever C
library names the env.

Co-authored-by: speak-agent <[email protected]>
…target is not served here

A request that writes no env and whose graph or platform supplies a C library
another row names is prepared again for that row (x86_64-linux with musl in the
graph is x86_64-linux-musl); one that writes another env is refused
(target-cabi-conflict). An unserved target lists its candidates, each with its
provider, priority and why it is not available.

Co-authored-by: speak-agent <[email protected]>
[[platform.define]] states a row (its triple, clang triple, object format,
family, naming, descriptor blocks, execution system, ISA profile);
[[platform.provider]] states what serves it, [platform] and [platform.hosted]
being its shorthands. A platform's definitions are registered when it is read
(early for a directory, else in a second pass after a provisional row), so the
parser, cfg(os) and the selection know them. A defined row takes the platform's
system rather than the host's C library; a sysroot that provides
hosted-standard-library or a provider stating hosted = true gives a bare-metal
row a hosted C environment. A version whose artifact is the same in every block
of a descriptor is a version for any target.

Co-authored-by: speak-agent <[email protected]>
…nother system is not judged here; i686-none-elf (mcpp#911 G4, G5, G12)

Co-authored-by: speak-agent <[email protected]>
…s; the lock records a request's identity (mcpp#911 G2; SPEC-016 §4.5, §5.2)

- `[platform.replace]` and `[target.<selector>.replace]` replace the row's
  machine description word by word; unmet words are reported with the row's.
- `mcpp why target` states the selection; `mcpp why flags [<unit>]` lists each
  word of a unit's command line and its link line with the layer that gave it.
- The build record and the plan event carry {request, identity, provider,
  priority, fallback}; build programs read MCPP_TARGET_PROVIDER.
- mcpp.lock records `[target."<request>"]`; `--locked` refuses a build that
  selects another identity.
- The selection replaces `resolve_request`; the snapshot records it on three
  hosts. aarch64-linux-gnu precedes its musl sibling, as on x86_64.

Co-authored-by: speak-agent <[email protected]>
… names stand; several programs are packed as stated (mcpp#911 B1, B2, B3)

- A manifest `mcpp pack` generates writes `[targets."<name>"]`.
- A platform's `link.exe`/`link.shared` suffix stands over a later statement
  (a build program's `artifact-name`); the conflict is reported at plan time.
- `mcpp pack` with several programs packs the one named after the package and
  names the others, refuses when none is so named, and `--all-programs` ships
  them together. A single file replaces an earlier pack's staged tree of the
  same name.

Co-authored-by: speak-agent <[email protected]>
A provider that pairs with the declared compiler family supplies the system:
with llvm declared for x86_64-windows-gnu, the mingw provider's payload is
installed as for gcc and becomes clang's sysroot, C library and C++ runtime
(libstdc++, whose bits/std.cc is the std module); lld links with libgcc and
winpthreads.

Co-authored-by: speak-agent <[email protected]>
… mtest 0.5.0 (mcpp#911 G7)

- `[defaults."<capability>"] <selector> = <package>`: the provider of a
  capability a package requires when neither the graph nor the platform
  provides it; a selector that names the target wins over `*`.
- The dev-dependencies, the skeleton and the docs name mtest 0.5.0.

Co-authored-by: speak-agent <[email protected]>
… (mcpp#911 G8)

- The patch root is the directory of the package's resolved manifest inside
  its archive, or the edge's `patch_root`; a patch written from the
  archive's top applies as written and the build says so.
- `mcpp patch edit <dependency>` copies the package root as the build reads
  it; `mcpp patch save <dependency>` writes the difference as the edge's
  next patch and adds it to the edge (the dependency editor writes patches,
  and replaces a default namespace's dotted spelling).

Co-authored-by: speak-agent <[email protected]>
…mcpp#911 G9)

`[targets.<name>.build]` states defines and flags for every translation unit
of the package the artifact links; where they differ, the units are compiled
as the artifact's variant under obj/_variant/<name>/, and the other artifacts
link the package's objects. Module interfaces stay one per package. The
existing per-target keys keep their entry scope.

Co-authored-by: speak-agent <[email protected]>
…w does (mcpp#911 G10)

- A host pair is any system's word with an architecture; `--systems all`
  adds the systems the resolved platforms define rows of.
- A carrier or a single file for a platform-defined system is built over the
  platform that defines it.
- A static ELF (no loader, no needed image) has no closure and is not run to
  learn so.

Co-authored-by: speak-agent <[email protected]>
… states how (mcpp#911 G11)

An artifact of a row a platform defines whose execution is another system is
refused by `mcpp run` and reported not run by `mcpp test` unless a runner or
an execution host is stated; a runner package is a target tool the runner
names, started with the run protocol (docs/41).

Co-authored-by: speak-agent <[email protected]>
…ommand line (SPEC-001 §5, SPEC-016 §8)

- A git dependency names at most one of rev, tag, branch; none follows the
  remote's default branch, announced by `git ls-remote --symref` (main, then
  master, otherwise), locked by commit and read offline from the lock.
- The string form of a reference takes `git+<url>[#tag=|rev=|branch=]`:
  `--platform git+<url>#tag=<t>` selects a platform from its repository; a
  repository named by URL alone is the package its last segment names.
- A row a platform defines is known whether or not the project writes a
  section for it.

Co-authored-by: speak-agent <[email protected]>
- The platform skeleton defines <arch>-<name> and the provider that serves
  it, with the llvm the built-in bare-metal rows pin.
- `mcpp check platform [dir]` reads a platform's statement as the engine
  does: rows (segments, built-in redefinitions, repeats), providers (rows
  served, shared priorities), and the identities served with provider and
  priority.

Co-authored-by: speak-agent <[email protected]>
Units are compiled with one section per function and per object, and a test
program links with --gc-sections (-dead_strip on Mach-O): mcpp's unit test
programs go from 32.6 MB to 13.7 MB each (code 17.3 MB to 1.6 MB), 5.1 GB to
2.2 GB in all. Static constructors are the collection's roots, so a case that
registers itself stays; [test] link = "objects" keeps every object whole.

Co-authored-by: speak-agent <[email protected]>
…p's unit tests are one program

- `[test] split`: "file" (default) lists a protocol program's cases and runs
  each file's as a process of its own, scheduled as programs are; "case" and
  "none" give a process per case or one.
- The marker a runner reads is taken at the version it speaks wherever it
  occurs: a test of the runner carries other versions as data.
- mcpp's tests/unit is one program (`[test] programs = "directory"`), with
  three case objects renamed that shared a name across files; tests use mtest
  0.5.1, whose marker survives --gc-sections.

Co-authored-by: speak-agent <[email protected]>
…sed)

`replace` of row defaults is withdrawn: a platform whose machine differs from a
built-in row defines its own row (G1), as i686-none-elf now is one (G12), and an
appended flag already overrides a row's where the compiler reads the last one.
`mcpp why flags` keeps naming each word's layer.

Co-authored-by: speak-agent <[email protected]>
- SPEC-016 (targets and providers); SPEC-001 §5.5 (git references), SPEC-002
  §3.4/§3.6/§3.7, SPEC-013 §1/§9.2/§11; docs 05, 08, 20, 21, 22, 35, 41, 90.
- A written C library over a graph's other one is reported, not refused
  (SPEC-002 §3.4); the unused refusal codes are removed.
- A build program's artifact-name alone yields to a platform's format; the
  project's and the machine's statements stand.
- A test linked by a platform's ld.lld keeps its own link line; a capability
  default's line is an int (clang's narrowing).
- e2e 299 and 746 state the selection; 1044 installs llvm itself.

Co-authored-by: speak-agent <[email protected]>
… is written with git diff; a test run is kept in the mtest store

- `mcpp check` and `mcpp patch` are removed. A platform's statement is checked
  as its manifest is read (a built-in row redefined or a row defined twice is
  an error; a provider serving no row and a priority tie are warnings), and
  `mcpp why platform` lists the rows it defines and the identities it serves.
  One list of a statement's providers (mcpp.manifest.platform_providers) serves
  the registration, the check and the report.
- `mcpp why deps` and resolution.json state each package's root
  (`manifest_dir`), from which `git diff` writes a patch (docs/05).
- `mcpp test` keeps each run in the mtest store's form under target/mtest
  (`[test] store`); the schedule of each process is recorded.
- A test that keeps what it reaches reads the protocol marker from the objects
  it was linked from when the link dropped it (mtest before 0.5.1).
- A platform that links with ld.lld keeps its own link line for tests.
- The tier check reads data/builtin.toml; docs/21 lists the three rows it lacked.

Co-authored-by: speak-agent <[email protected]>
… knows [test] programs

- `mcpp test --archive` composes its tests as runnables and runs them through
  the runner a build's tests use: the protocol each implements (recorded in
  mcpp-tests.json as the build decided it), a process per file of its cases,
  the workers, the mtest store. The store is written for `--case` runs too.
- A program of one file is not listed to be split by file.
- The store records GITHUB_SHA as the run's commit; docs/08 states how mtest
  takes the store in (`mtest store import`, or `[project] store`).
- The bootstrap is mcpp 2026.11.8.1, which reads `[test] programs`; the READMEs
  list the rows the tier check found missing.

Co-authored-by: speak-agent <[email protected]>
… test name is not another's directory; CI findings

- Under a cross `--target`, a `[target.<t>] toolchain` names the target's
  compiler; the build program takes the spec it replaced, as under a row's pin
  (mcpp's own tree built on Windows for x86_64-linux-musl compiled its build
  program with the musl cross gcc). e2e 1051.
- A test name that is another's directory (`unit`, `unit/own`) is refused,
  naming both.
- The rows' snapshot keeps LF on every checkout (.gitattributes).
- e2e 298 leaves out x86_64-windows-gnu, whose MinGW-w64 payload llvm pairs
  with; openkal-cross names the openkal macOS identity, aarch64-macos-musl.
- The stray empty `.edited` is removed; e2e 859 names a missing record.

Co-authored-by: speak-agent <[email protected]>
A dependency reached through the root's [dev-dependencies] that names the root
is the root: a framework that uses the package under test (mtest and
mcpplibs.os) is built against it rather than against a second copy, which
would provide every module twice in one program. The root's dev edges serve
its tests only, so they close no cycle of packages and fold into no key.
e2e 1052; docs/05.

Co-authored-by: speak-agent <[email protected]>
Sunrisepeak and others added 14 commits November 9, 2026 13:42
…ndows ACP check selects its cases by id

- `mcpp test <pattern>` matches a program or a part of one run as a process
  per file of its cases (`unit/test_home`): one rule (test_matches) for the
  plan's tests, a workspace's members and an archive.
- check_windows_home_legacy.py runs its two cases with --case and reads
  mtest's lines.
- The self-standing rule of the tests' graph lives in graph_edges.cpp
  (graph.cpp within its length).

Co-authored-by: speak-agent <[email protected]>
…#905's GCC defect left a set's constructor undefined)

Co-authored-by: speak-agent <[email protected]>
…e cached xlings and mtest are not downloaded again

GitHub's web address of a release asset answered 504 for minutes while the
API's address of the same asset answered 200 (2026-11-09).
- fetch_release.sh follows a failed web attempt with the API's, with the
  job's token.
- setup-macos-llvm downloaded the xlings release on every run, a cache hit or
  not; it now skips the download when the cached xlings is the pinned one, as
  bootstrap-mcpp does.
- e2e-mtest keeps the mtest bundle in the cache, by version, and fetches it
  through fetch_release.sh; the bundle is mtest 0.5.2.

Co-authored-by: speak-agent <[email protected]>
…me, as before, and said (B3 without a refusal)

The refusal broke an existing `mcpp pack` (mcppls). The program packed is
said with the others and the two ways to choose (`mcpp pack <program>`,
`--all-programs`). e2e 1043.

Co-authored-by: speak-agent <[email protected]>
…ith an index refresh per attempt

Co-authored-by: speak-agent <[email protected]>
…empt, by git at the last

A job's cached xlings index predates a newly published pin, and xlings keeps it
when its anonymous refresh fails (GitHub's 2026-11-09 incident).

Co-authored-by: speak-agent <[email protected]>
…otstrap mcpp and the e2e mtest

A job's cached xlings index can predate a published pin, and xlings keeps it
when its anonymous refresh fails (GitHub's 2026-11-09 incident, "timeouts due
to surge in anonymous users"). install_pinned_mcpp.sh tries the configured
mirror, refreshed; then CN (GitCode first), refreshed, the last by git; then
the release (install.sh, GitHub then GitCode, sha256 checked; on Windows the
zip through fetch_release.sh). e2e-mtest does the same for xim:mtest, with the
release bundle checked against its pinned sha256.

Co-authored-by: speak-agent <[email protected]>
A macOS host serves aarch64-linux-musl through openkal-platform, whose
compiler is llvm; llvm alone there is the row's own service. The test now
picks a row whose selection takes a non-llvm compiler and otherwise declares
a skip, which the target-matrix step accepts off Linux.

Co-authored-by: speak-agent <[email protected]>
…epts it for that run

With main's coverage map in place the pull request's Linux shards ran only
the scripts the change affects; the coverage check read every other script
as uncovered and the host requirement of 1033 as unmet. run_all.sh now
reports the left-out scripts as unaffected, the check counts them for that
run and host, and a shard the set gives no script is not mtest's failure.

Co-authored-by: speak-agent <[email protected]>
…tions

step13_dependency_cache and step13_lockfile had passed the 400-line gate of
#722 with this release's additions. The package graph the keys fold along
(key_graph, with serves_root_tests) and the lock's target entries
(lock_targets, target_drift) are functions of their own; behaviour is
unchanged.

Co-authored-by: speak-agent <[email protected]>
The loader of Mach-O runs an image's initialisers before its entry, in link
order; openkal-musl is brought up by an initialiser of its own, and the
program's objects came before it. A global constructor that allocated (the
registration of an mtest case) stopped in the allocator before the library
was up: every os test on hosted macOS exited 139 at start. The objects of a
package that provides mcpp:c-abi now lead every Mach-O image's objects, in
their own order, as a C runtime's start objects do on ELF (e2e 1053).

Co-authored-by: speak-agent <[email protected]>
… row is picked

compiler.family names the driver's family (clang), and the candidate loop
ended on a failed test under set -e: a macOS host, whose musl rows are served
by openkal-platform, ended the script without its skip. Measured by lowering
musl-gcc's priority on Linux, which serves those rows as macOS does.

Co-authored-by: speak-agent <[email protected]>
…ix states the target model's cells

The target matrix scanned this release for the first time on the four hosts.
Its changed cells are the target model's: musl identities served by
openkal-platform where no other provider is (llvm builds them, gcc and msvc
are capability-pin, the graph mode's pinned family is outside the platform's
version group), windows-gnu with llvm paired with the MinGW-w64 payload, and
the i686-none-elf row. One cell was a defect: windows-gnu with llvm on a host
without the MinGW payload failed its install as an unnamed refusal; it is now
host-cannot-serve. e2e 1044 runs in the job that has wine.

Co-authored-by: speak-agent <[email protected]>
@Sunrisepeak Sunrisepeak closed this Nov 9, 2026
@Sunrisepeak Sunrisepeak reopened this Nov 9, 2026
Sunrisepeak and others added 2 commits November 9, 2026 18:59
The ecosystem's mtest is 0.5.2 (children, mcpplibs.os ^0.4.1); the e2e
runner was already 0.5.2. mcpp's unit tests pass on it (166 programs).

Co-authored-by: speak-agent <[email protected]>
The refusal of a paired provider the host lacks took the phase function past
the 400-line gate of #722; the decision on a declared compiler against the
row's convention is a function of its own. Behaviour is unchanged.

Co-authored-by: speak-agent <[email protected]>
@Sunrisepeak
Sunrisepeak merged commit 9edccc4 into main Nov 9, 2026
82 checks passed
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