Etapa G: wayland root cause CONFIRMADO — scanner musl lee input vacío
Verificado que la fuente extraída protocol/wayland.xml está completa (165075 B) y
expat OK ⇒ el wayland-scanner compilado static-musl recibe el XML completo pero
emite headers vacíos y sale 0 (bug de runtime, falla con zig default y 0.13.0). FIX
recomendado: construir el scanner NATIVO (build-time only, no se shippea) y apuntar
libwayland al scanner externo; libwayland-{client,server} sí con musl/zig.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
2 archivos · +13 −10
- docs/14-mesa-stack.md +1 −1
- recipes/wayland.toml +12 −9
diff --git a/docs/14-mesa-stack.md b/docs/14-mesa-stack.md
index cd8187fd..7a4613ef 100644
--- a/docs/14-mesa-stack.md
+++ b/docs/14-mesa-stack.md
@@ -66,7 +66,7 @@ Construidas y selladas en el store (`hammer --store store build recipes/<x>.toml
| `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` | 🔴 **bloqueada — root cause confirmado** | `wayland-scanner` genera headers de protocolo **vacíos** → `WL_SHM_FORMAT_*`/`wl_*` undeclared. **Confirmado (2026-06-27):** la fuente extraída `work/sources/wayland-*/protocol/wayland.xml` está COMPLETA (165075 B), expat OK, no es ordenamiento de samurai (`-j1` falla igual). El scanner recibe el XML completo pero **emite vacío, sale 0** (por stdin expat: «no element found» = lee 0 bytes). ⇒ **bug de runtime del wayland-scanner compilado static-musl** (falla con zig default Y 0.13.0). **FIX:** el scanner es herramienta de build-time (no se shippea) ⇒ construirlo **nativo (host/glibc)** y apuntar libwayland al scanner externo; construir sólo libwayland-{client,server} con musl/zig. Alt: patchear la lectura de input del scanner para musl. |
| `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(⚪) |
diff --git a/recipes/wayland.toml b/recipes/wayland.toml
index 2471d27d..19690544 100644
--- a/recipes/wayland.toml
+++ b/recipes/wayland.toml
@@ -3,15 +3,18 @@
# libxml2. Core enlaza libffi; wayland-scanner usa expat (ambos ya en hammer). zig 0.13.0 por el
# patrón musl (evita miscompilación del zig default). link=dynamic: shared libs.
#
-# ⚠ BLOQUEADA (2026-06-27): el build de libwayland falla porque wayland-scanner genera
-# headers de protocolo VACÍOS (`wl_callback_add_listener`, `WL_SHM_FORMAT_ARGB8888`, …
-# undeclared). Diagnóstico: el scanner corre y sale 0 pero no emite nada; alimentado por stdin
-# expat reporta «no element found at line 1 col 0» = recibe input vacío. Resultados
-# INCONSISTENTES entre corridas (una vez protocol/wayland.xml medía 165 KB, otra parecía vacío)
-# + un proceso de la granja concurrente que muta el área de build compartida (ya borró
-# recipes/incoming/ y mete ruido en los logs). Falta una corrida AISLADA (farm detenido) para
-# discriminar: (a) extracción de fuente truncada, (b) scanner musl con lectura de input
-# miscompilada, (c) interferencia del farm. Ver docs/14-mesa-stack.md §Estado de build.
+# ⚠ BLOQUEADA (2026-06-27) — ROOT CAUSE CONFIRMADO: el build de libwayland falla porque
+# wayland-scanner genera headers de protocolo VACÍOS (`WL_SHM_FORMAT_ARGB8888`, … undeclared).
+# Verificado: la fuente extraída `work/sources/wayland-*/protocol/wayland.xml` está COMPLETA
+# (165075 bytes), expat está OK (estático, sin símbolos glibc-only), y NO es ordenamiento de
+# samurai (-j1 falla igual). El scanner recibe el XML completo pero emite vacío y sale 0; por
+# stdin expat dice «no element found» = lee 0 bytes. ⇒ es un BUG DE RUNTIME del wayland-scanner
+# compilado static-musl en el lab (falla con zig default Y 0.13.0 — no es la regresión de zig).
+#
+# FIX recomendado: wayland-scanner es herramienta de BUILD-TIME (no se shippea al rootfs) ⇒
+# construirlo NATIVO (host/glibc) y apuntar el build de libwayland al scanner externo
+# (`find_program('wayland-scanner')` / wrap de meson), construyendo sólo libwayland-{client,server}
+# con musl/zig. Alternativa: patchear la lectura de input del scanner para musl. Ver docs/14 §Estado.
name = "wayland"
version = "1.25.0"