Etapa G: stack Mesa — 4/7 construidas (samurai, meson, libdrm, seatd)

Adapta las recetas importadas a fases hammer (meson/samurai directos, link=dynamic)
y construye+sella la base del stack gráfico para el escritorio tawasuyu:

- samurai: zig 0.13.0 (el default miscompila musl → reallocarray falla en runtime)
- meson:   Python puro, copia mesonbuild/+wrapper (sin wheel/gpep517 que hammer no tiene)
- libdrm:  core-only (GPU helpers disabled) → sin libpciaccess; iris usa libdrm core
- seatd:   libseat.so.1, -Dwerror=false (CMSG_NXTHDR de musl dispara -Wsign-compare)

Pendiente (docs/14-mesa-stack.md §Estado): wayland (los headers de wayland-scanner
no aparecen, prob. libexpat.so en el scanner), wayland-protocols (bloqueada por
wayland) y mesa (la grande, recortada iris-only). meson validado con zig cc sobre
proyectos meson reales (libdrm, seatd).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-26 23:58:37 -04:00
co-authored by Claude Opus 4.8
parent e6ee70d783
commit 99bbeac54a
5 changed files with 97 additions and 21 deletions
+17
View File
@@ -56,6 +56,23 @@ el lab de hammer no tiene. Cada una necesita, mínimo:
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` | 🟡 **WIP** | falla: `wl_callback_add_listener`/`wl_registry_interface` undeclared → los headers que genera `wayland-scanner` no aparecen. Hipótesis: el scanner (host tool) no encuentra `libexpat.so` al correr durante el build → produce headers vacíos. Probar expat estático o `LD_LIBRARY_PATH` de las deps en la fase. |
| `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):
+11 -21
View File
@@ -1,34 +1,24 @@
# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
# samurai 1.3 — clon C de ninja (lo que usa Alpine como `ninja`). Build-tool del stack meson
# (libdrm/wayland/mesa lo invocan como backend). Provee /usr/bin/samu + symlink /usr/bin/ninja.
# zig 0.13.0: con el zig default (0.16/clang21) el binario musl miscompila y falla en runtime
# con "reallocarray: No error information" — el patrón conocido (binutils/elfutils/flex).
name = "samurai"
version = "1.3"
[source]
tarball = "https://github.com/michaelforney/samurai/releases/download/1.3/samurai-1.3.tar.gz"
# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
# sha512 = "f155745fdb90cca07d8e7178e60337173fee3a8f1dadc3773a80fe189f5864229afb409d946fb2a418820d7e6ef8332cd9e3e3627abd170146802277f30b4b4e"
sha256 = "1bc020a9e133432df51911ac71cc34322f828934d9a2282ba2916d88c15976af"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
zig_version = "0.13.0"
[build.phases]
# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
compile = '''
_abuild_phase() {
make CFLAGS="${CFLAGS//-Os/-O2}"
}
_abuild_phase
'''
# de package() de Alpine (traducido $pkgdir→/out):
compile = 'make CFLAGS="-O2"'
install = '''
_abuild_phase() {
set -e
make install PREFIX="/usr" DESTDIR="/out"
ln -s samu "/out"/usr/bin/ninja
}
_abuild_phase
ln -s samu /out/usr/bin/ninja
'''
+23
View File
@@ -0,0 +1,23 @@
# seatd 0.9.3 — daemon de gestión de seats + libseat. mirada abre el nodo DRM (master) vía
# libseat tras el handoff del splash. Backend seatd (sin logind/elogind — no lo tenemos ni lo
# queremos en el rootfs arje). Sin man-pages (evita scdoc) ni ejemplos. zig 0.13.0 (patrón musl).
name = "seatd"
version = "0.9.3"
[source]
tarball = "https://git.sr.ht/~kennylevinsen/seatd/archive/0.9.3.tar.gz"
sha256 = "302564d54d8e28191fadfd734f2675ecb0c9e0615a58011b89ef15dfa4dbaa96"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
zig_version = "0.13.0"
[build.phases]
configure = "meson setup output --prefix=/usr --buildtype=release -Dwerror=false -Dlibseat-logind=disabled -Dlibseat-seatd=enabled -Dserver=enabled -Dman-pages=disabled -Dexamples=disabled"
compile = "ninja -C output"
install = "DESTDIR=/out ninja -C output install"
[deps]
build = ["meson", "samurai", "python3", "pkgconf"]
+22
View File
@@ -0,0 +1,22 @@
# wayland-protocols 1.48 — colección de extensiones de protocolo Wayland (XML + .pc). No compila
# nada: instala los XML que mirada/clientes usan vía wayland-scanner. build-dep wayland (la build
# de meson chequea wayland-scanner). Sin tests.
name = "wayland-protocols"
version = "1.48"
[source]
tarball = "https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/1.48/downloads/wayland-protocols-1.48.tar.xz"
sha256 = "398036ac0eb6484982ddbde7ff86848d753231f9cdeeae983f06b52946625aa1"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
[build.phases]
configure = "meson setup output --prefix=/usr --buildtype=release -Dtests=false"
compile = "ninja -C output"
install = "DESTDIR=/out ninja -C output install"
[deps]
build = ["meson", "samurai", "python3", "pkgconf", "wayland"]
+24
View File
@@ -0,0 +1,24 @@
# wayland 1.25.0 — libwayland-client/server + wayland-scanner. Lo enlaza mirada (smithay) y Mesa
# (plataforma wayland). Proyecto meson. Sin docs/tests; sin dtd_validation para no arrastrar
# 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.
name = "wayland"
version = "1.25.0"
[source]
tarball = "https://gitlab.freedesktop.org/wayland/wayland/-/releases/1.25.0/downloads/wayland-1.25.0.tar.xz"
sha256 = "c065f040afdff3177680600f249727e41a1afc22fccf27222f15f5306faa1f03"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
zig_version = "0.13.0"
[build.phases]
configure = "meson setup output --prefix=/usr --buildtype=release -Ddocumentation=false -Dtests=false -Ddtd_validation=false -Ddefault_library=both"
compile = "ninja -C output"
install = "DESTDIR=/out ninja -C output install"
[deps]
build = ["meson", "samurai", "python3", "pkgconf", "libffi", "expat"]