cosmic: libxkbcommon va en TODA la cola — la dep no se deduce de la función del paquete

cosmic-idle se escribió sin [deps] con un argumento que parecía sólido: no usa
smithay-client-toolkit (el que hizo caer a cosmic-bg) y un demonio de inactividad
no interpreta teclas. Reventó igual, pero en el ENLACE y no en un build.rs:
-lxkbcommon lo arrastra cosmic-settings-config, de donde sale la tabla de atajos
y que usa TODO componente de la suite. La dep no viene de lo que el paquete hace
sino de la librería de configuración común.

Dos veces el mismo error de método con dos razonamientos distintos, y las dos
veces el mensaje decía exactamente quién y por qué. Queda en el runbook como
regla, no como anécdota.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-03 11:08:00 -04:00
co-authored by Claude Opus 5
parent 1355fc1650
commit 2b5d518486
2 changed files with 33 additions and 10 deletions
+20 -6
View File
@@ -95,12 +95,26 @@ separa la capa de UI del transporte; sin él, las dos preguntas llegan juntas.
6. **Las features de smithay que asustan no cuestan deps de build**: `backend_vulkan` (crate `ash`),
`backend_x11` (`x11rb` con `dl-libxcb`) y `xwayland` cargan todo por **dlopen**. Son deuda de
RUNTIME —libxcb y vulkan-loader viven hoy sólo en la cola KDE—, no un muro de compilación.
7. **«Habla Wayland en Rust» ≠ «no toca C».** cosmic-bg se escribió sin `[deps]` con ese argumento y
reventó en el `build.rs` de `smithay-client-toolkit` pidiendo `xkbcommon.pc`: **sctk ENLAZA
libxkbcommon**; el que la dlopea es `winit`, que es otra capa. Hablar el protocolo en Rust dice
cómo viaja el byte, no con qué se interpreta un teclado. `libxkbcommon` + `pkgconf` en `[deps]`, y
el `link = "static"` sigue siendo verdad porque su artefacto trae `.a` además de `.so`.
**Corolario para el resto de la cola: todo cliente de la suite va a necesitar al menos esos dos.**
7. **`libxkbcommon` + `pkgconf` van en TODA la cola, sin excepción — incluso en las piezas sin
interfaz.** Se aprendió dos veces, con dos razonamientos distintos y los dos equivocados:
- `cosmic-bg` fue sin `[deps]` porque «habla el protocolo en Rust y no toca C». Reventó en el
`build.rs` de `smithay-client-toolkit` pidiendo `xkbcommon.pc`: **sctk ENLAZA libxkbcommon**; el
que la dlopea es `winit`, que es otra capa. Hablar Wayland en Rust dice cómo viaja el byte, no
con qué se interpreta un teclado.
- `cosmic-idle` fue sin `[deps]` porque *ese* argumento ya no aplicaba —no usa sctk— y un demonio
de inactividad no interpreta teclas. Reventó en el ENLACE con `-lxkbcommon`, arrastrado por
**`cosmic-settings-config`**: de ahí sale la tabla de atajos y la usa **todo** componente de la
suite. La dep no viene de lo que el paquete hace, sino de la librería de configuración común.
La lección de método vale más que la dep: **la dep no se deduce de la función del paquete.** Está
escrita en el `build.rs` que panickea o en la línea de enlace, y las dos veces el error dijo
exactamente quién y por qué. El `link = "static"` sobrevive porque el artefacto de libxkbcommon
trae `.a` además de `.so`.
8. **Una feature apagada en el paquete puede estar prendida por otro.** `cosmic-bg` declara `image`
con `default-features = false` y sin AVIF, y aun así compila `dav1d-sys`: **las features de cargo
se UNIFICAN en el grafo**. Se resolvió trayendo `dav1d` (b3:aab7a874) en vez de parchear el
Cargo.toml de upstream — si el grafo dice que sabe decodificar AVIF, que lo sepa de verdad.
Mismo modo de falla que un `.pc Requires` arrastrando una dep que nadie declaró.
## Cómo se construye
+13 -4
View File
@@ -2,10 +2,16 @@
# `wayland-client` + los protocolos `staging`/`wlr` de idle-notify, `calloop` para el bucle, y zbus
# contra UPower para saber si hay batería.
#
# Sin `[deps]` a propósito y no por descuido: a diferencia de cosmic-bg NO usa smithay-client-toolkit
# —que es quien enlaza libxkbcommon (ver el gotcha 7 del runbook)—, y no necesita interpretar teclas:
# le alcanza con que el compositor le avise que nadie tocó nada. Si el build pide un `.pc`, el que lo
# pide se ve en el `build.rs` que panickea, y eso es un dato, no una conjetura.
# ── LLEVA libxkbcommon, Y EL RAZONAMIENTO DE QUE NO HACÍA FALTA ERA BUENO Y FALSO ───────────────
# Se escribió sin `[deps]` con este argumento: no usa smithay-client-toolkit —que es quien enlaza
# libxkbcommon— y un demonio de inactividad no interpreta teclas, le alcanza con que el compositor le
# avise que nadie tocó nada. El enlace lo refutó: `-lxkbcommon`, arrastrado por
# **`cosmic-settings-config`**, que es de donde sale la tabla de atajos y **la usa TODO componente de
# la suite**. O sea que la dep no viene de lo que el programa hace, sino de la librería de
# configuración común — y por eso no se deduce mirando la función del paquete.
#
# La conclusión general está en el gotcha 7 del runbook: `libxkbcommon` + `pkgconf` van en TODA la
# cola, sin excepción, incluso en las piezas sin interfaz.
name = "cosmic-idle"
version = "1.5.0"
@@ -25,3 +31,6 @@ mkdir -p /out/usr/bin
cp target/release/cosmic-idle /out/usr/bin/cosmic-idle
chmod 755 /out/usr/bin/cosmic-idle
'''
[deps]
build = ["libxkbcommon", "pkgconf"]