Tags: mcpp-community/mcpp
Tags
2026.10.1.3: a source for every tool a build uses, declared, programm… …able and observable Every tool a build uses now has a source that can be declared, decided by a build program, and read back (mcpp#755, protocol 15). A project that writes none of the new keys builds exactly as before, and its output is unchanged.
2026.10.1.2: a pack states its build, every drive takes the job count… …, and a unit's compile does not depend on the member selection (#751, #753) (#754) Implements .agents/docs/2026-10-01-pack-drive-and-selection-independent-compile-design.md and resolves #751 and #753. - Every ninja drive takes the job count and the stale-token reclaim from the plan, and is reported whenever the command opened the report, unless its caller writes its own lines (mcpp test's per-test drives). - mcpp pack states its build: package lines, the status row, and Finished before the first Packing line; one Finished for several configurations; the dispatch pass is reported; a pack fills the global dependency cache. - Every package's BMIs lie below its own directory except the root's, as object files have since #233; a unit reads one module map of what it reaches through its imports (a GCC mapper, a clang argument file of -fmodule-file= lines, an MSVC command file of /reference lines). - A file a member lists from outside its directory belongs to that member, not to the workspace's virtual root. - Position independence follows the target: every unit of an ELF target that is not freestanding is compiled with -fPIC. Verification: CI on 71d09f0 (42 passed; the two xcode-27 jobs fail as on main, #669). GalTranslPP built with mcpp from this branch on windows-2025, run 36814777279 on the final head: mcpp run -p GPPCLI after build --workspace took 10 s (3m22s on 2026.9.30.2), both release packs 89 s.
2026.10.1.1: member selection, build programs prepared once, a pack o… …ver several members, and output streams (#748, #749, #750) (#752) Implements .agents/docs/2026-09-30-member-selection-and-build-program-cost-plan.md. - Member selection (#750): one selection for build, test, pack and emit build-database; -p is repeatable and the selection is a set in [workspace] members order; --exclude; an unknown member, --exclude with -p, --workspace with -p and a second -p on run are refused before planning. - A test over several members plans once per configuration and runs each member's tests with its own runtime directories; the test stream adds a group_build record, build_group, and a per-test build_ms. - Build programs (#748): the bundled mcpp module and each host module are compiled once per key and kept by provenance (engine and index output in the global cache, project-owned output in the workspace); a workspace's programs compile concurrently and run in their serial order; the process launcher is safe for concurrent callers. - Pack over several members (#749): --workspace, a repeated -p and --exclude pack several members with one plan and one build per configuration, a stage directory per member and one dispatch pass; a member fails alone; a target name resolves for the member an action is for. - Output streams: narration on standard error on every command, results on standard output; mcpp run -q writes exactly the program's output; a mcpp run whose build failed exits 101.
2026.9.30.2: a selected workspace member declares as the root, the cl… …ang MSVC row states its compiler version (#746), and a shared member is compiled once per configuration (#747) The release canary of v2026.9.30.2 on mcpp-language-server stopped the release before any build job ran. This change fixes that defect, mcpp#746, and a test gap, for release as 2026.9.30.2. - A selected workspace member declares as the root. The workspace plan's virtual root declares only its members, and the rules that grant the root's own declarations a privilege read its edges alone, so a rooted workspace's own package, or a member selected with -p, lost the position it held when planned as its own root. PrepareState::declaredByRoot now answers for the root and each selected member, and the kind and reference clashes, the git lock, the identity write-back, edge linkage, direct target-side candidates and the index refresh ask it. Two selected members that disagree about one dependency's checkout or link form are refused, naming both (e2e 850). - mcpp#746: the version of the toolset's cl.exe, read from its VS_FIXEDFILEINFO as clang reads it, is passed as -fms-compatibility-version with the toolset words, so it is on every command and in every key (e2e 760, unit tests). - e2e 851 states that a member two configurations use is compiled once in each, with the union of one configuration's features.
2026.9.30.1: a build names each package when it does work, one status… … row with a screen of dots, --play-game, Finished from one minute, and one lock entry per identity (#743) Build output design revision 3 (.agents/docs/2026-09-30-build-output-refinement-design.md), from a report on `mcpp build` in the xlings repository with 2026.9.29.5. A package is named once, when it does work: Compiling at its first step that is not a dependency scan, or Cached with its units when the global cache places them; nothing is folded. A package inside the project is named by its short name, version and directory, any other by its identity and source, and the name's colour states the source. The cache pass runs through the report. One status row, aligned with the verbs and drawn half a second into the command, leaves in one write that overwrites the old rows in place, with autowrap off for the row; it states the last steps running once ninja has none left to start. Its screen of 24 braille cells (mcpp.ui.dots_screen) plays the chomper, the snake, the stack or the ions; MCPP_PROGRESS names one, or plain, or off. --play-game[=snake|stack|runner] plays a game on the screen from the keyboard, in the terminal's foreground only, and the terminal's mode is restored on exit and on a signal. A build program has a line when it runs or fails, and a failure names its package. Finished states how the time was spent from one minute, names the longest compile by its source file, and states the profile's descriptor on the fast path as well, from the step record's header. The step record is version 2. A bare key of a path or git dependency states only the short name, and a contradicting namespace is reported once per consumer manifest. A planned build leaves a committed mcpp.lock unchanged: the lock holds one entry per identity again. The Windows resource script moves to docs/res, the packaging and release scripts to tools, and the empty cdb.json is removed. The bundled xlings is 2026.9.30.1.
2026.9.29.5: a workspace's build programs are reused across selection… …s, the build database plans by configuration, and a build reports each step once with its outcome while a status line states the build (#742) The validation project's post-release run of 2026.9.29.4 and the cross-verification of this pull request found six problems in the commands around a workspace build, and a build that printed nothing for 40 minutes. - A member's build program is reused whichever members a command selects (its graph document lists only its own closure's requests), and the members' programs run dependencies first. - `mcpp emit build-database` and `mcpp build --configure-only` plan a workspace by configuration, as the build does; a command of several configurations publishes the root compile_commands.json once, as their union (SPEC-005 v1.6). - `mcpp pack` summarises more than eight outputs by directory. - A build reports each step once, with its outcome: ninja is read as it runs (its status lines, its log, a step record beside build.ninja, and the start of check and prepare actions from the engine's wrapper); a package's line is written when every step of it has run or when the build ends; dependencies are folded unless --verbose; a build program has one line; a failed step is reported when it fails; `Finished` states the whole command's time and how it was spent. - On a terminal the running lines and one status line are drawn below the output; in a log the status line is repeated after a minute of silence. Terminal detection works on macOS and Windows, and a Windows console receives UTF-16. - e2e 839 to 843, unit tests, docs in both languages, the design documents, CHANGELOG; version 2026.9.29.5. Merged after both gates passed: this pull request's CI (the two xcode-27 legs are the known #669) and the validation project's cross-verification with the mcpp built from this branch (Sunrisepeak/GalTranslPP run 36591168092).
2026.9.29.4: a program shipped through artifacts links with its own c…
…losure's line, and ${mcpp.bin_dir} is the declaring member's product directory, in a workspace plan (#741)
The validation project's post-release build of 2026.9.29.3, and its
cross-verification against this pull request, found two plan-level values used
where a workspace member's own value is meant.
- A program shipped through artifacts links with its own closure's line in a
workspace plan: a link group of its own closure (LinkGroup::linkOnly) holds
the link line and runtime contract and places nothing. The plan's line pools
the dependencies' flags and not a member's, so a library the program's
package states through its build program was missing (e2e 838 A1-A3).
- ${mcpp.bin_dir} in an action a workspace member's build program declares is
that member's product directory (e2e 838 A4; docs/30 in both languages).
- Version 2026.9.29.4; design document section 17.1.
Merged after both gates passed: this pull request's CI, and the validation
project's build, run, pack and release layout with the mcpp built from this
branch (Sunrisepeak/GalTranslPP run 36537600583).
Refs #734.
2026.9.29.3: a program shipped through artifacts in a workspace plan … …waits for no plan-level runtime file, and its own runtime files are beside it (#740) The validation project's post-release build of 2026.9.29.2 stopped with "'bin/translations/qt_gppcli_en.qm', needed by 'obj/gpp_updater/Updater.exe', missing and no known rule to make it". - The link edge of a unit outside the link groups (a program shipped through artifacts) no longer takes the plan's deploy set as order-only inputs in a workspace plan: the virtual root has no program, and nothing places that set. - A member's runtime set includes the closure of every package whose program the member ships through artifacts, so the program's own runtime files are in the member's product directory, as they were beside a root's program. - e2e 833 G9 states both; G2 and G3 count compile and link outputs, since a plan of another selection stages the runtime files again. - Version 2026.9.29.3; design document section 17.1. Refs #734.
2026.9.29.2: a workspace plan reads what a member states about itself… … from the member (#739) The plan's root in a workspace plan is a virtual root that holds the values shared by the whole graph. Five statements a member makes about itself were read from that root in 2026.9.29.1 and were therefore empty, and a member's product directory lacked the shared libraries its libraries need (.agents/docs/2026-09-29-workspace-build-graph-design.md, section 17.1). - A member's relative [indices].path is anchored at the member when the member is loaded (e2e 120). - The std module is built when a selected member's target entries import std (e2e 836 M1). - Each selected member's [resources] and windows_code_page are compiled against the member's directory and include directories, under res/<member>/, and embedded into the member's images only (e2e 837). A quoted include or resource file in a script is found through the include directories, as the resource compiler finds it. - Every graph-built shared library of a member's closure is placed in the member's product directory (e2e 835 L3). - [build] linkage is a root-position value. - A member's unknown mcpp: capability is refused, and its cfg() and schema warnings are reported, as a root's (e2e 836 M2, M3). - Version 2026.9.29.2. Refs #734.
PreviousNext