diff --git a/recipes/linux-firmware.toml b/recipes/linux-firmware.toml index 72a96f59..31f15bea 100644 --- a/recipes/linux-firmware.toml +++ b/recipes/linux-firmware.toml @@ -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 ─────────────────────────