Skip to content

test(sandbox): 闭环脚本纳入整条输入链和 RMLVO - #301

Merged
Sunrisepeak merged 3 commits into
mainfrom
feat/sandbox-input-chain
Aug 30, 2026
Merged

test(sandbox): 闭环脚本纳入整条输入链和 RMLVO#301
Sunrisepeak merged 3 commits into
mainfrom
feat/sandbox-input-chain

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

compat.libinput 发布后补进依赖表(它把 compat.libudev + compat.mtdev 一起拉进来),运行期加两段:libinput 经 libudev 起 context 并枚举 seat,以及 RMLVO 按名字编译真布局(XKB_CONFIG_ROOT 未设时只报告 —— 没有数据集的机器不是这里任何东西的缺陷)。

断言拆成两种,因为两半根本不是同一个问题

形态 判据 为什么
libudev kind = "shared" 来源 宿主有自己的 libudev.so.1,而 compat.libudev 故意用同一个 soname
libinput / libevdev / libmtdev / libxkbcommon / pixman kind = "lib" 缺席 对象并进消费者,正确构建下根本不该有 DT_NEEDED

把后者塞进原来那条「有没有解析到宿主」的 grep 是误导:它们永远匹配不到,而「没匹配到」会被读成「宿主没赢」,实际上是压根没东西可赢。

也没用 nm 查符号定义:strip 过的二进制没有 .symtab,会误报 FAIL;「没有共享库提供它」是同一主张的另一面,且不受 strip 影响。代码真在且能跑,由第 7 步证明。

实测

eco-2026-8-30-3,--sandbox --gpu,BRANCH=main:

===== 5. what the loader actually resolved =====
	libudev.so.1 => <project>/target/.../bin/libudev.so.1        ← 不是宿主那份
	libEGL.so.1 => <project>/target/.../bin/libEGL.so.1
	libGLESv2.so.2 => <project>/target/.../bin/libGLESv2.so.2
	...

===== 6. did anything come from the host? =====
  PASS: the host's copies were present and reachable, and none of them won

===== 6b. and the merged-in ones brought no shared library at all =====
  PASS: none of libinput/libevdev/libmtdev/libxkbcommon/pixman is a DT_NEEDED

===== 7. run it =====
  /dev/dri/renderD128   drm driver nvidia-drm    GL_VERSION OpenGL ES 3.2 Mesa 25.0.7
    glReadPixels         64 128 191 255 (wanted 64 128 191 255)
  /dev/dri/card0        drm driver simpledrm     gbm_bo_create 256x256 stride=1024
    glReadPixels         64 128 191 255 (wanted 64 128 191 255)
  reached EGL on a real device: yes
  drew and read the pixel back: yes

  -- input --
    libevdev  KEY_A -> KEY_A
    xkbcommon keycode 24 -> "q"
    libinput  assign_seat=0 fd=3 dispatch=0
    libinput came up on libudev: yes
    XKB_CONFIG_ROOT /home/speak/.xlings/subos/eco-2026-8-30-3/share/X11/xkb
    evdev/pc105/us  keycode 24 -> "q"
    the real us layout compiled: yes
  input chain answers: yes

===== RESULT =====
  PASS

libudev.so.1 那一行是这次新增里最有分量的:compat.libudev 故意用规范 soname,理由是 soname 复用能让源码构建与生态 payload 共存。这是那条判断第一次被放进「宿主有同名库、可达、就在 /usr/lib」的环境里正面检验 —— 而它赢了。

运行期那两条 libinput error: failed to find data files预期的(见 §10.9.2):quirks 数据集还没有提供方。枚举、事件、dispatch 全部正常,丢的是逐机型调校。

用法注释补了两条实测教训

  1. 要装 xim:xkeyboard-config 才会真跑 RMLVO 那半,否则只报告。
  2. --add-xpkg 验过的包,跑这个脚本前必须清 store —— xlings 按 (name, version) 查找且忽略 namespace,残留的 local:foo@1.0 会让 xim:foo@1.0install() 变成静默 no-op:payload 是空的,而 config() 照常跑并声明环境变量。在 xkeyboard-config 上撞过,看起来和「包坏了」一模一样。

文档

  • §10.8.1 记录这次运行
  • §10.10.1 记录 xim#733 那次回归:往 DISCOVERY 表加行同时是一次对现有提供方的改动 —— declare_subos_env 不传 only 就是「声明每一行」,所以 mesa 在表变长后开始声明它并不提供的键盘布局路径。检查清单因此是两项:新提供方要有两个调用,以及回头检查每个现有调用点传没传集合。

compat.libinput 发布后补进依赖表(它把 compat.libudev + compat.mtdev 一起拉进
来),运行期加两段:libinput 经 libudev 起 context 并枚举 seat,以及 RMLVO 按名字
编译真布局(XKB_CONFIG_ROOT 未设时只报告——没有数据集的机器不是这里任何东西的缺陷)。

断言拆成两种,因为两半根本不是同一个问题:

  kind = "shared" 的(现在多了 libudev)查**来源**——宿主有自己的 libudev.so.1,
  而 compat.libudev 故意用同一个 soname。

  kind = "lib" 的(libinput / libevdev / libmtdev / libxkbcommon / pixman)查
  **缺席**——对象并进消费者,正确构建下根本不该有 DT_NEEDED。

把后者塞进原来那条 grep 是误导:永远匹配不到,而「没匹配到」会被读成「宿主没赢」,
实际上是压根没东西可赢。也没用 nm 查符号定义:strip 过的二进制没有 .symtab 会误报
FAIL,而「没有共享库提供它」是同一主张的另一面且不受 strip 影响。

用法注释补了两条实测教训:要装 xim:xkeyboard-config 才会真跑 RMLVO 那半;以及用
--add-xpkg 验过的包跑这个脚本前必须清 store——xlings 按 (name, version) 查找且忽略
namespace,残留的 local:foo@1.0 会让 xim:foo@1.0 的 install() 变成静默 no-op。

eco-2026-8-30-3,--sandbox --gpu,BRANCH=main:

    libudev.so.1 => <project>/target/.../bin/libudev.so.1     ← 不是宿主那份
    PASS: the host's copies were present and reachable, and none of them won
    PASS: none of libinput/libevdev/libmtdev/libxkbcommon/pixman is a DT_NEEDED
    libinput  assign_seat=0 fd=3 dispatch=0
    evdev/pc105/us  keycode 24 -> "q"
    input chain answers: yes
    RESULT: PASS

文档 §10.8.1 记录这次运行,§10.10.1 记录 xim#733 那次回归——往 DISCOVERY 表加行
同时是一次对现有提供方的改动,因为 declare_subos_env 不传 only 就是「声明每一行」。
xim#734 补上 libinput-quirks 之后,把最后一格也变成断言,并做了一次性整体闭环
验证(不再分阶段)。

第 8 步的判据是**没有抱怨**,这不是偷懒而是唯一可观测的信号:两条数据变量都优雅
降级——不设也照样一路 PASS,libinput 用内置默认、xkbcommon 只编字符串 keymap。
所以它们必须有自己的检查:

    不设 LIBINPUT_QUIRKS_DIR:  libinput error: failed to find data files   ← 在
    设了:                      (无)                                         ← 没了

变量未设时报告而不失败——没装数据集的 subos 是合法配置,不是缺陷。
为此第 7 步改成捕获输出(仍原样打印),因为断言是关于 libinput 打了什么。

eco-2026-8-30-3,--sandbox --gpu,五个发现变量齐备:

    PASS: the host's copies were present and reachable, and none of them won
    PASS: none of libinput/libevdev/libmtdev/libxkbcommon/pixman is a DT_NEEDED
    glReadPixels 64 128 191 255 (wanted 64 128 191 255)   ×2 个 DRM 节点
    libinput  assign_seat=0 fd=3 dispatch=0
    evdev/pc105/us  keycode 24 -> "q"
    LIBINPUT_QUIRKS_DIR = .../share/libinput (52 files)
    ok: libinput loaded the quirks database
    XKB_CONFIG_ROOT     = .../share/X11/xkb (151 layouts)
    RESULT: PASS

文档:
- §10.8.2 这次一次性闭环验证的完整输出
- §10.9.3 libinput-quirks 已落地(xim#734),含「数据是不是构建出来的」这条判据
  ——它决定要不要重新发布归档;以及 install() 的 os 表是受限子集这个坑
- §10.9.4 USB_IDS_PATH 是**不该补**的那一格:libudev-zero 零个 getenv(机制不在),
  且 libinput 从不读那两个属性(补了也没用)。之前把它与 quirks 并列是错的
- §10.9.5 发行版为什么不需要这些变量:它们拥有 /usr。需要环境变量的是可重定位的
  那一类——Nix / Flatpak / Snap / Conda / 我们
- §10.10 发现变量表全部闭合,没有一格是留着的
@Sunrisepeak
Sunrisepeak merged commit 967ee1f into main Aug 30, 2026
3 of 16 checks passed
Sunrisepeak added a commit that referenced this pull request Aug 30, 2026
设计文档此前停在 #734,漏掉最后两个 PR,而它们恰好含本轮最可迁移的发现。

§11.1 完整变更集:八个 PR 两个仓,标出哪三个是回归修复。

§11.2 为什么不是单 PR。两条是硬约束、一条是我的失误,分开写:
  - 跨仓:一个 PR 无法跨两个 GitHub 仓库,而 §10.9 已论证这个切分是两个索引
    各做各建模的事;
  - 发布顺序:#301 的脚本从**已发布索引**解析 compat.libinput,只能在 #298
    合入并发布产物之后才可能被验证;
  - #733/#735 本可以不存在——它们修的是 #732 的回归,靠自我 review 而非新信息
    找到,所以合 #732 之前跑完检查清单就都在 #732 里了。清单是被这两次回归逼
    出来的,代价就是规则从事故里学、而事故已进历史。

§11.3 libs/** 三处缺席:前两处漏评审覆盖,第三处漏**交付**——#735 合了全绿、
镜像同步到位,xlings update 仍在发修复前那一版。这解释了本轮四处问题为什么
全部靠自我 review 发现、没有一处是 CI 抓到的。

§11.4 加一行 DISCOVERY = 三项检查,两项分别被 #733/#735 逼出来。

§11.5 最终状态,含用户侧产物核验(xim-index-ea36f6b.tar.gz)与两份数据归档
的双镜像 sha256 一致性。

头部状态从「待 review」改为「已实现并闭环验证(v1.0)」。
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