Three dist-* members that turn the tree mcpp pack stages into an installable form: an AppImage on Linux, an MSI or a Burn bundle on Windows, and a web directory for wasm32-emscripten. dist-apple and dist-apk have pages of their own (dist-apple.md, dist-apk.md).
Module mcpp.dist.appimage; engine floor: 2026.9.11.1.
Needs and behaviour. xim:appimagetool, which this feature declares on the cfg(linux) axis. Linux only. Turns the tree mcpp pack staged into one AppImage: the staged bundle is already an AppDir bar three files, so the member writes an AppRun, a .desktop entry and an icon into it and invokes one tool -- it never copies or re-lays-out a tree that can be hundreds of megabytes. From 0.11.1 options::icon may be an SVG as well as a PNG: the image carries <name>.svg, because the desktop entry names the icon without an extension and a reader finds it by the file's, and any other format is refused by name
Module mcpp.dist.wix; engine floor: 2026.9.11.1.
Needs and behaviour. xim:wix 5.0.2-1, which this feature declares on the Windows target axis; the .NET 6 runtime the tool needs is a Windows component the payload does not carry, and wix --version names it when it is missing. Windows only. --format msi renders a .wxs and passes the program in as a preprocessor variable, because a bind path that resolves to nothing is silent. From 0.10.0 --format setup is a Burn bundle chaining that MSI, with WiX's stock bootstrapper application (bal:WixStandardBootstrapperApplication, theme hyperlinkLicense, options::license_url its link) loaded through the WixToolset.BootstrapperApplications.wixext extension the 5.0.2-1 payload carries (options::extension names another). The bundle is written as <product_name>-<arch>.exe beside the MSI, with an UpgradeCode of its own, and options::bundle_output naming setup.exe is refused before wix runs, because wix refuses that name (WIX0388). A project with its own bootstrapper application supplies options::bundle_wxs, which receives the MSI as $(Msi). From 0.10.1 the MSI installs the staged tree, not the program alone: every file mcpp pack stages beside the program (a deployed file, a resolved DLL) is named file by file in a StagedFiles component group written beside the definition -- enumerated while the tree exists, never harvested from a directory -- placed at its staged path under INSTALLFOLDER, and declared an input of the action; the generated definition references the group, and a project's own options::wxs installs it with <ComponentGroupRef Id="StagedFiles" />. options::inputs and options::bundle_inputs declare the files a project's own definitions name beyond that (an icon, a bootstrapper application and its payloads). CI builds the bundle on windows-2022 and compares the MSI wix burn extract takes out of it with the one the first action wrote, and installs the MSI administratively and compares both the program and a deployed file
Module mcpp.dist.web; engine floor: 2026.9.13.1, the release that carries ${mcpp.self} and mcpp stage's argument shape as an engine contract (stage --verify content --output <dst> <src>) -- what lets this member's copy run on every host mcpp does, Windows included, in place of the cp this member used through 0.8.0.
Needs and behaviour. nothing beyond mcpp: wasm32-emscripten only. Copies ${mcpp.stage_dir}/bin/ -- the .js launcher, the implicit .wasm, the .data when present, and every mcpp::deploy'd file, all of which #622 A5 and A4 already stage there -- to <out_dir>/web/, dropping the bin/ prefix a browser has no use for, and writes an index.html rendered from a project template or a built-in default that loads the script with a plain <script src>. Each staged file and the rendered page are copied with ${mcpp.self} stage --verify content --output <dst> <src>, the same copier every stage_file edge in build.ninja already runs -- no host-specific copy tool, no plan-time create_directories (stage creates the destination's parent), and a second mcpp pack --format web with nothing changed copies nothing. From 0.12.0 options::page names the page (index.html by default), for a project whose other build names it after the target; a name that is not a bare *.html file name is refused at plan time