El build de libwayland falla: wayland-scanner produce headers de protocolo vacíos → wl_*/WL_SHM_FORMAT_* undeclared. Diagnóstico documentado en la receta y en docs/14-mesa-stack.md §Estado: el scanner sale 0 sin emitir; por stdin expat dice 'no element found at line 1 col 0' (input vacío). Descartado samurai-ordering (-j1 falla igual) y libexpat (estático, sin símbolos glibc-only). Resultados inconsistentes entre corridas (wayland.xml 165KB vs vacío) → sospecha de extracción .tar.xz no determinista, lectura de input miscompilada, o estado tocado por el farm. Siguiente: corrida aislada que verifique el tamaño del wayland.xml extraído. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6.3 KiB
SDD 14 — Stack gráfico (Mesa iris) para el escritorio tawasuyu
Estado: cola importada (2026-06-27). Contraparte en hammer del salto demo→producción de arje: el rootfs de producto necesita Mesa para que el greeter real de mirada (
mirada-greeter-llimphi) tome el DRM tras el handoff del splash. Seed de producción:tawasuyu/03_ukupacha/arje/seeds/arje-tawasuyu.card.json(entedisplay-manager-mesa). Ver su contrato rootfs enseeds/README.md.
Por qué iris-only (sin LLVM, sin Vulkan)
El target inmediato es una laptop Intel Iris Xe. El driver gallium iris
NO necesita LLVM (eso es radeonsi/llvmpipe). Recortando el build de Alpine
(que trae el kitchen-sink) a iris-only se elimina la cola pesada — clang, llvm,
libclc, spirv-llvm-translator, rust-bindgen, Vulkan, X11/glx:
-Dgallium-drivers=iris -Dvulkan-drivers= -Dllvm=disabled
-Dplatforms=wayland -Dglx=disabled -Dexpat=enabled
Eso deja un Mesa que sólo arrastra deps que hammer ya tiene o son chicas.
(Para AMD/NVIDIA-nouveau más adelante: radeonsi/nouveau sí piden LLVM →
otra rama del track.)
DAG de dependencias (estado contra el corpus actual)
| Tier | Receta | meson? | Estado en hammer | Notas |
|---|---|---|---|---|
| build | python3 |
— | 🟢 en store | meson/mako lo usan |
| build | meson |
— | 🟡 incoming | importada de Alpine 1.11.1; pyproject, necesita python3 |
| build | samurai (≡ninja) |
— | 🟡 incoming | 1.3, clon C de ninja (lo que usa Alpine) |
| build | pkgconf |
— | 🟢 receta | sustituto de pkg-config |
| build | bison / flex |
— | 🟢 receta | mesa genera parsers |
| build | mako (módulo py) |
— | ⚪ por verificar | templating de codegen de mesa; pip/source sobre python3 |
| lib | expat zlib zstd libffi |
— | 🟢 receta | deps de wayland/mesa |
| lib | libdrm |
sí | 🟡 incoming | 2.4.134; fijar -Dgallium? no — libdrm es agnóstico; link=dynamic |
| lib | wayland |
sí | 🟡 incoming | 1.25.0; deps expat+libffi; -Ddocumentation=false |
| lib | wayland-protocols |
sí | 🟡 incoming | 1.48; sólo datos (XML) + meson; dep wayland |
| lib | seatd (→libseat) |
sí | 🟡 incoming | la sesión de mirada abre el DRM vía libseat |
| top | mesa |
sí | 🟡 incoming | 26.1.1; recortar a iris-only (arriba); deps: libdrm, wayland, wayland-protocols, expat, zlib, zstd, python3+mako |
🟢 listo · 🟡 importada, falta adaptar (traducir abuild-meson/_abuild_phase
de Alpine a fases hammer + meson/samurai directos, como hizo elfutils) · ⚪ por crear.
Trabajo de adaptación por receta (lo real)
Las recetas en recipes/incoming/ son puntos de partida de import-alpine:
traen los parches musl de Alpine (lo valioso) pero usan los helpers de abuild que
el lab de hammer no tiene. Cada una necesita, mínimo:
- Reemplazar
abuild-mesonpormeson setup output --prefix=/usr --buildtype=release <-Dflags>y_abuild_phase/DESTDIR=/outpor las fasesconfigure/compile/installde hammer. compiler = "zig-cc",target = "x86_64-linux-musl",link = "dynamic"(son libs compartidas).- Declarar las deps de build en el grafo de hammer (no como
makedependsde Alpine). - Verificar
zig_versionsi zig 0.14 miscompila (patrón deelfutils/binutils/flex: fijar 0.13.0).
Orden de build (hojas→raíz): meson+samurai → libdrm,wayland → wayland-protocols,seatd → mesa.
Estado de build (2026-06-27)
Construidas y selladas en el store (hammer --store store build recipes/<x>.toml):
| Receta | Estado | Nota de adaptación |
|---|---|---|
samurai |
🟢 built | zig_version=0.13.0 (el default miscompila → reallocarray falla en runtime) |
meson |
🟢 built | Python puro: copia mesonbuild/+wrapper, sin wheel/gpep517; python3 runtime-dep |
libdrm |
🟢 built | core-only (todas las GPU helper disabled) → evita libpciaccess; iris usa libdrm core |
seatd |
🟢 built | -Dwerror=false (musl CMSG_NXTHDR dispara -Wsign-compare); logind disabled, backend seatd |
wayland |
🔴 bloqueada | wayland-scanner genera headers de protocolo vacíos → wl_*/WL_SHM_FORMAT_* undeclared al compilar libwayland. Debug (2026-06-27): el scanner corre, sale 0, no emite nada; por stdin, expat reporta «no element found at line 1 col 0» = recibe input vacío. Descartado: ordenamiento de samurai (falla con -j1), libexpat (estático, sin símbolos glibc-only). Resultados inconsistentes entre corridas (una vez protocol/wayland.xml=165 KB, otra vacío). Hipótesis vivas: (a) extracción del tarball .tar.xz truncada/no determinista en el lab, (b) scanner musl con lectura de input miscompilada, (c) estado compartido tocado por una corrida previa del farm (borró recipes/incoming/). Siguiente paso: corrida aislada (sin farm) que verifique el tamaño de protocol/wayland.xml extraído y trace la lectura del scanner. |
wayland-protocols |
⏸ bloqueada | build-depende de wayland (necesita wayland-scanner) |
mesa |
🟡 pendiente | recortar a iris-only (sin LLVM/Vulkan/X11); depende de libdrm✓+wayland+wayland-protocols+expat✓+zlib✓+zstd✓+python3✓+mako(⚪) |
meson anda con zig cc (clang 21) sobre proyectos meson — validado con libdrm y seatd. El cuello real restante es wayland (scanner) y luego mesa.
Lado tawasuyu (recetas Cargo, después de Mesa)
Modeladas sobre recipes/arje-zero.toml (fuente = monorepo tawasuyu a commit fijado, build hermético):
| Receta | bin | link | dep gráfica |
|---|---|---|---|
arje-splash |
/usr/lib/arje/arje-splash |
static-musl | sólo DRM dumb-buffer (sin Mesa) |
net-bring-up |
/usr/lib/arje/net-bring-up |
static-musl | ninguna |
mirada-greeter |
/usr/lib/arje/mirada-greeter-llimphi |
dynamic | EGL/GLES/GBM (mesa) + wayland + libseat |
mirada-greeter es el único que enlaza Mesa dinámico ⇒ bloqueado por el tier mesa.
Los otros dos pueden construirse e instalarse ya (no dependen de Mesa).
Hecho cuando
hammer bootstrap product produce un rootfs que, con la seed arje-tawasuyu,
arranca arje-zero → splash → mirada-greeter toma el DRM con Mesa/iris, sin
caer a texto. Verificación: boot en QEMU (con virgl/GPU) o metal en la laptop Iris Xe.