从 mcpplibs/mcpp-index#269(eui-neo 的 Linux SNI 托盘)里挖出来的:
一个 feature 无法把它自己拉进来的库的链接方式一起带上。
现状
src/manifest/xpkg.cppm 里 feature 接受的键是:
implies sources defines requires provides deps flags
ldflags 与 include_dirs 不在其中 —— 写了会被记进 xpkgUnknownKeys,
mcpp xpkg parse 报一句 unknown,然后静默不生效。
后果:一个本该是 feature 的东西只能默认开启
eui-neo 的 Linux 托盘需要 glib:
-DEUI_TRAY_SNI=1 —— 可以用 features.tray.flags 按 glob 门控 ✅
-Lmcpp_generated/glib/lib -lgio-2.0 -lgobject-2.0 -lglib-2.0 —— 无法门控 ❌
include_dirs = { "mcpp_generated/glib/include/glib-2.0" } —— 无法门控 ❌
于是关掉 feature 的消费者照样链 glib:代价一分不少,托盘没有。
那比默认开启严格更差,所以 #269 选了默认开启,并把理由写进了描述符。
⭐ 这不是 eui-neo 特有的形状:任何「feature 拉进一个库」的包都会撞上它。
features.<name>.deps 已经能把依赖拉进来,却说不出怎么链它 —— 这条线接了一半。
建议
给 feature 加 ldflags 与 include_dirs,与 flags 同一处分发。
⚠️ 但它有发布顺序:一个用了新键的描述符,在旧 mcpp 上会
「记录 + 警告 + 不生效」—— 也就是半配置,而半配置的链接错误指向别处。
所以描述符侧要等索引 latest 的 mcpp 下限跨过实现它的版本
(与 #519 的 soname 完全同型,见
.agents/docs/2026-08-28-issue519-dependency-linkage-form.md §11.3)。
⚠️ 也要想清楚 feature 的 ldflags 是私有还是沿 Public 边传播:
include_dirs 在 mcpp 里是无条件进 publicUsage 的,而链接标志的传播语义
与它不同。这个问题必须在实现前回答,不是实现中。
从
mcpplibs/mcpp-index#269(eui-neo 的 Linux SNI 托盘)里挖出来的:一个 feature 无法把它自己拉进来的库的链接方式一起带上。
现状
src/manifest/xpkg.cppm里 feature 接受的键是:ldflags与include_dirs不在其中 —— 写了会被记进xpkgUnknownKeys,mcpp xpkg parse报一句 unknown,然后静默不生效。后果:一个本该是 feature 的东西只能默认开启
eui-neo 的 Linux 托盘需要 glib:
-DEUI_TRAY_SNI=1—— 可以用features.tray.flags按 glob 门控 ✅-Lmcpp_generated/glib/lib -lgio-2.0 -lgobject-2.0 -lglib-2.0—— 无法门控 ❌include_dirs = { "mcpp_generated/glib/include/glib-2.0" }—— 无法门控 ❌于是关掉 feature 的消费者照样链 glib:代价一分不少,托盘没有。
那比默认开启严格更差,所以 #269 选了默认开启,并把理由写进了描述符。
⭐ 这不是 eui-neo 特有的形状:任何「feature 拉进一个库」的包都会撞上它。
features.<name>.deps已经能把依赖拉进来,却说不出怎么链它 —— 这条线接了一半。建议
给 feature 加
ldflags与include_dirs,与flags同一处分发。「记录 + 警告 + 不生效」—— 也就是半配置,而半配置的链接错误指向别处。
所以描述符侧要等索引
latest的 mcpp 下限跨过实现它的版本(与 #519 的
soname完全同型,见.agents/docs/2026-08-28-issue519-dependency-linkage-form.md§11.3)。ldflags是私有还是沿 Public 边传播:include_dirs在 mcpp 里是无条件进 publicUsage 的,而链接标志的传播语义与它不同。这个问题必须在实现前回答,不是实现中。