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