diff --git a/recipes/mold.toml b/recipes/mold.toml new file mode 100644 index 00000000..e5e8ecd5 --- /dev/null +++ b/recipes/mold.toml @@ -0,0 +1,61 @@ +# mold 2.42.1 — enlazador paralelo. C++20, CMake. +# +# ── POR QUÉ ENTRA, Y ES DISTINTO DEL RESTO DE ESTA TANDA ────────────────────────────────────── +# Las otras recetas de la tanda son para el usuario del producto; ésta es para quien CONSTRUYE con +# él. El catálogo trae `sccache` (cachear compilaciones) y no tenía con qué acelerar el enlace, que +# es justo la fase serial de un build grande. No reemplaza al lld de zig que usa el lab: entra como +# herramienta del userland, no del sandbox. +# +# ── `-DCMAKE_LINK_DEPENDS_USE_LINKER=OFF`, Y NO ES OPCIONAL ─────────────────────────────────── +# El lld que trae zig SEGFAULTEA cuando CMake le pasa `--dependency-file` (CMake ≥3.31 lo hace de +# fábrica para calcular dependencias de enlace). Ya está medido en este repo: de 15 recetas CMake +# barridas, 5 NO construían por esto. Una línea lo evita. +# +# `-DMOLD_USE_SYSTEM_TBB=OFF` y mimalloc: mold trae sus dependencias en `third-party/` y prefiere +# las suyas; el corpus no tiene ni tbb ni mimalloc, así que usar las de upstream no es una +# concesión sino la única vía sin escribir dos recetas más. +name = "mold" +version = "2.42.1" +license = "MIT" + +[source] +repo = "https://github.com/rui314/mold" +commit = "9b376bc6a9899d4a16b41777de1f013989459fbc" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "static" + +# ⚠ `strip_debug` NO ES COSMÉTICA ACÁ, Y ESTÁ MEDIDA. El primer sello de esta receta dio un +# artefacto de **629 MB, de los cuales 628 son UN SOLO FICHERO**: `/usr/bin/mold` con la info de +# depuración adentro. Un enlazador pesa ~8 MB pelado; el resto es DWARF de un C++20 grande +# compilado con `-g`, que `CMAKE_BUILD_TYPE=Release` no quita. Sellar eso no rompe nada —el binario +# funciona— y por eso es el modo de fallo caro: entra en el store, entra en la imagen, entra en el +# respaldo, y nadie mira el tamaño. Split SDD 23 (entra en `hash_inputs`; obliga a `binutils`). +strip_debug = true + +[build.phases] +# ⚠ `MOLD_MOSTLY_STATIC=ON` + `-static` EXPLÍCITO — LOS DOS, Y SE APRENDIÓ CORRIENDO EL BINARIO. +# El primer sello llevaba `link = "static"` y salió **dinámico**: `NEEDED libz.so.1 libzstd.so.1 +# libc.so`, con intérprete. Al ejecutarlo: +# Error relocating /lib/libz.so.1: __snprintf_chk: symbol not found +# …que es la zlib de glibc DEL ANFITRIÓN resolviendo símbolos de `_FORTIFY_SOURCE` que musl no +# tiene. O sea el cuadro completo de la casa: **selló, reprodujo y NO CORRÍA**. Dos causas +# independientes, y hacen falta las dos perillas: +# 1. `CMakeLists.txt:149` — `if(ZLIB_FOUND AND NOT MOLD_MOSTLY_STATIC)` enlaza la zlib +# COMPARTIDA del sistema; con MOSTLY_STATIC usa la `zlibstatic` que trae en tree (ídem +# zstd y blake3, líneas 161 y 179). Sin esto el binario pide sonames que el corpus no +# publica: `zlib` canónica es `.a`. +# 2. `-DCMAKE_EXE_LINKER_FLAGS=-static` — el `LDFLAGS=-static` que el lab exporta para +# `link = "static"` NO llegó a la línea de enlace de CMake. Declararlo es lo que hace +# que `link = "static"` sea verdad y no una etiqueta. +# +# Moraleja para la próxima receta CMake: `link = "static"` es una DECLARACIÓN, no una +# comprobación. Lo único que la comprueba es `readelf -d` sobre el artefacto — o correrlo. +configure = 'cmake -S . -B _build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_LINK_DEPENDS_USE_LINKER=OFF -DCMAKE_EXE_LINKER_FLAGS=-static -DMOLD_MOSTLY_STATIC=ON -DMOLD_USE_SYSTEM_TBB=OFF -DBUILD_TESTING=OFF' +compile = 'cmake --build _build' +install = 'DESTDIR=/out cmake --install _build' + +[deps] +build = ["cmake", "samurai", "zlib", "zstd", "openssl", "pkgconf", "binutils"] diff --git a/recipes/wireguard-tools.toml b/recipes/wireguard-tools.toml index 67cf6682..f22c645b 100644 --- a/recipes/wireguard-tools.toml +++ b/recipes/wireguard-tools.toml @@ -5,12 +5,18 @@ # configurarlo. Sin esto una caja takana puede hablar WireGuard y no hay forma de decirle con quién. # Pesa dos binarios y un puñado de scripts. # -# ── `link = "dynamic"`, Y NO ES GUSTO ────────────────────────────────────────────────────────── -# `wg` enlaza `libmnl`, y la receta canónica de libmnl es `--disable-static --enable-shared`: en el -# store NO hay un `libmnl.a` contra el que enlazar. Forzar `static` acá no daría un binario estático -# sino un enlace contra el `.a` del sysroot Alpine DEL LAB —la fuga que documenta el perfil de sway -# con zlib/expat/libffi—, que sella bien y sólo corre en una máquina con Alpine debajo. Dinámico es -# lo honesto: el `NEEDED libmnl.so.0` lo cubre la clausura. +# ── NO DEPENDE DE libmnl: LA TRAE ADENTRO ──────────────────────────────────────────────────── +# La primera versión de esta receta iba `link = "dynamic"` con `[deps] build = ["libmnl"]`, y el +# razonamiento era razonable y FALSO: «wg enlaza libmnl, la libmnl canónica es --disable-static, en +# el store no hay libmnl.a ⇒ dinámico». Lo desmintió el artefacto: `readelf -d wg` da **un solo +# NEEDED, `libc.so`**, y los símbolos `mnl_*` están DEFINIDOS adentro. El porqué está escrito en la +# fuente, en `src/netlink.h:1`: +# +# /* This is a minimized version of libmnl meant to be #include'd */ +# +# Upstream embebe el subconjunto de libmnl que usa, justamente para no arrastrar la dependencia. +# ⇒ `link = "static"` y sin `libmnl` en `[deps]`. Declarar una dep que no se usa no es inocuo: ata +# esta receta al hash de otra y hace que un rebuild de libmnl re-selle wireguard-tools para nada. # # ⚠ `wg-quick` es un script bash y pide `bash`, `ip` (iproute2) y `resolvconf`/`openresolv` en # RUNTIME. `wg` a secas no necesita nada de eso. Se declara lo que existe en el corpus; el día que @@ -26,7 +32,7 @@ commit = "49ce333da02056ae7b22ee2aeb6afe8aaed79b19" [build] compiler = "zig-cc" target = "x86_64-linux-musl" -link = "dynamic" +link = "static" [build.phases] # WITH_SYSTEMDUNITS=no: esta distro no tiene systemd (arje). WITH_BASHCOMPLETION/WITH_WGQUICK van @@ -35,5 +41,5 @@ compile = 'make -C src WITH_WGQUICK=yes WITH_BASHCOMPLETION=yes WITH_SYSTEMDUNIT install = 'make -C src DESTDIR=/out PREFIX=/usr WITH_WGQUICK=yes WITH_BASHCOMPLETION=yes WITH_SYSTEMDUNITS=no install' [deps] -build = ["libmnl", "pkgconf"] +build = ["pkgconf"] runtime = ["bash"]