|
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.27.1] - 2026-10-27 |
| 8 | + |
| 9 | +### Added |
| 10 | + |
| 11 | +- **Platforms: the configuration of a class of targets as one versioned package** |
| 12 | + (SPEC-013; docs/35). A package's `[platform]` section states the targets it |
| 13 | + serves, their toolchain and target base, the package for each target-side |
| 14 | + layer (`[platform.layers]`, or `false`), the tools built for this machine |
| 15 | + (`[platform.tools]`), the compile flags (`[platform.build]` and its |
| 16 | + `cfg(...)` tables), the link (`[platform.link]`: `driver`, `flags`, `start`, |
| 17 | + `script`, `inputs`, the names `exe` and `shared`, the `seal` steps), the |
| 18 | + runner (`{ cmd, host = "same-arch" | "any", exclusive }`) and named runners, |
| 19 | + the carrier of a self-contained program, a plugin run in the platform phase, |
| 20 | + a version group (`[platform.versions]`) and the part a host triple takes |
| 21 | + (`[platform.hosted]`). The engine selects a platform for the target graph |
| 22 | + (`--platform`, `MCPP_TARGET_<T>_PLATFORM`, `[target.<selector>] platform`, |
| 23 | + `config.toml`, the target table) and for the host graph (`--host-platform`, |
| 24 | + `MCPP_HOST_PLATFORM`, `[host] platform`), merges the overrides a project and |
| 25 | + this machine write under the same key names, adds the layers and tools the |
| 26 | + graph lacks (a layer a package of the graph provides is left to it), links, |
| 27 | + seals and names the artifact, runs it, and reports every value with its |
| 28 | + source. `cfg(platform = "<name>")` selects by platform. |
| 29 | +- **`x86_64-openkal` and `aarch64-openkal` need no declaration.** The target |
| 30 | + table selects `mcpplibs.openkal-platform` for both rows, and the platform |
| 31 | + states what a project wrote by hand in 2026.10.26.2: `llvm@23.1.3`, |
| 32 | + openkal-musl, openkal-llvm-runtime, `okld` and `okrun`, the image's flags, |
| 33 | + its link and seal, `{name}.oke` and `lib{name}.okso`, the runner and the M3 |
| 34 | + carrier. A project that names only its sources builds, runs, tests and |
| 35 | + packs an ok image. The engine holds no openkal code (`src/okimage` is |
| 36 | + removed). |
| 37 | +- **The host graph's platform.** With `[host] platform` build programs and |
| 38 | + their libraries are compiled as ok images of this machine's architecture, |
| 39 | + with one toolchain on Linux, macOS and Windows, and run by the platform's |
| 40 | + runner; a platform's own tools are always built natively. e2e 953; a |
| 41 | + platform package unrelated to openkal is e2e 952. |
| 42 | +- **Protocol 17** (SPEC-007 R9.10): `link_driver`, `link_input`, |
| 43 | + `link_input_from`, `artifact_name`, `seal` and `run_host`, stated by a |
| 44 | + platform's plugin in the platform phase (`mcpp::phase()` is `"platform"`) |
| 45 | + or by any build program in its build phase. |
| 46 | +- **One configuration, without a build.** `mcpp self env --target <triple>` |
| 47 | + (`--host`, `--format json`) reports the toolchain, the platform with each |
| 48 | + field's source, the tools, the runner and its program; `mcpp toolchain |
| 49 | + install --target <triple>` fetches the target's platform and builds its |
| 50 | + tools; `mcpp toolchain list` has a PLATFORM column. |
| 51 | +- **`mcpp test` builds the package's programs first** and gives each test |
| 52 | + `MCPP_BIN_<NAME>`, the path of the program `<name>`. In a platform package |
| 53 | + with no `--target`, it builds the tests for each of the platform's targets |
| 54 | + and runs those of this machine's architecture. |
| 55 | +- **Packaging along three axes** (SPEC-014; docs/10): `--linkage |
| 56 | + static|shared` (the program's dependency linkage; on Linux `static` is the |
| 57 | + musl row), `--mode system|vendored|self-contained` (what the machine |
| 58 | + provides; `--mode static` is `--linkage static --mode self-contained`), |
| 59 | + `--pkg-format tar|zip|dir|single-file|<provided>` (what is delivered; a |
| 60 | + format left unstated is a zip for a Windows program and a tar elsewhere) and |
| 61 | + the legs (`--target`, repeatable). Impossible combinations are refused before |
| 62 | + the build. `[pack] linkage`, `format`, `compress`, `sign` and `universal` are |
| 63 | + the project's defaults. e2e 954. |
| 64 | +- **Universal packages.** A platform with `universal = true` (openkal-platform) |
| 65 | + packs every one of its targets into one package, `<name>-<version>-<platform>`, |
| 66 | + with `lib/<arch>/` per leg and generated launchers (`bin/<name>`, |
| 67 | + `bin/<name>.cmd`) that pick the machine's architecture and start the |
| 68 | + platform's runner; `--mode self-contained` adds the runner of each system of |
| 69 | + `--systems` and each architecture under `libexec/`, built over the platform's |
| 70 | + hosted arrangement on any machine (a macOS or Windows runner is packed on |
| 71 | + Linux with no SDK and no C run-time of that system); `--no-universal` packs |
| 72 | + the selected target alone. e2e 955. |
| 73 | +- **Single files.** `--pkg-format single-file` writes one executable: for a |
| 74 | + native program the engine's launcher carrying the staged tree as a zstd |
| 75 | + frame, extracted once into the user's cache under the payload's sha256 and |
| 76 | + run from there; for an ok image the platform's carrier running the image |
| 77 | + from memory, one file per system of `--systems`. e2e 956. |
| 78 | +- **Compression in mcpp's own codecs.** `--compress gzip|zstd|xz|none[:level]` |
| 79 | + (`.tar.gz`, `.tar.zst`, `.tar.xz`, `.tar`) with zlib, zstd and liblzma as |
| 80 | + dependencies of mcpp: no compressor is looked for on `PATH`, and an archive |
| 81 | + is the same bytes on every host. A zip's entries are deflated (`gzip`) or |
| 82 | + stored (`none`). |
| 83 | +- **`mcpp-package.json` and what reads it.** Every staged tree describes its |
| 84 | + package: platform, the three choices, legs, systems, how it starts, and each |
| 85 | + file with its role, leg and sha256. `mcpp pack --merge a --merge b` joins |
| 86 | + packages written on several machines (legs and systems united, one digest |
| 87 | + per path); `mcpp emit xpkg --package <archive> --url <prefix>` writes the |
| 88 | + xim-pkgindex entry, one asset for every system for a universal package with |
| 89 | + its runner as a dependency. `[pack] sign = [argv]` signs each program, image, |
| 90 | + library and loader before the container, and each single file. e2e 957. |
| 91 | +- The `mcpp.pack` envelope gains `linkage`, `mode`, `pkgFormat`, `legs`, |
| 92 | + `systems` and each file artifact's `sha256`. A platform's plugin may provide |
| 93 | + package formats (`pack-format`, `artifact` actions) in the platform phase. |
| 94 | +- `mcpp.lock` records the packages a platform added, and those only they |
| 95 | + reach, with `origin = "platform"`, and names each entry's configurations in |
| 96 | + `targets` (absent for an entry of this machine's native configuration alone, |
| 97 | + so a lock of a natively built project is unchanged): a build for this machine |
| 98 | + and a build or pack for an ok image leave each other's entries as they were. |
| 99 | + The `plan` event and `result.json` carry `configuration.platform` and |
| 100 | + `hostPlatform`. |
| 101 | + |
| 102 | +### Changed |
| 103 | + |
| 104 | +- **`--pkg-format` is the package format of `mcpp pack` and `mcpp run`.** |
| 105 | + `--format` there is the earlier spelling and prints a warning; on every other |
| 106 | + command `--format` is the output encoding. |
| 107 | +- The reason `image-tool-absent` is `platform-tool-absent`; new reasons |
| 108 | + `platform-not-a-platform`, `platform-target-unserved`, |
| 109 | + `platform-version-group` and `platform-phase-directive`. |
| 110 | +- A layer the target's platform added is reported `platform`, and the |
| 111 | + platform follows on a `Platform` line (`Host platform` for the host graph). |
| 112 | +- A version of a dependency the index does not have is stated by mcpp: which |
| 113 | + index, its revision and age, and whether it was refreshed now and why not; |
| 114 | + the provider's own report is printed under `-v`. |
| 115 | +- A package shared by several configurations of one command is announced once. |
| 116 | +- **With `trim_paths`, clang is given `-ffile-reproducible`** (clang 17 and |
| 117 | + later): `__FILE__` takes the target's separator where clang applies it. An ok |
| 118 | + image built on Linux and one built on macOS are the same bytes; one built on |
| 119 | + a Windows host is not, because clang keeps the `\` it joined an included |
| 120 | + path with for a POSIX target (#850, upstream), and `mcpp pack --merge` |
| 121 | + refuses its images beside the others. |
| 122 | +- **`--pkg-format tar` writes `.tar.gz` on every host, Windows included**, with |
| 123 | + mcpp's own zlib, for a program's package and a library's alike; no `tar` or |
| 124 | + `gzip` program is run. `--compress none` writes `.tar`. |
| 125 | +- `x86_64-openkal` and `aarch64-openkal` select openkal-platform 0.17.3 |
| 126 | + (openkal-musl 0.22.6, openkal-llvm-runtime 0.16.6): the C library takes a |
| 127 | + program's arguments when it is entered, which a hosted program on macOS did |
| 128 | + not receive. |
| 129 | +- A platform's link with `ld.lld` itself finds the linker as `ld.lld`, `lld` |
| 130 | + or `lld-link` beside the compiler (a Windows payload ships `lld-link`, run |
| 131 | + with `-flavor gnu`); `mcpp explain <reason>` explains each `platform-*` |
| 132 | + reason. A build program's cached run is replayed only while what it named |
| 133 | + below its output directory is there (e2e 958). |
| 134 | + |
| 135 | +### Fixed |
| 136 | + |
| 137 | +- **A version the local index lacks is refreshed for when its install is |
| 138 | + refused.** The walk refreshes the index when a descriptor is missing, and not |
| 139 | + when a descriptor is present without the version asked for (version tables |
| 140 | + are per system, so that absence is not proof). The provider's "not found" for |
| 141 | + the version is, and it now reaches the refresh policy (offline, |
| 142 | + `[index] auto_refresh`, the debounce, one sync per run); after a refresh the |
| 143 | + install is asked once more. A dependency on a version published after the |
| 144 | + index was last synced (`openkal-llvm-runtime = "0.16.3"`) was refused until |
| 145 | + `mcpp index update`. e2e 949. |
| 146 | +- **A kernel-abi package over the system's C library is placed into the shared |
| 147 | + image that reaches it.** Every package providing an `mcpp:` layer was a |
| 148 | + boundary of static placement and went into programs only, which is right for |
| 149 | + a C library or a C++ runtime. On a hosted target openkal-linux (-macos, |
| 150 | + -windows) sits on the system's C library and is an ordinary static library |
| 151 | + under `mcpplibs.os`; a shared image reaching it was left with `kal_*` |
| 152 | + undefined, and CPython could not load an extension built on `mcpplibs.os` |
| 153 | + (`undefined symbol: kal_process_close`). A `kernel-abi` provider is now a |
| 154 | + boundary only when a C library of the graph sits on it. e2e 950. |
| 155 | +- **A kernel-abi package over the system's C library leaves a hosted row's |
| 156 | + toolchain in place.** The musl and windows-gnu rows name the payload that |
| 157 | + supplies the target's C library, and a graph that supplies a C library |
| 158 | + replaces it; a kernel-abi package counted as one. On linux-aarch64 a project |
| 159 | + reaching openkal-linux through `mcpplibs.os` then compiled `--linkage |
| 160 | + static` (the musl row) with the machine's llvm against glibc's headers. A |
| 161 | + kernel-abi package now supplies the system only on a target that has none of |
| 162 | + its own (a freestanding or a loader-supplied row). e2e 292. |
| 163 | +- **A package whose descriptor was read is the only one asked for.** A refused |
| 164 | + install of a namespace-omitted dependency was tried again as |
| 165 | + `compat:<name>` and `compat.<name>`, shown as downloading, and reported with |
| 166 | + three addresses, although the descriptor had named the package in |
| 167 | + `mcpplibs`. The compat spellings are tried only when no descriptor could be |
| 168 | + read. |
| 169 | +- **Two versions of a package that exports a header directory or provides a |
| 170 | + target-side layer are refused**, naming both requests. A renamed copy kept |
| 171 | + its C names and link symbols, and the two met in one link or one include |
| 172 | + path at a place that named neither. |
| 173 | +- **A version group is checked before the platform completes the graph.** A |
| 174 | + family package the project pinned outside the group is refused as the |
| 175 | + group's conflict, with both remedies. |
| 176 | +- **The std module of a macOS build whose C library is the graph's takes the |
| 177 | + deployment floor** every unit takes; it took the running system's version. |
| 178 | + |
7 | 179 | ## [2026.10.26.2] - 2026-10-26 |
8 | 180 |
|
9 | 181 | ### Added |
|
0 commit comments