fix(模块): 托管方不是负责方 —— 改名 cairo/displayinfo,并补齐两个不完备的包装体 - #328
Merged
Conversation
改名:freedesktop.cairo -> cairo,freedesktop.displayinfo -> displayinfo。
索引 namespace 是货架标签,从不进模块名。cairo 是它自己的项目,freedesktop.org
托管 git 但不拥有那套接口;libdisplay-info 解析的是 VESA 的 EDID/DisplayID。同
一条规则下 freedesktop.egl 导出的是 khronos.egl。
⭐ 而且两个包装体都不完备:
cairo 470 -> 697 缺 cairo_t,以及全部 192 个枚举量
displayinfo 206 -> 501 缺全部 295 个枚举量
cairo_t 的原因很具体:正则 cairo_[a-z0-9_]+_t 要求 cairo_ 与 _t 之间至少一个
字符,于是 `typedef struct _cairo cairo_t;` —— 这个库里用得最多的类型 —— 恰好
是它唯一匹配不到的名字。
为什么一直没人发现,这才是要记的:
- cairo:唯一 import 那个模块的测试同时写了 #include <cairo.h>,头文件把模块
缺的都补上了。一个从没被要求独立站住的 import,不是被测试了,是被装饰了。
- displayinfo:没有任何测试点过一个枚举量。而且只在 GCC 上加一个也发现不了 ——
导出 enum 会让枚举量在 GCC 可见,clang 拒绝同一个文件。
它是从外面被发现的:gnome.pangocairo 不能混用两条消费路线,只能问模块要
cairo_t,结果什么都没拿到。pango 那一版因此自己扫了 cairo.h;现在 cairo 修好,
那个变通已经删掉,普通的 export import cairo; 就够了。
发布形态:这两个包用 release 资产而不是 tag 归档,所以走 -mcpp3 新资产,tag 不
动、零窗口。pango 重切 tag(sha 0882a260…,CN 容器 tag 1.56.1-5)。
⚠️ 验证时撞上了本地 store 按 (name, version) 索引的固定代价:已解开过 1.18.2 的
机器拿不到新资产,报 `failed to read compiled module`,清掉 store 条目才对。已
写进 §23.4。
cairo 的测试拆成两个文件,一条路线一个,module.cpp 一个头都不包;displayinfo 的
测试比较两个枚举量 —— 导出清单再塌陷就是编译错误。
五个示例 × 两条工具链全绿。
gnome.pangocairo 转出 cairo 的模块,所以改名要么两个包同时到达消费者,要么中间 有一段是坏的。一个 PR 做不到,原因是硬的:一个成员只能声明一个项目级 index repo (xlings#374 / mcpp#238),于是 tests/examples/pangocairo 不可能同时用本 PR 的 gnome.pango* 描述符和本 PR 的 freedesktop.cairo 描述符。 所以本 PR 只做 cairo / libdisplay-info;pango 保持 import freedesktop.cairo 和 cairo.h 变通不动(tarball 回滚重发,sha 19507c67…,CN 容器 tag 1.56.1-6), 合并之后再切。 我一度反过来做了 —— 代码是对的,次序是错的。理由已写进 gnome.pangocairo 的描述符 和设计文档 §23.5。 五个示例全绿。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
一、改名:索引 namespace 是货架标签,从不进模块名
freedesktop.cairofreedesktop.cairocairofreedesktop.libdisplay-infofreedesktop.displayinfodisplayinfocairo 是它自己的项目,freedesktop.org 托管 git 但不拥有那套接口;libdisplay-info 解析的是 VESA 的 EDID/DisplayID,
freedesktop.*这个模块前缀留给 freedesktop 自己的规范(像freedesktop.wayland.client)。同一条规则下freedesktop.egl导出的是khronos.egl。改名会让老消费者编译报错并点名模块 —— 最该发现问题的地方。
二、⭐ 而且两个包装体都不完备
cairocairo_t,以及全部 192 个枚举量displayinfocairo_t的原因很具体 —— 正则是cairo_[a-z0-9_]+_t,要求cairo_与_t之间至少有一个字符:这个库里用得最多的类型,恰好是它唯一匹配不到的名字。
为什么一直没人发现 —— 这才是要记的
#include <cairo.h>,头文件把模块缺的都补上了。三、它是从外面被发现的
gnome.pangocairo不能混用两条消费路线(pangocairo.h经 glib 到<stdio.h>,混用让struct _IO_FILE变成两个实体),所以它只能问模块要cairo_t—— 什么都没拿到。pango 那一版因此带了个变通:自己扫
cairo.h。现在 cairo 修好了,那个变通已经删掉,普通的export import cairo;就够了 —— 本来就该够。四、发布形态
cairo / libdisplay-info 用的是 release 资产而不是 tag 归档,所以走
-mcpp3新资产:tag 不动,零窗口,资产名自带修订号。pango 用 tag 归档,原地重切(sha0882a260…,CN 容器 tag1.56.1-5)。(name, version)索引,已解开过1.18.2的机器拿不到新资产,报failed to read compiled module,清掉 store 条目才对。已写进 §23.4。五、测试形态也改了
tests/module.cpp一个头都不包 —— 缺名字就是编译错误。验证
五个示例(cairo、libdisplay-info、pango、pangoft2、pangocairo)× 两条工具链(gcc 16.1 / llvm 22.1)全绿;两个 fork 仓库本地双绿。