Skip to content

fix(模块): 托管方不是负责方 —— 改名 cairo/displayinfo,并补齐两个不完备的包装体 - #328

Merged
Sunrisepeak merged 2 commits into
mainfrom
feat/module-names
Aug 31, 2026
Merged

fix(模块): 托管方不是负责方 —— 改名 cairo/displayinfo,并补齐两个不完备的包装体#328
Sunrisepeak merged 2 commits into
mainfrom
feat/module-names

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

一、改名:索引 namespace 是货架标签,从不进模块名

包(索引键) 旧模块名 新模块名
freedesktop.cairo freedesktop.cairo cairo
freedesktop.libdisplay-info freedesktop.displayinfo displayinfo

cairo 是它自己的项目,freedesktop.org 托管 git 但不拥有那套接口;libdisplay-info 解析的是 VESA 的 EDID/DisplayID,freedesktop.* 这个模块前缀留给 freedesktop 自己的规范(像 freedesktop.wayland.client)。同一条规则下 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.h:135 */

这个库里用得最多的类型,恰好是它唯一匹配不到的名字。

为什么一直没人发现 —— 这才是要记的

  • cairo:唯一 import 那个模块的测试同时写了 #include <cairo.h>,头文件把模块缺的都补上了。

    一个从没被要求独立站住的 import,不是被测试了,是被装饰了。

  • displayinfo:没有任何测试点过一个枚举量。而且只在 GCC 上加一个也发现不了 —— 导出 enum 会让枚举量在 GCC 可见,clang 拒绝同一个文件(§21.5 那条)。

三、它是从外面被发现的

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 归档,原地重切(sha 0882a260…,CN 容器 tag 1.56.1-5)。

⚠️ 验证时撞上了「包版本与上游对齐」的固定代价:本地 store 按 (name, version) 索引,已解开过 1.18.2 的机器拿不到新资产,报 failed to read compiled module,清掉 store 条目才对。已写进 §23.4。

五、测试形态也改了

  • cairo:拆成两个文件,一条路线一个。tests/module.cpp 一个头都不包 —— 缺名字就是编译错误。
  • displayinfo:比较两个枚举量,导出清单再塌陷就是编译错误。

验证

五个示例(cairo、libdisplay-info、pango、pangoft2、pangocairo)× 两条工具链(gcc 16.1 / llvm 22.1)全绿;两个 fork 仓库本地双绿。

改名: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。

五个示例全绿。
@Sunrisepeak
Sunrisepeak merged commit d1151b8 into main Aug 31, 2026
11 checks passed
@Sunrisepeak
Sunrisepeak deleted the feat/module-names branch August 31, 2026 14:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant