linux-firmware: los enlaces de WHENCE se encadenan, así que van en tres pasadas

Primer intento con el arreglo: 2078 de 2415 (86 %), y el guardián cortó. La causa es que WHENCE
encadena —declara `a -> b` donde `b` es a su vez un enlace que aparece más abajo—, así que en una
sola pasada el destino todavía no existe cuando toca crear el primero. Se repite hasta que una
pasada no agregue nada, con tope de tres. Y ahora salta los que ya existen, para no recontar.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-09-17 21:27:16 +00:00
co-authored by Claude Opus 5
parent 36c3634542
commit d1032c0336
+18 -9
View File
@@ -77,16 +77,25 @@ cp -a ./* /out/lib/firmware/
sed -n 's/^Link:[[:space:]]*//p' /out/lib/firmware/WHENCE \
| sed 's/[[:space:]]*->[[:space:]]*/\t/' > /tmp/whence-links.tsv
declarados=$(wc -l < /tmp/whence-links.tsv)
# TRES PASADAS, y el motivo es medido: WHENCE encadena enlaces —`a -> b` donde `b` es a su vez un
# enlace que se declara más abajo—. Con una sola pasada el destino todavía no existe cuando toca
# crear el primero, y quedaban 2078 de 2415 (86 %), que es justo lo que hizo saltar al guardián.
hechos=0
while IFS="$(printf '\t')" read -r dst src; do
[ -n "$dst" ] && [ -n "$src" ] || continue
dir=$(dirname "/out/lib/firmware/$dst")
[ -e "$dir/$src" ] || continue # sólo si el destino existe de verdad
mkdir -p "$dir"
ln -sf "$src" "/out/lib/firmware/$dst"
hechos=$((hechos+1))
done < /tmp/whence-links.tsv
echo "linux-firmware: $hechos/$declarados enlaces de WHENCE creados"
for pasada in 1 2 3; do
antes=$hechos
while IFS="$(printf '\t')" read -r dst src; do
[ -n "$dst" ] && [ -n "$src" ] || continue
dst_abs="/out/lib/firmware/$dst"
[ -e "$dst_abs" ] && continue # ya hecho (o es un fichero de verdad)
dir=$(dirname "$dst_abs")
[ -e "$dir/$src" ] || continue # sólo si el destino existe de verdad
mkdir -p "$dir"
ln -sf "$src" "$dst_abs"
hechos=$((hechos+1))
done < /tmp/whence-links.tsv
echo "linux-firmware: pasada $pasada — $hechos/$declarados enlaces"
[ "$hechos" -eq "$antes" ] && break
done
[ "$hechos" -ge $((declarados * 9 / 10)) ] || { echo "linux-firmware: sólo $hechos de $declarados enlaces — el árbol no casa con su WHENCE" >&2; exit 1; }
# ── Aserción de completitud, CONTRA WHENCE y no contra un número mágico ─────────────────────────