|
4 | 4 | > Each `## [<version>]` section is that release's notes. Entries are written in English |
5 | 5 | > from 2026.9.28.3 on; earlier entries remain as written. |
6 | 6 |
|
| 7 | +## [2026.10.30.1] - 2026-10-30 |
| 8 | + |
| 9 | +### Added |
| 10 | + |
| 11 | +- **Target sets (SPEC-015).** A `--target` whose first segment is a system |
| 12 | + word names every row of the target table with that system and environment: |
| 13 | + `openkal` is `x86_64-openkal` and `aarch64-openkal`, `linux-musl` the musl |
| 14 | + rows this mcpp builds. Each member is a leg. `build` builds every leg (planned |
| 15 | + one after another, built at once); `run` runs the first leg this machine |
| 16 | + reaches, its own architecture first; `test` runs the legs it reaches, reports |
| 17 | + the others built and not run, and fails when no test ran. The `mcpp.build` |
| 18 | + envelope adds `legs`, the events their `triple`; `self env` adds `legs` |
| 19 | + (e2e 963). `[build] target` takes one target. |
| 20 | +- **Tests built once, run elsewhere.** `mcpp test --no-run --archive <file>` |
| 21 | + writes every leg's tests with `mcpp-tests.json`; `mcpp test --archive <file>` |
| 22 | + in a checkout runs what this machine reaches and builds nothing. The archive |
| 23 | + is a tar compressed as its name states (`.tar.gz`, `.tgz`, `.tar.zst`, |
| 24 | + `.tar.xz`, `.tar`); another name is refused before the build (e2e 964). A |
| 25 | + leg of the host's own system runs from an archive as an openkal leg does |
| 26 | + (e2e 989, on every system); on macOS the first build of this release started |
| 27 | + none of them, giving each an environment entry of an empty name. |
| 28 | +- **The build's contract, `${mcpp.contract}`.** Every configuration writes |
| 29 | + `mcpp-contract.json` beside its compile database: the compiler of each |
| 30 | + language with the words every unit is compiled with (target, sysroot, |
| 31 | + target-side headers, platform and profile flags), and the link driver, its |
| 32 | + words and the archiver. A build program's action names it with |
| 33 | + `${mcpp.contract}` and reads it while ninja runs, so a foreign build system |
| 34 | + compiles for the target as the engine does; the engine's own C++ dialect and |
| 35 | + module words are not in it (e2e 982). mcpp-plugins 0.21.0's `deps-cmake` |
| 36 | + compiles a cross build's subproject from it. |
| 37 | +- **`[platform] runner.hosts`, carrier entries and `descriptor_keys`.** A |
| 38 | + platform states the `<os>-<arch>` pairs its runner exists for, any number of |
| 39 | + carrier entries each for the pairs in its `hosts` (an entry of a carrier |
| 40 | + model this mcpp does not build is skipped with a warning), and the |
| 41 | + descriptor blocks its targets read (SPEC-013 §1.1, §10, §11, §14). |
| 42 | +- **`runs_on` in `mcpp-package.json`.** Where a package runs is computed once |
| 43 | + when it is packed: `self`, the pairs it runs on with what it carries, and |
| 44 | + `with.<runner>`, the pairs it runs on given the machine's runner. |
| 45 | + |
| 46 | +### Changed |
| 47 | + |
| 48 | +- **A pack holds the legs it names (SPEC-014 2.0).** `--target |
| 49 | + x86_64-openkal` packs that architecture; `--target openkal` packs both into |
| 50 | + one tree. The platform no longer widens a pack: `[platform] universal`, |
| 51 | + `[pack] universal` and `--no-universal` lose their effect, with a message |
| 52 | + that names the new spelling (`[pack] targets = ["openkal"]`; docs/51). |
| 53 | + Images of a platform with a runner have one layout whatever the number of |
| 54 | + legs: `bin/<name>`, `bin/<name>.exe`, `lib/<arch>/`, and with |
| 55 | + `--mode self-contained` `libexec/<runner>/<os>-<arch>/`. The image embedded |
| 56 | + in a carrier belongs to `--pkg-format single-file` only. A set of native |
| 57 | + programs is a package per leg (e2e 955, 983, 984). |
| 58 | +- **The Windows launcher is a program.** `bin/<name>.exe` replaces |
| 59 | + `bin/<name>.cmd`: no "Terminate batch job" prompt, and the process is named |
| 60 | + after the package. The POSIX launcher hands over to it under Git Bash, MSYS |
| 61 | + and Cygwin. |
| 62 | +- **`--systems` takes `<os>`, `<os>-<arch>` and `all`, and `[pack] systems`.** |
| 63 | + `--pkg-format` takes a list of containers of one staged tree (`tar,okb`), |
| 64 | + built once (e2e 985). Single files cover legs × systems (e2e 986). |
| 65 | +- **The pack summary names where the package runs.** `Runs on` and one `Not |
| 66 | + covered` line per pair the package does not reach; `mcpp.pack` adds |
| 67 | + `pkgFormats` and `runsOn`. A tree that runs nowhere is refused. |
| 68 | +- **A target reads the descriptor blocks its row names, never the build |
| 69 | + machine's (#851).** A target that is not Linux, macOS or Windows read the |
| 70 | + block of the system mcpp ran on, so a Web build took a dependency's `linux` |
| 71 | + block on Linux and its `windows` block on Windows, and an ok image the block |
| 72 | + of whichever system built it. Each row now names its blocks in order: |
| 73 | + `wasm32-emscripten` reads `emscripten`, then `linux`; `<arch>-openkal` |
| 74 | + `openkal`, then `linux` (a platform may state its own); iOS `ios`, then |
| 75 | + `macosx`; bare metal `none`. Version resolution, the synthesised manifest |
| 76 | + and the index refresh read the same block (unit `DescriptorKeys`). |
| 77 | +- **The Web link carries the profile's optimisation level (#851).** emcc runs |
| 78 | + wasm-opt and minifies the JavaScript launcher at the link, which had no |
| 79 | + `-O`: a release Web program was linked at `-O0`. The hello world's |
| 80 | + JavaScript is 13 KB rather than 66 KB (e2e 981). |
| 81 | +- **`[target.<sel>.abi] exceptions` takes the model (#851).** `"wasm"` selects |
| 82 | + WebAssembly's exception handling (`-fwasm-exceptions`), `"js"` the |
| 83 | + JavaScript model; `true` keeps the JavaScript model it has selected since |
| 84 | + 2026.9.12.3. The model is part of every cache key (e2e 981). |
| 85 | +- **`mcpp emit xpkg` names where a package runs (#860).** A |
| 86 | + self-contained universal package's entry named every system with every |
| 87 | + image architecture, so an Intel Mac installed a package that carries no |
| 88 | + runner for it. Each system's block names the architectures `runs_on` gives: |
| 89 | + the carried runners for a self-contained package, the pairs the platform's |
| 90 | + runner exists for otherwise. |
| 91 | + |
| 92 | +### Fixed |
| 93 | + |
| 94 | +- **A name two dependencies answer to is no package's (#852).** Two |
| 95 | + dependencies whose manifests both say `rules` warned on every build, and the |
| 96 | + bare name went to one of them. It is now published for neither: |
| 97 | + `MCPP_DEP_AMBIGUOUS_RULES` lists the qualified names, each qualified name |
| 98 | + keeps its own directory, and `dep_dir("rules")` ends the build program naming |
| 99 | + both (e2e 980). |
| 100 | +- **Programs start in the Android app sandbox again (#857).** Under `run-as` |
| 101 | + (SELinux `runas_app`) every program mcpp started failed with "not found" |
| 102 | + since 2026.10.26.2. A static strace showed one failing call, before any |
| 103 | + process was created: the root directory opened for reading, which the |
| 104 | + domain may search but not read. openkal-linux 0.18.3 opens every directory |
| 105 | + handle with `O_PATH`; mcpp is built on mcpplibs.os 0.2.3, which pins it, and |
| 106 | + openkal-platform 0.18.0 carries it to every ok image and hosted program. |
| 107 | +- **A gzip stream over 4 GiB.** zlib counts in 32 bits, and mcpp handed it the |
| 108 | + whole tree at once: a `.tar.gz` of more than 4 GiB was refused as "an input |
| 109 | + over 4 GiB", by `mcpp pack` and by a test archive alike. Input and output |
| 110 | + now pass in pieces of 1 GiB, so such a tree is one gzip member as any other. |
| 111 | +- **A program that cannot be started is reported with the system's account.** |
| 112 | + Every condition beyond not found, permission and not a program was reported |
| 113 | + as "error 5" (EIO), the system's own message dropped. The classification now |
| 114 | + covers invalid, no memory, directory, not supported and too large, and the |
| 115 | + report of `mcpp test` and `mcpp test --archive` carries what was being done |
| 116 | + and the kernel layer's value. |
| 117 | + |
7 | 118 | ## [2026.10.29.1] - 2026-10-29 |
8 | 119 |
|
9 | 120 | ### Fixed |
|
0 commit comments