维护说明:未发版的变更记录在 ## [Unreleased] 下;准备发版时,按
vX.Y.Z 标题格式将累计条目整理到对应版本节,并按改动性质归入
Added、Changed、Fixed、Docs 或 Chore。每条记录只保留用户和维护者
需要知道的主线变化,不逐行复制提交差异。
- mcpp.plugins 0.22.0。 dist-web 的页面是该格式唯一的可分发物,长期运行的
web运行器(emrun)提供该目录并打开页面; 被拒绝的请求以警告陈述;mcpp 2026.11.16.1 起 dist-web 向引擎陈述它包装的程序(mcpp::pack_program,协议 19), 多程序的包无需指名即打包该程序。包的下限仍为 mcpp 2026.10.30.1;latest指向 0.22.0(mcpp-community/mcpp-plugins#54)。 - openkal-platform 0.28.0。 增加四行:
i686-linux-musl(Linux 的 32 位行)、x86_64-uefi(openkal-uefi 0.10.0 之上的 UEFI 应用, OVMF 下由 dirun 运行;ok 映像也可作为被承载程序打包为 UEFI)、i686-openkal(i386 的 ok 映像)与i686-dos-musl(openkal-dos 之上的 DOS 程序, 仅为技术实验)。版本组随 openkal 0.25.3、openkal-macos 0.23.3、openkal-musl 0.29.6、openkal-llvm-runtime 0.20.3 与 openkal-image 0.6.3; 需要 mcpp 2026.11.14.1(mcpplibs/openkal-platform#31)。 - djgpp-platform 0.1.0(新包)。 DJGPP 构建的 32 位 DOS 程序的平台包:行
i586-dos-djgpp(COFF 目标文件、.exe、ILP32、 执行系统dos),其 GCC 由行的 GCC 目标i586-pc-msdosdjgpp指定(xim 包i586-pc-msdosdjgpp-gcc12.2.0),运行器为带 DOSBox Staging 配置的 dirun。仅 C:DJGPP 的 GCC 12.2.0 不支持 C++ 模块的依赖扫描。它与 openkal 的 DOS 路线 (openkal-platform 的i686-dos-musl,社区默认)并存;需要 mcpp 2026.11.13.1(mcpplibs/djgpp-platform#1)。
-
openkal-platform 0.28.1(版本组补丁)。 okrun、okld 与工具取 openkal-run/openkal-ld/openkal-tools 0.6.4(okrun 以 uname 指名目标), C 库取 openkal-musl 0.29.7,openkal-macos 0.23.4;行与键不变(mcpplibs/openkal-platform#32)。
-
openkal-musl 0.29.7。 在 hosted 安排中,
uname的sysname报程序所运行的系统(Linux、FreeBSD、Darwin、Windows_NT、UEFI、MS-DOS);ok 映像仍报openkal(mcpplibs/openkal-musl#96)。 -
mcpplibs.mwrap.recastnavigation 1.6.0.2(包装修订 2)。 网格在每个平台上逐字节相同。1.6.0.1 的 Detour BV 树与 Recast 轮廓孔洞合并 用 C 库的
qsort排序,qsort不稳定,glibc、macOS、Windows UCRT 与 emscripten 对相等键的排列不同,带并列键的网格(网格状布局 很常见)因而得到不同的字节,其上的群体走到不同位置。补丁 0004 让这五处改用std::stable_sort(同一比较函数,值得回馈上游);新测试 钉住分成四块的柱网大厅的字节与群体状态,各平台一致。消费者测试tests/mwrap/recastnavigation-path改用 1.6.0.2。 -
openkal-emscripten 0.14.3。 描述符权限表(4096 个条目与 64 个根)的成员默认值为 -1,两张表因此是已初始化数据:每个 Web 构建的程序带着约 80 KiB 不会用到的字节(一个交付预算 4,000,000 B 的站点因此超出 9,332 B)。默认值全部改为零,取用的槽位再设哨兵; emsdk 6.0.9、-O2 下
g_entries与g_roots从.data移到.bss,行为不变(mcpplibs/openkal-emscripten#22)。 -
openkal-image 0.6.4(openkal-run、openkal-ld、openkal-tools、openkal-bind)。 okrun 在匹配前对每个映像名作词法规整,绝对名与相对名 一样:空分量(
//)与.去掉,..去掉前一分量;此前绝对名原样匹配,含//的名字被拒绝。发布工作流在发布时自动运行,每个 发布都带产物,并增加 FreeBSD x86_64 与 aarch64(在 FreeBSD 机器中运行后附加)(mcpplibs/openkal-image#40)。 -
openkal-macos 0.23.4。 libSystem 的桩为 x86_64 列出
__bzero:clang 在该架构上把清零的memset降为__bzero,无 SDK 的 链接因此失败,x86_64-macos-musl的发布构建对任何程序都失败;CI 在 Linux 上链接、在 Intel Mac 上运行(mcpplibs/openkal-macos#50)。 -
mcpplibs.mwrap.recastnavigation 1.6.0.1(包装修订 1)。 群体的避障在每个平台上逐位相同。1.6.0 的 DetourCrowd 避障与 DetourTileCache 有向盒绕过 Detour 自己的钩子直接调用 C 库的
cosf、sinf,而钩子本身也转给 libm:glibc、macOS、Windows UCRT 与 emscripten 相差 一个 ulp,开启DT_CROWD_OBSTACLE_AVOIDANCE的群体因平台走到不同位置。三个补丁(patches/,预先应用在upstream/,documents.json记录每个文件在发布包中与打补丁后的校验和):0001 改调dtMathCosf/dtMathSinf(值得回馈上游);0002 让钩子和 Recast 求坡度的cosf使用port/DeterministicMath.cpp(只用 IEEE 运算,遍历全部 float 实测误差 0.500000001 ulp);0003 修正adaptiveDivs为偶数时读取未初始化方向、32 方向 4 圈时写出数组末尾的上游缺陷(上游 issue #496、#798)。消费者测试tests/mwrap/recastnavigation-path改用 1.6.0.1。 -
openkal 0.25.3。 一致性套件是独立的 mtest 项目(
tests/cts/mtest.toml):引擎在套件目录启动程序并把运行记录存入tests/cts/.mtest。0.25.2 下引擎取仓库根的项目,记录写入根存储,交给运行器(Web 上的node)的程序名按错误的目录解析。 条款与声明无变化(mcpplibs/openkal#68)。 -
openkal-macos 0.23.3。 构建程序只在请求了目标且链接不带 SDK 时提供 libSystem 的替身;它读取 mcpp 的
MCPP_TARGET_SDK(mcpp 2026.11.14.1)。在 Mac 上以--target aarch64-macos构建时链接带 SDK,替身的名字不再遮蔽 SDK 的 libSystem (undefined symbol: strlen);较早的 mcpp 不设该变量,沿用原条件(mcpplibs/openkal-macos#49)。 -
openkal 0.25.2。 一致性套件经弱引用到达每个名字而不要求其存在:丢弃无引用定义的链接保留实现所定义的名字,第 9 条的比较据此读取 (第 11 条第 63 项)。仓库的测试采用 mtest 布局(
tests/unit、tests/e2e,套件位于tests/cts,原conformance/);tools/run-conformance.sh的调用方式不变。声明无变化,按 0.25.1 编写的实现仍然符合(mcpplibs/openkal#67)。 -
mcpplibs.mwrap.meshoptimizer 1.3.1(包装修订 1)。 库以
-ffp-contract=off、不开 fast math 编译:同样的输入在每个平台上逐位得到同样的 meshlet、聚类与简化结果。1.3 按平台默认编译,arm64 把乘与加合成一次舍入,打乱的 48 × 48 网格得到的 meshlet 与 x86-64 不同(由一个 消费者在 ubuntu-24.04-arm 上的测试发现)。上游源码不变;消费者测试tests/mwrap/meshoptimizer-simplify改用 1.3.1。 -
mtest 0.9.0. 四个包的 0.9.0(同一标签、同一归档):选择文件的
!<id>排除该用例及其声明的用例,?<id>只在用例被声明时选中、 未声明时不报缺失;程序事件以"selection": ["except", "optional"]陈述这一能力(SPEC-017 P4.3,mcpp-community/mtest#24)。 运行器据此按用例声明的子用例划分一个长用例。不含!、?的选择行为不变。 -
mtest 0.8.5. 四个包的 0.8.5(同一标签、同一归档):
e2e::run的结果在输出达到上限时如实说明——outcome带回out_truncated、err_truncated与held_open,command可声明各输出的上限(out_limit、err_limit,默认值不变), 失败的succeeded、exited指出被截断的输出及其长度(mcpp-community/mtest#22)。其余行为不变。 -
mtest 0.8.4. 四个包的 0.8.4(同一标签、同一归档):测试程序在不能启动程序的系统上(
wasm32-emscripten)可以链接——以命令探测的 能力在该目标上于编译期回答“不具备”,不再触及进程接口;0.8.0 至 0.8.3 在该目标上链接不出任何测试程序。其余目标不变。 -
compat.glfw:Win32 后端以
requires = { "mcpp:kernel-abi=windows" }陈述它直接调用的系统接口。 MSVC 行、MinGW-w64 载荷与 mingw-w64-sysroot 基座都回答windows,且本索引接受的每个 mcpp 版本都如此回答(载荷的 kernel-abi 即目标的系统);openkal-musl 经 openkal-windows 的 Windows 身份回答openkal,没有窗口系统,在解析期以该要求被拒绝,不再在<windows.h>处编译失败。 要求写在c-abi=ucrt上则会使 2026.11.3.1–2026.11.10.1 在 MSVC 上拒绝本包(这些版本对 MSVC 回答msvc)。 -
compat.mimalloc:ok 映像不再链接
-lpthread、-lrt,Linux 不再链接-latomic。 ok 映像(<arch>-openkal)原先读linux块,链接时找不到这两个归档;新增openkal块,不列链接参数。-latomic上游只在找到时才链接,mimalloc 的原子操作在本索引 构建的各架构上都是无锁的,LLVM 工具链在图中 C 库之上没有这个归档。
-
CI 的 mcpp 由 2026.11.9.1 改为 2026.11.10.1(xpkgindex-update、openkal-compat 与
tests/openkal/pins.toml),以满足 openkal-image 0.6.0 的版本下限。 -
CI 的 mcpp 由 2026.11.7.2 改为 2026.11.9.1(xpkgindex-update、openkal-compat 与
tests/openkal/pins.toml),以满足 openkal-platform 0.24.5 的版本下限。 -
validate:llvm 腿不再从 Ubuntu 镜像安装 ffmpeg 开发包,改为在
/usr/include下放置 FFmpeg 公开头文件同名、内容为#error的文件。 文件名取自 compat.ffmpeg 描述符所指发布(按描述符的 sha256 校验)。宿主头文件一旦被包含即在包含处报错, 比安装另一版本的头文件更直接地检验包含顺序;2026-11-06 起 ubuntu-26.04 运行器上 ffmpeg 依赖闭包(约 100 MiB)的下载在每个 超时内都完成不了。
-
mcpplibs.mwrap.acl 2.1.0(新包)。 acl-m:Animation Compression Library 2.1.0(在给定误差内压缩骨骼动画片段与标量轨道, 并在任意时刻回放)及其固定的 Realtime Math 2.2.0 的 C++23 模块,以
export using在上游的命名空间acl、rtm、rtm::constants里导出两库头文件的全部公开名字(197 个类型、454 个函数);15 个内部链接的constexpr常量(k_invalid_track_index、k_num_quality_tiers等)以原名、原类型和原值位于mcpplibs::mwrap::acl。导出清单由 clang 读头文件推出并在 CI 中审计。封装仓库 从上游发布包取源码(应用上游提交 0b06bd1 的一处修复),以RTM_NO_INTRINSICS、ACL_NO_INTRINSICS、-ffp-contract=off、不用快速 数学构建:同一个片段在 Linux x86-64 与 arm64、macOS、Windows、wasm32 上,dev 与 release,压缩字节与回放姿态的哈希相同(钉住)。 不含io(SJSON 读写)与引擎插件。消费者测试tests/mwrap/acl-clip,安装后模板检查带--deploy。GLOBAL 为 GitHub 发布资产, CN 为 GitCodemcpp-res/mwrap-acl镜像,sha256 相同。 -
mcpplibs.mwrap.recastnavigation 1.6.0(新包)。 recastnavigation-m:Recast & Detour 1.6.0(由三角形构建导航网格、寻路、群体、 带障碍物的分块网格)的 C++23 模块,以
export using在全局命名空间导出 Recast、Detour、DetourCrowd、DetourTileCache 头文件的 全部公开名字(99 个类型、75 个无作用域枚举的枚举项、170 个函数);52 个内部链接的static const常量(DT_VERTS_PER_POLYGON、DT_SUCCESS、RC_WALKABLE_AREA、RC_PI等)以原名、原类型和原值位于mcpplibs::mwrap::recastnavigation。导出清单由 clang 读头文件 推出并在 CI 中审计。封装仓库从上游 1.6.0 发布包取源码(不依赖compat.recastnavigation:确定性要求库本身以-ffp-contract=off、不用快速数学、各配置都定义NDEBUG编译,依赖的构建不接受消费者的这些标志;一个程序只链接两者之一),以这些标志构建:同一 组三角形与群体在 Linux x86-64 与 arm64、macOS、Windows、wasm32 上,dev 与 release,网格字节与群体位置的哈希相同(钉住)。不含 DebugUtils 与演示程序。消费者测试tests/mwrap/recastnavigation-path,安装后模板检查带--deploy。GLOBAL 为 GitHub 发布资产, CN 为 GitCodemcpp-res/mwrap-recastnavigation镜像,sha256 相同。 -
mcpplibs.mwrap.jolt 5.6.0(新包)。 jolt-m:Jolt Physics 5.6.0(刚体与软体物理:形状、约束、查询、角色、载具)的 C++23 模块,以
export using在上游的命名空间里导出<Jolt/…>下各头文件的全部公开名字(JPH450 个类型、127 个函数与运算符、 6 个对象,及嵌套命名空间ClosestPoint、HalfFloatConversion、ScaleHelpers、StreamUtils、literals的名字);50 个内部链接的 常量(cMaxPhysicsJobs、cDefaultConvexRadius、JPH_PI等;常量数组为std::array)以原名位于mcpplibs::mwrap::jolt。导出清单 由 clang 读头文件推出并在 CI 中审计;JPH::FPControlWord只在上游声明它的平台(SSE、Arm)导出。封装仓库从上游 5.6.0 发布包取 源码并以跨平台确定模式构建(JPH_CROSS_PLATFORM_DETERMINISTIC、-ffp-contract=off、不用快速数学,JPH_NO_DEBUG使各配置相同): 同一场景在 Linux x86-64 与 arm64、macOS、Windows、wasm32 上,dev 与 release,0、1、4 个工作线程,哈希相同(钉住)。不含调试 渲染器、性能剖析、对象流与 GPU 计算后端。消费者测试tests/mwrap/jolt-world,安装后模板检查带--deploy。GLOBAL 为 GitHub 发布资产,CN 为 GitCodemcpp-res/mwrap-jolt镜像,sha256 相同。 -
mcpplibs.mwrap.basis_universal 2.50.1(新包)。 basis-universal-m:Basis Universal 2.50 转码器(把 KTX2 与
.basis纹理转成 像素或 GPU 自己的压缩格式)的 C++23 模块,<transcoder/basisu_transcoder.h>在basist、basisu及其内部命名空间声明的 603 个名字(148 个类型、273 个函数、70 个对象、112 个无作用域枚举的枚举项)以原名导出;头文件里 139 个内部链接的标量常量 以原名位于mcpplibs::mwrap::basis_universal::<所在命名空间>,11 个无法重新给出的内部链接名字(static函数、常量表、 非常量表达式的const float)留给头文件。封装仓库逐字节收录 v2_50 发布包的transcoder/与上游随附的 Zstandard 解码器 (zstd/zstddeclib.c),按上游默认方式构建(全部格式、KTX2、Zstandard),关闭浮点收缩;不含编码器。封装的测试读取上游 自己的 KTX2 测试文件:ETC1S 照片转成 RGBA 像素与 BC7、ETC2、ASTC 块的哈希在四个平台行一致,同一幅 XUASTC 图的两种打包 给出同一幅图。消费者测试tests/mwrap/basis-universal-transcode,安装后模板检查带--deploy。GLOBAL 为 GitHub 发布资产, CN 为 GitCodemcpp-res/mwrap-basis-universal镜像,sha256 相同。封装修订 2.50.1(2.50 保留):在每个目标上都启用不透明块的 较大 ASTC 表(上游在 Emscripten 下关闭它),编译为 WebAssembly 时的 ASTC 块与原生构建相同;平台列表加入 emscripten。 -
mcpplibs.mwrap.libjpeg_turbo 3.2.1(新包)。 libjpeg-turbo-m:libjpeg-turbo 的 TurboJPEG API(JPEG 压缩、解压、无损变换)的 C++23 模块,
<turbojpeg.h>的 7 个枚举、68 个枚举值、4 个类型、80 个函数以原名导出;头文件里的 43 个常量宏、9 个static const常量与表、3 个带参数的宏(tj3Init、TJSCALED、TJPAD)以原名位于mcpplibs::mwrap::libjpeg_turbo。 封装仓库逐字节收录 3.2.1 发布包中 TurboJPEG 静态库的源文件,按上游的清单构建:不带 SIMD 扩展(C 代码,默认路径全程 整数运算,各平台结果相同)、libspng 链接compat.zlib(上游的WITH_SYSTEM_ZLIB)、关闭浮点收缩。封装的测试里上游的testorig.jpg解码结果与上游回归测试期望的 MD5 一致。消费者测试tests/mwrap/libjpeg-turbo-decode,安装后模板检查带--deploy。GLOBAL 为 GitHub 发布资产,CN 为 GitCodemcpp-res/mwrap-libjpeg-turbo镜像,sha256 相同。 -
mcpplibs.mwrap.manifold 3.5.5.1(新包)。 manifold-m:Manifold(始终保持流形的实体几何库)的 C++23 模块,以
export using在上游的命名空间里导出<manifold/manifold.h>与<manifold/polygon.h>的全部公开名字(manifold36 个类型、10 个函数,manifold::math16 个函数,linalg10 个类型、116 个函数与运算符);7 个内部链接的constexpr常量(kPi、DEFAULT_SEGMENTS、linalg::identity等)以原名位于mcpplibs::mwrap::manifold。导出清单由 clang 读头文件推出并在 CI 中审计。 封装仓库从上游 3.5.5 发布包取源码并自行构建:与上游一样关闭浮点收缩(封装修订 3.5.5.1 补上,3.5.5 未入索引), 单线程(MANIFOLD_PAR=-1,不依赖 oneTBB),同样的输入在各平台给出逐位相同的三角形(次序随标准库的排序而不同),不含CrossSection(上游实现依赖 Clipper2,3.5.5 中不依赖它的后端只是占位)。消费者测试tests/mwrap/manifold-boolean,安装后模板检查带--deploy。 GLOBAL 为 GitHub 发布资产,CN 为 GitCodemcpp-res/mwrap-manifold镜像,sha256 相同。 -
mcpplibs.mwrap.meshoptimizer 1.3、mcpplibs.mwrap.cgltf 1.15(新包)。 两个 mwrap 包:meshoptimizer-m 以
export using导出<meshoptimizer.h>的全部公开名字(9 个类型、20 个枚举值、89 个函数),MESHOPTIMIZER_VERSION在.macros中为同名常量; cgltf-m 导出<cgltf.h>的全部公开名字(72 个类型、102 个枚举值、37 个函数),并再导出.write(<cgltf_write.h>)。 本索引没有这两个库的 compat 包,封装仓库各自从上游发布包取源码(校验和在upstream/documents.json)并自行构建;导出清单由 各仓库的tools/surface.py从头文件推出并在 CI 中审计。消费者测试tests/mwrap/meshoptimizer-simplify、tests/mwrap/cgltf-inspect,安装后模板检查带--deploy(STATIC_NOTICES);该检查读取生成的清单时同时接受带引号与 点分两种依赖键。GLOBAL 为 GitHub 发布资产,CN 为 GitCodemcpp-res/mwrap-<lib>镜像,sha256 相同。 -
mtest 0.8.3. 四个包的 0.8.3(同一标签、同一归档;含未入索引的 0.8.1、0.8.2 的内容):
bench::each的一次调用可以说明自己的组成 (part、time、value),给出最慢的几次、超过上限的次数与分配计数;bench::laps是同一测量的循环形式; 程序单独运行时打印测得的数字,并按标识、名字或带*的模式选择用例。只增不改。 -
mtest 0.8.0. 四个包的 0.8.0(同一标签、同一归档):用例以
only{}、except{}陈述其运行的平台与架构(mcpplibs.os 的名字), 在场所之外跳过并说明原因;capability在代码中声明机器能力,由程序在任一运行器下回答;case事件新增可选字段only、except、capabilities、reason;mtest ci coverage按用例陈述的场所检查。只增不改。 -
mtest 0.7.2. 四个包的 0.7.2(同一标签、同一归档):
mcpplibs.mtest.bench新增bench::each,逐次计时并给出分布(name、.p95、.p99、.max、.mean、.per_item), 测量体可暂停并声明条目数;只增不改。 -
mtest 0.6.3. 四个包的 0.6.3(同一标签、同一归档):
mcpplibs.mtest.cts让一致性套件对着一个主体运行 (cts::against、cts::needs)——用例需要而主体声明不具备的能力记为跳过(unsupported: …),既不算通过也不算失败; 运行要求而主体不具备的能力失败一次。协议不变。含 0.6.1(skip_exit:以退出状态判定的程序声明表示跳过的状态)与 0.6.2(源码写出的版本与清单一致);这两个版本未单独收录。 -
openkal-platform 0.26.0。 hosted 部分增加
x86_64-freebsd-musl与aarch64-freebsd-musl:openkal-freebsd 0.1.0 standalone 之上的 openkal-musl 0.29.2,以及 openkal-llvm-runtime 0.20.1,链接为一个静态程序。版本组为 openkal-image 0.6.1、 openkal-musl 0.29.2、openkal-llvm-runtime 0.20.1 与 openkal-freebsd 0.1.0,运行器的宿主包含 FreeBSD;要求 mcpp 2026.11.10.1。 mcpp 2026.11.10.2 经此版本服务这两行。 -
openkal-freebsd 0.1.0(新包)、openkal-musl 0.29.1 与 0.29.2、openkal-llvm-runtime 0.20.1、openkal-image 0.6.0 与 0.6.1(openkal-run、 openkal-ld、openkal-bind、openkal-tools)、mtest 0.6.0(mcpplibs.mtest、.capi、.gtest、.manifest),一次变更。 openkal-freebsd 在 FreeBSD 的系统调用接口上实现 openkal,可与系统 C 库并存(hosted),也可置于 openkal-musl 之下 (
standalone);openkal-musl 与 openkal-llvm-runtime 增加x86_64-freebsd-musl与aarch64-freebsd-musl两行。 openkal-run 只绑定其实现提供的接口(mcpp 2026.11.10.1 的MCPP_KERNEL_ABI_INTERFACES),0.6.1 在 FreeBSD 上以 openkal-freebsd 为缺省实现;openkal-musl 0.29.2 改用 openkal-ld ^0.6.0。mtest 0.6.0 实现 mcpp 测试 规范中每个用例的检查计数、输出与测试会话,并在入口中声明。 -
openkal-posix 0.1.0。 写在 POSIX C 库之上的 openkal 实现,为没有自身实现的系统服务;提供十五个接口(net、datagram、 prof、debug 不提供,名字不定义);声明
requires = ["mcpp:c-abi"]。新增成员tests/examples/openkal-posix(Linux、macOS)。 -
openkal-musl 0.29.0 与 openkal-llvm-runtime 0.20.0,一次变更。 musl 的
execvp、execvpe、execlp与posix_spawnp按kal_env_system所述系统的约定查找程序(Windows:PATH 以;分隔,无后缀的名字依次试PATHEXT各后缀);link、linkat经kal_fs_hard_link实现;声明requires = ["mcpp:kernel-abi=openkal"];依赖改为 openkal 0.25 一族。llvm-runtime 依赖 openkal-musl^0.29.0,其测试改为 mtest 的用例。tests/examples/openkal-musl与tests/examples/openkal改用新版本。 -
mcpplibs.os 0.4.4. 两个平台模块加入系统的对象模型:
windows::com(COM 与 Windows Runtime:套间、对象与按槽调用、query、create、hstring、activate、factory、delegate)和macos::objc(Objective-C 运行时:id、send<R>、 autorelease pool、类与选择子、框架、NSString、define_class、block);每个目标都声明、只在自己的平台定义,镜像里不定义; 库在首次使用时加载,不增加程序的链接输入(mcpplibs/os#24)。 -
openkal 0.25 一族,一次变更:openkal 0.25.0、openkal-kit 0.3.1、openkal-linux 0.26.0、openkal-macos 0.23.0、 openkal-windows 0.21.0、openkal-emscripten 0.14.0、openkal-opensbi 0.9.0。 规范新增
kal_fs_hard_link(按卷由KAL_FS_PROP_HARD_LINKS回答,条款 11 第 59 条),kal_process_stop_requested的字改为计数每次结束请求(第 60 条);一致性 套件按 mtest 测试协议报告,并核对实现清单的provides-interfaces、kal_interfaces()与导出名。各实现提供上述两项,测试改为 mtest 的用例;openkal-emscripten 声明requires = ["mcpp:c-abi"]。tests/examples/openkal改用此族,新增成员tests/examples/openkal-kit作为 kit 的直接使用者。kit 0.3.1 修正format_v4只写端口前三位数字的错误(8080 写作 080)。 -
mcpplibs.os 0.4.3. 依赖改为同时容纳 openkal 0.24 与 0.25 两族的版本区间(openkal
>=0.24.0, <0.26.0,各实现同理), mcpp 版本下限不变;openkal 实现以 mtest 测试自身时,经 mtest 到达 os 的图得以解析(mcpplibs/os#23)。 -
openkal-platform 0.24.5、openkal-image 0.5.4(openkal-ld、openkal-run、openkal-tools、openkal-bind)、mcpplibs.os 0.4.2, 一次变更。 openkal-run 以能力
mcpp:kernel-abi=openkal声明其 openkal 实现,并按系统给出缺省实现([defaults]);图中已有的 实现优先。平台要求 mcpp 2026.11.9.1。os 0.4.2 新增fs::watcher(mcpplibs/os#21),测试改为 mtest 的用例。 -
mcpplibs.cmdline 0.0.3.
value_type<T>()声明选项取T类型的数字,解析时用std::from_chars校验,不合法即解析错误;value_as<T>()读回。测试成员移到 0.0.3,并检验这两项。 -
mtest 0.5.2. 四个包的 0.5.2:自启动副本的测试以对象
child声明副本所做之事、以child_command启动之, 故不再定义main,同一目录的文件可为一个程序;库对 mcpplibs.os 的要求为^0.4.1。测试成员移到 0.5.2。 -
mtest 0.5.1. 四个包的 0.5.1:协议标记在只保留可达部分的链接(
--gc-sections)中保留,mcpp test2026.11.9.1 以此链接测试程序。测试成员移到 0.5.1。 -
mtest 0.5.0. 四个包的 0.5.0(同一标签、同一归档):一次运行为一张有向无环图,关键路径为其约束链;Markdown 报告 (mermaid 的图与甘特图);每个用例的资源用量(
[monitor]);按用例跨进程调度;run 作用域夹具、资源池与组件。依赖 mcpplibs.os 0.4.1。测试成员移到 0.5.0。 -
mcpplibs.os 0.4.1.
stdio::capture在捕获期间把一个标准流保存为文件(经 openkal、C 库与期间启动的程序写出的内容),text()交回内容并恢复该流;process::resources给出本程序及其已回收子程序的处理器时间、最大常驻集与读写字节数。 测试成员移到 0.4.1。 -
mtest 0.4.1. 四个包的 0.4.1(同一标签、同一归档):返回值的用例体不能通过编译;静态清单跨源文件读取 项目自己的套件类型(
types_of);标签选择a&b表示同时具有两个标签的用例。测试成员移到 0.4.1。 -
mtest 0.4.0.
mcpplibs.mtest、mcpplibs.mtest.gtest、mcpplibs.mtest.capi、mcpplibs.mtest.manifest的 0.4.0 (同一标签、同一归档):用例在名字之后声明其度量的界限(at_most、at_least),库在用例结束时判定(P6.5),列举、 静态清单与各适配器携带同一界限;引擎增加analyze trend,并以替换字符保存非 UTF-8 的输出。测试成员移到 0.4.0,mtest成员增加一个带界限的Bench。 -
mtest 0.3.0.
mcpplibs.mtest、mcpplibs.mtest.gtest、mcpplibs.mtest.capi的 0.3.0 与新包mcpplibs.mtest.manifest(同一标签、同一归档):一个对象即一个用例,类型即类别(UTest、CTS、E2E、Bench,Suite不声明类别),名字之后的属性说明它如何运行(资源、时限、隔离、重试、诊断)并由其声明的用例继承;静态用例 清单成为独立的包,读测试的工具不必链接测试库。测试成员mtest、mtest-gtest、mtest-capi移到 0.3.0,新成员mtest-manifest检验清单。 -
mtest 0.2.0.
mcpplibs.mtest、mcpplibs.mtest.gtest、mcpplibs.mtest.capi的 0.2.0(同一标签、同一归档):mcpplibs.mtest.manifest从源文本读出测试文件声明的用例(静态用例清单);引擎增加[discover.<name>]组、 用例属性、--shard、覆盖映射与list --static。测试成员mtest、mtest-gtest、mtest-capi随之移到 0.2.0。 -
mcpp.plugins 0.21.0。 CMake 交叉构建在动作运行时使用引擎给出的编译器、标志、归档器与目标约定(链接可执行文件或共享库的 交叉子项目需要 mcpp 2026.11.7.1);加速器规则拥有各自的代码目标,SYCL 在一个请求中给出多个 NVIDIA 架构与 SPIR-V (mcpp#887);
plugins-progress写出动作的可选进度;各成员经 mcpplibs.os 0.4.0 访问系统,不包含头文件。包的下限为 mcpp 2026.10.30.1;latest指向 0.21.0。 -
mtest 0.1.0.
mcpplibs.mtest, the C++ library of the mtest test system (cases, expectations, fixtures, bench, conformance and end-to-end helpers, no macro and no header, speaking the mtest test protocol); its GoogleTest adaptermcpplibs.mtest.gtest; its C ABImcpplibs.mtest.capi. The three share one tag and one archive of mcpp-community/mtest, each descriptor naming its member's manifest. The test membersmtest,mtest-gtestandmtest-capiconsume them. -
mcpplibs.os 0.4.0.
is_openkalnames a build for the openkal target, as eachis_<platform>names its own (is_imageremains as a deprecated alias);can_run_on(p)andon<P>(f)ask one platform question of a native build and an image alike; the platform modules are defined in an image where it can answer them; the effective user and the creation mask are the kernel's answers. The test memberosconsumes 0.4.0. -
mcpplibs.os 0.3.1. A name in the long spelling (
\\?\C:\...,\\?\UNC\...) is the name it spells:locateand everyos::fsoperation through it accept whatfs::extendedproduces, which 0.3.0 refused witherrc::invalid; the kernel layer is a compatible range. The test memberosconsumes 0.3.1 (it stayed on 0.2.9 when 0.3.0 was registered). -
The openkal 0.24.2 patch group: a leaf and a platform patch, as one change. openkal-llvm-runtime 0.19.2 keeps the volume of a name it rebuilds part by part (
lexically_normal,weakly_canonical,D:/a//b), which 0.19.1 lost on Windows (openkal-llvm-runtime#68), and openkal-platform 0.24.2 names it; no other member changes. The test membersopenkalandopenkal-platformconsume the 0.24.2 group. Written bytools/family_release.py indexof openkal-platform. -
The openkal 0.24.1 correction group, as one change. openkal-platform 0.24.1, openkal-musl 0.28.1 (a directory's whole name kept, openkal-musl#83), openkal-llvm-runtime 0.19.1 (a name beneath a Windows volume is absolute, openkal-llvm-runtime#64) and the image family 0.5.1 (openkal-ld, -run, -tools, -bind: okrun over openkal-macos 0.22.1, indexed by #720). The members name one another by compatible ranges and the platform's version group selects the versions; this change was written by openkal-platform's
tools/family_release.py index, which also verified each tag's GitHub archive against its GitCode mirror. The openkal members move to the group (runtime 0.19.1, platform 0.24.1, musl 0.28.1, the 0.5.1 image family). -
mcpplibs.mwrap.zlib 1.3.2、.zstd 1.5.7、.xz 5.8.3、.xxhash 0.8.3、.libarchive 3.8.7、.libc 17.0.0(新包)。 六个 mwrap 包装把头文件收敛到各自的包中(mcpp 设计记录 2026-11-07 D10)。前五个以 C++23 模块使用同版本的 compat 实现:函数、类型、 枚举值以上游的全局名导出,常量宏与类型宏在
.macros中为同名常量与别名,带参数的宏在<mwrap/<lib>/macros.hpp>; 导出清单由各仓库的tools/generate.py按 clang 读到的头文件生成并在 CI 中审计。mcpplibs.mwrap.libc映射 ISO C17 附录 B 的对象宏(stdout()、errno()、EOF、INT_MAX等),实现为目标的 C 库。消费者测试tests/mwrap/zlib-compress、zstd-squeeze、xz-pack、xxhash-digest、libarchive-bundle、libc-stdio,以及已安装模板与重定位许可检查(检查脚本以STATIC_NOTICES表统一六个包的约定)。GLOBAL 为 GitHub 发布资产,CN 为 GitCodemcpp-res/mwrap-<lib>镜像,sha256 两处一致。docs/mwrap.md补充 C 标准库这一实现来源。 -
openkal-macos 0.22.1. The confinement rules are sized to the grants of each start; sixteen grants named near
MAXPATHLENno longer refuse a well-formed start withkal_err_invalid. OpenKal is the compatible range^0.24.0. First member of the openkal 0.24.1 correction group (mcpp design record 2026-11-07 §4.2.3). -
The openkal test members consume the 0.24 group.
openkal-testsnames openkal 0.24.0, Linux 0.25.0, macOS 0.22.1, Windows 0.20.0, LLVM runtime 0.19.0 and Emscripten 0.13.0; the platform, musl, tools and binding members name openkal-platform 0.24.0, openkal-musl 0.28.0 and the 0.5.0 image family. Under the 0.23 pins a 0.24 candidate could not share a build with the member. -
openkal-musl 0.27.7. Select public Linux 0.24.2 and image loader 0.4.5 without changing the C library implementation or ABI. All ten producer jobs pass; matching source mirrors are verified and the direct consumer follows the release.
-
openkal-image source family 0.4.5. Loader, runner, tools and binding share the verified archive. The runner adopts Linux 0.24.2 unit-memory observation; okprof forwards complete environment values and child status. Both source consumers follow the release; hosted prebuilt tools and final engine qualification remain separate.
-
openkal-linux 0.24.2: avoid reading unrelated process RSS during unit memory observation; preserve refused-query fallback, group charges and supervision cadence.
-
openkal-platform 0.23.7. Image and hosted layers select musl 0.27.6 and LLVM runtime 0.18.7 consistently with the exact version group. The C library avoids redundant resolved-name property preflights; TLS, ThinLTO, loader, backend and hardening contracts remain intact. All four producer hosts passed; the hosted platform consumer follows the release. Final clangd cold CPU qualification remains separate.
-
openkal-llvm-runtime 0.18.7. Both allocator arrangements select musl 0.27.6; the C++ runtime implementation is unchanged. All ten producer checks passed, including native/cross-target behavior, four-host images and the unchanged L2 workload thresholds. GLOBAL and CN source archives are verified before registration; the conditional runtime test member follows the release.
-
openkal-musl 0.27.6. Resolve names through the optional operation without a redundant directory-property query, preserving weak-entry and unsupported fallbacks, lexical handling, errors and output bounds. All ten producer checks passed, including native compatibility controls and the same images on four hosts. GLOBAL and CN archives have the same verified SHA256; the direct C-library test member follows the release. Final clangd cold CPU qualification remains separate.
-
openkal-platform 0.23.5. Image layers and the version group select musl 0.27.5 and LLVM runtime 0.18.6 for scoped routing scratch. The loader, tools, backends and hardening selections are retained. All four producer hosts passed; the hosted platform test member follows the release.
-
openkal-llvm-runtime 0.18.6. Both allocator arrangements select musl 0.27.5 for scoped routing scratch with image automatic zeroing retained. The C++ runtime implementation is unchanged. All ten producer checks passed; the openkal test member follows the release. GLOBAL and CN source archives have the same verified SHA256.
-
openkal-musl 0.27.5. Scope routing scratch to the syscalls that use it and avoid large temporary initialization on empty descriptor unlocks and ordinary null-name rejections, while retaining image automatic zeroing and existing refusal/ownership behavior. All ten producer checks passed, including the same regression image on four hosts. GLOBAL and CN source archives have the same verified SHA256; the direct C-library test member follows the release.
-
openkal-platform 0.23.4. Both image and hosted arrangements select loader/tools 0.4.4, musl 0.27.4 and llvm-runtime 0.18.5. Kernel backend pins and compile/link conventions are unchanged. The hosted platform test member follows the release; mcpp remains 2026.11.3.1. GLOBAL and CN source archives have the same verified SHA256.
-
openkal-llvm-runtime 0.18.5. Both allocator arrangements select openkal-musl 0.27.4, which propagates image loader 0.4.4. The C++ runtime implementation is unchanged. The openkal test member follows the release. GLOBAL and CN source archives have the same verified SHA256.
-
openkal-musl 0.27.4. The image dependency selects openkal-ld 0.4.4 for the partial mapping correction. The C library implementation and hosted kernel backend pins are unchanged. The Linux test member follows the release. GLOBAL and CN source archives have the same verified SHA256.
-
openkal-ld, openkal-run, openkal-tools and openkal-bind 0.4.4. A refused later mapping run is copied without overwriting earlier read-only views; copied instructions are published separately. The correction passed four-host execution and the original Windows clangd startup and semantic replays. GLOBAL and CN source archives have the same verified SHA256.
-
mcpplibs.os 0.2.9. Linux selects openkal-linux 0.24.1 for corrected read-only confinement, and hosted/image qualification uses platform 0.23.3. The C++ API and implementation are unchanged. The os test member follows the release. GLOBAL and CN archives have the same verified SHA256.
-
openkal-platform 0.23.3. Both image and hosted arrangements select the corrected Linux confinement graph: Linux 0.24.1, musl 0.27.3, llvm-runtime 0.18.4 and image 0.4.3. It requires mcpp 2026.11.3.1. GLOBAL and CN archives have the same verified SHA256.
-
openkal-llvm-runtime 0.18.4. Both allocator arrangements select openkal-musl 0.27.3, which propagates Linux 0.24.1 and image loader 0.4.3. The C++ runtime implementation is unchanged. The openkal test member follows the release for musl targets. GLOBAL and CN archives have the same verified SHA256.
-
openkal-musl 0.27.3. The Linux dependency selects openkal-linux 0.24.1 for correct read-only confinement, and the image dependency selects openkal-ld 0.4.3. The C library implementation is unchanged. The Linux test member follows the release. GLOBAL and CN archives have the same verified SHA256.
-
openkal-ld, openkal-run, openkal-tools and openkal-bind 0.4.3. The native Linux runner uses openkal-linux 0.24.1, which requires Landlock ABI 3 before claiming read-only confinement. Both image test members follow the release. All four packages share one source archive; GLOBAL and CN downloads have the same verified SHA256.
-
openkal-linux 0.24.1. Read-only confinement requires Landlock ABI 3, which can restrict file truncation; earlier ABIs refuse a confinement request. The ABI probe cache uses atomic accesses. The openkal test member follows the release. GLOBAL and CN archives have the same verified SHA256.
-
mcpplibs.os 0.2.8. Process options expose granted directories and rights, confinement requests, resource preferences and the system null device. The corrected platform 0.23.2 group is verified on native, hosted and four image hosts. The os test member follows the release. GLOBAL and CN archives have the same verified SHA256.
-
openkal-platform 0.23.2. The corrected version group pins musl 0.27.2, llvm-runtime 0.18.3 and image tools 0.4.2; the published musl image edge now selects the same loader. It requires mcpp 2026.11.3.1. GLOBAL and CN archives have the same verified SHA256. The older published groups remain unchanged.
-
openkal-llvm-runtime 0.18.3. The runtime pins openkal-musl 0.27.2, whose image loader edge selects openkal-ld 0.4.2. The openkal test member follows the release. GLOBAL and CN archives have the same verified SHA256.
-
openkal-musl 0.27.2. The image dependency selects openkal-ld 0.4.2, matching the platform version group. The Linux test member follows the release. GLOBAL and CN archives have the same verified SHA256.
-
openkal-platform 0.23.1. This release supersedes 0.23.0 and pins openkal-macos 0.21.3, openkal-musl 0.27.1, openkal-llvm-runtime 0.18.2 and openkal-image 0.4.2. It requires mcpp 2026.11.2.3. GLOBAL and CN archives have the same verified SHA256.
-
openkal-llvm-runtime 0.18.2. The runtime pins openkal-musl 0.27.1 over openkal-macos 0.21.3, so hosted macOS programs receive their granted directories. The openkal test member follows the release. GLOBAL and CN archives have the same verified SHA256.
-
openkal-musl 0.27.1。 在 openkal-macos 0.21.3 之上:macOS 上的 hosted 程序得到被授予的目录(本库的初始化函数先于实现的运行, 实现改为从加载器的记录作答)。跨链接探针期望实现新导入的三个加载器名字;本库代码不变。测试成员
openkal-musl随之移动。 GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-ld/run/tools/bind 0.4.2。 在 openkal-macos 0.21.3 上构建 macOS 的运行器。测试成员
openkal-tools、openkal-bind随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-macos 0.21.3。 在实现自己的初始化函数运行之前被提问时(链接在它之前的初始化函数,如 hosted 安排中 openkal-musl 的), 参数、环境与启动者授予的目录取自加载器的记录(
_NSGetArgc、_NSGetArgv、_NSGetEnviron);此前被授予目录的 hosted 程序读到 实现的默认目录(整个文件系统、可写)。测试成员openkal随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像, sha256 两处一致。 -
openkal-platform 0.23.0。 openkal 0.23 的版本组(openkal-linux 0.24.0、openkal-macos 0.21.2、openkal-windows 0.19.0、 openkal-musl 0.27.0、openkal-llvm-runtime 0.18.1、openkal-image 0.4.1):映像在其基址上封存,运行器把它移到每次开机的基址并可从 初始化快照启动;每个单元以帧指针、全局栈保护、零初始化局部变量、libc++ 快速加固、CET(x86_64)或 pac-ret 与 BTI(aarch64) 编译,映像以 build-id 命名;okprof 列入平台工具;打包声明
gzip时 okb 的映像压缩存放。要求 mcpp 2026.11.2.3(std 模块以平台的 选项编译)。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-llvm-runtime 0.18.1。 有分支保护时 compiler-rt 的 outline atomics 也能汇编(openkal-platform 0.23.0 在 aarch64 上的
-mbranch-protection=pac-ret+bti):libunwind 的同名assembly.h不再跟在 compiler-rt 的之后重定义GNU_PROPERTY,目标文件带有aarch64 feature: BTI, PAC。测试成员openkal随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-llvm-runtime 0.18.0。 建在 openkal-musl 0.27.0 之上(openkal 0.23),即 openkal-platform 0.23.0 所指的 C 库;加固与帧指针 随平台的编译选项。测试成员
openkal随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-musl 0.27.0。 面向 openkal 0.23(openkal-linux 0.24.0、openkal-macos 0.21.2、openkal-windows 0.19.0)与 openkal-image 0.4.1:各系统上的
/dev/null交给启动的程序为环境的空设备;realpath由环境回答;映像的dlopen放在其基址; 初始化快照的两阶段(__okrun_snapshot、__okrun_snapshot_start);posix_spawn把程序持有的目录连同权限授予启动的程序;okm_preopen_attenuate(<okm_preopen.h>)按程序自己的请求衰减持有的目录(含记录);卷下的名字按环境的规则比较(盘符大小写、 两种分隔符);mimalloc 的归还延迟随资源偏好。测试成员openkal-musl随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-ld/run/tools/bind 0.4.1。 在 openkal-macos 0.21.2 上构建 macOS 的运行器:睡眠挂起当前上下文而不再自旋,单调时钟粒度 每次启动相同,初始化快照不再因测得的差异被拒绝。测试成员
openkal-tools、openkal-bind随之移动。GLOBAL 为 GitHub 标签归档, CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-macos 0.21.2。 单调时钟的粒度取内核的计时单位(
mach_timebase_info,向上取整:arm64 为 42 ns,x86_64 为 1 ns), 每次启动相同;此前以读数变化的差值测得,各次启动不同,openkal-image 的运行器在使用初始化快照前比较实现的事实,曾因此拒绝快照。 测试成员openkal随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-macos 0.21.1。 睡眠不再占用处理器时间:内核读取
ulock_wait所等待的字时不处理缺页,对尚未驻留的页返回EFAULT;kal_time_sleep等待的是一个从未写过的零字,每次等待立即失败,睡眠成了整段时长的自旋(在 arm64 与 x86_64 运行机上 睡 200 ms 耗费 127 至 200 ms 处理器时间)。等待现在在EFAULT时读取该字后重试,睡眠所用的字位于当前上下文的栈上。测试成员openkal随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-ld/run/tools/bind 0.4.0。 在 openkal 0.23 的实现上构建(openkal-linux 0.24.0、openkal-macos 0.21.0、openkal-windows 0.19.0):映像在每次开机选定的基址上放置,数据作为预备副本保存在用户缓存中;触页记录(
okprof record --what touch、okld touch)按程序的资源偏好预读;初始化代码的快照每次开机生成一次、之后的启动直接映射(OKRUN_SNAPSHOT=0关闭);启动的 花费随资源偏好(performance、balanced、economy)变化,okrun cache列出并回收运行器的缓存;okld bundle --compress写出压缩 的 okb(okb 2);okprof 成为 openkal-tools 的第三个程序。测试成员openkal-tools(构建 okprof)、openkal-bind随之移动。 GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal 0.23.0;openkal-linux 0.24.0、openkal-macos 0.21.0、openkal-windows 0.19.0、openkal-emscripten 0.12.0。 映像在其基址上放置(
kal_exec_alloc_at、placement note);exec 区域返回时为零,可封存(kal_exec_seal_part)、预取、私有映射 文件的部分(KAL_EXEC_MAP_WRITE);按名字解析全部链接(kal_fs_resolved_name)与带属性的列举;目录授予的衰减(只读、不变、 记录)与系统隔离(KAL_SPAWN_CONFINE);缺页、故障报告、采样与触页记录;资源偏好(kal_env_resources、KAL_SPAWN_RESOURCES_*)与可用内存(kal_memory_info)。测试成员openkal随之移动,并观察基址上的区域、只读衰减、内存与 资源偏好。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-ld/run/tools/bind 0.3.2。 在 openkal 0.22 的实现上构建(openkal-linux 0.23.0、openkal-macos 0.20.0、openkal-windows 0.18.0):映像启动程序时可以在位置上得到系统的空设备(
KAL_SPAWN_NULL_*),自身无改动。测试成员openkal-tools、openkal-bind随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal 0.22.0;openkal-linux 0.23.0、openkal-macos 0.20.0、openkal-windows 0.18.0、openkal-emscripten 0.11.0。
openkal.process的位置上的空设备:KAL_SPAWN_NULL_IN、_OUT、_ERR使启动的程序在该位置读到输入结束、写入全部被接受并 丢弃(属性KAL_PROCESS_PROP_NULL_STREAMS);Linux、macOS 在启动的程序一侧打开/dev/null,Windows 为本次启动打开NUL。 openkal-emscripten 依 0.22 编写,无其他改动。测试成员openkal随之移动,并观察标志与流同处一个位置时被拒绝。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-platform 0.21.1。 版本组改为 openkal-image 0.3.1(记住的 okb 准入不再读取成员)、openkal-musl 0.26.1、 openkal-llvm-runtime 0.17.1,carrier 为 openkal-run 0.3.1;其余与 0.21.0 相同。GLOBAL 为 GitHub 标签归档,CN 为 GitCode
mcpp-res镜像,sha256 两处一致。 -
openkal-llvm-runtime 0.17.1。 建在 openkal-musl 0.26.1 上(openkal-platform 0.21.1 的版本组);L2 的系统一侧改由 Clang 编译, 使比较的是运行时而不是编译器。测试成员
openkal随之移动。 -
openkal-musl 0.26.1。 映像的加载器为 openkal-ld 0.3.1(openkal-platform 0.21.1 的版本组),其余不变。测试成员
openkal-musl随之移动。 -
openkal-ld/run/tools/bind 0.3.1。 记住的 okb 准入不再读取成员:okrun 对此前在同一文件上比对过的成员只按形状准入 (
okld_okb_admit_layout:存储方式、在归档内、对齐),0.2.0 与 0.3.0 在这里计算归档声明的 CRC-32,每次启动遍历整个成员 (clangd 的 71 MB 映像约 0.1 s 处理器时间)。测试成员openkal-tools、openkal-bind随之移动。GLOBAL 为 GitHub 标签归档, CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
mcpplibs.os 0.2.7。 openkal 0.21 的实现(openkal-linux 0.22.0、openkal-macos 0.19.0、openkal-windows 0.17.0、openkal-emscripten 0.10.0),接口不变;其上的 ok 映像选 openkal-platform 0.21.0。测试成员
os随之移动。 -
openkal-platform 0.21.0;openkal-emscripten 0.10.0。 openkal 0.21 的版本组:openkal 0.21.0 与三个实现、openkal-musl 0.26.0、 openkal-llvm-runtime 0.17.0、openkal-ld/run/tools 0.3.0;mcpp 2026.11.2.2 以它为内置的
<arch>-openkal平台。openkal-emscripten 0.10.0 按 openkal 0.21 编写,0.21 的增补都在它不提供的接口上,其余不变。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像, sha256 两处一致。 -
openkal-musl 0.26.0、openkal-llvm-runtime 0.17.0。 openkal-musl 的分配器为嵌入的 mimalloc 3.6.1(
malloc-mimalloc,默认;malloc-mallocng保留 musl 自己的),匿名内存建在openkal.region上,定位读写不持锁,八个字符串函数按向量处理,普通互斥锁按 glibc 的方式等待。openkal-llvm-runtime 建在其上(裸机选 mallocng),PE 与 Mach-O 上thread_local的析构读到自己的变量 (emutls 在最后一轮才释放),并带 L2 的工作负载对比(bench/)。测试成员openkal-musl、openkal随之移动。CI 的 mcpp 移到 2026.11.2.1:openkal-musl 0.26.0 以embed嵌入 compat.mimalloc,并陈述mcpp >= 2026.11。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
mcpplibs.mwrap.mimalloc 3.6.1(新包)。 mimalloc-m:以 C++23 模块(
import mcpplibs.mwrap.mimalloc;)使用 compat.mimalloc 3.6.1。<mimalloc.h>的函数、堆、arena、子进程、选项与 STL 分配器以上游的全局名导出;.stats、.profile两个子模块对应<mimalloc-stats.h>、<mimalloc-profile.h>;上游的static inline辅助函数以同名适配在mcpplibs::mwrap::mimalloc;值宏在.macros中为常量,带类型参数的宏与mi_stats_t_decl留在<mwrap/mimalloc/macros.hpp>。消费者测试tests/mwrap/mimalloc-heap与已安装模板检查(allocate模板与重定位后的许可文件)。GLOBAL 为 GitHub 发布资产,CN 为 GitCodemcpp-res/mwrap-mimalloc镜像,sha256 两处一致。 -
openkal-ld/run/tools/bind 0.3.0。 openkal 0.21 的一轮:okld 把不可写、文件与内存大小相同、与文件偏移模 64 KiB 同余且独占所在 粒度的段从映像文件映射(
okld_host::map,即kal_exec_map_part),其余段照旧复制;每个重定位须写入可写段,否则拒绝映像; okrun 在程序运行期间保持映像文件打开。测试成员openkal-tools、openkal-bind随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal 0.21.0;openkal-linux 0.22.0、openkal-macos 0.19.0、openkal-windows 0.17.0。
openkal.exec的kal_exec_map_part:可执行区域的一部分由文件的字节构成(只读,或只读且可执行,属性KAL_EXEC_PROP_FILE),加载器据此映射映像的 指令与只读数据;结束的程序的处理器时间在句柄释放前可读。openkal-linux 以CLONE_VM | CLONE_VFORK启动程序、kal_alloc按需 切分;openkal-windows 不提供文件部分。测试成员openkal随之移动,并观察可执行区域的文件部分。 -
openkal-ld/run/tools/bind 0.2.0。 openkal 0.20 的一轮:运行器提供加载器接口
openkal.prof与openkal.debug,okrun --prof=(OKRUN_PROF)度量一个映像的调用、计数器与阶段,okprof(openkal-tools)记录、汇总与比较报告;kal_debug_symbolize由映像文件的符号表给出地址的名字;okb 的准入按用户记住,同一文件的后续启动不再重读整个 okb。测试成员openkal-tools、openkal-bind随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal 0.20.0;openkal-linux 0.21.0、openkal-macos 0.18.0、openkal-windows 0.16.0、openkal-emscripten 0.9.0。 按偏移的传输 (
kal_fs_read_at/kal_fs_write_at,不用也不改位置);程序与单元的内存用量(KAL_PINFO_MEMORY、kal_process_job_usage)与 单元的内存限额(kal_process_job_limit,HARD/SUPERVISED);可选接口openkal.region(保留、分段提交、归还与丢弃、整体释放); 加载器提供的openkal.prof/openkal.debug。测试成员openkal随之移动,并观察按偏移的传输、本程序的内存与区域。 GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
compat.mimalloc 3.6.1。 与 3.4.5 并存;同一份源文件列表同时写出两个版本的目录布局(3.6.1 分为
alloc/、arena/、heap/、prim/、profile/、util/七个目录,新增profile/三个单元),列表中某版本没有的名字在该版本下不选中任何文件。 按 c11 编译时补上_DEFAULT_SOURCE(上游以 gnu11 编译;3.6.1 的prim/prim.c在prim/unix/prim.c声明它之前已包含头文件)。 测试成员mimalloc随之移动。openkal-musl 0.26 将它嵌入为默认分配器。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-platform 0.20.2。 openkal-musl 0.25.0、openkal-llvm-runtime 0.16.15:线程一起分配,
memcmp与strlen按字或向量。 GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-musl 0.25.0;openkal-llvm-runtime 0.16.15。 有第二个线程后,每个线程保留它释放的小尺寸类槽(≤ 2032 B), 不经 mallocng 的锁取回:ok 映像中一次 malloc+free 在 1/2/4 线程下由 38.5/194/521 ns 降为 31/41/61 ns;
memcmp每次比较 8 字节,strlen每次 16 字节(x86_64 上 SSE2,其余按字)。单线程程序的行为不变。测试成员openkal、openkal-musl随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
mcpplibs.os 0.2.6。 openkal-macos 0.17.1;接口不变。其上的 ok 映像选 openkal-platform 0.20.1。测试成员
os随之移动。 GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-platform 0.20.1。 openkal-macos 0.17.1、openkal-musl 0.24.1、openkal-llvm-runtime 0.16.14、 openkal-ld/run/tools 0.1.9:macOS 上上下文的标识不再每次进入内核。GLOBAL 为 GitHub 标签归档,CN 为 GitCode
mcpp-res镜像,sha256 两处一致。 -
openkal-ld/run/tools/bind 0.1.9;openkal-musl 0.24.1;openkal-llvm-runtime 0.16.14。 openkal-macos 0.17.1 的一轮: macOS 上的 okrun 与 openkal-musl 建在它之上,上下文的标识不再每次进入内核;格式与加载器不变。测试成员
openkal、openkal-musl、openkal-tools、openkal-bind随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像, sha256 两处一致。 -
openkal-macos 0.17.1。
kal_task_current从系统库为每个线程保存的记录读取线程的内核标识(pthread_threadid_np), 不再每次调用都进入内核;值不变。openkal-musl 经它取得errno、线程指针与 ok 映像的每个(模拟的)线程局部变量,一次clangd --check调用约 158 万次。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
mcpplibs.os 0.2.5。 openkal 0.19 的实现(openkal-linux 0.20.0、openkal-macos 0.17.0、openkal-windows 0.15.0、 openkal-emscripten 0.8.0);接口不变。其上的 ok 映像选 openkal-platform 0.20.0。测试成员
os随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-platform 0.20.0。 openkal 0.19 的版本组:openkal 0.19.0、openkal-linux 0.20.0、openkal-macos 0.17.0、 openkal-windows 0.15.0、openkal-musl 0.24.0、openkal-llvm-runtime 0.16.13、openkal-ld/run/tools 0.1.8。GLOBAL 为 GitHub 标签归档,CN 为 GitCode
mcpp-res镜像,sha256 两处一致。 -
openkal-ld/run/tools/bind 0.1.8;openkal-musl 0.24.0;openkal-llvm-runtime 0.16.13。 openkal 0.19 的一轮: okb 为每个映像成员记录 1 MiB 分块的 SHA-256(
files.<member>.chunks),okrun 在多个上下文上同时校验各块,okld bundle写入、okld bundle check两种摘要都校验;openkal-musl 的getpid为环境给出的标识,kill(pid, 0)、getsid、getpgid经kal_process_open_id回答另一程序是否在运行,flock与F_OFD_SETLK[W]取打开文件的锁(kal_fs_lock),SCHED_OTHER/BATCH/IDLE与setpriority为调用上下文的占用(kal_task_set_priority);openkal-llvm-runtime 随之移动。 测试成员openkal、openkal-musl、openkal-tools、openkal-bind的版本随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal 0.19.0;openkal-linux 0.20.0、openkal-macos 0.17.0、openkal-windows 0.15.0、openkal-emscripten 0.8.0。
openkal.task增加两项:kal_task_cores(程序可运行于其上的处理器的物理核数,0 为无法回答)与kal_task_set_priority(调用者所在上下文对处理器的占用:DEFAULT、LOW、BACKGROUND,属性位KAL_TASK_PROP_PRIORITY, 升回被拒绝为kal_err_permission);规范 §1.1 写明边界:下层的东西不向上穿透,实现之间只在规范留名的余地内不同,绕过 openkal 的使用者绑定它所绕到的东西。各实现:Linux 以 sysfs 拓扑与 SCHED_OTHER/BATCH/IDLE,macOS 以hw.physicalcpu与 QoS 类,Windows 以处理器核心关系与后台模式,Emscripten 两者都答"无法回答/不支持"。测试成员openkal随之移动, 并观察 0.19 的两项。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-platform 0.19.2。 openkal 0.18 的版本组,openkal-ld/run/tools 0.1.7、openkal-musl 0.23.2、 openkal-llvm-runtime 0.16.12:Linux aarch64 上 okrun 在处理器表明有 SHA-256 指令时以其接纳映像。openkal 0.18.0 与三个 实现不变。GLOBAL 为 GitHub 标签归档,CN 为 GitCode
mcpp-res镜像,sha256 两处一致。 -
openkal-ld、openkal-run、openkal-tools、openkal-bind 0.1.7;openkal-musl 0.23.2;openkal-llvm-runtime 0.16.12。 Linux aarch64 上,加载器在处理器的
ID_AA64ISAR0_EL1表明有 SHA-256 指令时以其求摘要(Linux 自 4.11 起模拟对标识 寄存器的mrs,先以uname读内核版本);0.1.6 只在编译目标保证这些指令时使用(Apple arm64)。openkal-musl 钉 openkal-ld 0.1.7,openkal-llvm-runtime 随之移动,二者源码不变。测试成员openkal、openkal-musl、openkal-tools、openkal-bind随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-platform 0.19.1。 openkal 0.18 的版本组,openkal-ld/run/tools 0.1.6、openkal-musl 0.23.1、 openkal-llvm-runtime 0.16.11:okrun 在映像装入后释放它运行的文件,加载器以处理器的 SHA-256 指令求摘要、每个段只写 一次。openkal 0.18.0 与三个实现不变。其 CI 以 mcpp 2026.10.31.3 测量(集合的 Windows 启动器建在 mcpp 自身 openkal 行的平台上)。GLOBAL 为 GitHub 标签归档,CN 为 GitCode
mcpp-res镜像,sha256 两处一致。 -
openkal-ld、openkal-run、openkal-tools、openkal-bind 0.1.6;openkal-musl 0.23.1;openkal-llvm-runtime 0.16.11。 okrun 在映像装入后释放它运行的文件,并在加载器交回时释放每个被依赖映像的文件:映像只以其副本常驻,不再同时以文件常驻 (clangd.okb 约少 68 MiB)。加载器不保留指向所装入字节的指针(okld.h),以处理器的 SHA-256 指令求摘要(x86_64 的 SHA 扩展;
__ARM_FEATURE_SHA2下的 ARMv8 指令),每个段只写一次。openkal-musl 钉 openkal-ld 0.1.6,openkal-llvm-runtime 随之移动,二者源码不变。测试成员openkal、openkal-musl、openkal-tools、openkal-bind随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
mcpplibs.os 0.2.4。 按 openkal 0.18 的实现:openkal 0.18.0、openkal-linux 0.19.0、openkal-macos 0.16.0、 openkal-windows 0.14.0、openkal-emscripten 0.7.0。其上的 ok 映像选择 openkal-platform 0.19.0(mcpp 2026.10.31.2 的 openkal 行钉 0.18.0,其版本组为 openkal 0.17.1)。测试成员
os随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-emscripten 0.7.0。 按 openkal 0.18.0 编写,提供的十二个接口不变;
openkal.map不提供(Emscripten 的文件mmap是复制,无法满足共享区域的语义),链接时缺席。mcpplibs.os 0.2.4 的wasm32-emscripten由此解析;测试成员openkal的 wasm32 行随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-platform 0.19.0。 openkal 0.18 的版本组:openkal 0.18.0、openkal-linux 0.19.0、openkal-macos 0.16.0、 openkal-windows 0.14.0、openkal-musl 0.23.0、openkal-llvm-runtime 0.16.10、openkal-ld/run/tools 0.1.5。以 Windows 启动器打包(bundle-all、self-contained)需要 mcpp 2026.10.31.2。CI 的 mcpp 移到 2026.10.31.1(platform 0.18.0 起声明
mcpp >= 2026.10.30.1),客户端下限不变。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-musl 0.23.0、openkal-llvm-runtime 0.16.10。 openkal-musl 的文件
mmap、munmap、msync经openkal.map(偏移按KAL_MAP_ALIGNMENT向下对齐,区域止于文件末尾);openkal-llvm-runtime 随之移动。测试成员openkal-musl观察映射的文件,openkal移到 0.16.10。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像, sha256 两处一致。 -
openkal-ld、openkal-run、openkal-tools、openkal-bind 0.1.5。 okrun 以
openkal.map(私有、可写)映射它运行的映像 或 okb,而不是整体读入内存,映像结束时释放;映像绑定openkal.map的三个函数。四个成员钉 openkal 0.18.0、 openkal-linux 0.19.0、openkal-macos 0.16.0、openkal-windows 0.14.0。测试成员openkal-tools、openkal-bind随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal 0.18.0、openkal-linux 0.19.0、openkal-macos 0.16.0、openkal-windows 0.14.0。 新的可选接口
openkal.map(KAL_IFACE_MAP):kal_map_file把文件的一部分映射到地址空间(偏移为KAL_MAP_ALIGNMENT,即 64 KiB 的倍数;读或写、私有或共享),kal_map_sync使共享区域的写入对文件读取可见,kal_map_release按地址与长度 释放。区域不越过文件末尾、不可执行;末页中文件末尾之后的字节读为零。三个实现分别以 mmap、mmap 与 section/view 实现。测试成员openkal随之移动,并观察 0.18 的映射。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像, sha256 两处一致。 -
mcpplibs.os 0.2.3。 钉 openkal-linux 0.18.3:目录句柄以
O_PATH打开,进程可搜索而不可读的目录中按绝对名 启动的程序能被找到(Android 应用沙箱,mcpp-community/mcpp#857)。测试成员os随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-platform 0.18.0。 运行器声明
hosts(okrun 构建的系统与架构,即需要它的包能运行的地方);删除universal(打包只含命令命名的腿);版本组为 openkal-linux 0.18.3、openkal-musl 0.22.9、openkal-llvm-runtime 0.16.9、openkal-ld/run/tools 0.1.4。需要 mcpp 2026.10.30.1;测试成员openkal-platform在本仓库 CI 的 mcpp 移到 2026.10.30.1 时随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-musl 0.22.9、openkal-llvm-runtime 0.16.9。 openkal-musl 的
pread、pwrite、preadv、pwritev由定位、传输与恢复位置组成(此前返回ENOSYS);openkal-llvm-runtime 在 ok 映像上导出__cxa_thread_atexit, 带析构的thread_local的映像可以封装。测试成员openkal、openkal-musl随之移动。GLOBAL 为 GitHub 标签归档, CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-musl 0.22.8、openkal-llvm-runtime 0.16.8。 openkal-musl 钉 openkal-ld 0.1.4(本轮 openkal-image 归档); 0.22.7 仍钉 0.1.3,与本轮平台的版本组不一致。openkal-llvm-runtime 随之移动。测试成员
openkal、openkal-musl随之移动。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-musl 0.22.7、openkal-llvm-runtime 0.16.7、openkal-ld / openkal-run / openkal-tools / openkal-bind 0.1.4。 openkal-musl 钉 openkal-linux 0.18.3,并只在内部 overlay 在命令行上时为 C++ 定义
restrict:musl 的公开头写__restrict,而为每个 C++ 消费者定义的宏占用了程序自己的名字(clang 的TokenKinds.def把restrict作为宏 实参传入)。openkal-llvm-runtime 随之移动;openkal-image 的四个成员钉 openkal-linux 0.18.3,okrun 与载体能在 可搜索不可读的目录中启动程序。测试成员openkal、openkal-musl、openkal-tools、openkal-bind随之移动。 GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-linux 0.18.3。 每个
kal_dir(含两个预开放目录)以O_PATH打开:在其下解析名字、在其中启动程序、 描述它都不需要读权限,列举时另开可读的描述符。Android 应用沙箱(run-as,SELinuxrunas_app)中根目录的预开放以 EACCES 失败,以绝对名启动的每个程序报告为找不到(mcpp-community/mcpp#857)。测试成员openkal移到 0.18.3。 GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
mcpplibs.mwrap.libvpx 1.17.0(新包)。 libvpx-m:以 C++23 模块(
import mcpplibs.mwrap.libvpx;)使用 VP9 编解码库 libvpx 1.17.0 与 WebM 容器库 libwebm 1.0.0.32(建立在 compat.libvpx 与 compat.libwebm 之上)。根模块导出 libvpx 头文件的 133 个类型、192 个枚举值、上游导出的 35 个函数与两个 VP9 接口(VP8 未构建,其接口不导出),头文件中 86 个类型化控制函数 (VPX_CTRL_USE_TYPE生成的 static 函数)在mcpplibs::mwrap::libvpx中同名适配;mcpplibs.mwrap.libvpx.webm在各自 命名空间导出 libwebm 的 mkvmuxer、mkvparser 与 libwebm(命名空间作用域常量为内部链接,其值在mcpplibs::mwrap::libvpx::mkvmuxer/::mkvparser下同名提供);mcpplibs.mwrap.libvpx.macros把 74 个宏映射为常量、 函数与 constexpr 函数,其余(vpx_codec_control等)留在<mwrap/libvpx/macros.hpp>。描述符为 libvpx-m 的不可变mwrap-1.17.0发布包(暂无 CN 镜像)。新增使用者tests/mwrap/libvpx-webm:经类型化控制编码 VP9、mkvmuxer 封装、 mkvparser 解析并解码(PSNR 下限)、两次封装字节相同,以及侧边头文件与 import 同时使用;validate.yml 新增已安装模板检查 (wrapper 的 LICENSE/NOTICE 与两个库的 README、LICENSE、PATENTS、AUTHORS 在搬迁后的发布包中逐字节一致)。 -
compat.libvpx 1.17.0(新包)。 libvpx:WebM 项目的 VP9 视频编解码器(编码器与解码器;BSD-3-Clause,附 WebM 项目的 免版税专利授权 PATENTS)。从
v1.17.0标签归档构建上游configure --target=generic-gnu --disable-vp8 --enable-vp9 --enable-multithread(不含示例、工具、文档、单元测试、webm-io、libyuv)所编译的 101 个 C 源文件:通用 C 实现,无 SIMD、 无汇编、无运行时 CPU 检测,同一配置在 x86-64 与 aarch64、Linux、macOS、Windows 与wasm32-emscripten上不变地构建。 该配置生成的vpx_config.h、vpx_config.c、vpx_version.h与三个 RTCD 头(vp9_rtcd.h、vpx_dsp_rtcd.h、vpx_scale_rtcd.h)作为generated_files原样提供(私有头目录),只有描述宿主操作系统的三行改由预处理器决定: Windows 以外有pthread.h、unistd.h(Windows 上vpx_util/vpx_pthread.h用 Win32 实现工作线程),glibc 与 Apple 上有pthread_setname_np;不带 pthreads 的 Emscripten 上CONFIG_MULTITHREAD为 0(单线程工作器依次执行各块)。-ffp-contract=off。使用者#include <vpx/vpx_encoder.h>、<vpx/vp8cx.h>等(上游安装布局)。url 为上游标签归档 (暂无 CN 镜像);声明extensions.autoupdate。新增测试成员tests/examples/libvpx:版本与构建配置字符串、 一遍编码(好质量、恒定质量)解码回来的 PSNR、实时速度 8、无损逐像素还原、单线程两次编码字节相同、四线程分块编码 两线程解码。 -
compat.libwebm 1.0.0.32(新包)。 libwebm:WebM 项目的 WebM(Matroska)容器库,复用器 mkvmuxer 与解析器 mkvparser (BSD-3-Clause)。从
libwebm-1.0.0.32标签归档构建上游 CMakeLists.txt 的webm目标:common/file_util.cc、common/hdr_util.cc与 mkvmuxer、mkvparser 的源文件(不含默认关闭的新解析器webm_parser/、MPEG-TS 工具、WebVTT 与示例程序);无配置头、无生成文件。使用者#include <mkvmuxer/mkvmuxer.h>、<mkvparser/mkvparser.h>等。新增测试 成员tests/examples/libwebm:写一个 VP9 与 Opus 两条轨道的 WebM(BT.709 有限范围的色彩、OpusHead、编码延迟、 关键帧、cues、时长)到内存与磁盘(逐字节相同),用 mkvparser 从内存与 MkvReader 读回每一帧的字节与时间;给定轨道 UID 时两次复用字节相同(不给时 mkvmuxer 按当前时间随机生成)。 -
mcpplibs.mwrap.libwebp 1.5.0(新包)。 libwebp-m:以 C++23 模块(
import mcpplibs.mwrap.libwebp;)使用 compat.libwebp 1.5.0(BSD-3-Clause 与 Google 专利授权)。从固定版本的公开头文件生成,以export using导出:根模块webp/types.h、decode.h、encode.h、mux_types.h的 23 个类型、59 个枚举值与 72 个函数,mcpplibs.mwrap.libwebp.sharpyuv(根模块重新导出),以及demux/mux特性下的mcpplibs.mwrap.libwebp.demux(WebPDemux*、WebPAnimDecoder*)与mcpplibs.mwrap.libwebp.mux(WebPMux*、WebPAnimEncoder*),特性转发到 compat.libwebp 的同名特性。22 个static inline函数(WebPConfigInit、WebPPictureInit、WebPGetFeatures、WebPAnimEncoderNew…)在mcpplibs::mwrap::libwebp中以同名同签名适配;mcpplibs.mwrap.libwebp.macros映射 ABI 版本、WEBP_MAX_DIMENSION、 sharpyuv 版本与WEBP_ABI_IS_INCOMPATIBLE/SHARPYUV_MAKE_VERSION。包装仓库 CI(Linux x86_64 GCC/LLVM、Linux arm64 GCC、 macOS、Windows、wasm32-emscripten,dev 与 release)固定编码字节与解码像素的哈希,在所有目标上一致;一致性检查确认examples/webpcodec的编码与解码结果与上游 makefile.unix 构建的cwebp/dwebp逐字节相同(76 项)。描述文件pkgs/mwrap/libwebp.lua指向不可变的mwrap-1.5.0发布归档(暂无 CN 镜像)。新增测试成员tests/mwrap/libwebp-image(开启 demux 与 mux:有损与无损 RGBA 往返含 alpha、高级 API 及固定哈希、动画逐帧编码与回放、错误路径),validate.yml 中 验证已安装归档的默认image模板及其迁移后的许可文件。 -
mcpplibs.mwrap.pocketpy 2.2.0(新包)。 pocketpy-m:以 C++23 模块(
import mcpplibs.mwrap.pocketpy;)使用 compat.pocketpy 2.2.0(MIT)。从固定版本的<pocketpy.h>生成,以export using导出全部 29 个类型、91 个枚举值与 246 个函数(上游全局名不变);mcpplibs.mwrap.pocketpy.macros把 82 个宏中的 65 个映射为常量与函数(PK_VERSION、PK_ENABLE_*、py_isint…、py_r0…、TypeError等为传给py_exception的可变参数模板,py_callcfunc两种 NDEBUG 状态各自正确),PY_CHECK_ARGC、PY_CHECK_ARG_TYPE、py_arg留在<mwrap/pocketpy/macros.hpp>。包装仓库 CI (Linux x86_64 GCC/LLVM、Linux arm64 GCC、macOS、Windows、wasm32-emscripten,dev 与 release)运行嵌入 API 测试,并在 只用本模块写成的宿主上运行上游全部 92 个tests/*.py(源码与编译成.pyc各一遍)。描述文件pkgs/mwrap/pocketpy.lua指向不可变的mwrap-2.2.0发布归档(暂无 CN 镜像)。新增测试成员tests/mwrap/pocketpy-embed(exec/eval 读回、遍历 dict、Python 调用 C 函数、错误消息与 VM 继续、同一 VM 中重复执行、watchdog,以及侧头文件与 导入并用),validate.yml 中验证已安装归档的默认script模板及其迁移后的许可文件。 -
compat.pocketpy 2.2.0(新包)。 PocketPy 2:用 C11 写的小型可嵌入 Python 3.x 解释器(MIT,无依赖)。从标签归档 构建
src/**/*.c(即上游 CMake 的 POCKETPY_SRC;_generated.c已随源码提供,无需 prebuild.py)为静态库, 按上游 CMake 的默认做法作为一个 unity 翻译单元编译(生成的pocketpy_unity.c按 CMake 的 GLOB_RECURSE 顺序包含 84 个 源文件;源码依赖于此:NDEBUG 下PK_INLINE把头文件声明、其他文件调用的函数标为inline,clang 在 MSVC ABI 下不输出 其定义,逐个编译会在 Windows 上留下未定义符号),-std=gnu11。配置取pocketpy/config.h给未定义任何宏的使用者 的取值(即使用者的<pocketpy.h>所见):PK_ENABLE_OS=1、PK_ENABLE_THREADS=0(CMake 打开它只在其 unity 构建下 能编译:time.c未包含声明c11_thrd__yield的头文件)、PK_ENABLE_DLL=0;另打开两项上游选项:PK_ENABLE_DETERMINISM=1与-ffp-contract=off(同 CMake,浮点结果跨平台一致)、PK_ENABLE_WATCHDOG=1(py_watchdog_begin/py_watchdog_end在头文件中总是声明,只在打开时才有定义)。NDEBUG 随构建配置(release 定义),库与使用者一致。install()带匹配计数地应用上游 2.2.0 之后的修复 de8351ed:异常对象记录的回溯帧中只有 调试器才填写的locals/globals未初始化,而垃圾回收无条件标记它们,异常对象存活时回收会读到未初始化内存并可能崩溃 (上游自己的tests/901_array2d_extra1.py按 build.sh 构建即崩溃);修复将二者置为 nil。Linux 链接-lm,Windows 链接ws2_32并定义_CRT_SECURE_NO_WARNINGS。Linux、macOS、 Windows 与wasm32-emscripten使用同一组源文件与参数。使用者#include <pocketpy.h>。url 为上游标签归档(暂无 CN 镜像);声明extensions.autoupdate(v${version}标签)。新增测试成员tests/examples/pocketpy:版本与配置、 exec/eval 与 int/float/str/bool 读回、dict 与 list 的遍历、绑定的 C 函数及其参数检查、语法错误/运行时错误/ 抛出/无限递归均返回 false 并带消息且 VM 可继续、异常对象跨多次垃圾回收存活、watchdog 结束死循环、json/math/collections、确定性浮点值、 同一 VM 中重复执行、第二个 VM 与py_resetvm。 -
mcpplibs.os 0.2.2。 新增
wasm32-emscripten目标:基于 Emscripten 的 C 库与 openkal-emscripten 0.6.0 的 wasm 模块,在 node 或页面中运行;新增platform::emscripten、architecture::wasm32与is_emscripten,不定义平台模块。 openkal-emscripten 没有openkal.process,启动程序的调用在链接时失败并给出 openkal 符号名;interrupt报告不会收到 结束请求。修正(所有目标):fs::read不再经栈上 64 KiB 数组读取(它占满了 wasm 模块的默认栈);stamp_of与identity_of同时请求节点种类,不再把已有文件报告为不存在。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res/os镜像,sha256 一致。测试成员os移到 0.2.2。 -
mcpplibs.openkal-emscripten 0.6.0。 按 openkal 0.17.1 实现其提供的十二个接口,使依赖 openkal 0.17 的 mcpplibs.os 能在
wasm32-emscripten上解析与链接。kal_env_image为 node 所给的脚本(页面中为kal_err_not_found),kal_env_loader为kal_err_not_found,kal_env_system为emscripten;kal_fs_rename_flags中KAL_RENAME_NO_REPLACE为kal_err_not_supported(C 库没有不替换的原子改名),声明KAL_FS_PROP_REMOVE_OPEN(在 MEMFS 上测得);kal_net_listen_at/kal_net_connect_at为kal_err_not_supported。修正:C 库对其自身终端设备 即使在管道下也回答isatty为 1,现在由宿主(node 的tty.isatty)判断标准流是否为终端,终端设置KAL_TERM_SEQUENCES。一致性(emsdk 6.0.9、node 26.7.0):终端下 109 成立、0 不成立、14 未观察;管道下 97、0、15。 GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res/openkal-emscripten镜像,sha256 一致。测试成员openkal的 wasm32 依赖移到 0.6.0。 -
mcpplibs.os 0.2.1。 在程序自己的 C 库的两种安排下构建并通过测试:系统自己的 C 库,以及位于系统自身三元组上的 openkal-musl 与 openkal-llvm-runtime(mcpp docs/24)。机器、内存、卷的种类与两项交换在 Linux 与 macOS 上经内核调用 得到,Windows 上以 32 位 DWORD 与 UTF-16 WCHAR 声明 kernel32 的名字,均不经 C 库;标准输出的转向与 SIGPIPE 在进程 保存它们的地方修改。mcpp-language-server 的操作系统层进入 os(有界运行、线程、环境赋值、有界读取、规范名)。 ok image 的 C 库、C++ 运行时与加载器取自其平台(openkal-platform,mcpp 2026.10.27.1 为
<arch>-openkal选择), 包不再声明它们。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res/os镜像,sha256 一致。测试成员os移到 0.2.1。 -
mcpplibs.mwrap.dr_libs 2026.03.03(新包)。 dr_libs-m:以 C++23 模块(
import mcpplibs.mwrap.dr_libs;)使用 compat.dr_libs 2026.03.03(dr_wav 0.14.5、dr_flac 0.13.3、dr_mp3 0.7.3)。每个头文件各一个模块且可单独导入:mcpplibs.mwrap.dr_libs.wav(42 个类型、48 个枚举值、94 个函数)、.flac(32、6、31)、.mp3(28、8、29),全部以export using导出上游全局名;每个枚举都由 typedef 命名,枚举值按原样导出。mcpplibs.mwrap.dr_libs.macros把 171 个 对象式宏映射为其自身类型的常量;*_API等属性、字符串化宏与 dr_flac 的平台检测宏共 28 个留在<mwrap/dr_libs/macros.hpp>。包装仓库的 CI(Linux x86_64 GCC/LLVM、Linux arm64、macOS、Windows)逐样本核对 FLAC 解码、按 LAME 标签的无缝长度解码 MP3、在各容器中往返 WAV,并与 compat.miniaudio 链接在同一程序中解码出相同样本。 GLOBAL 为mwrap-2026.03.03发布资产,CN 为 GitCodemcpp-res/mwrap-dr_libs镜像,sha256 一致。新增测试成员tests/mwrap/dr_libs-audio与已安装模板及其许可文件的部署检查。 -
compat.dr_libs 2026.03.03(新包)。 dr_libs:单文件的 WAV/AIFF、FLAC 与 MP3 解码器(以及 WAV 编码器),C 实现, 无依赖,许可为 MIT-0 或 Unlicense 二选一。上游按头文件分别打标签(
wav-*、flac-*、mp3-*),没有同时覆盖三者的标签; 本包固定wav-0.14.5的提交fa931f3(2026-03-03)的归档,其中dr_flac.h、dr_mp3.h与flac-0.13.3、mp3-0.7.3标签逐字节相同,即 dr_wav 0.14.5、dr_flac 0.13.3、dr_mp3 0.7.3 三者均为已发布版本的最新提交;版本号取提交日期(同 compat.nanosvg)。一个生成的实现编译单元同时定义DR_WAV_IMPLEMENTATION、DR_FLAC_IMPLEMENTATION、DR_MP3_IMPLEMENTATION,构建为一个静态库;使用者#include <dr_wav.h>(<dr_flac.h>、<dr_mp3.h>)并链接,不要再定义 这些宏。上游默认配置(stdio 与转换接口保留,SIMD 由编译器预定义宏决定)。miniaudio 内嵌的是改名的副本(ma_dr_*), 两者可在同一程序中共存。GLOBAL 为 GitHub 提交归档,CN 为 GitCodemcpp-res/dr_libs镜像,sha256 一致。新增测试成员tests/examples/dr_libs(三平台):WAV(RIFF、Wave64、IEEE float、mu-law)往返、FLAC 按 STREAMINFO 的 MD5 逐样本无损解码与 定位、MP3 按 LAME 标签的无缝长度解码。 -
mcpplibs.mwrap.opus 1.6.1(新包)。 opus-m:以 C++23 模块(
import mcpplibs.mwrap.opus;)使用 compat.opus 1.6.1、 compat.opusfile 0.12 与 compat.ogg 1.3.6。mcpplibs.mwrap.opus导出 libopus 的 13 个类型与 87 个函数,并重新导出.file(opusfile:10 个类型、54 个函数;不导出未构建的 libopusurl 的 9 个声明)、.ogg(libogg:12 个类型、71 个函数) 与.macros(115 个整数常量、6 个类型别名、54 个 CTL 宏映射为返回带类型ctl_request的 constexpr 函数,7 个*_ctl函数各有接受它的重载,opus_encoder_ctl(enc, OPUS_SET_BITRATE(64000))写法不变);属性、版本测试与 CTL 参数检查等 22 个宏留在<mwrap/opus/macros.hpp>。包装仓库的 CI(Linux x86_64 GCC/LLVM、Linux arm64、macOS、Windows)经由模块 解码 RFC 8251 的 12 个测试向量(5 种采样率、单声道与立体声,共 120 次,逐包核对区间解码器最终状态,并以 libopus 的opus_compare对照参考输出),0 失败;212 个导出函数全部可链接。GLOBAL 为mwrap-1.6.1发布资产,CN 为 GitCodemcpp-res/mwrap-opus镜像,sha256 一致。新增测试成员tests/mwrap/opus-ogg与已安装模板及其许可文件的部署检查。 -
compat.ogg 1.3.6、compat.opus 1.6.1、compat.opusfile 0.12(新包)。 Opus 音频的三个 Xiph.Org 库,均为 BSD-3-Clause,均以上游发布 tarball 从源码构建为静态库。compat.ogg:Ogg 容器的分页与位打包(
src/framing.c、src/bitwise.c),<ogg/config_types.h>按上游 CMake 的结果由generated_files生成(int16_t…uint64_t)。 compat.opus:Opus 编解码器(RFC 6716)的编码器与解码器、multistream、ambisonics projection 与 repacketizer; 上游默认的浮点构建(源文件取自celt_sources.mk/silk_sources.mk/opus_sources.mk),deep PLC、DRED、 OSCE 与 QEXT 关闭(上游默认),纯 C、不启用 SIMD 内建函数与运行时 CPU 检测(x86 内建函数需要逐文件-m标志); 生成的config.h(OPUS_BUILD、PACKAGE_VERSION "1.6.1"、VAR_ARRAYS、ENABLE_HARDENING)与内部头文件目录 是私有包含目录,使用者只看到include/(#include <opus.h>);Linux/macOS 以-fvisibility=hidden编译, 与上游 configure 一致。compat.opusfile:Ogg Opus 文件(RFC 7845)的解码与精确定位,依赖 compat.ogg 与 compat.opus;只构建 libopusfile(不含需要 OpenSSL 的 libopusurl / HTTP)。GLOBAL 为上游发布资产 (opus 为 downloads.xiph.org,GitHub 无 1.6.1 发布;ogg 与 opusfile 为 GitHub 发布资产),CN 为 GitCodemcpp-res/opus、mcpp-res/ogg、mcpp-res/opusfile镜像,sha256 一致;声明extensions.autoupdate(v${version}标签)。新增测试成员tests/examples/opus(三平台):CELT 与 SILK 往返(信噪比)、包解析、5.1 multistream、 ambisonics、repacketizer,以 libogg 生成的 Ogg Opus 流经 opusfile 读取(OpusHead、OpusTags、精确长度、定位)。 -
mcpplibs.mwrap.box2d 3.2.0(新包)。 box2d-m:以 C++23 模块(
import mcpplibs.mwrap.box2d;)使用 compat.box2d 3.2.0。按上游全局名导出已安装头文件的 110 个类型、3 个不透明结构体、176 个枚举值、506 个B2_API函数、 91 个内联函数、8 个 C++ 向量运算符与b2_lengthUnitsPerMeter;头文件的 13 个static const对象(内部链接)以同类型、 同初值的常量置于mcpplibs::mwrap::box2d。mcpplibs.mwrap.box2d.macros把 20 个宏映射为常量、5 个读取长度单位的宏 映射为函数(B2_LINEAR_SLOP())、3 个 id 宏映射为 constexpr 函数;声明说明符、初始化器语法与断言留在<mwrap/box2d/macros.hpp>。包装仓库的 CI(Linux x86_64 GCC/LLVM、Linux arm64 GCC/LLVM、macOS、Windows、 wasm32-emscripten)在 dev 与 release 下运行确定性场景:上游的 falling hinges(第 299 步、哈希 0x465F3DF4)与 被撞倒的 20 层金字塔(600 步,哈希 0x790D7C28),1–8 个 worker、用户任务系统、SSE2 回退,各行逐位一致。 GLOBAL 为mwrap-3.2.0发布资产,CN 为 GitCodemcpp-res/mwrap-box2d镜像,sha256 一致。新增测试成员tests/mwrap/box2d-physics与已安装模板及其许可文件的部署检查。 -
compat.box2d 3.2.0(新包)。 Box2D v3:游戏用 2D 刚体物理引擎(C17,MIT,无依赖)。按上游 CMake 的做法从标签归档 构建
src/*.c为静态库:-std=gnu17、-ffp-contract=off(上游为跨平台确定性对每个 GCC/Clang 设置,禁止乘加收缩为 FMA)、上游默认的 SIMD 选择(x86_64 为 SSE2,并在运行时按 cpuid 分派 AVX2 求解器;arm64 为 Neon)、unix 上-fPIC -fvisibility=hidden,Linux 链接-lm -lpthread;Emscripten 目标加上游同样的-msimd128 -msse2(target_cfg)。 不定义 BOX2D_VALIDATE / BOX2D_DOUBLE_PRECISION / BOX2D_PROFILE(与上游作为依赖使用时相同)。使用者#include <box2d/box2d.h>。 GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致;声明extensions.autoupdate(v${version}标签)。 新增测试成员tests/examples/box2d(三平台):版本、下落与休眠、接触与移动事件、射线与凸包,以及上游的确定性场景 falling hinges(第 299 步全部休眠、变换哈希 0x465F3DF4,1 个与 4 个 worker、SSE2 回退路径)。 -
mcpplibs.mwrap.miniaudio 0.11.25(新包)。 miniaudio-m:以 C++23 模块(
import mcpplibs.mwrap.miniaudio;)使用 compat.miniaudio 0.11.25(MIT-0 或 Unlicense)。导出miniaudio.hAPI 部分的全部 266 个类型与结构体标签、368 个枚举值与 931 个MA_API函数(上游全局名不变),每个声明位于头文件声明它的同一预处理条件下;三个static MA_INLINE辅助函数在mcpplibs::mwrap::miniaudio中适配;mcpplibs.mwrap.miniaudio.macros把 27 个数值宏映射为常量,并把兼容名字 (ma_resource_manager_job*)映射为类型别名与函数引用;属性、字符串化与平台/后端测试宏留在<mwrap/miniaudio/macros.hpp>。 包装仓库的 CI(Linux x86_64 GCC/LLVM、Linux arm64、macOS、Windows,以及 Web:wasm32-emscripten,node 下运行测试) 在每个目标上依编译器自身的预处理审计导出。GLOBAL 为mwrap-0.11.25发布资产,CN 为 GitCodemcpp-res/mwrap-miniaudio镜像,sha256 一致。新增测试成员tests/mwrap/miniaudio-engine与已安装模板及其许可文件的部署检查。 -
mcpplibs.mwrap.sheenbidi 3.0.0(新包)。 sheenbidi-m:以 C++23 模块(
import mcpplibs.mwrap.sheenbidi;) 使用 compat.sheenbidi 3.0.0。导出已安装头文件的全部类型、结构体标签与 51 个SB_PUBLIC函数(上游全局名不变);mcpplibs.mwrap.sheenbidi.macros把宏映射为常量与 constexpr 函数,并把无名枚举的 236 个枚举值映射为其 typedef 类型的常量;SB_PUBLIC、SB_DEPRECATED与extern "C"括号留在<mwrap/sheenbidi/macros.hpp>。包装仓库的 CI (Linux x86_64 GCC/LLVM、Linux arm64、macOS、Windows)运行 Unicode 17.0.0 的 BidiTest.txt(770,241 例)与 BidiCharacterTest.txt(91,707 例),0 错误。GLOBAL 为mwrap-3.0.0发布资产,CN 为 GitCodemcpp-res/mwrap-sheenbidi镜像,sha256 一致。新增测试成员tests/mwrap/sheenbidi-bidi与已安装模板及其许可文件的部署检查。 -
compat.sheenbidi 3.0.0(新包)。 SheenBidi:Unicode 双向算法(UAX #9)的 C 实现,Apache-2.0,无依赖; 3.0.0 实现 Unicode 17.0.0,通过该版本的 BidiTest.txt 与 BidiCharacterTest.txt 全部用例。以上游的单一编译单元
Source/SheenBidi.c(SB_CONFIG_UNITY)从源码构建为静态库,只导出公共头文件的 51 个SB*入口;使用者的包含路径 只有Headers(#include <SheenBidi/SheenBidi.h>),内部头文件所在的Source是私有包含目录。未定义SB_CONFIG_EXPERIMENTAL_TEXT_API(上游默认,实验性的 SBText 接口不编译)。是 compat.fribidi(LGPL-2.1-or-later) 的宽松许可替代,可静态链接。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致; 声明extensions.autoupdate(v${version}标签)。新增测试成员tests/examples/sheenbidi(三平台)。 -
openlifa.openmui 0.3.0。 OpenLifa 标准 openmui 的规范:registry、C ABI(
include/openmui.h, 在使用者的包含路径上)和声明其值类型的 C++ 模块openmui.spec(语义树节点及其一致性检查、actor、 信封、Core 组件契约)。actor、效果、授权与信封采用 openas 0.2。只依赖标准库(头文件为 C99);代码 Apache-2.0,规范文本 CC BY-SA 4.0。GLOBAL 为 GitHub 标签归档。新增测试成员tests/examples/openlifa.openmui。 -
openlifa.openas 0.2.0。 OpenLifa 标准 openas 的规范与声明它的 C++ 模块(
openas、openas.conformance):actor 及其委托链的文本形式、动词的效果等级、系统上限之下的授权与单个请求的决定、 运行信封的记录种类、退出码与错误码,以及动词描述、actor 与授权的一致性检查。只依赖标准库;代码 Apache-2.0, 规范文本 CC BY-SA 4.0。GLOBAL 为 GitHub 标签归档。新增测试成员tests/examples/openlifa.openas。 -
gcc.libstdcxx16.1.0.1。 向 llvm 构建提供mcpp:c++-abi=libstdc++:安装时链接xim:gcc16.1.0 载荷的头文件与运行库目录并写出自身清单(std-module为bits/std.cc), clang 据此以 libstdc++ 编译、import std与链接(需要 mcpp 2026.10.26.1,SPEC-002 §7)。 新增测试成员tests/examples/libstdcxx-llvm。 -
openkal 0.17.1 及其实现 openkal-linux 0.18.1、openkal-macos 0.15.1、openkal-windows 0.13.1。 openkal 增加
KAL_SPAWN_ONE_STRING/KAL_PROCESS_PROP_ONE_STRING:接收单个字符串的系统(Windows)上, 程序名之后的参数按原样连接,供以自身语法读取命令的命令解释器使用;接收参数向量的系统拒绝该标志。 openkal-windows 实现它;openkal-linux 与 openkal-macos 把 SIGHUP 纳入结束请求;openkal-linux 以绝对名 启动需要解释器的程序(#!脚本的$0不再是/dev/fd/<n>);openkal-macos 把 EBADARCH 与 EBADMACHO 译为kal_err_not_program。测试成员openkal移到这些版本,并观察单字符串标志在 接收向量的系统上被拒绝。GLOBAL 为 GitHub 标签归档,CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal-linux 0.18.2、openkal-musl 0.22.1、openkal-llvm-runtime 0.16.1。 openkal-linux 的结束请求 处理器以私有 futex 唤醒结束字(与
kal_task_wait的等待一致),等待结束字的执行上下文由此被请求唤醒; 此前共享唤醒到达不了私有等待,以等待结束请求结束的程序在请求后仍不结束。openkal-musl 与 openkal-llvm-runtime 移到 openkal 0.17.1 这一轮:openkal 系列按精确版本固定,一个同时含 mcpplibs.os 0.2.0 与 openkal-musl 0.22.0 的 ok image 图会出现两个 openkal。测试成员openkal、openkal-musl随之移动。 -
openkal-windows 0.13.2、openkal-musl 0.22.2、openkal-llvm-runtime 0.16.2。 openkal-windows 的有界等待 按进程字的种类取得句柄:以有界生命期启动的程序由其记录命名,此前对它的每次有界等待都失败, 调用方的时限(mcpp 的
[hooks] timeout_seconds)在 Windows 上不起作用。openkal-musl 与 openkal-llvm-runtime 随之移动;测试成员openkal、openkal-musl随之移动。 -
openkal-windows 0.13.3。 环境表在首次查询时于一把锁下填写一次,两个执行上下文同时首次查询时 都读到已填写的表;此前其中一个可能读到空表,把已设置的变量(
PATH)报为不存在。管道的有界读以 性能计数器计量时限,此前把每次 1 ms 的睡眠计为 1 ms,而默认计时器下一次睡眠持续约 15.6 ms, 100 ms 的时限约等待 1.5 s。测试成员openkal随之移动。 -
openkal-run、openkal-tools、openkal-ld 0.1.1,openkal-musl 0.22.3,openkal-llvm-runtime 0.16.3。 openkal-image 的三个包移到 openkal 0.17.1 这一轮:okrun 把 ok image 导入的名字绑定到 openkal-linux 0.18.2、 openkal-macos 0.15.1 与 openkal-windows 0.13.3,以
KAL_SPAWN_ONE_STRING启动命令解释器的 image 在 okrun 下得到该标志的语义;三个包仍为同一版本、同一归档。openkal-musl 随 openkal-windows 0.13.3 与 openkal-ld 0.1.1 移动,openkal-llvm-runtime 随 openkal-musl 移动。测试成员openkal、openkal-musl、openkal-tools随之移动。 -
openkal-platform 0.17.2。 通用包(
universal = true:一个包含两个架构的映像、启动器,自包含时按系统带上运行器);okb包格式(平台插件经 mcpp.plugins.platform 0.20.0 运行okld bundle --package);载体作为包的运行器、 并能从内存运行一个映像 zip(单文件);-ffunction-sections -fdata-sections与--icf=safe;版本组移到 openkal-image 0.1.3、openkal-musl 0.22.5、openkal-llvm-runtime 0.16.5。GLOBAL 与 CN 的 sha256 一致。 -
mcpp.plugins 0.20.0。 新特性
plugins-platform(模块mcpp.plugins.platform):平台插件与包格式提供者的provide_format(声明格式,并在请求该格式的一遍中由暂存包的mcpp-package.json生成 artifact action),以及平台的 链接、产物命名、封装与运行主机的带检查的写法(mcpp SPEC-013 协议 17);mcpp::plugins::package读取暂存包的mcpp-package.json(SPEC-014 §4.5)。SYCL 构建只有一个 C++ 运行时(libstdc++)。需要 mcpp 2026.10.27.1;latest仍指向 0.19.1,随 mcpp 2026.10.27.1 发布移动。 -
openkal-platform 0.17.1(新包)。 ok 映像目标
x86_64-openkal、aarch64-openkal的平台包(mcpp SPEC-013): 工具链 llvm@23.1.3,C 库 openkal-musl 0.22.3,C++ 与编译器运行时 openkal-llvm-runtime 0.16.3,工具 okld、okrun (openkal-tools 0.1.1),编译与链接约定、封装、命名、运行器、载体,宿主组合与 openkal 0.17.1 的版本组。 mcpp 2026.10.27.1 的目标表为这两个目标选用它,工程不再声明运行时与工具。GLOBAL 为 GitHub 标签归档, CN 为 GitCodemcpp-res镜像,sha256 两处一致。 -
openkal 0.17.2 这一轮:openkal-ld、openkal-run、openkal-tools 0.1.2,新包 openkal-bind 0.1.2, openkal-musl 0.22.4,openkal-llvm-runtime 0.16.4。 openkal-image 0.1.2 定义 okb v1(
docs/okb.md): 一个 ZIP 归档,映像以 stored 存放、数据起点按 64 KiB 对齐,okb.json给出各架构的目录、入口与每个成员的 sha256,okb.sig对清单签名;okld bundle/okld bundle check写出并校验它,okrun 运行它;libokrun 增加okrun_run_okb_bytes、okrun_run_images(从内存运行,不写盘)与okrun_open_library/okrun_symbol/okrun_close。openkal-bind 是构建插件(模块mcpp.mcpplibs.openkal_bind,docs/bind.md):以.okso加 C 头文件发布的库,在 Linux、macOS、Windows 上经它生成的绑定调用, 边界(long、wchar_t、变参、无原型的回调、未导出的函数)在构建时拒绝。四个包同一标签、同一归档。 openkal-musl 0.22.4 的renameat2按标志的含义执行或拒绝(RENAME_NOREPLACE为kal_fs_rename_flags,RENAME_EXCHANGE与其余标志为EINVAL);此前不读标志,交换会丢失第二个文件。 openkal-llvm-runtime 随 openkal-musl 移动。新增测试成员openkal-bind(在构建程序中构建一个映像并经 插件绑定,测试经绑定调用映像、映像回调测试程序);openkal、openkal-musl、openkal-tools随之移动。 -
openkal-ld、openkal-run、openkal-tools、openkal-bind 0.1.3,openkal-musl 0.22.5,openkal-llvm-runtime 0.16.5。
okld bundle <out.okb> --package <树>由 mcpp 暂存的通用包写出 okb:读取mcpp-package.json(mcpp SPEC-014 §4.5), 角色为image的文件按lib/<arch>/成为成员,各自的架构与 sha256 被核对,入口取launch.entry;这是 openkal-platform 的okb包格式的动作。openkal-musl 随 openkal-ld 0.1.3 移动,openkal-llvm-runtime 随 openkal-musl 移动。测试成员openkal、openkal-bind、openkal-musl、openkal-tools随之移动。 -
mcpplibs.os 0.2.0。 mcpp 的操作系统层所承载的内容进入 os:
exec(本进程成为另一个程序)、 一个管道按写入顺序承载输出与错误输出、追加写与持久化、卷的容量、place与exchange、属主、 处理器数与可用内存、有界读取输入、发往错误流的输出、保留中断的原始模式,以及 Windows 的事实。 基于 openkal 0.17.1(openkal-linux 0.18.2、openkal-macos 0.15.1、openkal-windows 0.13.3);ok image 形态基于 openkal-llvm-runtime 0.16.3 与 openkal-tools 0.1.1。测试成员os移到 0.2.0,并观察两个输出 经一个管道按序到达。
-
CI and compatibility measurements use mcpp 2026.11.3.1. The hosted platform member selects openkal-platform 0.23.3. The index client floor and compatibility runtime baseline are unchanged.
-
compat.miniaudio 0.11.25 以
gnu11编译(可构建到 wasm32-emscripten)。 Emscripten 上 miniaudio 的 Web Audio 后端经EM_ASM内联 JavaScript,Emscripten 在严格的-std=c*模式下拒绝EM_ASM(上游 miniaudio.h §2.6: 不能使用-std=c*),原来的c_standard = "c11"使mcpp build --target wasm32-emscripten编译失败;改为gnu11后构建并在 node 下运行,启用的后端为 Web Audio 与 Custom(上游在 Emscripten 上不构建需要后台线程的 Null 后端)。 其他平台不受影响(上游 CMake 不设标准,GCC/Clang 默认即 GNU 方言);归档与 sha256 不变,仍为同一版本。 -
同一归档的包由点名其中一个的成员一并构建。 候选矩阵要求每个新增版本有直接点名它的测试成员; openkal-image 的 openkal-ld、openkal-run 与 openkal-tools 同一标签、同一归档,彼此以
path依赖到达, 成员openkal-tools构建 openkal-tools 时即从同一字节构建另两个。tests/autoupdate/ci.py的 matrix 对没有直接成员的包,查找本次计划中归档 URL 完全相同且有直接成员的同胞包,由该同胞的任务覆盖; 不同归档的包仍报no candidate consumer。 -
CI 按包身份选择受影响的成员。
validate.yml的 select 曾在成员清单中查找描述符短名的 子串:pkgs/o/os.lua选中 205 个成员中的 113 个(boost-*、macos、cfg(os = ...)、 注释里的exists),而经 asio、curl 依赖compat.openssl的成员一个也未选中。tests/select_members.py以 mcpp 的规则读取成员声明的(namespace, name),沿描述符的deps与包归档内清单(按 tag 读 raw.githubusercontent.com;release 资产则读归档本身, 并经path依赖到达同一归档的其他清单)陈述的依赖求传递闭包,选出依赖图含被修改身份的成员。 归档以 sha256 固定,已读结果由actions/cache保存。读不到的清单记为警告,由每周全量运行覆盖。 -
compat.sycl-runtime在 Linux 上要求mcpp:c++-abi=libstdc++。libsycl.so在 libstdc++ 上抛出sycl::exception,而一个进程中的两套 C++ 运行时之间带类型的catch不会匹配 (mcpp-community/mcpp#838)。gcc 工具链,或 llvm 加gcc.libstdcxx,满足该要求;其他构建 在编译前被拒绝。测试成员sycl-runtime在 Linux 上陈述 gcc。 -
mpusz.mp-units要求mcpp:compiler=llvm(原为mcpp:c++-abi=libc++):约束来自 GCC 16.1 的模块缺陷,是编译器而不是 C++ 库。compat.glfw以requires = { "mcpp:c-abi=glibc" }取代能力abi:glibc。 -
openkal-macos0.14.1、openkal-musl0.21.1、openkal-llvm-runtime0.15.6。 macOS 上 经fork复制的程序此前不能启动线程(pthread_create返回EAGAIN, mcpplibs/openkal-musl#55):kal_space_start只调用复制原语,而该系统的fork在原语前后 由系统库各部分加锁并在副本中更新自身状态。0.14.1 按系统库自身的顺序调用这些导出的部分; 0.21.1 与 0.15.6 移动锁定版本。两个 openkal 测试成员随之移动。GLOBAL/CN 与 sha256 的取法同上。 -
openkal0.16.0 及随之移动的七个包。 规范新增kal_task_start_sized(栈大小的下限, 给不出时为kal_err_no_memory)与KAL_TERM_PASS_INPUT(环境不改写所输入的字节), 并补述关闭目录即结束其未读完的枚举。openkal-linux0.17.0、openkal-macos0.14.0、openkal-windows0.12.0、openkal-emscripten0.5.0 实现三者;openkal-opensbi0.8.3 只移动规范的锁定版本;openkal-musl0.21.0 让线程得到所请求的栈并在 raw 模式下区分 回车与 Ctrl+J;openkal-llvm-runtime0.15.5 移动 C 库的锁定版本。GLOBAL 为上游 tag 归档, CN 为逐字节相同的 gitcode 资源,均按记录的 sha256 核对。 新增两个测试成员:tests/examples/openkal(规范在三平台、各实现在自身平台,以及新声明的 C 层行为)与tests/examples/openkal-musl(三份报告的原始程序,Linux)。 -
compat.httplib0.62.0。 在0.53.1之外新增版本键(旧键保留)。仍是纯头文件 Form B: 归档根目录仍只有一份httplib.h(747,115 → 846,648 字节,增量是 SSE 客户端、WebSocket 辅助与加固,全部落在头内,不引入 define、源文件或链接依赖),描述符的内联构建无需改动。 上游 CMake 的option()集合与target_link_libraries在 0.53.1→0.62.0 之间逐项相同 (两版实测 diff),三平台 ldflags 照旧。0.62.0 上游认识 wolfSSL/MbedTLS 后端,但本索引 没有对应的 compat 包,tls仍只接 OpenSSL,不新增 feature。实测(Windows / mcpp 2026.10.11.1 / LLVM 23.1.3 + MSVC 14.44):mcpp xpkg parseOK;httplib、httplib-zlib、httplib-brotli、httplib-no-exceptions各 1 passed。httplib-tls与httplib-zstd在本机都止步于依赖安装、未编到本包:compat.openssl3.5.1 的 Windows 安装钩子需要带Locale::Maketext::Simple的 Perl,而本机没有 Perl;compat.zstd1.5.7 的上游 tag 归档含 符号链接tests/cli-tests/bin/unzstd -> zstd,Windows 上 xlings 无法创建。两项都与本次 改版无关,交 CI 裁决。六个测试成员同步改到 0.62.0。 -
compat.wolfssl5.9.4。 wolfSSL(TLS/crypto)以 C 源码 compat 形态收录,上游最新稳定 tag 为v5.9.4-stable。上游的 autotools/CMake 都会在编译前生成wolfssl/options.h,而内联 描述符无法运行 configure,因此把该步骤的两项输出原样带入:sources逐条抄自上游 CMake 默认 的generate_lib_src_list()(5.9.4 的src/ssl_*.c、src/bio.c、src/x509*.c、src/pk*.c、src/conf.c由src/ssl.c#include,故不单列;wolfcrypt/src/{evp, evp_pk,asn_tsp,asm,ecc_fp}.c同理);generated_files写入mcpp_generated/wolfssl/options.h,即 CMake 默认选项生成的配置头,平台探测改写为_WIN32/__linux__/__SIZEOF_INT128__/x86_64/aarch64 分支。描述符通过cflags与 default-implied feature 同时下发WOLFSSL_USE_OPTIONS_H,库与消费者编译同一份配置, 结构体布局和功能集不会分叉。默认功能集:TLS 1.3/1.2、AES-GCM、ChaCha20-Poly1305、ECC、 DH、RSA-PSS、SHA-2/3/SHAKE、ML-KEM,并保留 CMake 的加固默认值(NO_OLD_TLS/NO_DES3/NO_RC4/NO_MD5/NO_MD4/NO_DSA/NO_PSK);Curve25519/Ed25519 与系统 CA 读取在 CMake 默认配置里本就关闭,本包保持一致。CN 镜像尚未发布到mcpp-res,按先例用纯字符串 url 回退 GLOBAL。实测(Windows / mcpp 2026.10.17.1 / LLVM):mcpp xpkg parse --all-os pkgs/c/compat.wolfssl.lua三平台parse OK(38 sources, 2 include dirs,1 generated file);冷mcpp test -p wolfssl→test result ok. 1 passed; 0 failed(头文件版本串、SHA-256 KAT、AES-256-GCM 往返及 坏 tag 拒绝、RNG、P-256 密钥导出)。新增成员tests/examples/wolfssl;linux/macOS 两腿交 CI 裁决。 -
compat.soci4.1.4。 SOCI(C++ 数据库访问层)以 C++ 源码 compat 形态收录:上游src/core的 22 个 TU 与 sqlite3 后端的 10 个 TU 编入同一个 lib —— 上游 CMake 把它们拆成soci_core/soci_sqlite3两个库,但 mcpp 的sources是每包一张表,且没有后端的 core 连session都开不了,所以拍平。两处"上游归档里没有、必须补"的东西:3rdparty/sqlite3是空的 git submodule,由compat.sqlite33.45.3 的依赖边替代(与compat.sqlitecpp同构); SOCI 4.1 起 core 与后端共 12 个 TU 无条件#include <fmt/format.h>,依赖刚落的compat.fmt12.2.0 —— 必须是普通形态,且这是实测:先按「取fmtlib.fmt的头 +FMT_HEADER_ONLY编进 自己的 TU」实现过,mcpp test -p soci一路走到链接期才失败,lld-link: error: duplicate symbol … fmt::v12::detail::dragonbox::cache_accessor<double>::compute_mul(模块对象的 COMDAT 键与 header-only 的不相撞),换成编译库形态后无需任何 define。 三组 CMake PRIVATE 定义分别落地:-DSOCI_SQLITE3_SOURCE=1进cxxflags(缺它soci-sqlite3.h只给两句前置声明,每个sqlite3_*调用都报 "use of undeclared identifier" —— 消费者走的恰是不定义的那条路,所以它必须止步于本包);带引号的SOCI_LIB_PREFIX/SOCI_LIB_SUFFIX/SOCI_DEBUG_POSTFIX走-includeshim(引号穿不过 描述符 → mcpp → argv 管道,compat.unixodbc撞过同一堵墙);SOCI_HAVE_SQLITE3所在的soci-config.h是 CMakefile(GENERATE)产物、不随 tarball 发布,按「只开 sqlite3」 时的输出逐字节复刻进generated_files。Boost 不做依赖:不加SOCI_USE_BOOST时全部源码不碰它。 其余七个后端不做 feature:它们的客户端库要么根本不在索引里(libpq / Oracle / DB2 / Firebird),要么驱动管理器按平台来源天差地别而 feature 的deps没有平台门控(odbc 在 linux 靠compat.unixodbc源码构建、windows/macOS 靠系统 SDK);以后加后端是一行sources加一行deps,不是重构。实测:mcpp xpkg parse pkgs/c/compat.soci.lua→parse OK;mcpp test -p soci冷验证 →test result ok. 1 passed; 0 failed(llvm 23.1.3 / MSVC ABI)——:memory:建表、绑定参数双向往返、rowset 迭代、indicator区分 NULL、事务三条路径 (显式rollback()/ 出作用域未 commit 自动回滚 /commit())、后端自带错误码与constraint_violation分类、SOCI_VERSION精确断言。消费侧命令行另有两条旁证:实测无-DNDEBUG(所以那批断言是活的,不是空测试)、无-DSOCI_SQLITE3_SOURCE(私有定义 确实没外泄)。⚠️ 后端以soci::sqlite3工厂对象取得:session("sqlite3", …)会走 SOCI 的 动态加载器去 dlopen 一个本包故意不产出的libsoci_sqlite3.so。⚠️ CN 镜像尚未发布到mcpp-res,按先例用纯字符串 url 回退 GLOBAL,补传后 sha256 不变。新增成员tests/examples/soci;linux/macOS 两腿交 CI 裁决。 -
compat.fmt12.2.0。 {fmt} 的头文件形态(#include <fmt/format.h>+ 链接)收录, 即fmtlib.fmt(模块形态)的非模块兄弟:同一个上游归档、同一个 sha256,身份却分开 —— 想要#include写法的工程不必为此背上一个自己从不import的模块 BMI。形态是编译库:sources直接抄上游默认 lib 的两份实现 TU(*/src/format.cc、*/src/os.cc,即 CMake 的add_library(fmt src/format.cc)加上FMT_OS默认 ON 的src/os.cc),include_dirs = {"*/include"}(前导*吃掉fmt-12.2.0/包装层)。没有generated_files、没有 anchor,也不需要任何 define:FMT_OS在 12.2.0 已不被头文件读取,FMT_SHARED/FMT_LIB_EXPORT是静态链路上不该定义的 DLL 词法,而src/fmt.cc是模块 unit, 归fmtlib.fmt。上游那个独立的 C API 静态库(src/fmt-c.cc+include/fmt/fmt-c.h) 按仓内 sources-only feature 收成features = { ["c-api"] = … },默认 OFF:只要 C++ 头的 消费者不付这个 TU。门控经负向实测:把tests/examples/fmt-c的依赖改回纯版本号,它在 链接期报lld-link: error: undefined symbol: fmt_vformat与fmt_vprint(fmt_arg的构造在头里是static inline,未解析符号只可能是 fmt-c.cc 的),带 feature 时包构建报 3 units、不带报 2 units。⚠️ MSVC 的/utf-8属消费侧:上游标记它 PUBLIC 的唯一来源是chrono.h的"µs"字面量,而本包三个 TU 及它们包含的全部头(base.h / format.h / format-inl.h)实测均为纯 ASCII;cxxflags只作用于本包 TU,替消费侧表达不了,故不声明, 只写进描述符注释。⚠️ CN 镜像尚未发布到mcpp-res,按compat.rapidcsv的先例用纯字符串 url 回退 GLOBAL;补传镜像后改回{ GLOBAL, CN }即可,sha256 不变。 实测:mcpp xpkg parse pkgs/c/compat.fmt.lua→parse OK;mcpp test -p fmt→test result ok. 2 passed; 0 failed(format.cc 的编译库断言 + os.cc 的getpagesize/pipe 往返),mcpp test -p fmt-c→1 passed; 0 failed;.xpkg.lua快照 里就是本 checkout 这份带c-api表的描述符,证明解析没落到远端已发布索引。新增成员tests/examples/fmt与tests/examples/fmt-c;linux/macOS 两腿交 CI 裁决。 -
compat.sdl33.4.18。 在 3.4.2 之外新增版本键(旧键保留,与compat.ftxui等既有做法一致)。补丁号不等于补丁:这份描述符里真正会失效的东西是源集与两份 签入 config,所以四处都按两个 tarball 实测过,而不是假定 ——src/只增 4 个文件 (两个 Vulkan 着色器头落在已整目录 glob 的目录里;另两个是src/video/wayland/SDL_waylandutil.{c,h},wayland 本就不在任何列表里),签入的 windows/macOS config 与 3.4.2 逐字节相同(两个平台的源集正是从它们反推的, 所以这次抬版本它们照用),linux config 的模板只动三行(删掉的HAVE__UITOA本就 未定义,新增的SDL_EMSCRIPTEN_PERSISTENT_PATH_STRING只对 emscripten 有意义), 上游CMakeLists.txt的源选择未变(唯一的.c/.m命中行是缩进)。⚠️ 生成的 linux config 不重新生成:它是冻结的 CMake 输出,3.4.18 新增而它不知道 的宏一律读作关闭 —— 与当初裁剪的方向一致,也与「config 只许声明索引真正打了包的 东西」同源。⚠️ CN 镜像 3.4.18 尚未发布到mcpp-res,按compat.ftxui7.0.3 的先例 用纯字符串 url 回退到 GLOBAL(list_cn_urls.lua明写忽略纯字符串 url,所以mirror-cn-reachable对这一条是空集);补传镜像后改回{ GLOBAL, CN }即可, sha256 不变(镜像按原样重托管 tag 归档)。 实测:windows 本地mcpp test -p sdl3编完并跑通 —— 3.4.18 报出 3 个视频驱动, dummy 窗口 320x240、定时器前进,test result ok. 1 passed。linux/macOS 两条腿由 CI 裁决:冻结的 linux config 是这次唯一没有被本地证伪的东西。 -
compat.libserial1.0.0。 LibSerial 的SerialPort/SerialStream以 compat 形态收录:上游 CMakeLIBSERIAL_SOURCES的三个 TU 编成一个 lib,公开头经include_dirs暴露。仅声明linux(公开头以<termios.h>开头、实现触及<linux/serial.h>,消费者用[target.'cfg(linux)'.dependencies]门控)。两处上游头 文件缺陷在包内修复:SerialPortConstants.h用uint8_t却未含<cstdint>,由generated_filesshim 补上;SerialPort.h的call_with_retry用了 C++20 已移除的std::result_of,libc++ 下整个库编不过,由install()改写为等价的std::invoke_result_t。GLOBAL 为上游 tag,CN 为mcpp-res/libserial镜像, sha256 相同。 -
openkal-llvm-runtime0.15.4。 只移动锁定版本:openkal-musl 0.20.1 携带 openkal-linux 0.16.1(修复线程局部存储镜像的位置)。该包的examples/cxx探针 正是发现该缺陷的地方 —— C++thread_local对象的 guard 字节落在非零邻居上, 构造函数从未运行;修复后同一探针通过(PR #34)。 -
openkal-linux0.16.1 与openkal-musl0.20.1。 0.16.1 修掉一处潜伏缺陷: 线程局部存储的镜像被放在变量地址之下八字节(段声明p_align = 8, p_memsz = 56时,链接器把变量放在tp - 56,而区域按 16 对齐建成 64 深)。0.16.0 新增的 实现自有 TLS 存储使该缺陷显形:两个带初值的线程局部变量互相读到对方的字节, C++ 的thread_local对象的 guard 字节落到非零邻居上而不构造 —— 由 openkal-llvm-runtime 的探针在 runner 上报出。0.20.1 只移动锁定版本。 GLOBAL/CN 与 sha256 的取法与前一行相同。 -
openkal-linux0.16.0、openkal-macos0.13.0、openkal-windows0.11.0、openkal-emscripten0.4.0、openkal-opensbi0.8.2、openkal-musl0.20.0。 六个同轮仓库的行:GLOBAL 为上游 tag 归档,CN 为字节一致的 gitcode 资源 (sha256 两次取自上游、一次取自 CN,三者相同)。openkal-linux 以mincore实测 映射、以mapping_end - RLIMIT_STACK与栈下最近映射之上一个 guard gap 的较高者 为下界;openkal-macos 走_pthread_self与两个_np查询(三个名字补进port/libSystem.tbd);openkal-windows 走GetCurrentThreadStackLimits(声明补进src/win32.h与port/kernel32.def);openkal-emscripten 走emscripten_stack_get_base/_end;openkal-opensbi 只移动锁定版本;openkal-musl 让pthread_getattr_np对调用线程给出真实区间、对其它线程一律ENOSYS。同时修掉 openkal-linux 在 hosted 形态下从未描述自身 TLS 镜像的潜伏缺陷。 -
openkal0.15.0 与六个同轮仓库。 规范新增kal_task_stack:一个执行上下文可以 说出自己所在的栈区间(自问自答、不取句柄),用于替换 C 库移植层此前对pthread_getattr_np的拒绝。openkal-linux 0.16.0 用mincore实测映射并以mapping_end - RLIMIT_STACK与栈下最近映射之上一个 guard gap 两者中较高者为下界; openkal-macos 0.13.0 走_pthread_self与两个_np查询(三个名字同时补进port/libSystem.tbd);openkal-windows 0.11.0 走GetCurrentThreadStackLimits(声明补进src/win32.h与port/kernel32.def);openkal-emscripten 0.4.0 走emscripten_stack_get_base/_end;openkal-opensbi 0.8.2 只移动锁定版本; openkal-musl 0.20.0 让pthread_getattr_np对调用线程给出真实区间、对其它线程 一律ENOSYS,并撤回对应的[c-abi-absent]行。同时修掉 openkal-linux 在 hosted 形态下从未描述自身 TLS 镜像的潜伏缺陷(上下文线程指针落在存储区错误一端),新增tests/conformance_task_tls.cpp以非零初值观测该镜像。 -
compat.libevent2.1.13。 Linux、macOS、Windows 分别通过上游 CMake 生成 平台配置头,再由 mcpp 编译 libevent 核心、HTTP/DNS 扩展和对应系统后端; TLS 可选组件未收录。workspace 成员测试事件分派、缓冲区和 HTTP 对象。 -
compat.muduo2.0.3 与 Boost 头组件。 muduo 仅支持 Linux;内联构建muduo_base/muduo_net源码,按上游 2.0.3 的依赖补充compat.boost-any、compat.boost-circular-buffer、compat.boost-concept-check并复用既有compat.boost-utility。 三个新增 Boost 包各有 workspace 成员;muduo 的成员按 Linux 门控。上游归档使用 GLOBAL 地址, CN 镜像待补。安装钩子仅修补 C++20 移除的shared_ptr::unique()与缺失的<time.h>。 -
compat.yaml-cpp0.8.0 与 0.9.0。 YAML 1.2 解析与生成,按上游 CMake 目标原样编译 (src/*.cpp+src/contrib/*.cpp),GLOBAL + GitCode CN 镜像字节一致。上游把YAML_CPP_STATIC_DEFINE作为静态构建的 PUBLIC 定义;描述符的defines到不了消费者, 所以用yaml-cpp/dll.h的同名遮蔽头送达,测试在编译期断言它到了(MSVC ABI 上缺它就是 dllimport 链接错误,Linux 上看不出来)。两个版本各有一个测试成员(yaml-cpp、yaml-cpp-v080),都列入tests/openkal/members.toml在 openkal 上测量。
-
候选门只在消费者构建候选包的平台上调度它。
tests/autoupdate/ci.py的member_platforms读取消费者清单:无条件依赖在三个平台调度;cfg(os = ...)或cfg(windows)下的依赖只在该平台调度;其余条件(环境、架构)不调度任何宿主作业,由包自身仓库 在目标上测量。mcpp 只锁定宿主解析到的包,向另一平台的 runner 要平台包的锁定证明必然失败;test_ci.py覆盖了这条规则。 -
站点的 openkal 分面改为两个取值:
openkal-ecosystem与openkal-compat。 原先的 「openkal itself / runs on openkal / fails on openkal」是句子而不是名字。构成 openkal 的 包归入openkal-ecosystem;测试项目在 openkal 依赖图中测得runs的包归入openkal-compat。只测得builds或fails的包不再归入分面,其页面仍按目标列出测量结果 与第一条诊断。 -
openkal 测量按改动选成员,不再每次全量。
compat.py select --base <merge-base>: 改动 openkal 家族描述符、pins.toml、compat.py才测全部成员;改members.toml只测 新增或改动的条目([not-portable]计入所指成员,[excluded]不选);改tests/examples/<成员>/测该成员;改描述符测依赖它的成员。selftest为每条规则各加一例。 -
openkal 的 Windows 目标改名为
x86_64-windows-musl。 依赖图在 Windows 上呈现的是 musl 的 C 环境,不是 MinGW;x86_64-windows-gnu会被读成 mingw-w64 构建。实测同一依赖图: cli11、zlib、cmp-module 仍 runs,curl 仍停在同一条curl_setup.h:591。2026-09-23 之前的 结果仍记在旧名下。 -
CN 镜像可以由库的维护者自己托管。
check_mirror_urls.lua要求CN是 gitcode 的 release 资产(https://gitcode.com/<owner>/<repo>/releases/download/…),不再限定mcpp-res组织;mcpp-res仍是默认。#463 起main上的 lint 因ZheFeng7110.boost的维护者镜像而失败,现在通过。
- 索引制品按提交只定一次字节,两个托管端提供同一份。 同一提交重跑发布(夜间 cron)
会重新打包:条目时间取自检出,于是字节不同;GitHub 以
--clobber替换了资产,GitCode 不能替换而保留第一份,两端指针却都改成第二份的摘要。2026-09-16 实测 v7649883: GitHub78535f36…(553573 字节)、GitCoded89135a3…(553557 字节),树相同。CN 客户端 因此拒收 GitCode 的字节并回落到 GitHub(mcpp-community/mcpp#648)。现在tools/publish_mcpp_index.sh先复用已发布的同版本字节(先问不可替换的 GitCode), 新打包则可复现(排序、固定属主/权限/条目时间、gzip -n),发布末尾逐端取回比对摘要, 不一致即失败。xim-pkgindex 在 2026-09-05 以同样方式修过同一缺陷。
-
farm 只携带这个 runtime 够得到的东西,并且把「一个钉挪动」这件事在整条链上补齐。 三个 farm(
compat.glx-runtime/compat.opencl-runtime/compat.vulkan-runtime) 一起到 2026.09.11,消费者链compat.glfw3.4.0.1、compat.opencl2026.09.11、compat.vulkan1.4.357.2、compat.sycl-runtime2026.09.11 同步。⭐ 剔掉
libnvidia-pkcs11*,并撤回它带来的 OpenSSL 依赖。 它是加密令牌模块, 由应用自己的 PKCS#11 配置加载,不由任何 GPU 驱动派发;进 farm 只因为名字匹配libnvidia*.so.*。判据是LD_DEBUG=libs(带对照):两条链上pkcs11出现 0 次,而驱动确实够得到的libnvidia-glvkspirv出现 6 次、OpenCL adapter 出现 23 次 —— 对照证明这个仪器分得开,所以 0 是读数不是沉默。它们也是 farm 里唯一需要libcrypto的成员,随之消失的还有那条无解的libcrypto.so.1.1(OpenSSL 1.1 上游 已 EOL)。⚠️ ⚠️ 一个更早的判据什么都没测到:把成员删掉看示例还跑不跑 —— 删掉libnvidia-glvkspirv示例照样跑。原因是被测二进制和被改的 farm 不是同一个 (产物目录有两个,钉着不同版本)。判据又一次指错了对象。
-
三处只有真跑一遍才会现形的缺陷。
⚠️ ⚠️ 排除循环遍历了模式表却把模式写死。compat.vulkan-runtime的never_farm_patterns绑定了pat然后传了字面量libnvidia-gtk*,于是这张表 看起来是列表、行为上只有一条。往里加libnvidia-pkcs11毫无效果 —— farm 依旧 81 个成员、两个 PKCS#11 都在,这是「排除」写完之后才发现的。⚠️ ⚠️ readelf -d不是传递的,一趟补不完。 上一版用ldd(答案是整个传递闭包) 所以一趟够;换成readelf是对的(它答文件说什么,而不是这台机器能不能解析), 但这一轮补进来的库会带来自己的依赖。实测:compat.glx-runtime第一次真安装, farm 从 52 涨到 77 仍缺 9 条,包括libLLVM.so.20.1和libstdc++.so.6。 现在迭代到不动点(带上界防环),再测 86 个成员、0 缺口、0 封条。⚠️ 找不到readelf时那一趟静默返回空,读数与「已完全闭合」相同;现在明确告警, 且compat.glx-runtime的工具查找也先查 store 再查 PATH。实测(本机,真驱动):
compat.glx-runtime86 成员 / 0 缺口,零直接宿主触达 —— 4 条走xim:nvidia-gl-host-link、24 条走其它 xim 载荷、其余走 subos 库视图。 SYCL 示例members 49 / walked 49 / findings 无,Vulkan 示例members 56 / walked 56 / findings 无,两者都在 RTX 4080 上跑出正确结果。
-
两处只有把 glx 那一版真正跑一遍才会现形的缺陷。 上一轮我量了 opencl 和 vulkan,
compat.glx-runtime的新逻辑从头到尾没有被执行过。⚠️ ⚠️ DT_NEEDED里可以是绝对路径。 这个 farm 的四个 glvnd 厂商入口 (libEGL_nvidia、libGLESv1_CM_nvidia、libGLESv2_nvidia、libGLX_nvidia) 直接写着/lib/x86_64-linux-gnu/...。loader 对这类条目直接打开、完全不走 搜索路径,所以 farm 既服务不了它也不该为它封 unserved —— 而把它当 soname 会 去查一个带斜杠的名字,并且造出一个名字是路径的 unserved 链接。三个包一并 跳过这类条目。⚠️ 找不到readelf时那一趟静默返回空,读数与「farm 已完全闭合」一模一样。 这正是这批改动要消灭的那种混淆,只是掉到了工具查找这一层。现在会明确告警, 并且compat.glx-runtime的工具查找也和另外两个一样先查 store 再查 PATH —— 这个包跑在从未被要求装工具链的机器上。实测(本机,对着已装的 glx farm 走同一套逻辑):52 个成员、跳过 4 条绝对路径、 19 条需补,19 条全部来自生态载荷,0 条 unserved,没有路径形状的条目。
-
compat.vulkan1.4.357.1 —— 移动一个钉,需要一个新版本。 上一条把compat.vulkan对compat.vulkan-runtime的钉从 2026.09.07 挪到 2026.09.10,没有抬compat.vulkan自己的版本。对一台已经装着compat.vulkan@1.4.357.0的机器,那份已安装副本里记着的仍是 2026.09.07; 而同时自己也直接声明compat.vulkan-runtime的消费者(mcpp 的图形示例在cfg(linux)下就是这么写的)拿自己的钉去比,于是构建停在irreconcilable versions。⚠️ ⚠️ 本地测不出来:重新解析过索引的机器两边都读到 2026.09.10,毫无冲突。 它是在 CI 上、一个~/.mcpp是热的 runner 上现形的。「本机绿」在这一类升级 问题上等于零信息量。⭐ 规则:一个包如果钉着另一个包的版本,那个钉挪动时它自己必须换版本 —— 换版本买到的是一次重装,重装才会按当前索引重新记录。
1.4.357.0保持原样, 已经持有它的机器照原样解析。
-
三个 host farm 改为对自己的成员负责,并且对宿主只保留一条具名的触达 (
compat.glx-runtime2026.09.10、compat.opencl-runtime2026.09.10、compat.vulkan-runtime2026.09.10)。这三个包的成员由文件名模式决定,而完整性(如果检查的话)对着的是另一个 集合 —— ICD 清单里的库。模式存在的理由恰恰是「专有驱动会按名字 dlopen 自己 家族的成员,没有任何
DT_NEEDED遍历看得见」;既然这么说了,那些成员在别处也 得当作可达的 —— 而它们不是。从来没被验证的,正是模式为之存在的那一半。实测(装了 NVIDIA 驱动的宿主,用 mcpp 自己的 dlopen 面检查):
compat.glx-runtime52 个成员缺 30 条闭包边(它根本没有闭包遍历)、compat.vulkan-runtime76 个缺 5 条、compat.opencl-runtime缺 4 条 —— 最后这 4 条就是 mcpp-index#376 报的那几条(该 issue 标题写的是 vulkan, 实际观测到的来自 opencl)。⚠️ 配方里「种子不能取整个 farm」的理由测的是排除之前的集合。 它写着闭包会 拉进 64 个库、GTK 在其中 —— 那是对「模式匹配到的每个文件」成立,因为libnvidia*.so.*也匹配驱动的设置界面。farm 是模式匹配减去never_farm_patterns,对那个求闭包在本机只新增 5 个,GTK/GLib/Pango/Cairo 一个都没有。结论会被复查,理由不会。⭐ 新规则:一个成员需要的每条 soname 都有明写的答案,没有静默分支。
- 生态发布了它 —— 在
xpm.linux.deps里声明,从已装载荷取 (新增xim:openssl、xim:mesa); - 不可再分发的专有驱动用户态 —— 也走包:新增
xim:nvidia-video-host-link拥有「宿主的libnvcuvid.so.1在哪」这一个 问题,和libcuda-host-link/nvidia-gl-host-link同形; - 两者都不是、也不可能成为 —— 写进配方的
UNSERVED表并附理由 (今天只有libcrypto.so.1.1:OpenSSL 1.1 上游已 EOL,而只有 NVIDIA 的 PKCS#11 提供者要它,没有任何 OpenCL/Vulkan 入口够得到); - 以上都不是 —— 安装时打警告点名。这一条是关键:farm 从生态之外拿了什么, 必须是有人写下来的清单,而不是残留物。
没有任何一条分支会为成员去 /usr/lib 收一个新文件。
compat.glx-runtime一条都不收:那 30 条全部来自已装载荷(4 条libnvidia-*来自xim:nvidia-gl-host-link,其余 26 条来自xim:graphics拉起来的栈)。⭐ 判据落在 mcpp 会问的那个问题上:成员的
DT_NEEDED用readelf -d读, 归属只对着 farm 这一个目录判。先前用ldd是错的 —— 它答的是「在这台机器 上能不能解析」,而这台机器包含宿主默认目录,于是宿主碰巧有的 soname 读成已解析、 从不被记录,而消费者的搜索路径里没有宿主。实测:libcrypto那两条对这一趟不可见, 却被 mcpp 在上一层从同一个目录报了出来。实测结果(本机,opencl farm):
members 48 / walked 47 / missing 0, 只剩libcrypto.so.1.1一条 dangling —— 正是明写为 unserved 的那条。 改动前是 4 条 missing。⚠️ 抬版本键是必须的:install()的产物烤进已安装载荷,不换键的机器会一直留着 未闭合的 farm。消费者compat.glfw/compat.opencl/compat.vulkan同步重钉。 - 生态发布了它 —— 在
-
收录
compat.sdl33.4.2 —— SDL3 窗口/输入/音频层,从源码构建(形态 E)。 它是compat.sdl2的兄弟而非替代:两者是不同 API、不同 soname。 比 SDL2 好办的两点都是实测:tarball 没有符号链接 (tar tvzf|grep -c '^l'→ 0),所以不需要 SDL2 那种-nosymlinks重打包托管; 以及配置分发器是上游自带的 —— windows/macOS 的 config 都是签入的, 只有 linux 会掉进SDL_build_config_minimal.h(那份根本没有视频驱动)。 所以只生成一份 config,而且只有 linux 用它。⚠️ 生成它必须用索引自己的工具链 + 索引自己的 X11 头 —— mcpp 的 gcc 自带 sysroot,看不见/usr/include,不喂索引的头 SDL 的检测会直接失败退出。⚠️ ⚠️ config 只许声明索引真正打了包的东西,这是规则不是偏好:CMake 探的是 它运行的那台机器,宿主有什么就开什么,然后在这里编不过。三个是靠失败的构建 一个个抓出来的 —— XSCRNSAVER(X11/extensions/scrnsaver.h找不到)、LIBTHAI、 HIDAPI_LIBUSB;XTEST/XSYNC 一并预防性关掉。剩下的是可核对的:配置里所有 会被dlopen的库共 7 个,每一个都有对应的包(fribidi + X11 六件套), 与linux.deps一一对应。 源集不是"读 CMakeLists 猜的":configure 之后从CMakeFiles/SDL3-static.dir/build.make把 CMake 真正选中的 266 个源读回来, 归并成 73 个整目录 + 1 个部分目录(src/core/linux,跳过 dbus/IME 那 6 个 文件 —— 与compat.sdl2跳过的是同一批,它们不自 guard)。 macOS/Windows 不用生成的 config,所以它们的源集是从签入 config 里开了哪些 driver 反推的;windows 有一处不显然:SDL_THREAD_GENERIC_COND_SUFFIX/_RWLOCK_SUFFIX意味着条件变量和读写锁回退到 generic 实现,所以要单独带上thread/generic/SDL_syscond.c与SDL_sysrwlock.c—— 只这两个,其余四个 与 windows 版同名。 测试用 SDL 的 dummy 视频驱动,三个平台上无显示器都能跑:断言头与运行时 版本一致、编译进来的驱动表里有 dummy 与 offscreen(掉进 minimal config 就一个 都没有)、dummy 驱动真能初始化并建出 320x240 的窗口和同尺寸 surface、 以及计时器会前进。 实测:linux · gcc 16.1.0 与 linux · llvm 22.1.8 两条腿都编过(267 个 TU)并跑通; macOS/Windows 由 CI 裁决。CN 镜像gitcode.com/mcpp-res/sdl3已建并验过逐字节相同。 -
收录 vulkan-rt 依赖的八个通用库,一次补齐:
compat.glm1.0.2、compat.doctest2.4.12、compat.argparse3.2、compat.mio2023.3.3、compat.gzip-hpp0.1.0、compat.cpptrace1.0.4、compat.libassert2.2.1、compat.libcoro0.16.0。八个都带已验证的 CN 镜像 (gitcode.com/mcpp-res/<slug>,逐个比对 sha256 与 GLOBAL 逐字节相同, 8/8),八个都带 workspace 成员做行为断言。 四个不是「拉个头文件就完事」,记在配方里:⚠️ compat.gzip-hpp冻结在一个已经编不过的点上:utils.hpp六处、decompress.hpp一处用uint8_t却不 include<cstdint>(实测 gcc 16.1.0)。 而且它是消费者侧失败 —— 本包一个 C++ TU 都没有,cxxflags = {"-include", "cstdint"}(compat.redis-plus-plus的修法)到不了出错的 TU。唯一可用的杠杆是 同名遮蔽头 +#include_next,与compat.catch2修<new>是同一招;include_dirs因此必须mcpp_generated在前,调换两行会静默失效。 ⭐compat.cpptrace是形态 E 去掉 config 头:六个符号后端、六个 unwinder、 三个 demangler 每个文件自己#ifdef,所以源列表是一条 glob,配置全在 defines。 选的后端一律零外部依赖:unix 走 libgcc 的_Unwind_Backtrace+dladdr+__cxa_demangle,windows 走 DbgHelp。⚠️ 代价写在配方里:dladdr不读 DWARF, 所以栈帧有函数名、没有 file:line;要行号得再加一个 libdwarf 包,留作 feature。compat.libassert依赖上面那个(上游是 FetchContent 一份进自己的树,这里是 正经依赖,消费者链两次也只有一份 cpptrace);magic_enum 不需要 —— 读 CMakeLists 会发现它只在LIBASSERT_BUILD_TESTING下打开,库源码一次都没提过它。⚠️ compat.libcoro只出核心:上游 networking 默认开,但它的 c-ares 在vendor/c-ares这个 git submodule 里,而 GitHub 归档从不含 submodule (实测find vendor -type f→ 0 个文件)—— 这个产物根本编不出网络那半。所以源列表 是上游LIBCORO_SOURCE_FILES在if(LIBCORO_FEATURE_NETWORKING)之前的部分, 逐条转录而非 glob(scheduler.cpp/poll.cpp/epoll/kqueue/net/全都不自 guard)。 另外coro/export.hpp是generate_export_header生成的,tarball 里没有, 缺了它第一个 TU 就 fatal error;快照进generated_files,CORO_STATIC_DEFINE走defines(要到消费者)而非cxxflags。 测试都断言真行为而非「能编译」:glm 断言叉积/列主序/GLM_FORCE_DEPTH_ZERO_TO_ONE下近平面映射到 0;gzip 断言 gzip magic + 真的变小 + 往返;cpptrace 断言四层调用链 的帧数与互不相同的返回地址;libassert 走失败路径,断言报告里有表达式原文、 消息和两个操作数的值,并且拿到了非空 stacktrace(这条同时证明 cpptrace 是传递到达的); libcoro 用 200 个协程在coro::mutex下累加。 -
收录
khronos.vulkan-hpp1.4.357.0 —— Vulkan 的 C++ 绑定,按 Khronos 现在自己 发布的形态消费:import vulkan;/import vulkan_video;。⭐ 这是本索引第一个走 形态 C 第一条分支的包(上游自带.cppm,直接点名),此前所有模块包都是合成 包装体。描述符里没有一行包装代码:导出面是 Khronos 从 XML registry 生成的。 载荷取 Vulkan-Headers 的 tarball,与compat.vulkan-headers同一个 URL、 同一个 sha256 —— Khronos 把生成好的vulkan.cppm/vulkan_video.cppm随每个 Vulkan-Headers tag 一起发。指向 Vulkan-Hpp 仓反而更差,三条都实测过:该仓没有vulkan-sdk-*tag(404),Vulkan-Headers 在那里是 git submodule 而 GitHub 归档 永远不含 submodule,以及由此产生的第二份vulkan/include 根会让vulkan.hpp由-I顺序决定。同一份 tarball 则让两个包不可能错配 —— 模块单元开头就是VULKAN_HPP_STATIC_ASSERT( VK_HEADER_VERSION == 357 )。 命名空间取khronos而非compat(本索引里 namespace 是消费形态的契约:compat.*按头文件消费,归属 namespace 承诺import);模块名保持上游的vulkan/vulkan_video,不加索引前缀,否则所有 Vulkan-Hpp 文档对 mcpp 用户 都是错的。import_std = true不是偏好:单元第 27 行是无条件的export import std;,上游 CMake 也正因此把模块目标 gate 在23 IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD上。依赖取 loader (compat.vulkan)而不只是头:Vulkan-Hpp 默认 静态 dispatcher (VULKAN_HPP_DISPATCH_LOADER_DYNAMIC在没有VK_NO_PROTOTYPES时为 0),vk::enumerateInstanceVersion()会编成对vkEnumerateInstanceVersion的直接 调用,只依赖头会得到一个"能编译、每个消费者都链接失败"的包。 与上游Vulkan::HppModule一致地不定义任何VK_USE_PLATFORM_*:那些宏按 平台互斥、无法做成可移植的 feature,而可移植路线也不需要它们 —— GLFW/SDL2 交回 的VkSurfaceKHR包成vk::SurfaceKHR{ raw }即可,surface/swapchain 本身在 模块里是无条件存在的。 新增 workspace 成员tests/examples/vulkan-hpp-module(两个测试:module.cpp全文无#include,断言枚举量取值、sType默认、format_traits的 constexpr 结果、raii层的编译期成员,以及经静态 dispatcher 打到 loader 的两次真实调用;video.cpp单独证明第二个模块单元被编译 —— 它import vulkan;,只能排在第一个 之后,而sources只是一张无序的表)。 实测:linux · gcc 16.1.0 与 linux · llvm 22.1.8 两条腿都产出两个 BMI/PCM 并跑通; macOS 与 Windows 走的是与 llvm 腿相同的 clang 路径,其运行期一半早已由tests/examples/vulkan在三条腿上证明(调用的是同一批 loader 入口)。⚠️ x86_64-windows-gnu(mingw)不可用,也不是 CI 腿(索引的 windows 工具链是 llvm/MSVC ABI):GCC-on-PE 把模块归属的函数内静态量vk::errorCategory@vulkan()::instance放进消费者对象的普通.bss,与模块对象里 的 COMDAT 副本撞成multiple definition;且compat.vulkan的 windows 入口是 MSVC 形态的vulkan-1.lib,mingw 的 ld 找不到。两条都不是描述符能修的。 -
收录
mcpplibs.rules-cuda0.1.0 —— 把「怎么编一个 CUDA 设备翻译单元」收成一条 可 import 的构建规则(host-module = true)。⭐ 一个仓库都不用新建,与grpcgen同形:描述符指向 mcpp 自己源码 tarball 的一个子路径 (*/examples/09-cuda-kernel/rules-cuda/mcpp.toml)。规则与它所讲的协议 (构建程序协议 v7)由同一次发布产出,指向同一份 tarball 因而不是权宜之计, 而是让两者不可能错配。需要 mcpp >= 2026.9.5.2。 实测:示例工程去掉 path 依赖、改写一行[dependencies.mcpplibs]后, 在 RTX 4080 上构建并跑出12 24 36 48。 -
收录 CUDA 设备侧的六个适配包:
compat.cudart(CUDA Runtime)与compat.cublas/cufft/curand/cusolver/cusparse(五个算子库)。 载荷一律来自 xim(xpm.linux.deps接线),本仓库只回答「怎么对它构建」: install() 把载荷的include/与lib/*.so*链进包自己的目录,include_dirs/-L/runtime.library_dirs因而全部落在包内。 一律走 12.x 线 —— 设备运行时不得新于它将遇到的驱动,而xpm.<platform>.deps按 OS 读取而非按版本,所以一份描述符只指一条线。⚠️ 两处上游造成的耦合写在配方里:compat.cudart额外依赖xim:cuda-nvcc, 因为 12.x 线的crt/host_config.h在编译器组件里而cuda_runtime.h无条件 include 它;以及 NVIDIA 的.so带RUNPATH = $ORIGIN,它会关掉可执行 文件继承来的 DT_RPATH,所以 glibc 2.34 合并进 libc 的三个存根 (librt.so.1/libpthread.so.0/libdl.so.2)必须一并链进同一个目录 —— 否则程序在main之前就以librt.so.1: cannot open shared object file退出。 -
新增工作区成员
tests/examples/cuda-curand:无设备的机器上断言库能加载并 应答(即上面那条$ORIGIN缺陷的判据),有设备时再断言生成值落在 [0,1] 且均值接近 0.5。五个算子库包由同一模板生成,-l名逐个读自上游归档; cuRAND 载荷最小(85 MB,对比 cuBLAS 的 933 MB),因此它是每个 PR 都跑的那个。
-
compat.sycl-runtime2026.09.10 与compat.cuda-driver2026.09.10:驱动一侧 的 farm 由枚举哨兵目录得到,不再手写libcuda.so.1一个名字,并把哨兵 依赖钉到xim:libcuda-host-link@0.0.2。手写的那一半正是错的那一半:libur_adapter_cuda.so.0的 DT_NEEDED 里除libcuda.so.1之外还有libnvidia-ml.so.1,farm 没有携带,适配器加载失败,CUDA 后端整个消失, 程序以退出码 134 终止且不打印任何异常文本(mcpp#596)。哪些驱动库存在是 哨兵包的问题;读它的目录得到的 farm 无法与它不一致,而写死文件名的 farm 已经 不一致了。旧版本键保留:本文件只有一个install()且不读pkginfo.version(), 所以旧钉今天安装得到的仍是当前 farm,新版本键的作用是让已经装过该目录的机器 重新安装。 -
compat.sycl-runtime明确声明不服务libOpenCL.so.1。载荷自带 OpenCL 适配器,而compat:opencl会连带引入宿主专有 OpenCL 驱动的 farm,把一份 随机器而变的厂商面塞进每一个 SYCL 工程;实测中它还提供了libnvidia-ml.so.1, 从而遮住上一条正在修的缺口。需要该后端的工程在自己的 manifest 里声明compat:opencl。 -
compat.cuda-runtime改名为compat.cuda-driver,并改正repo字段。 NVIDIA 词汇里 "CUDA Runtime" 专指libcudart,而本包 farm 的是驱动的libcuda.so.1;它的capabilities/provides从第一版起就写作cuda.driver, 只有包名不一致。旧条目冻结保留,compat.cuda-runtime@2026.09.05继续解析到 同一份实现;工作区成员tests/examples/cuda-driver(原cuda-runtime)同时 依赖新旧两个名字,让这条过渡承诺有判据。 -
收录
compat.boost-beast1.92.0(Boost.Beast,HTTP/WebSocket),沿 modular-boost 拆包路线一次性补齐其 24 个传递依赖:boost-asio、boost-align、boost-bind、boost-compat、boost-container、boost-container-hash、boost-core、boost-describe、boost-endian、boost-intrusive、boost-io、boost-logic、boost-move、boost-mp11、boost-optional、boost-predef、boost-preprocessor、boost-smart-ptr、boost-static-string、boost-system、boost-type-index、boost-utility、boost-variant2、boost-winapi。 29 包 include 树两两不相交、闭包逐 include 核实;boost-asio经 default feature 携带BOOST_ASIO_DISABLE_BOOST_CONTEXT_FIBER/..._DATE_TIME与BOOST_ASIO_HAS_THREADS(llvm-on-Windows 无_MT/BOOST_HAS_THREADS, 不钉定会静默退化为 null_thread 且 VERSION_TAG 跨 TU 漂移),保持家族 header-only。新增boost-beast、boost-asio、boost-family三个工作区 成员;其中boost-family为大测试成员,一个工程 6 个测试文件覆盖全部 23 个没有专属成员的小依赖包(core/smart-ptr、container/intrusive/ optional/static-string、mp11/describe/preprocessor/type-index/predef、 system/compat/bind、endian/container-hash/logic/align、io/utility/ winapi)。 -
收录
gzj-creator.galay5.0.2 原生 Form-A 模块包,覆盖galay.utils与galay.kernel默认模块,并加入 Unix 示例工程和索引文档。
-
tests/examples/sycl-runtime的判据由三个手写 soname 的 dlopen改为 对 farm 全体成员做 DT_NEEDED 闭包走查。farm 有 26 个成员而断言只有三个 名字,坏掉的两个不在其中,所以这条判据在缺陷存在期间一直是绿的。改用 dlopen 全体成员仍然不够:dlopen 量的是进程,而进程的搜索路径上不止本包放的东西 —— 实测中另一个 farm 提供了libnvidia-ml.so.1,把本包的缺口遮成通过。 现在的走查只看 farm 自己,并区分三种读数:解析到、farm 里存在但悬空(无驱动的 机器,记 note)、farm 根本没有(打包缺口,失败)。三条腿都实测过:补全后 26/26 通过;拿掉 NVML 后点名成员与 soname 失败;把驱动链改为悬空后 24/26 通过。 -
跟进 Galay 5.0.1 对 C++23 module prelude 的跨平台 intrinsic 头文件守卫修复, 避免 Clang 在 Linux/macOS 上错误转发
intrin.h。 -
跟进 Galay 5.0.2 将
AioCommitAwaitable::await_suspend的类外模板定义放回galay::async命名空间,修复 Clang 22 导出galay.kernel时的模块语义错误, 同时保留 LinuxUSE_EPOLLAIO 后端行为。
- 记录 Galay 5.0.2 归档的双下载 SHA256 校验,以及 PR #285 的全平台 CI 验证结果。