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…

⎇ main recipes/libslirp.toml TOML · 79 siq'ikuna · 5.4 KB Ñawpa willay ch'uya

libslirp: la red de usuario que qemu dejó de traer incluida f33df351c · Sergio ·

1# libslirp 4.9.5 — la pila de red en espacio de usuario. Dep de `qemu` para que una máquina virtual
2# tenga red SIN privilegios.
3#
4# ══ POR QUÉ ENTRA ══════════════════════════════════════════════════════════════════════════════
5# `censo-distro.py` marca «virtualización» **3 de 3 ausente**, con el comentario que da el argumento
6# entero: «ni invitado ni anfitrión: **no se puede probar la propia ISO sin salir**». Una distro que
7# genera imágenes y no puede arrancarlas depende de otra máquina para verificarse — y este proyecto
8# ya tiene memorias de probar sus escritorios en QEMU **desde fuera**.
9#
10# ⚠ **Y libslirp no es un detalle opcional de qemu: desde qemu 7.2 la pila slirp DEJÓ DE VENIR
11# incluida.** Sin esta biblioteca, `-netdev user` no existe, y la única red posible es `tap`, que
12# necesita root y configurar un puente. O sea: sin libslirp, probar una ISO con red se convierte en
13# una operación privilegiada. Con ella, es `qemu -netdev user`.
14#
15# ══ CUESTA UNA RECETA: CERO DEPS NUEVAS ════════════════════════════════════════════════════════
16# Medido sobre su `meson.build`: `glib-2.0` (está) e `iconv`, que **musl trae en libc**. Nada más.
17#
18# ⚠ El `.pc` se llama **`slirp`**, no `libslirp` — su `pkg.generate(filebase: 'slirp')` lo fija, y es
19# el nombre exacto con el que qemu la busca (`dependency('slirp')`, `meson.build:1281`). Un `.pc`
20# con otro nombre se instalaría igual y qemu diría «slirp not found» sin mencionar que la
21# biblioteca está. Por eso el guardián comprueba el NOMBRE y no sólo la existencia.
22name    = "libslirp"
23version = "4.9.5"
24license = "BSD-3-Clause"
25
26[source]
27tarball = "https://gitlab.freedesktop.org/slirp/libslirp/-/archive/v4.9.5/libslirp-v4.9.5.tar.gz"
28sha256  = "f43e68b60b580647574ec4a0e2b6c600a56281e6c39f79426510832dc810f483"
29
30[build]
31# `glib` del corpus es estática, así que no hay dep shared-only que fuerce dinámico (la regla está
32# en `recipes/gdb.toml`: `link` tiene que coincidir con lo que publican las deps de ESTA receta).
33compiler = "zig-cc"
34target   = "x86_64-linux-musl"
35link     = "static"
36flags    = []
37
38[build.phases]
39# `--prefer-static` para que pkg-config entregue los `Requires.private` del corpus estático-primero.
40# ⚠ **`-Ddefault_library=static` EXPLÍCITO, y la primera pasada lo aprendió por las malas:** la
41# receta declara `link = "static"` y aun así salió `libslirp.so.0.4.0`. En un proyecto meson el
42# `link` de la receta **no decide lo que se PRODUCE** —controla cómo enlaza el lab— y lo que decide
43# la forma de la biblioteca es `default_library`, cuyo default de meson es `shared`. El idioma del
44# repo es pasarlo explícito: `cairo.toml` y `glib.toml` lo hacen.
45#
46# Estática además evita un nodo de runtime: qemu la embute en vez de arrastrar un `NEEDED
47# libslirp.so.0` que habría que declarar en la clausura de toda imagen con qemu.
48configure = 'PKG_CONFIG_PATH=/usr/lib/pkgconfig meson setup output --prefix=/usr --buildtype=release --prefer-static -Ddefault_library=static'
49compile   = 'meson compile -C output'
50install = '''
51set -e
52DESTDIR=/out meson install -C output
53lib=$(find /out/usr/lib -name 'libslirp.*' 2>/dev/null | head -1)
54[ -n "$lib" ] || { echo "libslirp: no quedó ninguna libslirp.* — NO sello" >&2; ls -R /out/usr 2>/dev/null | head -20 >&2; exit 1; }
55# La ruta de la cabecera importa: qemu incluye <slirp/libslirp.h>, así que tiene que estar en ese
56# subdirectorio y no suelta en /usr/include.
57[ -f /out/usr/include/slirp/libslirp.h ] || { echo "libslirp: falta include/slirp/libslirp.h — es la ruta que qemu incluye" >&2; find /out -name 'libslirp.h' >&2; exit 1; }
58# ⚠ El nombre del `.pc` es el contrato con qemu: `slirp.pc`, no `libslirp.pc`.
59pc=/out/usr/lib/pkgconfig/slirp.pc
60[ -f "$pc" ] || { echo "libslirp: no quedó slirp.pc — qemu la busca como dependency('slirp') y diría «not found» sin mencionar que la biblioteca está" >&2; ls /out/usr/lib/pkgconfig 2>/dev/null >&2; exit 1; }
61# CHEQUEO FUERTE: con PKG_CONFIG_LIBDIR puesto —para no leer el anfitrión— y pidiendo cflags+libs
62# de verdad, que es lo único que valida las transitivas (`Requires: glib-2.0`). `--exists` no valida
63# nada: en este repo dio verde en falso dos veces.
64PKG_CONFIG_LIBDIR=/out/usr/lib/pkgconfig:/usr/lib/pkgconfig pkgconf --cflags --libs slirp >/dev/null 2>&1 || {
65  echo "libslirp: pkgconf no resuelve 'slirp' con sus transitivas — el dependency() de qemu fallaría" >&2
66  PKG_CONFIG_LIBDIR=/out/usr/lib/pkgconfig:/usr/lib/pkgconfig pkgconf --cflags --libs slirp >&2
67  exit 1
68}
69# Y que exporte la API de verdad: una biblioteca presente sin `slirp_init` es un fichero, no una
70# pila de red. Se exige DEFINIDO, no sólo presente — un símbolo UND casa con un grep y no sirve.
71readelf -sW "$lib" 2>/dev/null | awk '$8=="slirp_init" && $7!="UND"{f=1} END{exit !f}' || {
72  echo "libslirp: slirp_init no está DEFINIDO en $(basename "$lib") — qemu enlazaría y no tendría red de usuario" >&2
73  exit 1
74}
75echo "libslirp: $(basename "$lib") + include/slirp/libslirp.h + slirp.pc $(PKG_CONFIG_LIBDIR=/out/usr/lib/pkgconfig:/usr/lib/pkgconfig pkgconf --modversion slirp)"
76'''
77
78[deps]
79build = ["meson", "samurai", "pkgconf", "python3", "glib", "libffi", "pcre2", "zlib", "binutils"]