Skip to content

Commit ef5c04f

Browse files
authored
Merge branch 'mcpp-community:main' into main
2 parents 5c1da99 + dc2b194 commit ef5c04f

12 files changed

Lines changed: 691 additions & 43 deletions

File tree

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
# Namespace Field Design — mcpp 0.0.6
2+
3+
> 方案设计文档,指导 namespace 字段的实现和生态迁移。
4+
5+
## 1. 动机
6+
7+
mcpp 生态向 C++23 模块化方向发展。包索引中存在两类库:
8+
9+
- **模块化库**(mcpplibs 生态):原生 `export module`,用 `import` 消费
10+
- **非模块化库**(compat):传统 C/C++ 库,通过 Form B 描述文件 + `#include` 消费
11+
12+
需要在 namespace 层面区分这两类,让用户一眼看出某个依赖是否是模块化的,
13+
同时为未来"非模块化库迁移到模块化"提供清晰的升级路径。
14+
15+
## 2. 命名空间划分
16+
17+
| namespace | 含义 | 示例包 |
18+
|---|---|---|
19+
| `mcpplibs` | mcpplibs 生态的模块化 C++23 库 | cmdline, tinyhttps, llmapi, xpkg, templates |
20+
| `mcpplibs.capi` | mcpplibs 的 C API 模块化封装子集 | lua (封装 Lua C API 为 C++23 module) |
21+
| `compat` | 非模块化的第三方 C/C++ 库(兼容性支持,不鼓励直接使用) | gtest, mbedtls, lua(上游 C 库), ftxui |
22+
23+
### 2.1 默认 namespace
24+
25+
由于 xlings 的 `defaultNamespace = repo.name`(硬编码为索引仓库名 `"mcpp-index"`),
26+
我们采用**每个包显式指定 namespace** 的方案,不依赖默认值。
27+
28+
### 2.2 用户 mcpp.toml 写法
29+
30+
```toml
31+
# 模块化库
32+
[dependencies.mcpplibs]
33+
cmdline = "0.0.2"
34+
tinyhttps = "0.2.2"
35+
llmapi = "0.2.5"
36+
37+
# C API 封装
38+
[dependencies.mcpplibs.capi]
39+
lua = "0.0.3"
40+
41+
# 非模块化兼容库
42+
[dependencies.compat]
43+
gtest = "1.15.2"
44+
mbedtls = "3.6.1"
45+
ftxui = "6.1.9"
46+
lua = "5.4.7" # 上游 C 库(和 mcpplibs.capi.lua 是不同的包)
47+
```
48+
49+
### 2.3 迁移路径
50+
51+
当某个 compat 库完成模块化封装后:
52+
1. 在 mcpplibs 或 mcpplibs.capi 下发布新包
53+
2. compat 版本标记 deprecated(保留一段时间)
54+
3. 用户改一行依赖声明即可迁移
55+
56+
## 3. 索引文件布局
57+
58+
### 3.1 描述文件命名
59+
60+
文件名使用 `<namespace>.<name>.lua` 格式:
61+
62+
```
63+
pkgs/
64+
c/compat.gtest.lua namespace="compat", name="gtest"
65+
c/compat.mbedtls.lua namespace="compat", name="mbedtls"
66+
c/compat.lua.lua namespace="compat", name="lua"
67+
c/compat.ftxui.lua namespace="compat", name="ftxui"
68+
m/mcpplibs.cmdline.lua namespace="mcpplibs", name="cmdline"
69+
m/mcpplibs.tinyhttps.lua namespace="mcpplibs", name="tinyhttps"
70+
m/mcpplibs.llmapi.lua namespace="mcpplibs", name="llmapi"
71+
m/mcpplibs.xpkg.lua namespace="mcpplibs", name="xpkg"
72+
m/mcpplibs.templates.lua namespace="mcpplibs", name="templates"
73+
m/mcpplibs.capi.lua.lua namespace="mcpplibs.capi", name="lua"
74+
```
75+
76+
### 3.2 描述文件格式
77+
78+
```lua
79+
package = {
80+
spec = "1",
81+
namespace = "compat", -- 显式 namespace(0.0.6+)
82+
name = "gtest", -- 短名
83+
...
84+
}
85+
```
86+
87+
### 3.3 xpkgs 安装目录
88+
89+
```
90+
<namespace>-x-<name>/<version>/
91+
92+
compat-x-gtest/1.15.2/
93+
compat-x-mbedtls/3.6.1/
94+
compat-x-lua/5.4.7/
95+
compat-x-ftxui/6.1.9/
96+
mcpplibs-x-cmdline/0.0.2/
97+
mcpplibs-x-tinyhttps/0.2.2/
98+
mcpplibs.capi-x-lua/0.0.3/
99+
```
100+
101+
## 4. mcpp 实现清单
102+
103+
### 4.1 src/pm/compat.cppm (已完成 PR #23)
104+
105+
- `resolve_package_name(name, ns)` — 显式 ns 优先 > 点号拆分 > 默认
106+
- `qualified_name(ns, short)` — 重建完整名
107+
- `xpkg_dir_name(index, ns, short)` — xpkgs 目录名
108+
109+
### 4.2 src/manifest.cppm (已完成 PR #23)
110+
111+
- `Package.namespace_` 字段
112+
- TOML `[package].namespace` 解析
113+
- `extract_xpkg_namespace()` — 从 xpkg lua 读 namespace
114+
115+
### 4.3 src/pm/package_fetcher.cppm (待更新)
116+
117+
`install_path()` 查找逻辑需要同时支持:
118+
- 新路径: `<namespace>-x-<name>`(如 `compat-x-gtest`)
119+
- 老路径: `<defaultIndex>-x-<qualifiedName>`(如 `mcpp-index-x-gtest`)
120+
121+
### 4.4 src/cli.cppm (已完成 PR #23)
122+
123+
- dep 名称匹配走 compat 模块
124+
- lua namespace 传播到 manifest
125+
126+
## 5. 向后兼容
127+
128+
### 5.1 compat.cppm 的三条规则
129+
130+
1.`namespace` 字段 → 直接用(新路径)
131+
2. `name` 带点号 → 按首个点拆分(老路径,deprecated in 1.0.0)
132+
3. 纯短名 → 走 `install_path` 的 fallback 扫描
133+
134+
### 5.2 install_path 双路查找
135+
136+
```
137+
查 <xpkgs>/<namespace>-x-<name>/<version>/ ← 新路径
138+
查 <xpkgs>/<defaultIndex>-x-<qualifiedName>/<version>/ ← 老路径 fallback
139+
```
140+
141+
先找到哪个用哪个。新安装的包走新路径,老缓存继续能用。
142+
143+
## 6. 弃用时间线
144+
145+
| 版本 | 变化 |
146+
|---|---|
147+
| 0.0.6 | namespace 字段支持 + 双路 install_path |
148+
| 0.1.0 | mcpp-index 全面迁移到显式 namespace |
149+
| 1.0.0 | 移除 name 嵌点的 compat 拆分逻辑 |

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ mcpp run
7272
- [发布打包](docs/02-pack-and-release.md)
7373
- [工具链管理](docs/03-toolchains.md)
7474
- [从源码构建 & 参与贡献](docs/04-build-from-source.md)
75+
- [mcpp.toml 工程文件指南](docs/05-mcpp-toml.md)
7576

7677
任意命令的完整选项可通过 `mcpp <cmd> --help` 查阅。
7778

0 commit comments

Comments
 (0)