Repository navigation
2026.11.9.1: targets and providers; a platform defines rows; mcpp#911 G1–G12, B1–B3; tests are mtest's - #912
Merged
Merged
Conversation
…re the move to data Co-authored-by: speak-agent <[email protected]>
…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]>
… and the task plan 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]>
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]>
Sunrisepeak
force-pushed
the
release/2026.11.9.1
branch
from
November 9, 2026 04:00
af5764b to
a31c762
Compare
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]>
…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]>
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]>
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]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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).[target.<selector>.priority],builtin:<name>,mcpp why target, the build record's{request, identity, provider, priority, fallback},MCPP_TARGET_PROVIDER, and[target."<request>"]inmcpp.lockwith--locked.[[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 platformlists what it serves;mcpp new --template platform.mcpp why flags; G2). A row's defaults are not replaced in place: a machine that differs is another row.i686-none-elf(G12).mcpp why depsstates each package's root,git diffwrites the patch); per-artifact compile variants[targets.<name>.build](G9).x86_64-windows-gnu,import stdincluded.git+<url>#tag=on the command line; at most one ref.--all-programs).--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).x86_64-windows-gnuwith llvm where the MinGW payload is absent ishost-cannot-serve; the expected table states the cells the target model changes, measured on the four hosts.prset's left-out scripts are reportedunaffectedto the coverage check; the function-size gate holds.Tests
Co-authored-by: speak-agent [email protected]