Skip to content

feat: xpkg 的 feature 应该能带 ldflags / include_dirs —— 否则「拉一个库的 feature」表达不出来 #522

Description

@Sunrisepeak

mcpplibs/mcpp-index#269(eui-neo 的 Linux SNI 托盘)里挖出来的:
一个 feature 无法把它自己拉进来的库的链接方式一起带上。

现状

src/manifest/xpkg.cppm 里 feature 接受的键是:

implies  sources  defines  requires  provides  deps  flags

ldflagsinclude_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 加 ldflagsinclude_dirs,与 flags 同一处分发。

⚠️ 但它有发布顺序:一个用了新键的描述符,在旧 mcpp 上会
「记录 + 警告 + 不生效」—— 也就是半配置,而半配置的链接错误指向别处。
所以描述符侧要等索引 latest 的 mcpp 下限跨过实现它的版本
(与 #519soname 完全同型,见
.agents/docs/2026-08-28-issue519-dependency-linkage-form.md §11.3)。

⚠️ 也要想清楚 feature 的 ldflags私有还是沿 Public 边传播:
include_dirs 在 mcpp 里是无条件进 publicUsage 的,而链接标志的传播语义
与它不同。这个问题必须在实现前回答,不是实现中。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions