tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1463Shell 157Markdown 91Rust 853029 Definiciones

⎇ 060e24e5649f16434ae127cc513486af99b60234 docs/14-mesa-stack.md Markdown · 93 líneas · 6.3 KB Historia crudo

Etapa G: debug wayland-scanner — genera headers vacíos (input vacío a expat) 060e24e56 · sergio ·

1# SDD 14 — Stack gráfico (Mesa iris) para el escritorio tawasuyu
2
3> **Estado:** cola importada (2026-06-27). Contraparte en hammer del salto
4> demo→producción de arje: el rootfs de producto necesita **Mesa** para que el
5> greeter real de mirada (`mirada-greeter-llimphi`) tome el DRM tras el handoff
6> del splash. Seed de producción: `tawasuyu/03_ukupacha/arje/seeds/arje-tawasuyu.card.json`
7> (ente `display-manager-mesa`). Ver su contrato rootfs en `seeds/README.md`.
8
9## Por qué iris-only (sin LLVM, sin Vulkan)
10
11El target inmediato es una laptop **Intel Iris Xe**. El driver gallium **`iris`
12NO necesita LLVM** (eso es `radeonsi`/`llvmpipe`). Recortando el build de Alpine
13(que trae el kitchen-sink) a iris-only se elimina la cola pesada — clang, llvm,
14libclc, spirv-llvm-translator, rust-bindgen, Vulkan, X11/glx:
15
16```
17-Dgallium-drivers=iris   -Dvulkan-drivers=   -Dllvm=disabled
18-Dplatforms=wayland      -Dglx=disabled      -Dexpat=enabled
19```
20
21Eso deja un Mesa que sólo arrastra deps que hammer ya tiene o son chicas.
22(Para AMD/NVIDIA-nouveau más adelante: `radeonsi`/`nouveau` sí piden LLVM →
23otra rama del track.)
24
25## DAG de dependencias (estado contra el corpus actual)
26
27| Tier | Receta | meson? | Estado en hammer | Notas |
28|---|---|---|---|---|
29| build | `python3` | — | 🟢 en store | meson/mako lo usan |
30| build | `meson` | — | 🟡 incoming | importada de Alpine 1.11.1; pyproject, necesita python3 |
31| build | `samurai` (≡ninja) | — | 🟡 incoming | 1.3, clon C de ninja (lo que usa Alpine) |
32| build | `pkgconf` | — | 🟢 receta | sustituto de pkg-config |
33| build | `bison` / `flex` | — | 🟢 receta | mesa genera parsers |
34| build | `mako` (módulo py) | — | ⚪ por verificar | templating de codegen de mesa; pip/source sobre python3 |
35| lib | `expat` `zlib` `zstd` `libffi` | — | 🟢 receta | deps de wayland/mesa |
36| lib | `libdrm` | sí | 🟡 incoming | 2.4.134; **fijar `-Dgallium`? no** — libdrm es agnóstico; `link=dynamic` |
37| lib | `wayland` | sí | 🟡 incoming | 1.25.0; deps expat+libffi; `-Ddocumentation=false` |
38| lib | `wayland-protocols` | sí | 🟡 incoming | 1.48; sólo datos (XML) + meson; dep wayland |
39| lib | `seatd` (→`libseat`) | sí | 🟡 incoming | la sesión de mirada abre el DRM vía libseat |
40| **top** | `mesa` | sí | 🟡 incoming | 26.1.1; recortar a iris-only (arriba); deps: libdrm, wayland, wayland-protocols, expat, zlib, zstd, python3+mako |
41
42🟢 listo · 🟡 importada, **falta adaptar** (traducir `abuild-meson`/`_abuild_phase`
43de Alpine a fases hammer + `meson`/`samurai` directos, como hizo `elfutils`) · ⚪ por crear.
44
45## Trabajo de adaptación por receta (lo real)
46
47Las recetas en `recipes/incoming/` son **puntos de partida** de `import-alpine`:
48traen los parches musl de Alpine (lo valioso) pero usan los helpers de abuild que
49el lab de hammer no tiene. Cada una necesita, mínimo:
50
511. Reemplazar `abuild-meson` por `meson setup output --prefix=/usr --buildtype=release <-Dflags>`
52   y `_abuild_phase`/`DESTDIR=/out` por las fases `configure`/`compile`/`install` de hammer.
532. `compiler = "zig-cc"`, `target = "x86_64-linux-musl"`, `link = "dynamic"` (son libs compartidas).
543. Declarar las deps de build en el grafo de hammer (no como `makedepends` de Alpine).
554. Verificar `zig_version` si zig 0.14 miscompila (patrón de `elfutils`/`binutils`/`flex`: fijar 0.13.0).
56
57Orden de build (hojas→raíz): `meson`+`samurai` → `libdrm`,`wayland` → `wayland-protocols`,`seatd` → `mesa`.
58
59## Estado de build (2026-06-27)
60
61Construidas y selladas en el store (`hammer --store store build recipes/<x>.toml`):
62
63| Receta | Estado | Nota de adaptación |
64|---|---|---|
65| `samurai` | 🟢 **built** | `zig_version=0.13.0` (el default miscompila → `reallocarray` falla en runtime) |
66| `meson` | 🟢 **built** | Python puro: copia `mesonbuild/`+wrapper, sin wheel/gpep517; `python3` runtime-dep |
67| `libdrm` | 🟢 **built** | core-only (todas las GPU helper disabled) → evita libpciaccess; iris usa libdrm core |
68| `seatd` | 🟢 **built** | `-Dwerror=false` (musl `CMSG_NXTHDR` dispara `-Wsign-compare`); logind disabled, backend seatd |
69| `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. |
70| `wayland-protocols` | ⏸ **bloqueada** | build-depende de wayland (necesita wayland-scanner) |
71| `mesa` | 🟡 **pendiente** | recortar a iris-only (sin LLVM/Vulkan/X11); depende de libdrm✓+wayland+wayland-protocols+expat✓+zlib✓+zstd✓+python3✓+mako(⚪) |
72
73meson anda con zig cc (clang 21) sobre proyectos meson — validado con libdrm y seatd. El cuello real
74restante es **wayland** (scanner) y luego **mesa**.
75
76## Lado tawasuyu (recetas Cargo, después de Mesa)
77
78Modeladas sobre `recipes/arje-zero.toml` (fuente = monorepo tawasuyu a commit fijado, build hermético):
79
80| Receta | bin | link | dep gráfica |
81|---|---|---|---|
82| `arje-splash` | `/usr/lib/arje/arje-splash` | static-musl | sólo DRM dumb-buffer (sin Mesa) |
83| `net-bring-up` | `/usr/lib/arje/net-bring-up` | static-musl | ninguna |
84| `mirada-greeter` | `/usr/lib/arje/mirada-greeter-llimphi` | **dynamic** | EGL/GLES/GBM (mesa) + wayland + libseat |
85
86`mirada-greeter` es el único que enlaza Mesa dinámico ⇒ **bloqueado por el tier `mesa`**.
87Los otros dos pueden construirse e instalarse ya (no dependen de Mesa).
88
89## Hecho cuando
90
91`hammer bootstrap product` produce un rootfs que, con la seed `arje-tawasuyu`,
92arranca `arje-zero` → splash → `mirada-greeter` toma el DRM con Mesa/iris, sin
93caer a texto. Verificación: boot en QEMU (con virgl/GPU) o metal en la laptop Iris Xe.

14-mesa-stack.md

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 (ente display-manager-mesa). Ver su contrato rootfs en seeds/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)

TierRecetameson?Estado en hammerNotas
buildpython3—🟢 en storemeson/mako lo usan
buildmeson—🟡 incomingimportada de Alpine 1.11.1; pyproject, necesita python3
buildsamurai (≡ninja)—🟡 incoming1.3, clon C de ninja (lo que usa Alpine)
buildpkgconf—🟢 recetasustituto de pkg-config
buildbison / flex—🟢 recetamesa genera parsers
buildmako (módulo py)—⚪ por verificartemplating de codegen de mesa; pip/source sobre python3
libexpat zlib zstd libffi—🟢 recetadeps de wayland/mesa
liblibdrmsí🟡 incoming2.4.134; fijar -Dgallium? no — libdrm es agnóstico; link=dynamic
libwaylandsí🟡 incoming1.25.0; deps expat+libffi; -Ddocumentation=false
libwayland-protocolssí🟡 incoming1.48; sólo datos (XML) + meson; dep wayland
libseatd (→libseat)sí🟡 incomingla sesión de mirada abre el DRM vía libseat
topmesasí🟡 incoming26.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:

  1. Reemplazar abuild-meson por meson setup output --prefix=/usr --buildtype=release <-Dflags> y _abuild_phase/DESTDIR=/out por las fases configure/compile/install de hammer.
  2. compiler = "zig-cc", target = "x86_64-linux-musl", link = "dynamic" (son libs compartidas).
  3. Declarar las deps de build en el grafo de hammer (no como makedepends de Alpine).
  4. Verificar zig_version si zig 0.14 miscompila (patrón de elfutils/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):

RecetaEstadoNota de adaptación
samurai🟢 builtzig_version=0.13.0 (el default miscompila → reallocarray falla en runtime)
meson🟢 builtPython puro: copia mesonbuild/+wrapper, sin wheel/gpep517; python3 runtime-dep
libdrm🟢 builtcore-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🔴 bloqueadawayland-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⏸ bloqueadabuild-depende de wayland (necesita wayland-scanner)
mesa🟡 pendienterecortar 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):

Recetabinlinkdep gráfica
arje-splash/usr/lib/arje/arje-splashstatic-muslsólo DRM dumb-buffer (sin Mesa)
net-bring-up/usr/lib/arje/net-bring-upstatic-muslninguna
mirada-greeter/usr/lib/arje/mirada-greeter-llimphidynamicEGL/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.