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…
udisks SELLADO: enchufar un USB ya hace algo, y gvfs trae su monitor de volúmenes
1# libblockdev 3.5.0 — la librería de operaciones sobre dispositivos de bloque: leer una tabla de
2# particiones, identificar un sistema de ficheros, montar un `loop`. Existe acá por un único
3# consumidor: `udisks` la pide sin perilla (`configure.ac:175`, `blockdev >= 3.4`).
4#
5# ── CUATRO PLUGINS DE TRECE, Y LA CUENTA NO ES ARBITRARIA ─────────────────────────────────────
6# libblockdev se construye como un núcleo + plugins que se cargan con `dlopen`. `udisks` dice en su
7# propio código cuáles quiere (`src/udisksdaemon.c:351-360`): **part, swap, loop, mdraid, fs,
8# crypto** y nvme. Se encienden los cuatro cuyo cierre YA está sellado:
9#
10# fs → uuid + mount + ext2fs/e2p (e2fsprogs) + blkid ✅ identificar y manipular el FS
11# part → libparted >= 3.1 ✅ leer/escribir la tabla de particiones
12# loop → nada ✅ montar una ISO como disco
13# swap → uuid + blkid ✅ lo pide el núcleo de udisks
14#
15# ── ⚠ LOS TRES QUE FALTAN, CON LO QUE CUESTAN Y LO QUE ROMPEN ─────────────────────────────────
16# crypto → `libcryptsetup >= 2.3` ⇒ **no se podrá abrir un disco LUKS desde el escritorio.**
17# Es el que más se va a notar de los tres; su cadena (cryptsetup + devmapper/lvm2 +
18# json-c + argon2) es su propia unidad de trabajo.
19# mdraid → `libbytesize >= 0.1` (que a su vez pide gmp y mpfr) ⇒ sin gestión de RAID software.
20# nvme → `libnvme >= 1.3` ⇒ sin las funciones específicas de NVMe (el disco NVMe se ve y se
21# monta igual: lo que falta es SMART/namespaces propios de ese protocolo).
22#
23# ⚠ Y ESTO NO IMPIDE QUE `udisksd` ARRANQUE, lo cual es bueno y hay que saberlo: usa `bd_try_init`
24# (`udisksdaemon.c:373`), que registra `Failed to load the 'crypto' libblockdev plugin` y **sigue**.
25# O sea que el demonio levanta, los discos y los USB funcionan, y lo que falta falla en el momento
26# de usarlo. Es degradación honesta, no un arranque roto — pero el log lo va a decir en cada boot.
27#
28# ── LO DEMÁS, APAGADO POR NO TENER CONSUMIDOR ─────────────────────────────────────────────────
29# btrfs, dm, lvm, mpath, nvdimm, s390, smart, smartmontools, tools, escrow, python3. ⚠ TODOS los
30# plugins vienen ENCENDIDOS por defecto en este configure (`AS_IF([test "x$with_X" != "xno"]`), así
31# que hay que nombrarlos uno por uno: no declarar uno es encenderlo.
32#
33# `--disable-introspection`: el consumidor (udisks) es C. `--without-gtk-doc`: no hay gtk-doc.
34# ⚠ SIN `gettext-tiny`: este tarball no trae `po/` (comprobado).
35name = "libblockdev"
36version = "3.5.0"
37license = "LGPL-2.1-or-later"
38
39[source]
40tarball = "https://github.com/storaged-project/libblockdev/releases/download/3.5.0/libblockdev-3.5.0.tar.gz"
41sha256 = "bccd30e6b5d11504de60d9889ff6a2a25b07a4ec8f04070f2387e168301b3e3a"
42
43[build]
44compiler = "zig-cc"
45target = "x86_64-linux-musl"
46link = "dynamic"
47
48[build.phases]
49configure = "CFLAGS='-O2 -fPIC' PKG_CONFIG_PATH=/usr/lib/pkgconfig ./configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc --enable-shared --disable-static --disable-dependency-tracking --disable-introspection --without-gtk-doc --with-fs --with-part --with-loop --with-swap --without-btrfs --without-crypto --without-dm --without-lvm --without-lvm-dbus --without-mdraid --without-mpath --without-nvdimm --without-nvme --without-smart --without-smartmontools --without-s390 --without-tools --without-escrow --without-python3 && sed -i 's/ -nostdlib//g' libtool"
50compile = 'make -j"$(nproc)"'
51install = '''
52set -e
53make DESTDIR=/out install
54# ── LAS TRES CABECERAS QUE UDISKS EXIGE Y ESTE BUILD NO INSTALA ──────────────────────────────
55# `udisks/configure.ac:440-548` comprueba con AC_COMPILE_IFELSE que existan `blockdev/part.h`,
56# `loop.h`, `swap.h`, `fs.h`, `mdraid.h`, `crypto.h` y `nvme.h`, y ABORTA si falta alguna. Las
57# cuatro primeras las instala este build; las tres últimas no, porque sus plugins están apagados.
58#
59# Se copian igual, y no es un apaño ciego — está medido sobre el artefacto:
60#
61# nm -D --defined-only libblockdev.so | grep -c ' bd_md_' ⇒ 28
62# nm -D --defined-only libblockdev.so | grep -c ' bd_crypto_' ⇒ 77
63#
64# o sea que **los stubs de esos plugins YA están en la librería** aunque el plugin no se haya
65# construido: así está diseñado libblockdev —una API estable que hace `dlopen` del plugin— y por eso
66# `bd_try_init` puede arrancar sin él. Las cabeceras viven en el árbol de fuentes
67# (`src/lib/plugin_apis/*.h`), no se generan, así que copiarlas no inventa ninguna API.
68#
69# ⇒ udisks COMPILA y ENLAZA, y en runtime `bd_md_*`/`bd_crypto_*`/`bd_nvme_*` devuelven error de
70# «plugin no disponible». Lo que eso significa para el usuario está en `udisks.toml`.
71cp -a src/lib/plugin_apis/mdraid.h src/lib/plugin_apis/crypto.h src/lib/plugin_apis/nvme.h /out/usr/include/blockdev/
72test -f /out/usr/include/blockdev/crypto.h
73test -f /out/usr/lib/libbd_fs.so
74'''
75
76[deps]
77# El `sed` del `-nostdlib` va por si algún plugin arrastra C++ — es la misma trampa de libtool+zig
78# que documenta `recipes/incoming-gnome/hunspell.toml`, y ponerlo cuesta nada.
79# ⚠ `python3` es dep de BUILD aunque las bindings de Python estén APAGADAS: el `configure` de los
80# dos ejecuta `AM_PATH_PYTHON` igual y, al no encontrar intérprete, recorre toda la lista hasta
81# `python2.0` y aborta con `configure: error: no suitable Python interpreter found`. El mensaje no
82# menciona ninguna opción, así que se lee como si faltara una perilla. Cuarta herramienta de build
83# que se olvida en esta jornada, y por el mismo motivo que las otras tres: no sale en ningún `.pc`
84# ni en ningún `NEEDED` — sólo la ve el configure, fallando.
85#
86# ══ ⚠ POR QUÉ TODO EL CIERRE DE BLOQUE VA EN VARIANTES `-shared` ══════════════════════════════
87# libblockdev construye sus plugins como `.so` y los carga con `dlopen`, así que TODO lo que entre
88# en ellos tiene que ser PIC. Las canónicas del corpus son estáticas y ninguna lo es — medido:
89#
90# libblkid.a 154 · libext2fs.a 422 · libe2p.a 313 · libparted.a 2929 (reubicaciones
91# R_X86_64_32 fuera de .debug; control: libcap.a=0, dbus-1.a=0)
92#
93# y el enlace muere nombrando el fichero: `relocation R_X86_64_64 cannot be used against local
94# symbol; recompile with -fPIC >>> defined in /usr/lib/libblkid.a(la-init.o)`.
95#
96# ⚠ Y `libparted` NO está en la lista, aunque «particiones» suene a parted: el plugin `part` usa
97# **libfdisk** (`configure.ac:233`), y libparted sólo entra con `--with-tools`, que acá está
98# apagado. Eso sacó a parted del cierre entero — una variante compartida menos que autorar.
99#
100# ⚠ Y HUBO UNA TRAMPA ANTES DE LLEGAR ACÁ, que las variantes resuelven de raíz: `e2fsprogs` y
101# `util-linux` publican LOS MISMOS ficheros (`blkid.pc`, `uuid.pc`, `libblkid.a`, `libuuid.a`), y la
102# hidratación SOBREESCRIBE (`hydrate.rs`, test `hydrate_overwrites_existing_without_touching_store`)
103# ⇒ sobrevive la del dep que se hidrata AL FINAL. Con las canónicas, el configure veía la blkid
104# 1.47.4 que arrastra e2fsprogs y abortaba pidiendo >= 2.23.0, y la cura era reordenar una lista,
105# que es una cura frágil. Por eso `e2fsprogs-shared`, `libmount-shared` y `libfdisk-shared` BORRAN
106# en su `install` lo que no es suyo: cada receta publica lo que dice su nombre y ningún orden de
107# lista decide qué versión de una librería ve un build.
108#
109# `libudev-zero` da `libudev.pc` (el núcleo lo pide, `configure.ac:200`); `kmod` da `libkmod.pc`;
110# `util-linux` da blkid/mount/uuid; `e2fsprogs` da ext2fs/e2p; `parted` da libparted.
111build = ["make", "pkgconf", "python3", "glib", "libffi", "pcre2", "zlib-shared", "kmod", "libudev-zero", "e2fsprogs-shared", "libblkid-shared", "libmount-shared", "libuuid-shared", "libfdisk-shared"]