|
| 1 | +# 新增 CLI11 收录方案 |
| 2 | + |
| 3 | +**日期**: 2026-08-06 |
| 4 | +**本仓**: `mcpp-community/mcpp-index`(github 别名 `mcpplibs/mcpp-index`) |
| 5 | +**来源**: 社区 PR [#169](https://github.com/mcpplibs/mcpp-index/pull/169)(@tz12323 提供描述符初稿), |
| 6 | +本文档记录补齐部分:CN 镜像、workspace 成员、描述符修正与验证结论。 |
| 7 | + |
| 8 | +**目标**: |
| 9 | +1. 收录 [`CLIUtils/CLI11`](https://github.com/CLIUtils/CLI11) 2.7.2 —— header-only 命令行解析器, |
| 10 | + `compat` 形态,文件 `pkgs/c/compat.CLI11.lua`。 |
| 11 | +2. 建立 CN 镜像 `gitcode.com/mcpp-res/cli11`。 |
| 12 | +3. 添加 `tests/examples/cli11/` 测试工程并登记为 workspace 成员。 |
| 13 | + |
| 14 | +--- |
| 15 | + |
| 16 | +## 1. 形态判定 |
| 17 | + |
| 18 | +| 库 | 形态 | 最新 tag | 收录版本 | License | |
| 19 | +|---|---|---|---|---| |
| 20 | +| CLI11 | B. header-only | `v2.7.2` | `2.7.2` | BSD-3-Clause | |
| 21 | + |
| 22 | +上游 tarball 顶层是 `CLI11-2.7.2/` wrap 层,头文件在 `include/CLI/` 下,实现头在 |
| 23 | +`include/CLI/impl/*_inl.hpp`。默认模式下所有定义带 `CLI11_INLINE`,`CLI/CLI.hpp` 把 |
| 24 | +impl 头一并拉进来 —— **没有需要编译的库源码**,所以走 shape B:`include_dirs` 暴露头 |
| 25 | +文件根,再配一个 anchor TU 让 mcpp 有可构建的 `lib` target。 |
| 26 | + |
| 27 | +原 PR 写的是 `include_dirs = { "include" }`,这是错的:`mcpp` 段里的路径都是**相对 |
| 28 | +verdir 的 glob**,必须由前导 `*` 吸收 `CLI11-<tag>/` 这一层,即 `*/include`。按原样 |
| 29 | +构建时消费者的 `#include <CLI/CLI.hpp>` 找不到头文件。 |
| 30 | + |
| 31 | +### 1.1 两个不收的上游额外件 |
| 32 | + |
| 33 | +- `src/Precompile.cpp` —— 上游的预编译模式。只有在 `CLI11_COMPILE` 同时到达**消费者** |
| 34 | + 的 TU 时才有意义(否则头文件里的 inline 定义照常生效,编出来的那份是死重量)。 |
| 35 | + 那是 interface define,不是 sources 门控,feature 表达不了完整语义,故不做半吊子实现。 |
| 36 | +- `src/modules/CLI11.cppm` —— 上游自带的 C++20 模块接口。模块层是另一种包形态 |
| 37 | + (参见 `pkgs/n/nlohmann.json.lua`),不是 compat 包的 feature。日后要 `import CLI11;` |
| 38 | + 应另开一个模块层描述符。 |
| 39 | + |
| 40 | +因此本包**没有 feature**,也就没有需要做负向验证的门控。 |
| 41 | + |
| 42 | +## 2. CN 镜像 |
| 43 | + |
| 44 | +slug 取包名去掉 `compat.` 前缀后小写:`cli11`(与既有 `mcpp-res` 仓库的小写风格一致)。 |
| 45 | + |
| 46 | +``` |
| 47 | +GLOBAL: https://github.com/CLIUtils/CLI11/archive/refs/tags/v2.7.2.tar.gz |
| 48 | +CN: https://gitcode.com/mcpp-res/cli11/releases/download/2.7.2/cli11-2.7.2.tar.gz |
| 49 | +sha256: 46eef3101da70852ec7af026e09d485ccee81813331c8c6052d39344443b83da |
| 50 | +``` |
| 51 | + |
| 52 | +执行:`gtc repo create` → 先推 init commit(新仓无分支,release 无法 target main) |
| 53 | +→ `gtc release publish --tag 2.7.2 --asset cli11-2.7.2.tar.gz`。 |
| 54 | + |
| 55 | +闭环验证:CN url `http=200`,`size=1446996`,sha256 与 GLOBAL **字节一致**。 |
| 56 | +纯头文件包,三平台共用同一 url 与 sha。 |
| 57 | + |
| 58 | +## 3. 测试工程 |
| 59 | + |
| 60 | +`tests/examples/cli11/`,依赖 `[dependencies.compat] CLI11 = "2.7.2"`。 |
| 61 | +`compat` 的 `[indices]` 重定向由 workspace 根继承,不在成员里重复声明(单条是硬约束)。 |
| 62 | +依赖写**限定形式**:索引表按请求的 namespace 取键,裸名会走默认命名空间、从线上索引 |
| 63 | +解析,被测的就不再是本 checkout。 |
| 64 | + |
| 65 | +`tests/parse.cpp` 断言四件事加两条失败路径: |
| 66 | + |
| 67 | +- 取值 / 默认值保持 / flag / 多值选项(`expected(3)`)/ 子命令的一次完整 parse; |
| 68 | +- 未声明的选项必须抛 `CLI::ParseError`(证明 parse 真的跑了,而不是静默无动作); |
| 69 | +- `check(CLI::Range(1,10))` 越界必须抛 `CLI::ValidationError`(带到 Validators 那一组头文件); |
| 70 | +- `CLI11_VERSION == "2.7.2"`(证明解开的是这个归档); |
| 71 | +- 调用包自身的 anchor 符号 `mcpp_compat_cli11_headers_anchor()`。 |
| 72 | + |
| 73 | +最后一条是有意的:header-only 包的 lib target 里就只有这一个 TU,引用它能证明包**确实 |
| 74 | +被编译并链接**了,而不是只有头文件被 include(绿 CI 不等于包被编译)。 |
| 75 | + |
| 76 | +## 4. 验证结果 |
| 77 | + |
| 78 | +本地用 CI 同版本 mcpp `2026.8.6.1`,`MCPP_INDEX_MIRROR=CN`(CI 侧走 GLOBAL), |
| 79 | +清掉 `target/` 与 `.mcpp/` 冷启动: |
| 80 | + |
| 81 | +``` |
| 82 | + Downloading compat.CLI11 v2.7.2 |
| 83 | + Compiling cli11-tests v0.1.0 (.) |
| 84 | + Compiling compat.CLI11 v2.7.2 |
| 85 | + Compiling parse (test) |
| 86 | + Running bin/parse |
| 87 | +parse ... ok (0.02s) |
| 88 | +
|
| 89 | + test result ok. 1 passed; 0 failed; finished in 87.28s (build 3.06s + run 0.02s) |
| 90 | +``` |
| 91 | + |
| 92 | +产出 obj 两个:`obj/parse.o` 与 `obj/compat_CLI11/mcpp_generated/cli11_anchor.o`。 |
| 93 | + |
| 94 | +本地复现 `validate.yml` 的 lint,全部通过:lua 语法、必填字段、无前导 `v`、 |
| 95 | +`check_mirror_urls.lua`、`check_package_name.lua`、`check_cross_package_refs.lua`、 |
| 96 | +`mcpp xpkg parse`(解析器语法,严格模式)。 |
| 97 | + |
| 98 | +## 5. 文件清单 |
| 99 | + |
| 100 | +1. `pkgs/c/compat.CLI11.lua` — 包描述符(修正 `include_dirs` glob、CN 镜像 url、 |
| 101 | + `language` 对齐仓内其余描述符的 `c++23`) |
| 102 | +2. `tests/examples/cli11/mcpp.toml` — 测试工程配置 |
| 103 | +3. `tests/examples/cli11/tests/parse.cpp` — 测试代码 |
| 104 | +4. `mcpp.toml` — 登记 workspace 成员 |
| 105 | +5. `README.md` / `README.zh-CN.md` — 参考样例表各加一行 |
| 106 | +6. `.agents/docs/2026-08-06-add-cli11-plan.md` — 本文档 |
0 commit comments