症状
每个 protobuf 消费者的每次构建都会刷一条:
warning: src/protobuf.cppm: lib target without conventional lib root
'src/protobuf.cppm' (create the file or set [lib].path)
来源:compat.protobuf 描述符声明 ["protobuf"] = { kind = "lib" },mcpp 于是按约定推出模块根 src/<name>.cppm,发现文件不存在。
为什么这条建议不成立
protobuf 是纯 .cc / .h 的非模块 C++ 库——它没有模块接口,也不会有。src/protobuf.cppm 不是「作者忘了建」的文件,而是一个在这个包里不存在的概念。于是这条 warning 给出的两个出路都不通:
- "create the file" —— 要求作者为一个非模块库凭空造一个模块接口;
- "set [lib].path" —— 没有可以指的东西。
src/modgraph/validate.cppm:145 的判据只有「has_lib_target(manifest) 且约定路径不存在」,它把命名约定当成了要求。约定的正确含义是「如果你有模块根,默认叫这个名字」,而不是「lib 就必须有模块根」。
可用的判据
同一个函数往下几行就在做这件事:它遍历 g.units 找 lib root 单元,以便检查它导出的是主模块而不是分区。所以图里有没有任何模块接口单元这件事是现成的——
- 该 target 有模块接口、但约定根缺失 ⇒ 当前的 warning 是对的,保留;
- 该 target 一个模块接口都没有 ⇒ 它是非模块库,约定根不适用,不该告警。
(也可以让描述符显式声明,但那会要求所有既有的非模块 compat 包都改一遍;从图上判定不需要生态动一根手指。)
影响面
仅告警。但它落在 protobuf / gRPC 这条最常用的链路上,每次构建都出现;与 #373 那条一样,长期刷屏会把诊断输出训练成噪声,而「lib root 缺失」在真正的模块库上是有意义的信号。
复现
任意工程依赖 compat.protobuf(或直接 mcpp new 一个 grpc 模板工程)后 mcpp build。
症状
每个 protobuf 消费者的每次构建都会刷一条:
来源:
compat.protobuf描述符声明["protobuf"] = { kind = "lib" },mcpp 于是按约定推出模块根src/<name>.cppm,发现文件不存在。为什么这条建议不成立
protobuf 是纯
.cc/.h的非模块 C++ 库——它没有模块接口,也不会有。src/protobuf.cppm不是「作者忘了建」的文件,而是一个在这个包里不存在的概念。于是这条 warning 给出的两个出路都不通:src/modgraph/validate.cppm:145的判据只有「has_lib_target(manifest)且约定路径不存在」,它把命名约定当成了要求。约定的正确含义是「如果你有模块根,默认叫这个名字」,而不是「lib 就必须有模块根」。可用的判据
同一个函数往下几行就在做这件事:它遍历
g.units找 lib root 单元,以便检查它导出的是主模块而不是分区。所以图里有没有任何模块接口单元这件事是现成的——(也可以让描述符显式声明,但那会要求所有既有的非模块 compat 包都改一遍;从图上判定不需要生态动一根手指。)
影响面
仅告警。但它落在 protobuf / gRPC 这条最常用的链路上,每次构建都出现;与 #373 那条一样,长期刷屏会把诊断输出训练成噪声,而「lib root 缺失」在真正的模块库上是有意义的信号。
复现
任意工程依赖
compat.protobuf(或直接mcpp new一个 grpc 模板工程)后mcpp build。