diff --git a/recipes/pkgconf.toml b/recipes/pkgconf.toml index e84b8ba9..c9135c3a 100644 --- a/recipes/pkgconf.toml +++ b/recipes/pkgconf.toml @@ -19,3 +19,14 @@ sha256 = "ab89d59810d9cad5dfcd508f25efab8ea0b1c8e7bad91c2b6351f13e6a5940d8" compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" + +# Fases explícitas SÓLO para el `-all-static` (patrón jq/parted/shadow/procps-ng/expat). Con el +# BuildSys automático el `LDFLAGS=-static` que el lab exporta por `link = "static"` pasa por LIBTOOL, +# que lo lee como "preferí mis .a", NO como flag al linker ⇒ el binario salía DINÁMICO (NEEDED: +# libc.so) jurando ser estático. El único flag de libtool para un binario 100% estático es +# `-all-static`, y va en `make` Y en `make install` (libtool RELINKEA al instalar; sólo en compile no +# basta). Nunca en configure: ahí rompe los tests de link de autotools. +[build.phases] +configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --disable-shared --enable-static' +compile = 'make LDFLAGS="-all-static -no-pie" -j"$(nproc)"' +install = 'make DESTDIR=/out install LDFLAGS="-all-static -no-pie"' diff --git a/recipes/samurai.toml b/recipes/samurai.toml index 1114a681..085a70f8 100644 --- a/recipes/samurai.toml +++ b/recipes/samurai.toml @@ -19,17 +19,25 @@ zig_version = "0.13.0" build = ["make"] [build.phases] -# `-target x86_64-linux-musl` en LDFLAGS: samurai NO usa libtool (Makefile pelado), así que el -# `-all-static` de jq/parted/shadow no aplica — sería un flag desconocido para zig-cc. La causa era -# otra y NO es de samurai: el lab exporta `CC="zig cc -mcpu=baseline"` SIN `-target` (sandbox.rs), -# así que zig compila NATIVO, detecta la musl de Alpine del rootfs (/usr/lib/libc.a existe) y enlaza -# contra ella IGNORANDO el `-static` que el lab exporta por `link = "static"`. Medido dentro del -# sandbox sobre un `int main(){return 0;}` trivial, con readelf: -# zig cc -mcpu=baseline -static → NEEDED=1 (dinámico) -# zig cc -mcpu=baseline -target x86_64-linux-musl -static → NEEDED=0 (estático) -# El `-target` fuerza la musl BUNDLEADA de zig ⇒ el `-static` se respeta. La receta ya declaraba -# `target = "x86_64-linux-musl"`, pero ese campo no llega al CC: hasta que eso se arregle en el -# framework (re-hashea los 841 sellados), va por receta. +# `-target x86_64-linux-musl` en LDFLAGS. Samurai cae en la INTERSECCIÓN de dos rarezas, y por eso es +# la única receta que necesita esto: +# +# 1. NO usa libtool (Makefile pelado) ⇒ el `-all-static` de jq/parted/shadow/expat no aplica acá: +# sería un flag desconocido para zig-cc. El `-static` llega crudo al driver. +# 2. Pinea `zig_version = "0.13.0"` (ver arriba: el zig default miscompila el musl acá) — y el +# `-static` de zig 0.13 está ROTO para el target NATIVO dentro del sandbox: compila nativo, +# detecta la musl de Alpine del rootfs (/usr/lib/libc.a existe) y enlaza contra ella IGNORANDO +# el -static. `-target` fuerza la musl BUNDLEADA de zig ⇒ el -static se respeta. +# +# Medido DENTRO del sandbox con readelf, sobre un `int main(){return 0;}` trivial: +# zig 0.13.0: -static → NEEDED=1 (dinámico) ← el bug +# zig 0.13.0: -target x86_64-linux-musl -static → NEEDED=0 (estático) +# zig 0.16.0: -static → NEEDED=0 (estático) ← default, sano +# +# NO es un agujero de framework: con el zig default el -static del lab funciona, así que `CC` sin +# `-target` (sandbox.rs) está bien y NO hay que re-hashear el store. Las otras 4 recetas que pinean +# 0.13.0 con link=static (mtools/openssh/openssl/xorriso) están sanas: usan libtool, que absorbe el +# -static por su cuenta. Auditadas, 0 mienten. compile = 'make CFLAGS="-O2" LDFLAGS="-target x86_64-linux-musl -static"' install = ''' set -e