Skip to content

Releases: mcpp-community/mcpp

v0.0.65

25 Jun 06:30
0f96b82

Choose a tag to compare

修复

  • mcpp add gtest + mcpp buildduplicate symbol: main / LNK2005(#168):
    gtest 作为常规依赖时,其 gtest_main.cc(自带 main)被链进应用,与应用自身的
    main 冲突。修复采用通用的「feature 门控源」机制:依赖描述符可声明
    [mcpp].features.<名>.sources,被某 feature 列出的源默认不编译/链接,仅在该
    feature 被请求(dep = { version="…", features=["…"] })时纳入。gtest 描述符把
    gtest_main.cc 归入 main feature → 默认只链框架,不再撞 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 门控源解析);
    e2e 79_gtest_regular_dep_feature_main.sh(#168 哨兵 + features=["main"] opt-in +
    add --dev)。

CI

  • release workflow 默认 xlings 版本 0.4.580.4.60(缓存键同步更新)。

v0.0.64

25 Jun 01:56
db8ca3e

Choose a tag to compare

修复

  • 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.omain
    只在测试不自带 main 时才被拉入。{自带/框架 main} × {用/不用 gtest} 全部组合
    皆正确,用户无感。纯模块依赖(如 mcpplibs.cmdline,无非模块对象)行为不变。
    这是通用 link-model 改进、由既有描述符 kind 驱动,无 gtest 特例,未来
    测试框架声明 kind="lib" 即自动适配。详见
    .agents/docs/2026-06-25-dependency-archive-linking-design.md

测试

  • 新增单测 NinjaBackend.ArchiveInputsLinkedAfterObjects(归档须排在对象之后)与
    跨平台 e2e 78_test_main_combinations.sh(四种 main×gtest 组合 mcpp test 全绿)。

v0.0.63

24 Jun 20:17
95885dd

Choose a tag to compare

修复

  • 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 回退)与跨平台
    e2e 77_cdb_preserves_test_entries.sh(mcpp test 后真实重建 mcpp build 仍保留测试条目)。

v0.0.62

24 Jun 03:56

Choose a tag to compare

修复

  • 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() 加多级回退
    (SDKROOTxcrunxcrun --sdk macosxxcode-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

23 Jun 23:47
52df10e

Choose a tag to compare

新增

  • 离线优先的索引刷新: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

23 Jun 08:54

Choose a tag to compare

(no CHANGELOG entry found for 0.0.60)

v0.0.59

23 Jun 05:18

Choose a tag to compare

(no CHANGELOG entry found for 0.0.59)

v0.0.58

21 Jun 20:09
49d6cbc

Choose a tag to compare

(no CHANGELOG entry found for 0.0.58)

v0.0.57

19 Jun 18:57
4bd2db3

Choose a tag to compare

修复

  • 包描述符解析改为 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 各加一步:用本次构建出的 mcpp git clonemcpp build /
    mcpp run 外部 C++ 工程 xlings(openxlings/xlings),验证自托管 mcpp 能构建真实外部项目。

v0.0.56

18 Jun 20:38
6a5e2f3

Choose a tag to compare

修复

  • mcpp run / test / build 不再把目标的捆绑 glibc LD_LIBRARY_PATH 注入到
    mcpp 自身进程,因而泄漏进它启动的宿主 /bin/sh。在 glibc 比捆绑版(2.39)更新的
    发行版上,sh 会被强制加载捆绑的旧 libc,无法满足宿主 libtinfoGLIBC_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-projectvendored(默认)、bundle-allself-contained;新增
    system 模式(完全依赖宿主提供所有共享库,用于发行版打包 / 同发行版部署)。
    static 不变。两轴模型:libc 由 --target 选(gnu/musl),--mode 只选打包深度。