Skip to content

Latest commit

 

History

History
353 lines (264 loc) · 16.1 KB

File metadata and controls

353 lines (264 loc) · 16.1 KB

Changelog

本文件追踪 mcpp-community/mcpp 公开仓的版本演进。 格式参考 Keep a Changelog

[0.0.44] — 2026-06-02

修复

  • 修复 git branch 依赖的缓存身份和 lockfile source 元数据。branch 依赖现在会先 解析到具体 commit,缓存 key 会随远端 branch 更新而变化,lockfile 也会记录 git+<url>#branch=<name>@<sha> 而不是错误落到 index+mcpplibs@

[0.0.43] — 2026-06-02

新增

  • 支持在单个 [dependencies] / [dev-dependencies] / [build-dependencies] / [workspace.dependencies] 表中使用多段 dotted dependency selector,例如 imgui.core = "..." 会先尝试 mcpplibs.imgui/core,未命中时再尝试同级根 imgui/core
  • xpkg.luamcpp.deps 支持同样的 dotted selector 规则,方便 compat、 imgui 等生态根和 mcpplibs 并列演进。

改进

  • mcpp add 默认保留用户写入的 dotted selector,显式 namespace 仍可使用 ns:name 写入 [dependencies.<ns>]

[0.0.42] — 2026-06-01

新增

  • [package].standard 打通为一等 C++ 标准配置,默认仍为 c++23, 并支持 c++26 / c++2c 等写法。

修复

  • 编译 flags、compile_commands.json、fingerprint 与 import std 标准库 BMI 预构建命令现在使用同一个 active C++ 标准。
  • std.gcm / std.pcm cache 增加元数据校验,只有 compiler、stdlib、target、 standard、source 与 build command 匹配时才复用。
  • build.cxxflags 回归附加 C++ flags 语义,若写入 -std= 会提示迁移到 [package].standard

[0.0.41] — 2026-06-01

修复

  • 修复 Objective-C .m 源文件在 Ninja 后端被路由到 C++ 编译规则的问题。 .m 现在与 .c 一样使用 C/Objective-C 编译器与 cflags,避免 macOS GLFW 等上游 Objective-C 源被错误附加 -std=c++23

[0.0.40] — 2026-06-01

修复

  • 修复 project-local index 包的 xpm hook 工具依赖无法解析官方 xim 索引的问题。项目级 xlings 配置现在会在 custom/local index 旁边显式暴露 官方 xim 索引,让 xim:python 等 hook 工具依赖可用。

[0.0.39] — 2026-06-01

修复

  • 修复 project-local index 包安装时没有走项目 xlings 数据根的问题,本地 path 索引现在通过 xlings CLI 直接安装到项目数据目录,避免 hook 查找不到同索引包。
  • 修复包 install hook 运行前 mcpp.deps 尚未安装的问题,库/头文件依赖可以继续 留在 mcpp.deps,只有 hook 执行工具需要放入 xpm deps。

[0.0.38] — 2026-05-31

新增

  • 支持包描述拥有自己的 ldflags,依赖包声明的链接参数会随包源码编译 一起进入最终链接命令,消费方项目不再需要手动补齐第三方 C/C++ 库的私有链接参数。

[0.0.37] — 2026-05-31

修复

  • 修复 xlings 项目构建时自动索引刷新泄漏 xlings 内部 [N/M] index::path 输出的问题。mcpp 仍保留 Updating package index (auto-refresh) 状态行, 且该状态行走统一彩色 UI 输出;内部 xlings update 现在在自动刷新路径中 静默执行。
  • 修复自动索引 freshness 依赖不稳定目录 mtime 的问题,改用 mcpp-owned .mcpp-index-updated marker,避免 full prepare 时重复刷新索引。
  • 修复命名空间依赖命中 BMI cache 后仍显示 Compiling mcpplibs.* 的问题, cache key 与 UI 状态现在使用解析得到的 canonical dependency identity。
  • 修复 xim: 工具链自动安装时官方索引/目标包文件/.xlings-index-cache.json 可能陈旧或指向临时 sandbox 路径导致 package not found 的问题。

[0.0.36] — 2026-05-31

修复

  • 修复默认 mcpplibs 索引缺失时被其他 xlings 索引误判为 fresh 的问题。 mcpp build/search 现在会要求默认索引自身存在并处于 TTL 内,避免 compat.* 依赖在混合缓存状态下找不到。

[0.0.35] — 2026-05-30

新增

  • 支持包描述拥有自己的 cflags / cxxflags,依赖包源码编译时会继承所属包 的构建宏,消费方项目不再需要集中声明第三方 C 库的私有宏。
  • 支持 Form B mcpp.generated_files,官方索引包可以在包目录下生成少量配置头, 用于承载平台兼容宏或库私有配置。

修复

  • 修复本地 path 索引读取命名空间包时没有匹配 pkgs/<prefix>/<namespace>.<name>.lua 的问题。
  • 自定义索引首次同步时保留 mcpp 的 Fetching custom index repos 状态提示,但静默 xlings update 的内部逐项输出。

[0.0.33] — 2026-05-30

改进

  • 将 legacy dotted dependency key 兼容解析移入 mcpp.pm.compat.legacy 模块,保留 mcpp.pm.compat 作为 facade,并明确标注该兼容路径将在 mcpp 1.0.0 移除。

[0.0.32] — 2026-05-30

修复

  • 修复 project-local .xlings.json 生成时未转义 JSON 字符串的问题, 避免 Windows 本地 index 路径中的反斜杠导致 xlings 跳过项目索引。

[0.0.31] — 2026-05-30

修复

  • 修复 xlings 项目使用 mcpp 构建时 custom index 首次同步、project data root 查找和 local index 相对路径解析的问题。
  • 支持 canonical nested dependency 写法: [dependencies] capi.lua = "0.0.3"[dependencies.mcpplibs] capi.lua = "0.0.3"
  • 将 legacy flat dotted dependency key 兼容解析集中到 mcpp.pm.compat, 并标注该兼容路径将在 mcpp 1.0.0 移除。

[0.0.14] — 2026-05-13

LLVM / Clang 工具链支持与 xlings 镜像配置完善。

新增

  • LLVM / Clang 工具链支持 —— 新增基于 clang++clang-scan-depsllvm-arlld 的工具链探测与构建路径,支持 xlings llvm 包提供的 自包含 Linux LLVM 工具链。
  • import std 支持 —— LLVM libc++ 模块标准库可用时,自动发现 std.cppm / std.compat.cppm,并接入标准库 BMI 预构建流程。
  • mcpp self config --mirror —— 通过 xlings 抽象层配置 sandbox 镜像,默认初始化为 CN,CI 可显式切换为 GLOBAL

改进

  • 🔧 工具链 provider 拆分 —— 将通用模型、探测逻辑、GCC、Clang、LLVM provider 与 registry 分离到独立模块,为后续更多工具链扩展预留入口。
  • 🔧 xlings 索引兼容迁移 —— 自动将历史 mcpp-index 索引名迁移到 mcpplibs,避免旧 sandbox 状态影响新流程。

[0.0.4] — 2026-05-10

构建 / 环境体验优化三件套。

新增

  • Glob 排除模式 —— [modules].sources (以及 Form B 的 sources) 现在支持 ! 前缀的排除模式(类似 .gitignore):
    sources = ["src/**/*.cpp", "!src/**/*_test.cpp", "!src/**/*_fuzzer.cpp"]
    正向 glob 先展开、再减去 !-prefixed glob 命中的路径。解决了上游库 test/fuzzer 文件与源混放时不得不逐文件列举的问题(典型如 ftxui)。

改进

  • 🔧 xlings 布局调整 —— xlings 二进制从 <MCPP_HOME>/bin/xlings (与 mcpp 同目录)移至 <MCPP_HOME>/registry/bin/xlings (= <XLINGS_HOME>/bin/xlings)。由于 xlings 的 shim-creation guard 恰好检查 <XLINGS_HOME>/bin/xlings 是否存在,新布局下 ensure_sandbox_xlings_binary 自然变成 no-op,省去了之前的 hardlink 步骤。

  • 🔧 测试自动继承 sandbox PATH —— mcpp test 在调用测试二进制前, 自动把 sandbox 的 subos/default/bin(含 patchelf、ninja 等 一次性自举工具)追加到 $PATH,使 test 代码 shell-out 到这些工具时 不再报 "command not found"。

[0.0.3] — 2026-05-10

依赖解析体系的三步演进:0.0.2 release tag 之后合入 transitive walker, 这一版补齐 SemVer 合并(Level 2)+ 多版本 mangling 兜底(Level 1)。

新增

  • 依赖图传递性遍历 —— 直接依赖的子依赖(以及更深层)自动跟随入解析图, 消费者不必再在自己的 mcpp.toml 里把 grandchild 也写一遍;子依赖的 [build].include_dirs 也会沿链路传播,让中间层在编译时看得到 grandchild 的头文件。冲突检测同时区分 path / git / version 三类来源,跨来源不允许 混用。

  • SemVer 合并解析(Level 2) —— 同一个包在传递依赖图里被多个消费者 以不同版本约束声明时,resolver 会把两条原始约束 AND 合并(裸版本号视作 =X.Y.Z),向 index 重新查询,选出同时满足两侧的具体版本。若该版本与 此前已 pin 的不一致,旧的 manifest 与 [build].include_dirs 会被原地 替换为新版本的内容,孩子依赖也按新 manifest 重新入队。新增 e2e 32_semver_merge.sh 覆盖兼容合并 + 不可调和两条主链路。

  • 多版本 mangling 兜底(Level 1) —— SemVer 合并失败时(典型如 =0.0.1=0.0.2 这种无重叠的 pin),resolver 不再硬报错,而是把次要 版本的源码 stage 到 target/.mangled/<consumer>/... 下,通过正则改写 (export )?module X; / (export )?module X:Y; / (export )?import X; 把模块名替换成 <X>__v<M>_<m>_<p>__mcpp 形式,让两个 BMI 在同一构建图 里以不同模块名共存(C++23 module attachment 帮我们做 ABI 隔离,无需额外 namespace mangle)。直接 consumer 的源码也一并 stage + 改写,让它的 import 指向 mangled 副本。MVP 范围:仅处理 dep-as-consumer + 叶子 secondary 两种情形,主包做 consumer 或 secondary 还有自己的 transitive deps 时报清晰错误并建议显式 pin。新增 src/pm/mangle.cppm(纯改写 helper + 11 个单元测试)和 e2e 33_multi_version_mangling.sh

改进

  • 🔧 构建后端按需为多包做 obj 路径命名空间 —— plan.cppm 检测到 跨包同名源文件(多版本 mangling 后两个 parse.cppm 同时存在的常见情形) 时,自动把 obj/<file>.o 改为 obj/<sanitized-pkg>/<file>.o,.ddi 扫描产物随之放在 object 同目录下。无碰撞时仍是原始 obj/<file>.o 布局,不影响现有缓存命中。

第二个公开版本。新增 C 语言一等公民支持、xpkg 风格依赖命名空间、包管理子系统骨架重构,以及 lib-root 约定。

新增

  • C 语言源文件支持mcpp.toml[build] 段新增 cflagscxxflagsc_standard 三个字段;ninja 后端探测 .c 源文件后自动派 生兄弟 C 编译器(g++ → gccclang++ → clang、跨编译器前缀如 x86_64-linux-musl-gcc 同样适用),发出独立的 c_object 规则。 按文件扩展名分发:.cppm → cxx_module.c → c_object、其它 → cxx_object;dyndep / 模块扫描自动跳过 .c实测可直接编译 mbedtls 3.6.1 全部 108 个 .c 源文件(SHA-256 测试向量与 FIPS 180-4 一致)。

  • lib-root 约定 — 库项目(kind = "lib" / shared)的 primary module interface 默认在 src/<package-tail>.cppm,且必须 export module <full-package-name>;(无 :partition 后缀);可用 [lib].path = "src/foo.cppm" 显式覆盖(cargo lib.rs 风格)。 违规组合(显式 path 但文件缺失 / 文件 export partition / module 名 不匹配 [package].name)报 error;约定文件缺失只报 warning,给已有 项目软迁移时间。纯 binary 项目跳过所有检查。

  • xpkg 风格依赖命名空间mcpp.toml 现在原生支持三种依赖书写形式:

    • 平铺默认命名空间:gtest = "1.15.2"(mcpp, gtest),无引号
    • TOML 子表命名空间:[dependencies.mcpplibs] cmdline = "0.0.2"(mcpplibs, cmdline),无引号
    • 老式带点字符串(向后兼容):"mcpplibs.cmdline" = "0.0.2" 仍能解析
    • CLI 同步:mcpp add mcpplibs:cmdline@0.0.2 接受 <ns>:<name> 冒号分隔形式,写出仍是子表写法
    • 解析层在 DependencySpec 增加 namespace_ + shortName 结构化 字段,fetcher / lockfile / cache 等下层逻辑沿用现有完全限定 key。

改进

  • 🛠 src/pm/ 包管理子系统(7 步重构,全部完成) — 包管理相关代码 从 cli.cppm(3510→2900 行) / manifest.cppm / lockfile.cppm / fetcher.cppm / publish/xpkg_emit.cppm 中抽出,集中到独立的 src/pm/ 目录下,跟 build/ / toolchain/ / pack/ 平级。 最终 8 个内部模块:

    • pm/pm.cppm(子系统门面,re-export 数据类型)
    • pm/dep_spec.cppmDependencySpec + kDefaultNamespace
    • pm/index_spec.cppm — 占位,等索引仓配置实现
    • pm/lock_io.cppmmcpp.lock IO
    • pm/package_fetcher.cppm — xlings NDJSON 客户端
    • pm/resolver.cppmresolve_semver + is_version_constraint
    • pm/commands.cppmcmd_add / cmd_remove / cmd_update
    • pm/publisher.cppmemit_xpkg + tarball / sha256 / release helpers

    整个重构严格保持零行为变更:每一步独立 PR、独立 CI 通过、独立可 回滚;旧模块名(mcpp.lockfile / mcpp.fetcher / mcpp.publish.xpkg_emit) 保留薄 shim 透传到新模块,所有调用点零改动。规划与依赖图见 .agents/docs/2026-05-08-pm-subsystem-architecture.md §3-§5。

  • 📄 新增设计文档 .agents/docs/:

    • 2026-05-08-package-index-config.md — 多源包索引仓配置 + mcpp.lock 索引 commit 锁定 + 两层不可变性 (L1 publish policy + L2 lock mechanism)
    • 2026-05-08-pm-subsystem-architecture.md — 包管理子系统目标布局 与 7 步落地计划

修复

  • 🐛 path 依赖的 [package].name 比对支持 xpkg 标准 name + 旧式 <ns>.<name> 复合名两种形式,兼容当前 mcpp-index 描述符尚未迁移的 状态。
  • 🐛 module 扫描器解析 partition import(import :foo)时,不再把当前 TU 自己的 partition 后缀拼进 logical name。 之前 export module M:bar; 里的 import :foo; 被解析成 M:bar:foo (没人 provide,产生 7 条 stale warning);现在正确解析为兄弟分区 M:foo。GCC dyndep 实际能分辨,所以 build 不影响,但 mcpp 自己的 warning 噪音消失。在 mcpplibs/tinyhttps 上验证(7 条 warning → 0 条)。

兼容性

向后兼容。老的 mcpp.toml / mcpp.lock 不需要任何改动即可在 0.0.2 下 继续工作。带引号的 "ns.name" 形式继续被解析,只是新写出的 mcpp add 会用无引号的子表形式。

[0.0.1] — 2026-05-07

mcpp 首个公开发版本。

已具备的能力

  • ✅ 基础工程命令:mcpp new / build / run / clean / test
  • ✅ C++23 模块(import std / import foo.bar)一等公民支持
  • ✅ 跨项目依赖:mcpp-index 远程仓库、git、本地 path 三种来源
  • ✅ SemVer 约束:"foo" = "^0.0.1" / "~1.2.0" / ">=1, <2"
  • ✅ P1689 编译器驱动模块扫描 + ninja dyndep
  • ✅ 跨项目 BMI 持久缓存
  • ✅ 私有 toolchain 沙盒(mcpp toolchain install / default / list), 跟系统 PATH 完全隔离;首次使用自动装 musl-gcc 默认工具链
  • ✅ 部分版本号支持(mcpp toolchain install gcc 15 自动选最高匹配)
  • mcpp pack 三种自包含发布模式:
    • static — musl 全静态,单文件可分发
    • bundle-project(默认)— 只 bundle 项目第三方 .so
    • bundle-all — 全自包含含 ld-linux + libc,附 run.sh wrapper
  • mcpp self {doctor,env,version,explain} 自诊断
  • ✅ 下载 / 安装实时进度(速度、字节数、终端宽度自适应)
  • ✅ 项目相对路径显示(@mcpp/...、project-relative)

发布产物(GitHub Release)

  • mcpp-0.0.1-linux-x86_64.tar.gz — bundled tarball(mcpp + 内置 xlings)
  • mcpp-linux-x86_64.tar.gzlatest 别名
  • install.shcurl | bash 装机脚本
  • SHA256SUMS + 各资产 sha256 sidecar
  • 二进制为 musl 全静态 ELF,无 PT_INTERP / RUNPATH 依赖,任意 Linux x86_64 直接可跑

限制

  • 仅支持 Linux x86_64(glibc / musl 通用)
  • macOS / Windows / aarch64 还在路上
  • workspace、mcpp publish --auto(自动 PR 到 mcpp-index)等功能未发版

反馈

接口、命令、产物形态可能在后续小版本调整。issue / 想法 / 协作意向都欢迎到 issues 来。