现象
包自身 mcpp build 时,[target.'cfg(...)'.build].sources(0.0.95 #223 的 cfg 条件 sources)正常参与构建;但该包作为依赖(path dep 实测)被消费时,cfg 条件 sources 不被展开编译 → 链接 undefined reference。与 0.0.94 修复的「feature sources 在 mcpp test 下不编译」(#218)属同一类:条件源集解析在非 root 构建路径缺失。
最小复现(mcpp 0.0.95, linux, gcc@16.1.0)
mylib/mcpp.toml:
[package]
name = "mylib"
version = "0.0.1"
[targets.mylib]
kind = "lib"
[build]
sources = ["src/**/*.cppm"]
[target.'cfg(linux)'.build]
sources = ["src/impl.cpp"]
src/mylib.cppm: export module mylib; export extern "C++" int impl_value(); export int probe() { return impl_value(); }
src/impl.cpp: int impl_value() { return 42; }
cd mylib && mcpp build → OK(impl.cpp 编译)
app 以 mylib = { path = "../mylib" } 依赖并 import mylib; → undefined reference to impl_value()(dep 的对象里没有 impl.o)
影响
多平台源列表分平台声明的包(ffmpeg-m:x86 目标编 NASM .asm、aarch64 目标编 GAS .S,源列表按 [target.'cfg(all(<os>, arch = "..."))'.build].sources 生成)只能作为 root 项目构建,不能被消费。ffmpeg-m 当前被迫把主平台(linux-x86_64)源列表退回 [build].sources,macOS 目标块等本修复后启用。
期望
依赖解析/构建图生成时,对每个依赖包按 resolved target 评估其 [target.*] 表(与 root 包同语义);顺带确认 dev-dependencies/mcpp test 路径同样覆盖(cf. #218 的教训:add 需要在所有模式做)。
现象
包自身
mcpp build时,[target.'cfg(...)'.build].sources(0.0.95 #223 的 cfg 条件 sources)正常参与构建;但该包作为依赖(path dep 实测)被消费时,cfg 条件 sources 不被展开编译 → 链接 undefined reference。与 0.0.94 修复的「feature sources 在 mcpp test 下不编译」(#218)属同一类:条件源集解析在非 root 构建路径缺失。最小复现(mcpp 0.0.95, linux, gcc@16.1.0)
mylib/mcpp.toml:src/mylib.cppm:export module mylib; export extern "C++" int impl_value(); export int probe() { return impl_value(); }src/impl.cpp:int impl_value() { return 42; }cd mylib && mcpp build→ OK(impl.cpp 编译)app以mylib = { path = "../mylib" }依赖并import mylib;→undefined reference to impl_value()(dep 的对象里没有 impl.o)影响
多平台源列表分平台声明的包(ffmpeg-m:x86 目标编 NASM
.asm、aarch64 目标编 GAS.S,源列表按[target.'cfg(all(<os>, arch = "..."))'.build].sources生成)只能作为 root 项目构建,不能被消费。ffmpeg-m 当前被迫把主平台(linux-x86_64)源列表退回[build].sources,macOS 目标块等本修复后启用。期望
依赖解析/构建图生成时,对每个依赖包按 resolved target 评估其
[target.*]表(与 root 包同语义);顺带确认dev-dependencies/mcpp test路径同样覆盖(cf. #218 的教训:add 需要在所有模式做)。