Skip to content

feat(libdisplay-info): 生成全部走 build.mcpp,并带模块 - #308

Merged
Sunrisepeak merged 1 commit into
mainfrom
feat/libdisplay-info-buildmcpp
Aug 30, 2026
Merged

feat(libdisplay-info): 生成全部走 build.mcpp,并带模块#308
Sunrisepeak merged 1 commit into
mainfrom
feat/libdisplay-info-buildmcpp

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

按规范重做:fork 的生成物不再用 sh + python 预生成再签进仓,改由 build.mcpp 产出 —— 它是 C++,mcpp 编译并运行它,所以这个包不需要 python3、sh 或任何外部工具

产物 内容
pnp-id-table.c 2583 行厂商表,写进 out dir
src/libdisplay-info.cppm 模块包装,206 个名字(130 类型 + 76 函数)

没有签进仓的生成物,也就没有「重生成再 diff」的 CI 步骤 —— 「数据与代码不一致」这个状态不存在。这是构建期生成和签生成物的本质区别。

模块解决一个真问题

七个公共头一个 extern "C" 都没有,C++ 消费者 #include 会 mangle 到链接失败。测试成员之前就得自己包一层:

import freedesktop.displayinfo;   // 包装做在模块内

测试已改成 import 并通过 —— 证明经索引也可用。模块是生成的,所以版本升级不会悄悄丢名字。

顺带:build.mcpp 的表比上游生成器更正确

pnp.idsDemoPad<U+00A0>Software<U+00A0>Ltd,U+00A0 编码是 c2 a0 两字节。上游按文本读、按码点转义成 \240 —— 单字节,不是 UTF-8,消费者打印会得到替换字符。build.mcpp字节转义成 \302\240

全文件 diff:2583 行,除几个非 ASCII 名字外完全一致,而那几个这边是对的。

只改了 pkgs/tests/examples/

按规范重做:fork 的生成物不再用 sh + python 预生成再签进仓,改由 build.mcpp
产出——它是 C++,mcpp 编译并运行它,所以这个包不需要 python3、sh 或任何外部工具。

  pnp-id-table.c            2583 行厂商表,写进 out dir
  src/libdisplay-info.cppm  模块包装,206 个名字(130 类型 + 76 函数)

没有签进仓的生成物,也就没有「重生成再 diff」的 CI 步骤——数据与代码不一致
这个状态不存在。这是构建期生成和签生成物的本质区别。

模块解决一个真问题:七个公共头一个 extern "C" 都没有,C++ 消费者 #include 会
mangle 到链接失败。测试成员之前就得自己包一层;现在 import freedesktop.displayinfo;
把包装做在模块内。测试已改成 import 并通过,证明经索引也可用。

顺带:build.mcpp 的表比上游生成器更正确。pnp.ids 里 U+00A0 编码是 c2 a0 两字节,
上游按文本读、按码点转义成 \240(单字节,不是 UTF-8);build.mcpp 按字节转义成
\302\240。全文件 diff:2583 行,除几个非 ASCII 名字外完全一致。

只改了 pkgs/ 与 tests/examples/。
@Sunrisepeak
Sunrisepeak merged commit 7741d10 into main Aug 30, 2026
11 checks passed
@Sunrisepeak
Sunrisepeak deleted the feat/libdisplay-info-buildmcpp branch August 30, 2026 14:16
Sunrisepeak added a commit that referenced this pull request Aug 30, 2026
§14 fork 的规范形态。本轮前半段用 sh + python 预生成、把产物签进仓——那是错的。
关键是我一开始判断错了 build.mcpp 是什么:它是 mcpp 编译并运行的 C++ 程序,
import mcpp; 给指令 API,所以任何「读文件、变换文本、写文件」的生成器都能在
里面做,不需要外部解释器。libdisplay-info(#308)是按新形态重做的样板。

  没有签进仓的生成物,所以也没有「重生成再 diff」的 CI 步骤——「数据与代码
  不一致」这个状态不存在。

§14.2 模块能顺手消掉一类上游缺陷:libdisplay-info 七个公共头一个 extern "C"
都没有,有了模块消费者就不用自己包。compat.libseat 有同样问题而没有模块,两者
对照说明模块层不只是风格。

§14.3 生成器可以比上游更正确:PNP 表逐行 diff 过,2583 行除几个非 ASCII 名字
外一致,而那几个这边是对的(上游按码点转义 U+00A0 成单字节 \240,不是 UTF-8)。

§15 fontconfig:我的估算错了。说过它「中,和 libinput 同量级」,实测 7 个生成物,
其中 fc-lang.py 387 行吃 281 个 .orth 文件编译成 FcCharSet 位图。已在 build.mcpp
里做通 5 个(含用二分查找替掉 gperf 完美哈希——唯一消费者只读一个字段,72 条目,
语义等价而少一个工具和一遍预处理)。剩下两个及建议的混合形态写在 §15.3。

§16 沙箱验证的盲点:合成 home 带的索引快照早于被测的包,脚本因此把一个已发布
一小时的包报成「找不到」。任何 --sandbox 里的验证第一步必须是 mcpp index update,
否则测的是镜像打包那天的生态。

只改 .agents/docs/,不触发任何 CI。
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