Los llamadores EJECUTABLES: scripts/ (incluida toda la granja), los runbooks y CLAUDE.md. Seguro porque la 3a ya garantiza que el worker emite los dos binarios, y porque en farm-lab-sync.sh el cargo build remoto precede a la invocación remota en el mismo script. Verificado: sintaxis de los 49 (bash -n / py_compile — ojo que why-differs-barrido.sh es Python con extensión .sh) y `takana hash` devuelve hash real sobre el store. NO se toca en esta etapa, a propósito: - La variable de entorno HAMMER=. Es interfaz de los scripts entre sí y hay llamadores que la fijan; renombrarla va con la etapa 4. - docs/evidencia/ y los HANDOFF: son REGISTRO de lo que se corrió ese día. Reescribir un comando dentro de una evidencia la falsifica. - docs/state/: es generado, se regenera solo. - Los ADR y los docs de diseño: texto, y `hammer` sigue funcionando. Van con la etapa 5, que es la de churn de texto.
44 lines
2.6 KiB
Bash
44 lines
2.6 KiB
Bash
# libs-compartidas-desde-store.sh — helper compartido por los scripts de imagen: poner en el rootfs
|
|
# fundido las librerías COMPARTIDAS que el cierre hidratado NO trae, tomándolas de su artefacto
|
|
# sellado (`<lib>-shared`).
|
|
#
|
|
# ── POR QUÉ EXISTE ──────────────────────────────────────────────────────────────────────────────
|
|
# La receta canónica de libffi/expat/bzip2 es `--disable-shared`: su artefacto publica sólo el `.a`.
|
|
# Pero libgobject, libgirepository, libwayland-{client,server}, libp11-kit y libgjs salen con
|
|
# `NEEDED`/símbolos `ffi_*`, y mesa entero (iris_dri, swrast_dri, kms_swrast_dri, libEGL, libgbm)
|
|
# con `XML_*`. En el HOST eso resuelve contra el sysroot Alpine DEL LAB, así que el artefacto sella,
|
|
# el perfil reporta 100% y nadie se entera. En la imagen no hay lab: el loader de musl aborta con
|
|
#
|
|
# Error relocating /usr/lib/libgobject-2.0.so.0: ffi_call: symbol not found
|
|
#
|
|
# y el escritorio muere con código 127 antes de pintar. Es el mismo punto ciego que documenta
|
|
# `scripts/vigia-sonames.py` («mesa y wayland pidiendo expat y libffi»), visto desde el lado de la
|
|
# imagen: el cierre de BUILD no es el cierre de RUNTIME.
|
|
#
|
|
# El artefacto se elige por `hammer hash` sobre la receta —el de la receta de HOY—, no por el más
|
|
# reciente del store: con dos artefactos del mismo paquete conviviendo, la fecha no dice cuál rige.
|
|
# Mismo criterio que `pid1-desde-store.sh` y que los inyectores de arje-*-compat.
|
|
#
|
|
# ABORTA si falta un artefacto. Deliberado: seguir sin él produce una imagen que arranca hasta el
|
|
# escritorio y muere ahí, que es el modo de falla que este helper existe para cerrar.
|
|
#
|
|
# Uso: . scripts/lib/libs-compartidas-desde-store.sh ; inyectar_libs_compartidas "$MERGED"
|
|
# Var: LIBS_COMPARTIDAS="libffi-shared expat-shared bzip2-shared" (override de la lista)
|
|
|
|
inyectar_libs_compartidas() {
|
|
local merged="$1" recetas hash dir n
|
|
recetas="${LIBS_COMPARTIDAS:-libffi-shared expat-shared bzip2-shared}"
|
|
echo "==> libs compartidas del store (el cierre sólo trae los .a)"
|
|
for n in $recetas; do
|
|
hash=$(./target/release/takana --store store hash "recipes/$n.toml" 2>/dev/null | tail -1 | sed 's/^b3://')
|
|
dir="store/$hash-$n"
|
|
if [ -n "$hash" ] && [ -d "$dir" ]; then
|
|
cp -a --remove-destination "$dir"/usr/lib/*.so* "$merged"/usr/lib/ 2>/dev/null || true
|
|
echo " ✓ $n $(echo "$hash" | cut -c1-12)"
|
|
else
|
|
echo " ✗ falta $n sellado en store/ — el escritorio morirá con 'symbol not found'" >&2
|
|
return 1
|
|
fi
|
|
done
|
|
}
|