tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

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.

0cd3e62822cc6e6748517894fd65a9a738d0fa35 · ruwaq Sergio · (1 killa ñawpaq) · tayta 424363fbd · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

2 qillqakuna · +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"