Releases: mcpp-community/mcpp
Releases · mcpp-community/mcpp
v0.0.65
修复
mcpp add gtest+mcpp build报duplicate symbol: main/LNK2005(#168):
gtest 作为常规依赖时,其gtest_main.cc(自带 main)被链进应用,与应用自身的
main 冲突。修复采用通用的「feature 门控源」机制:依赖描述符可声明
[mcpp].features.<名>.sources,被某 feature 列出的源默认不编译/链接,仅在该
feature 被请求(dep = { version="…", features=["…"] })时纳入。gtest 描述符把
gtest_main.cc归入mainfeature → 默认只链框架,不再撞 main;需要 gtest 提供
main 时gtest = { version="1.15.2", features=["main"] }显式开启。
门控仅作用于mcpp build;mcpp test保持既有的 dev 依赖 main 检测(0.0.64)不变。
详见.agents/docs/2026-06-25-gtest-main-feature-and-add-dev-design.md。
新增
mcpp add --dev <pkg>:把依赖写入[dev-dependencies](测试专属,如 gtest;
由mcpp test消费,不链进mcpp build的应用)。
测试
- 单元
SynthesizeFromXpkgLua.FeatureGatedSources(描述符 feature 门控源解析);
e2e79_gtest_regular_dep_feature_main.sh(#168 哨兵 +features=["main"]opt-in +
add --dev)。
CI
- release workflow 默认 xlings 版本
0.4.58→0.4.60(缓存键同步更新)。
v0.0.64
修复
mcpp test在自带main()的测试 + gtest dev-dep 下duplicate symbol: main:
gtest 的gtest_main.cc自带main(),而 mcpp 此前把依赖的全部对象内联进每个
测试二进制,于是测试自己的main()与gtest_main.o撞符号。修复:兑现依赖
描述符里已声明的kind="lib"——把这类依赖编译成静态归档lib<pkg>.a,链接在
测试对象之后;标准归档语义只在符号未定义时拉成员,故gtest_main.o的main
只在测试不自带main时才被拉入。{自带/框架 main} × {用/不用 gtest}全部组合
皆正确,用户无感。纯模块依赖(如 mcpplibs.cmdline,无非模块对象)行为不变。
这是通用 link-model 改进、由既有描述符kind驱动,无 gtest 特例,未来
测试框架声明kind="lib"即自动适配。详见
.agents/docs/2026-06-25-dependency-archive-linking-design.md。
测试
- 新增单测
NinjaBackend.ArchiveInputsLinkedAfterObjects(归档须排在对象之后)与
跨平台 e2e78_test_main_combinations.sh(四种 main×gtest 组合mcpp test全绿)。
v0.0.63
修复
tests/目录无代码提示:clangd 在测试文件里对gtest::InitGoogleTest()、
import std/import mcpplibs.*全无补全。根因:compile_commands.json是当次构建
plan 的镜像,mcpp build的 plan 不含tests/**/*.cpp与 dev-deps,而它与mcpp test
写同一个 cdb——后写覆盖前写,日常「编辑→build」循环里测试条目几乎总被擦掉。修复:
write_compile_commands由「全量覆盖」改为「合并保留」——保留当前 plan 未覆盖但
文件仍存在的旧条目(上次mcpp test写入的测试条目),剪除已删文件。mcpp build自身
零改动:不解析、不下载任何 dev-deps,build-only 用户与构建图均不受影响(offline-first)。
跑一次mcpp test后,测试补全在后续所有mcpp build中持久生效。
详见.agents/docs/2026-06-25-cdb-test-coverage-design.md。
测试
- 新增单测
tests/unit/test_compile_commands.cpp(合并/剪除/去重/坏 JSON 回退)与跨平台
e2e77_cdb_preserves_test_entries.sh(mcpp test后真实重建mcpp build仍保留测试条目)。
v0.0.62
修复
- macOS 链接
library not found for -lSystem(#43):macOS 链接命令此前从不显式传 SDK,
链接侧靠 clang 隐式探测(xcrun/SDKROOT→ ld64-syslibroot)去找libSystem。干净的 CI
Xcode runner 上探测正常、缺陷被掩盖;真机一旦xcode-select指向异常 / 只装 Command Line
Tools / 新装 bundled clang,探测失效就ld64.lld: library not found for -lSystem+ 所有 libc
符号未定义。修复:f.ld显式追加-isysroot <SDK>,并给macos::sdk_path()加多级回退
(SDKROOT→xcrun→xcrun --sdk macosx→xcode-select -p推导 → 固定路径),即便
xcrun 返回空也能定位 SDK,把链接从「碰运气」变「确定」。(#162) - macOS 首跑需手动回车 / stdin 挂起:装 POSIX 工具链时进程等待 stdin,POSIX 路径也 seal
stdin(</dev/null),不再要求交互按键。(#163)
测试
- 新增跨平台 e2e
76_compile_commands_generated.sh:mcpp new+mcpp build一个最小工程,
在 Linux / macOS / Windows 三平台断言根目录生成合法compile_commands.json。因mcpp build
含链接步骤,它同时是 macOS-lSystem链接缺陷的跨平台回归哨兵。(#165)
v0.0.61
新增
- 离线优先的索引刷新:
mcpp build不再因 TTL 过期就自动联网xlings update。改为
miss-triggered——依赖在本地索引里就直接用(零网络,消除弱网/Termux 首跑卡顿);依赖在
本地查不到时才刷新一次去拉它(打印Refreshing package index — \` not found locally`,
并有 120s 防重,避免一个 build 里多个缺包各跑一遍全量 git 同步)。 mcpp index status:只读、全程不联网,显示 xim/mcpplibs 两索引的 present/fresh/age/path;
缺索引时提示显式mcpp index update。- install.sh 多架构:新增
linux-aarch64(aarch64 / arm64),并支持 GitHub→GitCode(CN)
镜像回退(MCPP_MIRROR=CN强制 GitCode),让被墙网络下同一条安装命令可用。 - first-init 细粒度计时日志:
--verbose下首次初始化(sandbox 布局、patchelf/ninja bootstrap)
各步带时间戳 +ScopedTimer耗时([VERBOSE <ts>] … done (Δ=<ms>ms)),便于定位"卡很久"的步骤。
CI
- e2e 套件拆为独立的
ci-linux-e2e.yml,与 build/单测/工具链矩阵并行,缩短每个 PR 的关键路径。 tests/e2e/run_all.sh每个用例输出耗时 + 末尾「最慢优先」汇总,便于后续分片/优化。
杂项
- 自托管清单改用 TOML 原生命名空间依赖写法
mcpplibs.cmdline = "0.0.1"(去掉遗留引号)。
v0.0.60
(no CHANGELOG entry found for 0.0.60)
v0.0.59
(no CHANGELOG entry found for 0.0.59)
v0.0.58
(no CHANGELOG entry found for 0.0.58)
v0.0.57
修复
- 包描述符解析改为 identity-first:不再「按候选文件名跨索引无序扫描、撞上第一个就返回」,
而是用描述符声明的规范(ns, name)二元组校验命中文件的身份。修复compat.zlib在全新
CI 上偶发index entry has no mcpp field(外来xim-pkgindex/.../zlib.lua因目录遍历
顺序先被撞到而冒充compat.zlib)。索引目录改为排序后确定性遍历。
重构
- 新增统一的
canonical_xpkg_identity()归一器(身份 = 二元组(ns, name);ns为可分层命名
空间路径,name为单一末段;点号名a.b本质(a, b))。归一三步:无声明 ns → 继承所属索引
默认 ns;求 FQN;按最后一个点切分。匹配 = 限定请求精确相等 / 非限定请求按默认搜索路径
[mcpplibs, compat]。compat降级为搜索路径里的数据项(kCompatNamespace),不再是匹配
分支。[indices]路径索引的无命名空间描述符继承索引命名空间。
CI
ci-{linux,macos,windows}.yml各加一步:用本次构建出的 mcppgit clone并mcpp build/
mcpp run外部 C++ 工程 xlings(openxlings/xlings),验证自托管 mcpp 能构建真实外部项目。
v0.0.56
修复
mcpp run/test/build不再把目标的捆绑 glibcLD_LIBRARY_PATH注入到
mcpp 自身进程,因而泄漏进它启动的宿主/bin/sh。在 glibc 比捆绑版(2.39)更新的
发行版上,sh会被强制加载捆绑的旧 libc,无法满足宿主libtinfo的GLIBC_2.42
符号而在目标运行前崩溃(报错形如sh: ... version 'GLIBC_2.42' not found)。新增
platform::process::run_exec/capture_exec:直接 exec(不经 shell),额外环境
只作用于子进程;run / test / 快速路径 ninja / 整次构建 ninja 四个启动点全部改走它。
变更
mcpp pack --mode模式更名,语义更清晰(旧名保留为永久别名,tarball 后缀冻结不变):
bundle-project→vendored(默认)、bundle-all→self-contained;新增
system模式(完全依赖宿主提供所有共享库,用于发行版打包 / 同发行版部署)。
static不变。两轴模型:libc 由--target选(gnu/musl),--mode只选打包深度。