diff --git a/recipes/expat.toml b/recipes/expat.toml index 5e896eb3..904ee8db 100644 --- a/recipes/expat.toml +++ b/recipes/expat.toml @@ -12,10 +12,13 @@ sha256 = "10b195ee78160a908388180a8fe3603d4e9a12f4755fbf5f3816b23a9d750da0" compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" + +# Split de la info de depuración (SDD 23 etapa 4). Entra en `hash_inputs`: re-hashea a propósito. +strip_debug = true flags = [] [deps] -build = ["make"] +build = ["binutils", "make"] [build.phases] # --with-pic: el .a estático lleva objetos PIC ⇒ enlazable dentro de .so (Mesa liga libexpat en diff --git a/recipes/ncurses.toml b/recipes/ncurses.toml index 4e565236..5ddb78e2 100644 --- a/recipes/ncurses.toml +++ b/recipes/ncurses.toml @@ -9,7 +9,13 @@ sha256 = "136d91bc269a9a5785e5f9e980bc76ab57428f604ce3e5a5a90cebc767971cc6" compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" + +# Split de la info de depuración (SDD 23 etapa 4). Entra en `hash_inputs`: re-hashea a propósito. +strip_debug = true [build.phases] configure = "./configure --prefix=/usr --without-shared --with-normal --enable-widec --without-debug --without-ada --without-tests --enable-pc-files --with-pkg-config-libdir=/usr/lib/pkgconfig --with-fallbacks=linux,vt100,vt220,xterm,xterm-256color,screen,tmux,tmux-256color,ansi" compile = "make" install = "make install.libs install.includes DESTDIR=/out" + +[deps] +build = ["binutils"] diff --git a/recipes/zstd.toml b/recipes/zstd.toml index c7f1f388..d9af0e42 100644 --- a/recipes/zstd.toml +++ b/recipes/zstd.toml @@ -10,9 +10,15 @@ sha256 = "eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3" compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" + +# Split de la info de depuración (SDD 23 etapa 4). Entra en `hash_inputs`: re-hashea a propósito. +strip_debug = true flags = [] [build.phases] # CFLAGS con -fPIC: el libzstd.a lleva objetos PIC ⇒ enlazable dentro de .so (Mesa liga libzstd en # sus bibliotecas compartidas; sin PIC: «R_X86_64_PC32 ... recompile with -fPIC»). PIC es superset. compile = 'make -C lib libzstd.a CFLAGS="-O3 -fPIC"' install = 'make -C lib install PREFIX=/usr DESTDIR=/out' + +[deps] +build = ["binutils"] diff --git a/scripts/desplegar-strip.sh b/scripts/desplegar-strip.sh new file mode 100755 index 00000000..5ca780eb --- /dev/null +++ b/scripts/desplegar-strip.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +# desplegar-strip.sh — activa `strip_debug = true` por TANDAS. Etapa 4 del SDD 23. +# +# ── QUÉ HACE Y POR QUÉ POR TANDAS ────────────────────────────────────────────────────────────── +# Activar el split de debug re-hashea la receta A PROPÓSITO (cambia el contenido del artefacto), y +# re-hashea en cascada todo lo que dependa de ella. Hacerlo de golpe sobre 1161 recetas dejaría el +# corpus entero sin sellar a la vez: días de granja antes de poder verificar NADA, y el disco +# aguantando artefactos viejos y nuevos al mismo tiempo. +# Por tandas se puede medir, verificar y podar entre medias, que es lo que hace la campaña +# reversible en vez de un salto a ciegas. +# +# ── LA DEP DE `binutils` VA EXPLÍCITA, NO INYECTADA POR EL LAB ────────────────────────────────── +# El paso de strip usa `strip --strip-debug -D` de binutils. Se podría hacer que el lab lo +# materialice solo, sin tocar las recetas — pero entonces la VERSIÓN de binutils sería un input +# invisible: dos corridas con binutils distintos darían artefactos distintos con el mismo hash. Los +# `deps` SÍ entran en `hash_inputs`, así que declararlo es lo único que mantiene el invariante. +# Cuesta una edición mecánica por receta; el invariante no se negocia por comodidad. +# +# ── EXCLUSIONES, y por qué exactamente éstas ─────────────────────────────────────────────────── +# `binutils` y `make`: binutils provee el `strip`, y depende de make. Si se les activara el split se +# necesitarían a sí mismos para construirse. No es una preferencia: es la circularidad. +# +# Uso: scripts/desplegar-strip.sh --tanda N [--aplicar] +# (sin --aplicar sólo lista lo que haría) +set -uo pipefail +ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT" +N="${N:-25}"; APLICAR=0 +while [ $# -gt 0 ]; do + case "$1" in + --tanda) N="$2"; shift 2 ;; + --aplicar) APLICAR=1; shift ;; + *) echo "opción desconocida: $1" >&2; exit 2 ;; + esac +done + +EXCLUIDAS="binutils make" + +candidatas="" +for f in recipes/*.toml; do + [ -f "$f" ] || continue + n=$(basename "$f" .toml) + case " $EXCLUIDAS " in *" $n "*) continue ;; esac + grep -q 'strip_debug' "$f" && continue # ya desplegada + grep -q 'CERRADA POR DECISIÓN' "$f" && continue # no se toca lo cerrado + grep -qE '^link\s*=' "$f" || continue # sin línea link no sé dónde insertar + candidatas="$candidatas $f" +done + +total=$(echo $candidatas | wc -w) +tanda=$(echo $candidatas | tr ' ' '\n' | head -"$N") +echo "==> candidatas totales: $total · esta tanda: $(echo $tanda | wc -w)" +[ "$APLICAR" = 1 ] || { echo "$tanda" | tr ' ' '\n' | head -10 | sed 's|^| |'; echo "==> DRY-RUN: nada tocado. Repetí con --aplicar."; exit 0; } + +hechas=0 +for f in $tanda; do + python3 - "$f" <<'PY' +import re, sys +p = sys.argv[1]; s = open(p).read() +m = re.search(r'^(link\s*=\s*"[a-z]+")\s*$', s, re.M) +if not m: sys.exit(0) +s = s[:m.end(1)] + '\n\n# Split de la info de depuración (SDD 23 etapa 4). Entra en `hash_inputs`: re-hashea a propósito.\nstrip_debug = true' + s[m.end(1):] +# binutils en deps: el paso de strip del lab usa su `strip --strip-debug -D`. +if '"binutils"' not in s: + if re.search(r'^build\s*=\s*\[', s, re.M): + s = re.sub(r'^build\s*=\s*\[', 'build = ["binutils", ', s, count=1, flags=re.M) + elif '[deps]' in s: + s = s.replace('[deps]', '[deps]\nbuild = ["binutils"]', 1) + else: + s = s.rstrip('\n') + '\n\n[deps]\nbuild = ["binutils"]\n' +open(p, 'w').write(s) +PY + hechas=$((hechas+1)) +done +echo "==> $hechas recetas con strip_debug=true (+ dep binutils)" +echo "==> siguiente: construir la tanda en la granja y verificar con scripts/verificar-repro.sh"