Releases: mcpp-community/mcpp
v0.0.5
v0.0.4
构建 / 环境体验优化三件套。
新增
- ✅ Glob 排除模式 ——
[modules].sources(以及 Form B 的sources)
现在支持!前缀的排除模式(类似.gitignore):正向 glob 先展开、再减去sources = ["src/**/*.cpp", "!src/**/*_test.cpp", "!src/**/*_fuzzer.cpp"]
!-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"。
v0.0.3
依赖解析体系的三步演进: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 个单元测试)和 e2e33_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]段新增cflags、
cxxflags、c_standard三个字段;ninja 后端探测.c源文件后自动派
生兄弟 C 编译器(g++ → gcc、clang++ → 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"显式覆盖(cargolib.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.cppm—DependencySpec+kDefaultNamespacepm/index_spec.cppm— 占位,等索引仓配置实现pm/lock_io.cppm—mcpp.lockIOpm/package_fetcher.cppm— xlings NDJSON 客户端pm/resolver.cppm—resolve_semver+is_version_constraintpm/commands.cppm—cmd_add/cmd_remove/cmd_updatepm/publisher.cppm—emit_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
会用无引号的子表形式。
v0.0.2
第二个公开版本。新增 C 语言一等公民支持、xpkg 风格依赖命名空间、包管理子系统骨架重构,以及 lib-root 约定。
新增
-
✅ C 语言源文件支持 —
mcpp.toml的[build]段新增cflags、
cxxflags、c_standard三个字段;ninja 后端探测.c源文件后自动派
生兄弟 C 编译器(g++ → gcc、clang++ → 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"显式覆盖(cargolib.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.cppm—DependencySpec+kDefaultNamespacepm/index_spec.cppm— 占位,等索引仓配置实现pm/lock_io.cppm—mcpp.lockIOpm/package_fetcher.cppm— xlings NDJSON 客户端pm/resolver.cppm—resolve_semver+is_version_constraintpm/commands.cppm—cmd_add/cmd_remove/cmd_updatepm/publisher.cppm—emit_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
会用无引号的子表形式。
v0.0.1
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 项目第三方 .sobundle-all— 全自包含含 ld-linux + libc,附run.shwrapper
- ✅
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.gz—latest别名install.sh—curl | 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 来。