You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 37c6796
Browse filesBrowse the repository at this point in the historyBrowse files
The engine gaps left open after the SDK batch (2026.9.12.2) (#619)
* docs(design): the engine gaps left open after the SDK batch
Issues #564 to #618 checked against main at c688fca: six were fixed and are
closed, two are not engine work, and four remain. Their designs, together with
the two gaps the 2026-09-11 record left open, of which one turns out to be
misdiagnosed: the per-target tool declaration exists under
[target.<selector>.xlings.workspace], measured on linux-x86_64.
For review before implementation.
* docs(design): review decisions, three measured corrections, and the task list
The four review questions are answered: windows_subsystem takes "windows",
windows_entry ships now, a resolve-time refusal is enough for #613, and the
graph-wide switch is an abi table.
Measuring the plan corrected it three times. The #613 refusal already exists as
requires = ["mcpp:c++-abi=libstdc++"]. The whole-graph channel G2 asked for is
dialect_cxxflags: -pthread there links the openkal-emscripten threads feature,
while the same flag in cxxflags reproduces the recorded error. And a new
defect, T1: mcpp build --toolchain llvm@22.1.8 after a gcc build replays the
gcc build in 0.00s.
* feat: the engine gaps left open after the SDK batch (2026.9.12.2)
Implements .agents/docs/2026-09-12-engine-gaps-after-the-sdk-batch.md (M1-M9).
- #618: `[targets.<name>] windows_subsystem` and `windows_entry`, rendered per
ABI onto the declaring executable's own link (`/SUBSYSTEM:` with the CRT
`/ENTRY:` symbol on MSVC, `-mwindows`/`-municode` on GNU), inert off PE, and
refused on library targets. Build-program protocol 10 adds the
`windows-subsystem` and `windows-entry` directives for a named target.
- T1: the fast path compares the toolchain request (`--toolchain`,
`MCPP_TOOLCHAIN`, and `[toolchain] default`); a build asking for another
toolchain no longer replays the previous one.
- #615: `runtime.deploy = [{ from, to }]` places runtime files in a directory
relative to the executable, in mcpp.toml and in descriptors, and `mcpp pack`
carries both `deploy_files` and `deploy` at the same relative paths.
- `[target.<selector>.abi] threads` as a typed graph-wide switch, with
`requires_abi` on a package or feature refused before compilation when the
root does not state it.
- #613: a dependency's install hook receives MCPP_COMPILER, MCPP_CXX_STDLIB and
the target names, computed by the function the build-program environment
uses; docs state the `mcpp:c++-abi` recipe for source-built static packages.
- #614: one function decides an xlings invocation's environment, the Windows
project scope is restored after each invocation, and xlings' own error lines
follow a failed install.
- #609 and G1: a documented toolchain hazard, and the refusal that names
`[target.<selector>.xlings.workspace]`, with examples/13 using it.
* fix: remove module-boundary shapes that crash clang on the MSVC ABI; correct the hook environment
Windows CI (clang 20.1.7, x86_64-pc-windows-msvc) crashed compiling
directives.cppm. The change introduced constructs of the kind src/pack/pack.cppm
records crashing that toolchain: pointers to members of an imported type and a
std::span over an exported constexpr array, plus optional-bearing types in an
exported interface. They are replaced by plain code: `windows_choice_problem`
states the accepted values once for both parsers, the directive check and apply
are per field, `invocation_env` returns a plain struct, ScopedInvocationEnv
keeps plain members, and the hook scope uses six ScopedEnv locals.
tests/e2e/648 measured that a dependency's install hook runs before the
toolchain is resolved, because prepare resolves it after the dependency graph.
The hook therefore receives the build's target and empty toolchain names; the
code comment, docs/22, docs/32, the CHANGELOG and the design record now state
this, and 648 asserts it, including that inherited values do not leak through.
Test fixes: 645 resolves its helper directory before changing directory and
drives `mcpp run` through MCPP_TOOLCHAIN; 647 writes each manifest to its own
package directory.
* test(645): the machine-default leg takes the newest other installed version
The first other version found was gcc 13.3.0, which rejects -fmodules, so the leg measured the compiler rather than the fast path. Measured after the change: build A-B-A, run A-B-A, and gcc@16.1.0 -> gcc@15.1.0 with the artefact's version string, all passing.
* test(645): a host whose fast path declines for another reason is reported, not failed
macOS and Windows CI found an unchanged second build resolving the toolchain: try_fast_build requires an ELF runtime-validation verdict for every artefact, which Mach-O and PE never record (#400). The control now compares the toolchain= lines the two builds record; identical lines report the host as not measured and print the entry, differing lines fail. The design record notes the ELF-only fast path as outside this change.
---------
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
Application bundles, application manifests and DPI awareness are not part of
252
+
these keys; they belong to packaging formats and to `[resources]`.
253
+
205
254
#### Per-target keys
206
255
207
256
```toml
@@ -223,6 +272,8 @@ required_features = ["gui"] # only built when feature `gui` is
223
272
|`defines`| Preprocessor macros (`name` or `name=value`); desugar to `-D<x>` on both the C and C++ entry compile. |
224
273
|`cxxflags` / `cflags`| Extra compile flags for this target. Do **not** put `-std=...` here — use `[package].standard`. |
225
274
|`required_features`| The target is emitted only when **every** listed feature is active in the build; otherwise it is silently skipped. A gate only — it does not activate features (use `--features` / `[features].default`). **One exception, and it is not a second rule:** when this target is requested as a host tool (`tools = [...]`, §2.14), the target is what was *asked for*, so its `required_features` become the sub-build's *inputs*. Same field, one meaning — the resolution just runs in the opposite direction. |
275
+
|`windows_subsystem`*(2026.9.12.2+)*| The PE subsystem of an executable: `"console"` (the default) or `"windows"`, a GUI program that starts without a console. Reaches this target's link and no other, and renders nothing on a target that is not PE. See the section above. |
276
+
|`windows_entry`*(2026.9.12.2+)*| The entry function the program defines: `"main"` (the default), `"wmain"`, `"WinMain"` or `"wWinMain"`. See the section above. |
226
277
227
278
> **Scope (important):**`defines` / `cxxflags` / `cflags` on a target apply **only to that
228
279
> target's exclusive entry source** (its `main`) — never to shared module/impl objects, which
0 commit comments