libglvnd: sólo despacho de GL — muere la colisión de libEGL. Y obs-studio llevaba meses sin construir
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.
Semantic delta
No definition changed: this change is text, documentation or data.
2 files · +43 −3
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"