From c13d25f02bd408ab5d385060443e522fc1e69c5e Mon Sep 17 00:00:00 2001 From: sergio Date: Fri, 7 Aug 2026 20:24:34 -0400 Subject: [PATCH] =?UTF-8?q?wlroots=200.18.2=20SELLADA=20=E2=80=94=20el=20d?= =?UTF-8?q?esbloqueo=20del=20frente=20de=20WMs=20Wayland=20ligeros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Primera receta del frente nuevo. wlroots es la biblioteca de la que cuelgan casi todos los compositores ligeros (sway, labwc, river, hyprland): sin ella no hay ninguno, y con ella los compositores salen baratos porque no traen torre de C debajo. Hasta hoy el catálogo tenía de toda esa familia sólo `foot` y `mako`. b3:9b56bac0d00977524072cf393ecc9f0b847fcc1a0bfba9d9c4d57fd9a4a74b44 · 13 MB · construida en el worker (cadena GUI: no se rebuildea en el laptop por el zig-skew). COLA AISLADA `incoming-wlr/`, porque otro agente comparte el repo. Como la resolución de deps es hermano→padre, una receta de acá ve el corpus pero NO ve `incoming-gnome/`, donde viven `libdisplay-info` y `hwdata` ⇒ se copian como hermanas. No duplica trabajo: los ficheros son idénticos, el ArtifactHash es el mismo y el build hace cache-hit. Verificado antes de construir: ambas dan el mismo b3: que su original. LAS OPCIONES, VERIFICADAS CONTRA EL meson_options.txt DEL TARBALL, no de memoria — porque una opción `-D` inventada NO se ignora: meson aborta en la primera desconocida. Es exactamente lo que tenía muerta a gnome-session con su `-Dsystemd=false`. El `.pc` resultante confirma que salió lo pedido: have_drm_backend=true, have_libinput_backend=true, have_gles2_renderer=true, have_gbm_allocator=true, have_session=true, y have_x11_backend / have_xwayland en FALSE — la distro es Wayland pura y X11 es deuda aparcada por diseño; no entra por la puerta de atrás. DOS COSAS QUE COSTARON UNA ITERACIÓN CADA UNA: · `-Dwerror=false` no es pereza, es DIFERENCIA DE TOOLCHAIN. wlroots compila con -Werror y upstream lo valida con gcc; nuestro `zig cc` es clang y avisa de lo que gcc calla. Murió en `types/wlr_shm.c:503` por `-Wunused-but-set-variable` sobre has_argb8888/has_xrgb8888 — código correcto que sólo clang señala. Tratar los avisos de OTRO compilador como errores del proyecto es un fallo de método, no un hallazgo de calidad. · `libffi`, `expat` y `zlib` en deps aunque wlroots no los use: los exigen los `.pc` de wayland y mesa en su `Requires`, y pkgconf resuelve el grafo de .pc completo antes de dar un cflag. Misma lección que wlr-randr esta mañana. El artefacto trae `libwlroots-0.18.{a,so}`, su .pc y 111 cabeceras bajo `usr/include/wlroots-0.18/wlr/`. Listo para que sway enlace contra él. Co-Authored-By: Claude Opus 5 (1M context) --- recipes/incoming-wlr/hwdata.toml | 24 +++++++ recipes/incoming-wlr/libdisplay-info.toml | 25 +++++++ recipes/incoming-wlr/wlroots.toml | 82 +++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 recipes/incoming-wlr/hwdata.toml create mode 100644 recipes/incoming-wlr/libdisplay-info.toml create mode 100644 recipes/incoming-wlr/wlroots.toml diff --git a/recipes/incoming-wlr/hwdata.toml b/recipes/incoming-wlr/hwdata.toml new file mode 100644 index 00000000..e8cc8ced --- /dev/null +++ b/recipes/incoming-wlr/hwdata.toml @@ -0,0 +1,24 @@ +# hwdata 0.393 — bases de datos de IDs de hardware (pnp.ids, pci.ids, usb.ids) + hwdata.pc. Sin código: +# sólo datos. Campaña KDE (ADR 0011): lo exige libdisplay-info en tiempo de build (dependency('hwdata') +# native → pkgdatadir/pnp.ids) y kwin como RUNTIME (find_package(hwdata) TYPE RUNTIME, tabla PNP de EDID). +# `configure` es un script shell propio (no autoconf); no compila nada. +name = "hwdata" +version = "0.393" + +[source] +tarball = "https://github.com/vcrhonek/hwdata/archive/refs/tags/v0.393.tar.gz" +sha256 = "322add86944680e99d04468d49de180a7ce0c77fb406f7abde8ab14f2d161051" + +[build] +compiler = "gcc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = './configure --prefix=/usr --libdir=/usr/lib --datadir=/usr/share' +compile = 'true' +install = 'make install DESTDIR=/out' + +[deps] +build = ["pkgconf"] diff --git a/recipes/incoming-wlr/libdisplay-info.toml b/recipes/incoming-wlr/libdisplay-info.toml new file mode 100644 index 00000000..30b2fbc1 --- /dev/null +++ b/recipes/incoming-wlr/libdisplay-info.toml @@ -0,0 +1,25 @@ +# libdisplay-info 0.2.0 — parseo de EDID/DisplayID (libdisplay-info.so). Campaña KDE (ADR 0011): sustrato +# de kwin (pkg_check_modules(libdisplay-info>=0.2.0) REQUIRED, lectura de EDID de los monitores). Meson. +# En build necesita pnp.ids: usa dependency('hwdata') native → si no está, cae a /usr/share/hwdata/pnp.ids +# y meson `files()` EXIGE que exista ⇒ hwdata es dep de build. Sin di-edid-decode (tool) para evitar más deps. +name = "libdisplay-info" +version = "0.2.0" +license = "MIT" + +[source] +tarball = "https://gitlab.freedesktop.org/emersion/libdisplay-info/-/archive/0.2.0/libdisplay-info-0.2.0.tar.gz" +sha256 = "f7331fcaf5527251b84c8fb84238d06cd2f458422ce950c80e86c72927aa8c2b" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +zig_version = "0.13.0" + +[build.phases] +configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig meson setup output --prefix=/usr --buildtype=release" +compile = "ninja -C output" +install = "DESTDIR=/out ninja -C output install" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "hwdata"] diff --git a/recipes/incoming-wlr/wlroots.toml b/recipes/incoming-wlr/wlroots.toml new file mode 100644 index 00000000..c144d351 --- /dev/null +++ b/recipes/incoming-wlr/wlroots.toml @@ -0,0 +1,82 @@ +# wlroots 0.18.2 — la biblioteca de la que cuelgan casi todos los compositores Wayland ligeros +# (sway, labwc, river, hyprland…). Es el DESBLOQUEO del frente de WMs ligeros: sin ella no hay +# ninguno, y con ella los compositores son baratos porque no traen torre de C debajo. +# +# ── POR QUÉ ESTA COLA APARTE (`incoming-wlr/`) ────────────────────────────────────────────────── +# Otro agente comparte este repo, así que el frente nuevo va en cola AISLADA y nunca se hace +# `git add -A`. Y como la resolución de deps es HERMANO→PADRE, una receta de acá ve `recipes/` (el +# corpus) pero NO ve `recipes/incoming-gnome/`. `libdisplay-info` y `hwdata` sólo existen en las +# colas de escritorio ⇒ se copian como hermanas. **No es duplicar trabajo**: los ficheros son +# idénticos, así que el ArtifactHash es el mismo y el build hace cache-hit — verificado, ambos dan +# el mismo `b3:` que su original en incoming-gnome. +# +# ── LA FUENTE: tarball de RELEASE, no el `-/archive/` autogenerado ───────────────────────────── +# Mismo criterio que `wlr-randr` y `wayland-protocols`: los archivos que GitLab genera al vuelo no +# son estables byte a byte en el tiempo, así que un sha256 pineado sobre ellos se rompe solo. El de +# release está firmado por el proyecto y no cambia. sha256 medido con curl|sha256sum. +# +# ── LAS OPCIONES, VERIFICADAS CONTRA EL meson_options.txt DE 0.18.2 ──────────────────────────── +# Comprobadas una a una en el tarball, no de memoria — porque una opción `-D` inventada NO se ignora: +# meson aborta en la primera desconocida y la receta ni llega a configurar. (Es exactamente lo que +# tenía muerta a `gnome-session`, que pasaba `-Dsystemd=false` cuando esa opción no existe en 48.0.) +# Las diez opciones reales son: xcb-errors · xwayland · examples · icon_directory · renderers · +# backends · allocators · session · color-management · libliftoff. +# +# -Dxwayland=disabled la distro es Wayland PURA; X11 es una de las tres deudas aparcadas por +# diseño del frente GNOME y no vamos a traerla por la puerta de atrás. +# -Dxcb-errors=disabled corolario de lo anterior (es una lib de diagnóstico de XCB). +# -Dbackends=drm,libinput sin el backend `x11`, que sólo sirve para correr el compositor DENTRO +# de una sesión X11 — justo lo que no tenemos. Quedan DRM (metal) y libinput. +# -Drenderers=gles2 mesa nos da `glesv2.pc` y `egl.pc`. Vulkan exigiría el loader y las +# cabeceras, que son otro frente; el renderer GLES2 es el camino probado. +# -Dallocators=gbm mesa nos da `gbm.pc`. +# -Dsession=enabled libseat, que viene de `seatd` — sin esto no hay forma de tomar el DRM +# master sin ser root, que es como arranca un compositor en metal. +# -Dexamples=false son binarios de demo; no van a una imagen. +# -Dlibliftoff=disabled overlays de plano de hardware, opcional y una dep más. +# -Dcolor-management=disabled gestión de color; opcional en 0.18 y arrastra dependencias que +# todavía no hacen falta para «que un WM ligero arranque». +# -Dwerror=false NO es pereza, es una diferencia de TOOLCHAIN. wlroots compila con -Werror y +# upstream lo valida con gcc; nuestro `zig cc` es clang, que avisa de cosas +# que gcc calla. Medido: muere en `types/wlr_shm.c:503` con +# `-Werror,-Wunused-but-set-variable` sobre `has_argb8888`/`has_xrgb8888` — +# código correcto que sólo clang señala. Tratar los avisos de OTRO compilador +# como errores del proyecto es un fallo de método, no un hallazgo de calidad. +# (`werror` es opción universal de meson, no de wlroots.) +# +# ── `-Ddefault_library=both` ─────────────────────────────────────────────────────────────────── +# Igual que libinput y pixman: meson produciría sólo `.so` y los consumidores (sway, labwc…) +# enlazan estático. Con `both` salen las dos y cada consumidor toma la que necesita. +# +# ── deps: la lección del `.pc Requires` ──────────────────────────────────────────────────────── +# `libffi`, `expat` y `zlib` NO los usa wlroots directamente: los exigen los `.pc` de wayland y mesa +# en su línea `Requires`, y pkgconf resuelve el grafo de `.pc` COMPLETO antes de emitir un cflag. +# Omitirlos da un error que culpa a wayland o a mesa, que son inocentes. Ver `wlr-randr`, donde el +# síntoma fue «Package 'libffi', required by 'wayland-client', not found». +# `python3` va porque **meson es un script de Python**: sin intérprete, exit 127 que se lee como +# «meson no está» cuando meson sí está. + +name = "wlroots" +version = "0.18.2" +license = "MIT" + +[source] +tarball = "https://gitlab.freedesktop.org/wlroots/wlroots/-/releases/0.18.2/downloads/wlroots-0.18.2.tar.gz" +sha256 = "cf776c169169f279808d9eabc6583f484338dcd454c966a285ff178c88c105d4" + +[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 --wrap-mode=nodownload -Dwerror=false -Ddefault_library=both -Dexamples=false -Dxwayland=disabled -Dxcb-errors=disabled -Dbackends=drm,libinput -Drenderers=gles2 -Dallocators=gbm -Dsession=enabled -Dlibliftoff=disabled -Dcolor-management=disabled" +compile = "ninja -C output" +install = "DESTDIR=/out ninja -C output install" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "wayland", "wayland-protocols", "libdrm", + "libxkbcommon", "pixman", "mesa", "libinput", "seatd", "libudev-zero", "libevdev", + "mtdev", "libdisplay-info", "hwdata", "libffi", "expat", "zlib"] +run = ["wayland", "libdrm", "libxkbcommon", "pixman", "mesa", "libinput", "seatd"]