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:
@@ -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
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user