Motivation
Fifteen members declare xlings payloads, and each decides on its own where its tool comes from: some take an option, some an environment variable, rules-spirv and rules-slang fall back to PATH silently (contrary to SPEC build-plugins R6.2), dist-wix and dist-appimage refuse PATH, and rules-cuda, rules-hip, rules-ascendc and dist-apk offer no way to name a tool at all. A tool named in build.mcpp does not prevent the declared payload from being downloaded (mcpp-community/mcpp#755).
Design
Recorded in .agents/docs/2026-10-01-ecosystem-build-plugin-framework-design.md (v3). For 0.19.0, on the engine of mcpp#755:
mcpp.plugins.tool (in plugins-core): one resolver for every member -- a tool::choice option type (constructible from a string, so o.cmake = "/usr/bin/cmake" keeps working), one priority order (the build program's choice, a member's legacy variable, the engine's override, the payload requested on demand), one refusal text, and a decision recorded with the build.mcpp line that made it.
mcpp.plugins.toolchain (feature toolchain): builders of a toolchain description for the root build program's toolchain phase (layout, prefixed, compose, from_env_script, with_launcher, managed).
- Every member that runs a payload tool migrates to
tool::resolve; members whose tools are needed only for some builds declare their payloads provision = "on-request"; the silent PATH fallbacks become warnings.
- Documentation and fixtures for each source.
Motivation
Fifteen members declare xlings payloads, and each decides on its own where its tool comes from: some take an option, some an environment variable,
rules-spirvandrules-slangfall back toPATHsilently (contrary to SPEC build-plugins R6.2),dist-wixanddist-appimagerefusePATH, andrules-cuda,rules-hip,rules-ascendcanddist-apkoffer no way to name a tool at all. A tool named inbuild.mcppdoes not prevent the declared payload from being downloaded (mcpp-community/mcpp#755).Design
Recorded in
.agents/docs/2026-10-01-ecosystem-build-plugin-framework-design.md(v3). For 0.19.0, on the engine of mcpp#755:mcpp.plugins.tool(inplugins-core): one resolver for every member -- atool::choiceoption type (constructible from a string, soo.cmake = "/usr/bin/cmake"keeps working), one priority order (the build program's choice, a member's legacy variable, the engine's override, the payload requested on demand), one refusal text, and a decision recorded with thebuild.mcppline that made it.mcpp.plugins.toolchain(featuretoolchain): builders of a toolchain description for the root build program's toolchain phase (layout,prefixed,compose,from_env_script,with_launcher,managed).tool::resolve; members whose tools are needed only for some builds declare their payloadsprovision = "on-request"; the silentPATHfallbacks become warnings.