From 8d10bccf343cf25108c5aa927d48070fad1ce2fd Mon Sep 17 00:00:00 2001 From: sergio Date: Wed, 5 Aug 2026 10:54:54 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=87=20wireplumber:=20construido,=20cor?= =?UTF-8?q?riendo=E2=80=A6=20y=20NO=20era=20el=20bloqueo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit b3:b8f3baf0, selló a la primera. Arranca desde cosmic-start ("wireplumber OK (pid 192) — hay gestor de sesión"), se conecta al grafo (dos clientes en wpctl status) y wpctl pasa a mostrar una sección Video que antes no existía. Y el Start de ScreenCast SIGUE sin Response a los 60s. Mismo resultado exacto. LA HIPÓTESIS QUEDA MATADA POR MEDICIÓN. "Falta el gestor de sesión que mueva el nodo de Paused a Streaming" era mía y era razonable; no era cierta. Queda escrita junto a su refutación porque una hipótesis descartada CON EVIDENCIA vale más que una lista de sospechosos: acota el próximo paso a lo que queda, que es el backend mismo. El dato nuevo, que es por dónde seguir: con wireplumber corriendo, `wpctl status` lista `Video → Streams` VACÍO durante el handshake. O sea que el nodo `cosmic-screencast` que SÍ existe en `pw-cli ls Node` no llega a wireplumber como stream gestionado. Próximo movimiento: RUST_LOG=trace sobre screencast_thread, no otra dep. ── por qué receta propia y no la de GNOME ────────────────────────────────────── La de incoming-gnome funciona pero NEEDea libglib/libgobject/libpipewire de la ISLA DINÁMICA de GNOME: traerla metería una segunda glib y una segunda pipewire en la imagen. De 19 deps, 14 dan hash idéntico; las que divergen divergen a propósito — sobre todo `pipewire`, que acá apunta a la de COSMIC (338d1d8c), la que el escritorio realmente ARRANCA. Un gestor de sesión contra otra pipewire que la que corre no gestiona nada. El cambio de fondo es glib → glib-shared. COSMIC usa la glib ESTÁTICA del corpus, que le alcanza al portal porque es un ejecutable. Acá no: wireplumber produce un .so y 17 módulos, y libglib-2.0.a tiene 44.275 reubicaciones R_X86_64_32/32S ⇒ no es PIC. La regla del frente GNOME (readelf -r ANTES de gastar el build) ahorró uno. Y la salida no fue una campaña nueva sino una MEDICIÓN: incoming-kde/glib-shared copiada a esta cola resuelve al MISMO hash (0584ce1f) y ya estaba sellada ⇒ cero rebuild. Idem pcre2-shared, lua y libelogind. Las dos glib coexisten sin pisarse (.a y .so son ficheros distintos) y el portal conserva sus 3 NEEDED. escritorio-cosmic: 84 → 89 recetas, 0 faltantes. Co-Authored-By: Claude Opus 5 (1M context) --- .../cosmic-wireplumber-wpctl-2026-08-05.png | Bin 0 -> 66964 bytes docs/runbooks/cosmic-desktop.md | 51 +++++++++- docs/state/targets.toml | 5 + recipes/incoming-cosmic/glib-shared.toml | 32 ++++++ recipes/incoming-cosmic/libelogind.toml | 69 +++++++++++++ recipes/incoming-cosmic/lua.toml | 95 ++++++++++++++++++ recipes/incoming-cosmic/pcre2-shared.toml | 36 +++++++ recipes/incoming-cosmic/wireplumber.toml | 86 ++++++++++++++++ scripts/cosmic/cosmic-start-qemu.sh | 28 ++++++ scripts/cosmic/hydrate-cosmic.sh | 5 + 10 files changed, 402 insertions(+), 5 deletions(-) create mode 100644 docs/evidencia/cosmic-wireplumber-wpctl-2026-08-05.png create mode 100644 recipes/incoming-cosmic/glib-shared.toml create mode 100644 recipes/incoming-cosmic/libelogind.toml create mode 100644 recipes/incoming-cosmic/lua.toml create mode 100644 recipes/incoming-cosmic/pcre2-shared.toml create mode 100644 recipes/incoming-cosmic/wireplumber.toml diff --git a/docs/evidencia/cosmic-wireplumber-wpctl-2026-08-05.png b/docs/evidencia/cosmic-wireplumber-wpctl-2026-08-05.png new file mode 100644 index 0000000000000000000000000000000000000000..c99c8516dfa0826c31cebca9c401d20dbcf276e9 GIT binary patch literal 66964 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 literal 0 HcmV?d00001 diff --git a/docs/runbooks/cosmic-desktop.md b/docs/runbooks/cosmic-desktop.md index 5dab1c7d..999e8e76 100644 --- a/docs/runbooks/cosmic-desktop.md +++ b/docs/runbooks/cosmic-desktop.md @@ -1090,6 +1090,46 @@ esperarlo. Es una hipótesis, no una medición — construir `wireplumber` la co - Y uno de shell, al automatizar por QMP: **`| head -N` bufferiza** y deja la terminal en blanco hasta que el programa termina. Parece que la sonda colgó cuando en realidad está esperando. +## 🔇 wireplumber: construido, corriendo… y NO era el bloqueo (2026-08-05) + +`recipes/incoming-cosmic/wireplumber.toml` 0.5.15 → **`b3:b8f3baf0`**, selló a la primera. Arranca +desde `cosmic-start` (`wireplumber OK (pid 192) — hay gestor de sesión`), se conecta al grafo (dos +clientes en `wpctl status`) y `wpctl` pasa a mostrar una sección **Video** que antes no existía. + +**Y el `Start` de ScreenCast sigue sin `Response` a los 60s. Exactamente el mismo resultado.** + +La hipótesis de la sección anterior —«falta el gestor de sesión que mueva el nodo de `Paused` a +`Streaming`»— **queda MATADA por medición**. Era mía y era razonable; no era cierta. Se deja escrita +junto con su refutación porque una hipótesis descartada con evidencia vale más que una lista de +sospechosos: acota el próximo paso a lo que queda, que es el propio backend. + +El dato nuevo, que es por dónde seguir: con wireplumber corriendo, `wpctl status` lista +`Video → Streams` **vacío** durante el handshake. O sea que el nodo `cosmic-screencast` que sí existe +en `pw-cli ls Node` **no llega a wireplumber como stream gestionado**. El próximo movimiento es el log +del backend con `RUST_LOG=trace` alrededor de `screencast_thread`, no otra dep. + +### Por qué es una receta propia y no la de GNOME + +La de `incoming-gnome` está sellada y funciona, pero su binario NEEDea `libglib-2.0.so.0`, +`libgobject-2.0.so.0` y `libpipewire-0.3.so.0` **de la isla dinámica de GNOME**: traerla tal cual +metería una segunda glib y una segunda pipewire en la imagen. De las 19 deps, **14 dan hash idéntico** +y las que divergen divergen a propósito — sobre todo `pipewire`, que acá apunta a la de COSMIC +(`338d1d8c`), la que el escritorio realmente arranca. Un gestor de sesión contra otra pipewire que la +que corre no gestiona nada. + +**El cambio de fondo es `glib` → `glib-shared`.** COSMIC usa la glib ESTÁTICA del corpus, que le +alcanza a `xdg-desktop-portal` porque es un ejecutable. Acá no: wireplumber produce +`libwireplumber-0.5.so` y 17 módulos, y `libglib-2.0.a` del corpus tiene **44.275 reubicaciones +`R_X86_64_32/32S`** ⇒ no es PIC y no entra en un `.so`. (Regla del frente GNOME: `readelf -r` ANTES de +gastar el build — acá ahorró uno.) + +La salida no fue una campaña nueva sino una **medición**: `incoming-kde/glib-shared.toml` copiada a +esta cola resuelve al **mismo hash** (`0584ce1f`) y **ya estaba sellada** ⇒ cero rebuild. Idem +`pcre2-shared` (`f254abaa`), `lua` (`e6c35f98`) y `libelogind` (`f1a690b2`). Las dos glib **coexisten +sin pisarse** en el rootfs: `.a` y `.so` son ficheros distintos, y el portal conserva sus 3 NEEDED. + +Cierre: `escritorio-cosmic` pasa de 84 a **89 recetas**, 0 faltantes. + ### El `-L/usr/lib` que pkg-config no da `pkg-config` **omite los `-L` de directorios que considera estándar del sistema**, asumiendo que el @@ -1105,11 +1145,12 @@ existe, y eso cuesta igual que un bug. ## Lo que falta, en orden -1. ~~Arrancar el demonio de pipewire~~ ✅ y ~~el cliente persistente~~ ✅ (`portal-probe`, `b3:af49d32d`). - **Lo que queda es `wireplumber`**: el stream de ScreenCast se crea y llega a `Paused`, con nodo - `cosmic-screencast` visible en pipewire, pero nadie lo pasa a `Streaming` y el backend no emite el - `Response`. La hipótesis es que falta el gestor de sesión — construirlo la confirma o la mata. - Falta también correr `portal-probe filechooser`, que ya puede capturar la URI. +1. ~~Demonio de pipewire~~ ✅, ~~cliente persistente~~ ✅ (`portal-probe`, `b3:af49d32d`), + ~~`wireplumber`~~ ✅ (`b3:b8f3baf0`) — **y wireplumber NO era el bloqueo**: el `Start` sigue sin + `Response`. Lo que queda es el **backend mismo**: con `RUST_LOG=trace` alrededor de + `screencast_thread`, mirando por qué el nodo que sí existe en `pw-cli ls Node` no aparece como + `Video → Streams` en `wpctl`. Falta también correr `portal-probe filechooser`, que ya puede + capturar la URI. 2. **Decidir `gvfs`** (ver la corrección de arriba: las piezas ya están selladas, lo que falta es la decisión sobre la segunda glib). Destrabaría los montajes remotos de cosmic-files y su applet. 3. **Enchufar la tienda a `.swm`**: servir `org.freedesktop.PackageKit` y encender la feature diff --git a/docs/state/targets.toml b/docs/state/targets.toml index d59ce729..43ac29e5 100644 --- a/docs/state/targets.toml +++ b/docs/state/targets.toml @@ -137,6 +137,11 @@ paquetes = [ # porque nadie la declara como dep y sin ella el perfil no incluiría con qué verificarse a sí # mismo — un handshake de portal sólo se puede ejercer DESDE la sesión, con bus y compositor vivos. "portal-probe", + # El GESTOR DE SESIÓN de pipewire. Se lista como raíz porque ningún `[deps]` lo alcanza: es un + # CLIENTE del demonio, no una librería de nadie. Trae consigo la glib COMPARTIDA (`glib-shared`), + # que no es la estática que usa el resto de la cola — wireplumber produce `.so` y la estática del + # corpus no es PIC. Construido y corriendo; NO desbloqueó ScreenCast (ver el runbook). + "wireplumber", # Datos, no binarios: el tema de iconos (y el hicolor del que hereda), las tablas de xkb y una # tipografía. Ninguno es dep de build de nadie y sin ellos el escritorio arranca roto — sin puntero, # sin teclado o con tofu. diff --git a/recipes/incoming-cosmic/glib-shared.toml b/recipes/incoming-cosmic/glib-shared.toml new file mode 100644 index 00000000..555e1116 --- /dev/null +++ b/recipes/incoming-cosmic/glib-shared.toml @@ -0,0 +1,32 @@ +# glib-shared 2.88.1 — variante DINÁMICA (libglib-2.0.so.0 + libgobject/libgio/libgmodule/libgthread) +# para el escritorio KDE. El canónico (recipes/glib.toml) es `-Ddefault_library=static --prefer-static` +# (sólo .a) ⇒ no enlaza dentro de un .so. Es la **deuda Capa 0 "glib shared-PIC"** que el ADR 0011 arrastra +# desde plasma-workspace (se esquivó parcheando NetworkManagerQt a opcional). +# +# glib es foundational para el resto del escritorio: libnm (NetworkManager→plasma-nm), polkit (auth), +# xdg-desktop-portal, gstreamer. Esta variante lo destraba. +# +# Deps: libffi ya es PIC (--with-pic en el canónico, enlazable en .so) ⇒ no necesita variante. +# pcre2-shared SÍ (el pcre2 canónico no tiene --with-pic). zlib-shared por el libz.so versionado. +# Se conservan los switches del canónico (tests/nls/libmount/selinux/introspection off) para no arrastrar +# deps nuevas; sólo cambia el modo de librería. +name = "glib-shared" +version = "2.88.1" + +[source] +tarball = "https://download.gnome.org/sources/glib/2.88/glib-2.88.1.tar.xz" +sha256 = "51ab804c56f6eab3e5045c774d1290ac5e4c923d4f9a3d8e33123bee45c1840e" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = "PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release -Ddefault_library=shared -Dtests=false -Dnls=disabled -Dlibmount=disabled -Dselinux=disabled -Dman-pages=disabled -Dintrospection=disabled -Dglib_debug=disabled -Dglib_assert=false -Dglib_checks=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" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "libffi", "pcre2-shared", "zlib-shared"] diff --git a/recipes/incoming-cosmic/libelogind.toml b/recipes/incoming-cosmic/libelogind.toml new file mode 100644 index 00000000..d6dee0e5 --- /dev/null +++ b/recipes/incoming-cosmic/libelogind.toml @@ -0,0 +1,69 @@ +# libelogind — la C-ABI `sd-login` que le faltaba a la distro, implementada en arje-compat. +# +# QUÉ RESUELVE: mutter (y polkit, gcr, at-spi2-core) exigen un proveedor de logind por pkg-config — +# `libsystemd` o `libelogind`— para llamar la API C sd-login. Esa API NO es un cliente D-Bus: lee +# `/run/systemd/{sessions,users,seats}`. Los otros tres tienen perilla para esquivarla y se +# construyeron por su camino degradado; **mutter no tiene**, porque `-Dudev=false` exige +# `-Dlogind=false` (mutter/meson.build:257) y sin udev+logind no hay backend nativo KMS: no hay +# compositor de verdad, sólo anidado. +# +# POR QUÉ NO ES elogind NI UN STUB: `arje-logind-compat` ya escribe ese estado en /run/systemd (ver +# `arje_compat::login_state`). Lo único que faltaba era una librería que lo LEYERA y lo ofreciera en +# C. `arje-sdlogin-compat` hace exactamente eso — no inventa datos ni levanta un daemon paralelo. +# Empaquetar elogind sería traer un logind entero a competirle al que arje ya tiene. +# +# Corrige de paso lo que afirma el comentario de recipes/arje-logind-compat.toml («no hace falta la +# C-ABI sd-login… los escritorios consultan login1 en RUNTIME por D-Bus»): es cierto para los +# clientes D-Bus y FALSO para mutter, que la enlaza. +# +# HUB-ONLY, como toda receta de fuente tawasuyu: la gitea escucha en :2345 y el worker efímero es +# secretless ⇒ recibe Connection refused en :22. Se muele en el hub. +name = "libelogind" +version = "0.0.1" + +[source] +# El `commit` es el identificador inmutable; la URL es sólo locator y NO entra al ArtifactHash. +# Rama `selfhost/arje-zero-attest-lockfile`, igual que arje-logind-compat, porque es la única que +# versiona el `Cargo.lock` de la raíz: sin él, el vendoreo `--locked` del fetch no es reproducible +# (el monorepo lo gitignora en main). +repo = "gitea@git.tawasuyu.net:tawasuyu/tawasuyu.git" +commit = "749edfe41766e098d3eb18561c6a396610c5cd8e" +# El monorepo COMMITEA su propio `vendor/` (`[patch.crates-io] smithay = { path = "vendor/smithay" }`, +# la copia parcheada que mirada necesita para el tearing) y el `cargo vendor` de hammer escribe ahí +# por defecto, pisándolo: el build muere con `failed to read /src/vendor/smithay/.cargo-checksum.json` +# al resolver la dep git de taffy. Se vendorea a un subdir aparte, igual que arje-logind-compat. +# Apareció recién ahora porque el `vendor/` entró a esta rama con el merge de main, no antes. +# Ver [[hammer-cargo-vendor-clobbers-project-vendor]]. +cargo_vendor_dir = ".hammer-cargo-vendor" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +# dynamic, no static: el producto ES una librería compartida (cdylib). Con `link = "static"` el lab +# exporta -static y no hay .so que valga. +link = "dynamic" +flags = ["-p", "arje-sdlogin-compat"] + +[build.phases] +# Sólo se sobrescribe `install`: el `compile` por defecto del lab (cargo build --release, offline y +# vendoreado) es el correcto. El default de Cargo copia EJECUTABLES a /usr/bin, y acá no hay ninguno: +# hay una .so, una cabecera y un .pc. +# +# El SONAME (libelogind.so.0) lo fija el build.rs del crate, no esta receta, para que un `cargo build` +# a mano también produzca algo enlazable. Por eso el fichero se instala directamente con ese nombre y +# el `libelogind.so` es el symlink de desarrollo que busca el linker. +# +# La cabecera va a /usr/include/elogind/systemd/ y el .pc trae `-I${includedir}/elogind`: así el +# `#include ` de mutter resuelve sin que mutter sepa que somos nosotros. Es el +# mismo arreglo de elogind upstream. +install = ''' +set -e +mkdir -p /out/usr/lib/pkgconfig /out/usr/include/elogind/systemd +cp target/release/libelogind.so /out/usr/lib/libelogind.so.0 +ln -s libelogind.so.0 /out/usr/lib/libelogind.so +cp 03_ukupacha/arje/arje-sdlogin-compat/include/systemd/sd-login.h /out/usr/include/elogind/systemd/ +# sd-daemon.h va aparte porque en systemd también son dos cabeceras y quien la usa la pide por su +# nombre: gdm hace `#include ` en common/gdm-log.c para `sd_booted()`. +cp 03_ukupacha/arje/arje-sdlogin-compat/include/systemd/sd-daemon.h /out/usr/include/elogind/systemd/ +cp 03_ukupacha/arje/arje-sdlogin-compat/pkgconfig/libelogind.pc /out/usr/lib/pkgconfig/ +''' diff --git a/recipes/incoming-cosmic/lua.toml b/recipes/incoming-cosmic/lua.toml new file mode 100644 index 00000000..95c23872 --- /dev/null +++ b/recipes/incoming-cosmic/lua.toml @@ -0,0 +1,95 @@ +# lua 5.4.8 — el intérprete y **la librería compartida**, que es lo que hace falta acá. +# +# POR QUÉ ENTRA: `wireplumber` —el gestor de sesión de PipeWire, sin el cual PipeWire acepta clientes +# pero no enumera ni enruta dispositivos— tiene su política escrita EN LUA y embebe un intérprete +# (`lib/wplua`). Su `subprojects/lua.wrap` DESCARGA Lua 5.5 de lua.org, cosa imposible en el sandbox +# hermético (`--wrap-mode=nodownload`), así que va con `-Dsystem-lua=true` y el sistema tiene que +# tener Lua. Su meson acepta 5.5, 5.4 o 5.3 (meson.build:91-95); se elige **5.4**, la serie estable +# larga que usan las distros, en vez de la 5.5 del wrap. +# +# ══ LO QUE ESTA RECETA TIENE QUE INVENTAR, porque upstream no lo da ═════════════════════════════ +# El Makefile de Lua sólo produce `liblua.a` y los binarios. **No hay regla de `.so` ni fichero +# pkg-config**: los agrega cada distro. Acá se agregan las dos cosas, y a mano, porque no hay dónde +# copiarlas de: +# +# 1. `-fPIC` en `MYCFLAGS`. Sin esto la `.a` no es reubicable y `libwplua` —que es un objeto +# compartido— no linkea: es la regla del corpus sobre `.a` no-PIC dentro de un `.so` +# («relocation R_X86_64_32 … recompile with -fPIC»), la misma que obligó a las variantes +# `-shared` de zlib, sqlite, libxml2, libuuid y dbus. +# 2. La `.so` se enlaza a mano desde la `.a` con `--whole-archive`, porque una librería estática sólo +# aporta los objetos que alguien referencia y acá hay que llevárselos TODOS. SONAME +# `liblua-5.4.so.0`, que es el que graba quien enlace. +# 3. El `.pc` se escribe acá. El nombre importa: wireplumber prueba `lua-5.4`, `lua5.4` y `lua54` en +# ese orden, así que el fichero se llama `lua5.4.pc` y ADEMÁS se deja `lua-5.4.pc` y `lua.pc` como +# enlaces — es más barato satisfacer las tres convenciones que adivinar cuál buscará el próximo +# consumidor. +# +# `-DLUA_USE_LINUX` es lo que activa `dlopen` y el resto de POSIX; sin él Lua se compila en modo ANSI +# genérico y `require` de módulos C no funciona. **SIN readline a propósito**: sólo lo usa el REPL +# interactivo, y el ncurses del catálogo es static-only y arrastra `-static` al link (el mismo +# problema que hizo saltar `pw-top` en la receta de pipewire). +# +# `SYSLIBS` pierde el `-Wl,-E` de upstream: exportar todos los símbolos del EJECUTABLE sirve para que +# módulos C cargados por `require` vean la API de Lua, y acá el que exporta es la `.so`. +name = "lua" +version = "5.4.8" + +[source] +tarball = "https://www.lua.org/ftp/lua-5.4.8.tar.gz" +sha256 = "4f18ddae154e793e46eeab727c59ef1c0c0c2b744e7b94219710d76f530629ae" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = "true" +compile = ''' +set -e +# CC se pasa explícito: el Makefile de Lua lo fija a `gcc -std=gnu99` en la línea 9 y ganaría sobre el +# del entorno. +make -C src all CC="hammer-zig-cc -std=gnu99" \ + SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-ldl" MYCFLAGS="-fPIC" +# La .so que upstream no construye. --whole-archive porque de una estática el linker sólo se lleva lo +# referenciado, y acá hay que llevárselo todo. +hammer-zig-cc -shared -o src/liblua-5.4.so.0.0.0 \ + -Wl,-soname,liblua-5.4.so.0 \ + -Wl,--whole-archive src/liblua.a -Wl,--no-whole-archive -lm +''' +install = ''' +set -e +mkdir -p /out/usr/bin /out/usr/lib/pkgconfig /out/usr/include /out/usr/share/man/man1 +install -m755 src/lua /out/usr/bin/lua5.4 +install -m755 src/luac /out/usr/bin/luac5.4 +ln -s lua5.4 /out/usr/bin/lua +ln -s luac5.4 /out/usr/bin/luac +install -m644 src/lua.h src/luaconf.h src/lualib.h src/lauxlib.h src/lua.hpp /out/usr/include/ +install -m644 src/liblua.a /out/usr/lib/liblua-5.4.a +install -m755 src/liblua-5.4.so.0.0.0 /out/usr/lib/ +ln -s liblua-5.4.so.0.0.0 /out/usr/lib/liblua-5.4.so.0 +ln -s liblua-5.4.so.0 /out/usr/lib/liblua-5.4.so +ln -s liblua-5.4.so /out/usr/lib/liblua.so +cat > /out/usr/lib/pkgconfig/lua5.4.pc <<'PC' +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include +INTERPRETER=${exec_prefix}/bin/lua5.4 +COMPILER=${exec_prefix}/bin/luac5.4 + +Name: Lua +Description: Lua language engine +Version: 5.4.8 +Requires: +Libs: -L${libdir} -llua-5.4 -lm +Cflags: -I${includedir} +PC +# Las tres convenciones de nombre que se usan por ahí; wireplumber prueba lua-5.4, lua5.4 y lua54. +ln -s lua5.4.pc /out/usr/lib/pkgconfig/lua-5.4.pc +ln -s lua5.4.pc /out/usr/lib/pkgconfig/lua54.pc +ln -s lua5.4.pc /out/usr/lib/pkgconfig/lua.pc +''' + +[deps] +build = ["make", "pkgconf"] diff --git a/recipes/incoming-cosmic/pcre2-shared.toml b/recipes/incoming-cosmic/pcre2-shared.toml new file mode 100644 index 00000000..7ebc72d7 --- /dev/null +++ b/recipes/incoming-cosmic/pcre2-shared.toml @@ -0,0 +1,36 @@ +# pcre2-shared 10.47 — variante DINÁMICA (libpcre2-8.so.0, PIC) para el escritorio KDE. +# El canónico (recipes/pcre2.toml) es --disable-shared SIN --with-pic ⇒ su .a no enlaza dentro de un .so. +# Lo exige glib-shared (libglib-2.0.so linkea pcre2 para GRegex). Deuda Capa 0 (static↔dinámico). +# +# compiler=gcc igual que el canónico: su comentario advierte que zig-cc MISCOMPILA libs C (patrón file/jq); +# el gcc del rootfs es musl, y el .so resultante es ABI-compatible con los consumidores zig. +# --disable-symvers como el canónico (musl no maneja symbol versioning de la forma que asume pcre2). +name = "pcre2-shared" +version = "10.47" + +[source] +tarball = "https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.47/pcre2-10.47.tar.bz2" +sha256 = "47fe8c99461250d42f89e6e8fdaeba9da057855d06eb7fc08d9ca03fd08d7bc7" + +[build] +compiler = "gcc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +compile = ''' +./configure \ + --build=$CBUILD --host=$CHOST \ + --prefix=/usr \ + --enable-shared --disable-static \ + --enable-pcre2-16 --enable-pcre2-32 \ + --enable-jit \ + --enable-pcre2grep-libz \ + --disable-symvers +make -j"$(nproc)" +''' +install = "make DESTDIR=/out install && find /out -name '*.la' -delete" + +[deps] +build = ["zlib-shared"] diff --git a/recipes/incoming-cosmic/wireplumber.toml b/recipes/incoming-cosmic/wireplumber.toml new file mode 100644 index 00000000..ab1cec75 --- /dev/null +++ b/recipes/incoming-cosmic/wireplumber.toml @@ -0,0 +1,86 @@ +# wireplumber 0.5.15 — EL GESTOR DE SESIÓN de PipeWire, en la variante de COSMIC. +# +# ── POR QUÉ EXISTE ESTA COPIA Y NO SE REUSA LA DE GNOME ───────────────────────────────────────── +# `recipes/incoming-gnome/wireplumber.toml` está sellada y funciona, pero su binario NEEDea +# `libglib-2.0.so.0`, `libgobject-2.0.so.0` y `libpipewire-0.3.so.0` **de la isla dinámica de GNOME**. +# Traerlo tal cual a la imagen de COSMIC significaría meter una segunda glib y una segunda pipewire — +# justo el choque de 370 ficheros solapados que la campaña midió y evitó. +# +# La regla del runbook es que copiar entre colas sale gratis **sólo si toda la clausura resuelve +# igual**. Acá NO resuelve igual, y eso es lo que se quiere: de las 19 deps, 14 dan hash idéntico y +# las que divergen divergen A PROPÓSITO —`pipewire` apunta a la de COSMIC (`338d1d8c`), que es la que +# el escritorio realmente ARRANCA. Un gestor de sesión contra otra pipewire que la que corre no +# gestiona nada. +# +# ── EL CAMBIO DE FONDO: `glib` → `glib-shared` ────────────────────────────────────────────────── +# COSMIC usa la `glib` ESTÁTICA del corpus (le sirve a `xdg-desktop-portal`, que es un ejecutable). +# Acá no alcanza: wireplumber produce `libwireplumber-0.5.so` y sus módulos, y la estática del corpus +# tiene **44.275 reubicaciones `R_X86_64_32/32S`** en `libglib-2.0.a` ⇒ no es PIC y no se puede +# enlazar dentro de un `.so`. (Regla del frente GNOME: `readelf -r` ANTES de gastar un build.) +# +# La salida no fue una campaña nueva sino una MEDICIÓN: `incoming-kde/glib-shared.toml` copiada acá +# resuelve al **mismo hash** (`0584ce1f`) y **ya está sellada** ⇒ cero rebuild. Idem `pcre2-shared` +# (`f254abaa`), `lua` (`e6c35f98`) y `libelogind` (`f1a690b2`), traídas por la misma razón: no existen +# en el catálogo padre y sus hashes coinciden con los de su cola de origen. +# +# ── LO QUE APORTA, Y POR QUÉ HACE FALTA ACÁ ───────────────────────────────────────────────────── +# `pipewire` se construye con `-Dsession-managers=[]`: arranca, acepta clientes y sirve —el portal ya +# figura como cliente suyo— pero **no hay política** de qué es entrada, qué es salida, ni quién mueve +# un nodo de `Paused` a `Streaming`. Y ahí está parado ScreenCast: el backend crea el nodo +# (`cosmic-screencast`, `Video/Source`, visible en `pw-cli ls Node`), su log dice +# `state-changed 'Connecting' -> 'Paused'`… y no emite el `Response`. La hipótesis a confirmar o +# matar con esta receta es que falta exactamente esto. +# +# La política está escrita EN LUA: embebe un intérprete (`lib/wplua`) y sus reglas viven en +# `src/scripts/*.lua`. Por eso la dep interesante no es PipeWire sino **`lua`**. +# +# `-Dsystem-lua=true` es obligatorio: por defecto usa su `subprojects/lua.wrap`, que **DESCARGA Lua +# 5.5 de lua.org**, y el sandbox va con `--wrap-mode=nodownload`. Con la perilla prendida busca por +# pkg-config `lua-5.5`/`lua5.5`/`lua55`, después las 5.4 y después las 5.3 (meson.build:91-95): +# nuestra `lua5.4.pc` entra por la segunda tanda. +# +# `-Delogind=enabled` — la C-ABI de logind otra vez, y acá la sirve `arje-sdlogin-compat`, el mismo +# shim que en el resto del fractal. wireplumber la usa para saber si la sesión está activa antes de +# tomar los dispositivos, que es justo el problema que ese shim resuelve. +# +# Apagados: `-Dsystemd=disabled` y sus units (PID1 es arje-zero y el arranque lo hace `cosmic-start`); +# `-Ddoc=disabled` (falta sphinx/doxygen); `-Dtests=false -Ddbus-tests=false`; `-Dintrospection=disabled` +# porque nadie carga `Wp-0.5` por typelib. +name = "wireplumber" +version = "0.5.15" + +[source] +tarball = "https://gitlab.freedesktop.org/pipewire/wireplumber/-/archive/0.5.15/wireplumber-0.5.15.tar.gz" +sha256 = "baa121bc918df5fa0e0e70755bb1c99ffab0ab107225ecf99aa470e2c6ba5e7b" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +# Sin `rm -rf output`: con el árbol de fuentes compartido (ADR 0012) borrar el dir de build es +# sabotear a quien esté compilando en paralelo. Lección heredada de la receta de GNOME. +configure = ''' +set -e +PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output \ + --prefix=/usr --buildtype=release --wrap-mode=nodownload \ + -Ddefault_library=shared \ + -Dsystem-lua=true -Dsystem-lua-version=auto \ + -Delogind=enabled -Dsystemd=disabled \ + -Dsystemd-system-service=false -Dsystemd-user-service=false \ + -Dintrospection=disabled -Ddoc=disabled \ + -Dtests=false -Ddbus-tests=false \ + -Dc_args=-Wno-error=date-time +''' +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" + +[deps] +# Difiere de la de GNOME en cuatro nombres, y los cuatro a propósito: `glib-shared` en vez de `glib` +# (la estática no es PIC), `pcre2-shared` en vez de `pcre2` (coherencia con lo que el `.pc` de +# glib-shared declara), y `pipewire`/`pulseaudio` que resuelven a los de ESTA cola — los que el +# escritorio arranca. +build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "lua", "pipewire", + "glib-shared", "dbus-shared", "libelogind", "alsa-lib", "libsndfile", "pulseaudio", + "expat", "pcre2-shared", "libffi", "libudev-zero", "zlib-shared"] diff --git a/scripts/cosmic/cosmic-start-qemu.sh b/scripts/cosmic/cosmic-start-qemu.sh index 35d27df8..c5c48c40 100755 --- a/scripts/cosmic/cosmic-start-qemu.sh +++ b/scripts/cosmic/cosmic-start-qemu.sh @@ -170,6 +170,34 @@ else say "!! sin /usr/bin/pipewire — ScreenCast no va a poder crear stream" fi +# ── EL GESTOR DE SESIÓN: wireplumber ──────────────────────────────────────────────────────────── +# pipewire se construye con `-Dsession-managers=[]`, o sea que arranca y sirve pero NO TIENE +# POLÍTICA: nada decide qué es entrada, qué es salida, ni quién mueve un nodo de `Paused` a +# `Streaming`. wireplumber es esa política, escrita en Lua. +# +# Por qué está acá y no antes: **necesita el socket de pipewire ya abierto**. Se lanza después a +# propósito, no por orden estético — un gestor de sesión sin demonio que gestionar sale con error. +# +# Acá NO se puede esperar un socket, porque wireplumber no abre ninguno: es un CLIENTE de pipewire, +# no un servidor. Lo que dice que hizo su trabajo es que aparezca como cliente en el grafo +# (`pw-cli ls Client`), y eso es una medición del sistema, no una condición de arranque. Así que se +# espera un instante y se reporta si el proceso sigue vivo — con el log a mano, que es lo que sirve +# cuando falla. +if [ -x /usr/bin/wireplumber ] && [ -S "$XDG_RUNTIME_DIR/pipewire-0" ]; then + /usr/bin/wireplumber >/tmp/wireplumber.log 2>&1 & + WP_PID=$! + sleep 2 + if alive $WP_PID; then + say "wireplumber OK (pid $WP_PID) — hay gestor de sesión" + else + say "!! wireplumber MURIÓ:"; dump /tmp/wireplumber.log + fi +elif [ -x /usr/bin/wireplumber ]; then + say "!! wireplumber presente pero sin socket de pipewire — no se lanza" +else + say "-- sin wireplumber (pipewire sirve, pero sin política de sesión)" +fi + # ── FONDO: color liso, porque la imagen por defecto NO SE PUEDE EMPAQUETAR ──────────────────── # El default de cosmic-bg apunta a `/usr/share/backgrounds/cosmic/orion_nebula_nasa_heic0601a.jpg`, # que vive en el repo `cosmic-wallpapers`… en **git-lfs**: el tarball de GitHub pesa 20 KB y trae diff --git a/scripts/cosmic/hydrate-cosmic.sh b/scripts/cosmic/hydrate-cosmic.sh index 2e6ce37e..e329bba4 100755 --- a/scripts/cosmic/hydrate-cosmic.sh +++ b/scripts/cosmic/hydrate-cosmic.sh @@ -84,6 +84,11 @@ else # con el bus y el compositor vivos— y sale estática, sin un NEEDED, justamente para que nunca # falle por algo del sistema que está midiendo. recipes/incoming-cosmic/portal-probe.toml + # El GESTOR DE SESIÓN de pipewire. Ningún `[deps]` lo alcanza —es un cliente del demonio, no una + # librería de nadie— así que es raíz a mano como todo lo que se lanza por PATH. Trae consigo la + # glib COMPARTIDA (`glib-shared`), que no es la estática que usa el resto de la cola: wireplumber + # produce `.so` y la estática del corpus no es PIC. + recipes/incoming-cosmic/wireplumber.toml recipes/incoming-cosmic/cosmic-app-library.toml recipes/incoming-cosmic/cosmic-workspaces-epoch.toml # Ni binario ni librería: DATOS. El tema de iconos de COSMIC — sin él el escritorio no se ve