swm_version: 1 base: distro_version: dev pins: {} mutations: - type: source_patch tarball: https://ftp.gnu.org/gnu/readline/readline-8.2.tar.gz sha256: 3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35 build: compiler: zig-cc target: x86_64-linux-musl link: dynamic flags: [] phases: configure: ./configure --prefix=/usr --enable-shared --disable-static --with-curses compile: make SHLIB_LIBS=-lncursesw install: | set -e make install DESTDIR=/out SHLIB_LIBS=-lncursesw # La readline trae `rlconf.h` y binarios de ejemplo que no hacen falta para satisfacer un NEEDED. rm -rf /out/usr/bin /out/usr/share # ── GUARDIÁN 1: el soname que los consumidores piden ───────────────────────────────────────── F=$(find /out/usr/lib -name 'libreadline.so.8*' | head -1) test -n "$F" || { echo "!! no se generó libreadline.so.8 — ¿--enable-shared no tomó?" >&2; ls -l /out/usr/lib >&2; exit 1; } SO=$(readelf -d "$F" 2>/dev/null | sed -n 's/.*SONAME.*\[\(.*\)\].*/\1/p') test "$SO" = "libreadline.so.8" || { echo "!! SONAME es '$SO' y esperaba 'libreadline.so.8'" >&2; exit 1; } echo "guardián: libreadline.so.8 ok (SONAME correcto, $(stat -Lc%s "$F") bytes)" # ── GUARDIÁN 2: EL DE ALPINE — que no esté SUBENLAZADA ─────────────────────────────────────── # Copiado de su APKBUILD casi literal («verify that it is not underlinked as upstream designed # it»). Sin esto la librería existe, tiene el soname correcto y sus símbolos de terminal quedan # colgando: el fallo reaparecería en el consumidor, a un eslabón de distancia y sin nombrar a esta # receta. Es exactamente la forma de fallo que esta receta viene a cerrar, así que dejarla sin # comprobar sería no haber aprendido nada. readelf -d "$F" 2>/dev/null | grep -q 'NEEDED.*ncurses' || { echo "!! libreadline.so.8 NO está enlazada contra ncurses (subenlazada)" >&2 echo " readline hace esto por diseño de upstream; revisá SHLIB_LIBS=-lncursesw." >&2 readelf -d "$F" 2>/dev/null | grep NEEDED >&2 exit 1 } echo "guardián: enlazada contra ncurses ($(readelf -d "$F" | sed -n 's/.*NEEDED.*\[\(.*ncurses.*\)\].*/\1/p'))" # ── GUARDIÁN 3: la prueba del consumidor ───────────────────────────────────────────────────── # Los símbolos que python3 y sqlite buscan de verdad. «Existe» no es «sirve». falta="" for s in readline add_history rl_completion_matches; do nm -D --defined-only "$F" 2>/dev/null | grep -qE " $s(@|\$)" || falta="$falta $s" done test -z "$falta" || { echo "!! la .so no define:$falta" >&2; exit 1; } echo "guardián: define los símbolos que piden python3 y sqlite" target_bin: /usr/bin/readline-shared expected_hash: b3:79355aadaef0df300bac523a4d64d7087ec061f147048df0ad9c9809047123a0 deps: build: - ncurses-shared - make runtime: []