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.
This commit is contained in:
Sergio
2026-09-13 01:36:36 +00:00
parent 424363fbdc
commit 0cd3e62822
2 changed files with 43 additions and 3 deletions
+11 -1
View File
@@ -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 \
+32 -2
View File
@@ -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"