From 0cd3e62822cc6e6748517894fd65a9a738d0fa35 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Sep 2026 01:36:36 +0000 Subject: [PATCH] =?UTF-8?q?libglvnd:=20s=C3=B3lo=20despacho=20de=20GL=20?= =?UTF-8?q?=E2=80=94=20muere=20la=20colisi=C3=B3n=20de=20libEGL.=20Y=20obs?= =?UTF-8?q?-studio=20llevaba=20meses=20sin=20construir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit libglvnd b3:e27d3b2833a6aa6a6b4a4caad5ef2121e7be31a3c7ae59d0db22b01d696ffc99 obs-studio b3:29d95ddf50ef79692b48cae493758def564202ef81eba236b6cb279757621403 ── libglvnd: se apagan egl, gles1, gles2 y headers ───────────────────────────────────────────── La receta se escribió para la campaña completa —glvnd toma libEGL y mesa pasa a ser vendor detrás— y la campaña NO SE HIZO: las tres mesa siguen con -Dglvnd=false. El resultado, medido en /mnt/cosecha/escritorios/kde-rootfs ya hidratado, era el cuadro que la propia receta anunciaba: /usr/lib/libEGL.so.1 -> libEGL.so.1.0.0 1.440.624 B (mesa: el driver) /usr/lib/libEGL.so.1.1.0 323.144 B (glvnd: despacho, HUÉRFANO) Dos libEGL.so.1 distintos en la MISMA ruta, más libGLESv2.so.2 y los headers GL/, EGL/ y GLES2/ duplicados y con BYTES DISTINTOS (gl.h: 79.877 vs 80.393). Quién gana depende del orden de hidratación y nada lo guarda. Y no hacía falta: OBS, que es la razón de que la receta exista, NO usa glvnd en runtime. libobs-opengl.so sale con NEEDED libEGL.so.1 y nada más, y sus indefinidos son todos egl* —ni un gl[A-Z] sin resolver— o sea que su glad resuelve por eglGetProcAddress contra la EGL de mesa. Lo único que glvnd le da es satisfacer el OpenGL::GL de CMake AL ENLAZAR. Ahora sella libGLdispatch.so.0 + libOpenGL.so.0 + opengl.pc y nada más: CERO ficheros en común con mesa. Radio medido: 1 dependiente. ⚠ Esto quita el DAÑO, no cierra el muro: libOpenGL.so.0 enlaza y en runtime sigue sin haber vendor (no hay libEGL_mesa.so.0 ni egl_vendor.d). Cerrarlo es re-sellar las TRES mesa con -Dglvnd=true en un movimiento, y el precio está medido: `yupana radio mesa` = 148 directos, 154 transitivos, 153 sellados que caen a deuda, las CINCO imágenes. Decisión de distro, no arreglo de paso. ── obs-studio: el cache-hit tapaba una regresión ─────────────────────────────────────────────── Al forzar su rebuild, el configure murió pidiendo `qrcodegencpp`, que no es receta de ninguna cola. La causa NO era libglvnd. La receta dice «[source] de takana NO clona submódulos ⇒ sus directorios llegan VACÍOS» y por eso hacía `touch plugins/obs-websocket/CMakeLists.txt`. Esa premisa dejó de ser cierta: los submódulos YA se materializan, así que `touch` no vacía nada —sólo toca la mtime de un fichero que existe— y el CMakeLists de verdad entra pidiendo su dependencia. Corregido a `mkdir -p` + `: >` (truncar), que funciona con submódulos y sin ellos: la receta deja de depender de una premisa que puede cambiarle bajo los pies. Construye y sella en el hub. --- recipes/incoming-kde/obs-studio.toml | 12 +++++++++- recipes/libglvnd.toml | 34 ++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/recipes/incoming-kde/obs-studio.toml b/recipes/incoming-kde/obs-studio.toml index 5c3d4576..c2c11686 100644 --- a/recipes/incoming-kde/obs-studio.toml +++ b/recipes/incoming-kde/obs-studio.toml @@ -99,7 +99,17 @@ flags = [] [build.phases] configure = ''' -touch plugins/obs-browser/CMakeLists.txt plugins/obs-websocket/CMakeLists.txt +# ⚠ `: >` (TRUNCAR), NO `touch` — CORREGIDO 2026-09-13. El comentario de arriba dice que +# «`[source]` de takana NO clona submódulos ⇒ sus directorios llegan VACÍOS», y **eso dejó de ser +# cierto**: los submódulos YA se materializan. Con el árbol real de `obs-websocket` presente, +# `touch` no lo vacía —sólo actualiza la mtime de un fichero que ya existe— así que su CMakeLists +# de verdad entra y el configure muere pidiendo `qrcodegencpp`, que no es receta de ninguna cola. +# `: >` lo trunca exista o no, y el `mkdir -p` hace que funcione en los dos mundos: con submódulos +# y sin ellos. La receta ya no depende de una premisa que puede cambiar bajo sus pies. +# +# Se descubrió porque `libglvnd` cambió y forzó el rebuild: el artefacto sellado tapaba la +# regresión desde que los submódulos empezaron a materializarse. Un cache-hit congela regresiones. +for d in plugins/obs-browser plugins/obs-websocket; do mkdir -p "$d"; : > "$d/CMakeLists.txt"; done cmake -B build -G Ninja -Wno-dev \ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=lib \ -DCMAKE_SKIP_INSTALL_RPATH=ON -DOBS_VERSION_OVERRIDE=32.2.2 -DCALM_DEPRECATION=ON \ diff --git a/recipes/libglvnd.toml b/recipes/libglvnd.toml index 68cc6492..679de4d1 100644 --- a/recipes/libglvnd.toml +++ b/recipes/libglvnd.toml @@ -27,6 +27,36 @@ # libEGL.so.1 EGL, ahora como DESPACHO: el vendor real lo pone mesa (libEGL_mesa.so.0) # libGLESv1_CM.so.1 / libGLESv2.so.2 # +# ══ 2026-09-13 · SÓLO DESPACHO DE GL: `egl/gles/headers` APAGADOS, Y ES UN ARREGLO ════════════ +# Esta receta se escribió pensando en la campaña completa —glvnd toma libEGL y mesa pasa a ser +# vendor detrás— y la campaña NO SE HIZO: las tres mesa siguen con `-Dglvnd=false`. El resultado +# medido, en `/mnt/cosecha/escritorios/kde-rootfs` ya hidratado, era el cuadro que el propio párrafo +# de abajo anunciaba: +# +# /usr/lib/libEGL.so.1 -> libEGL.so.1.0.0 1.440.624 B (mesa: el driver) +# /usr/lib/libEGL.so.1.1.0 323.144 B (glvnd: despacho, HUÉRFANO) +# +# Dos `libEGL.so.1` distintos en la MISMA ruta, más `libGLESv2.so.2` y los headers `GL/`, `EGL/` y +# `GLES2/` duplicados y **con bytes distintos** (`gl.h`: 79.877 vs 80.393). Quién gana depende del +# orden de hidratación y nada lo guarda — la enfermedad de las dos glib, otra vez. +# +# Y no hacía falta para nada: **OBS, que es la razón de que esta receta exista, no usa glvnd en +# runtime.** `libobs-opengl.so` sale con `NEEDED libEGL.so.1` y nada más, y sus símbolos indefinidos +# son todos `egl*` — ni un `gl[A-Z]` sin resolver — o sea que su `glad` resuelve los punteros por +# `eglGetProcAddress` contra la EGL de mesa. Lo único que glvnd le da es satisfacer el +# `OpenGL::GL` de CMake **al ENLAZAR**. +# +# ⇒ Se apagan `egl`, `gles1`, `gles2` y `headers`. Queda lo que de verdad se usa: +# libGLdispatch.so.0 libOpenGL.so.0 opengl.pc +# Cero ficheros en común con mesa ⇒ cero colisión. Radio: **1 dependiente** (obs-studio). +# +# ⚠ ESTO NO ES LA CAMPAÑA, ES QUITAR EL DAÑO MIENTRAS LA CAMPAÑA NO SE DECIDE. Hoy +# `libOpenGL.so.0` enlaza y **en runtime no hay vendor** (no existe `libEGL_mesa.so.0` ni +# `/usr/share/glvnd/egl_vendor.d/`): una app que llame de verdad por ahí encuentra una tabla vacía. +# Cerrarlo es re-sellar las TRES mesa con `-Dglvnd=true` en un solo movimiento, y el precio está +# medido: `yupana radio mesa` = **148 dependientes directos, 154 transitivos, 153 sellados que caen +# a deuda, las CINCO imágenes**. Es decisión de distro, no un arreglo de paso. +# # ⚠ EL CAMBIO DE DUEÑO DE libEGL NO ES MENOR. Hoy `libEGL.so.1` la instala mesa directo; con glvnd # la instala glvnd y mesa pasa a ser un VENDOR detrás (`-Dglvnd=true` ⇒ `libEGL_mesa.so.0` + su JSON # en `/usr/share/glvnd/egl_vendor.d/`). Mismo soname, otro fichero y otro dueño: si mesa se @@ -78,8 +108,8 @@ exec hammer-zig-cc $a W chmod +x "$ZW/cc" CC="$ZW/cc" PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release \ - -Dx11=disabled -Dglx=disabled -Degl=true -Dgles1=true -Dgles2=true \ - -Dasm=enabled -Dtls=true -Dheaders=true + -Dx11=disabled -Dglx=disabled -Degl=false -Dgles1=false -Dgles2=false \ + -Dasm=enabled -Dtls=true -Dheaders=false ''' compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"