qtshadertools construyó qsb + instaló OK, pero el post-paso de symlinks falló:
'ln: /out/: cannot overwrite directory' (línea de user_facing_tool_links con
nombre vacío → ln ... /out/) → install non-zero → no selló → qtdeclarative sin
qsb. Los tools quedan en /usr/lib/qt6/bin con rpath; CMake los halla solo.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Tras mesa/EGL, nuevo muro: Qt6GuiPrivateDependencies.cmake declara third_party
XKB (libxkbcommon) → sin materializar, Qt6::GuiPrivate no se crea → 'non-existent
target'. Set completo de deps p/consumidor Qt6::Gui: mesa (EGL+GLESv2) + libdrm +
libxkbcommon (XKB). Patrón durable para KF6.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bug: qtshadertools selló VACÍO — 'Could NOT find EGL' → 'TARGET Qt::Gui not met'
→ skip build → sin qsb → qtdeclarative desactivó QtQuick (solo motor QML). El
Qt6::Gui de qtbase (construido con EGL) exige EGL en TODO consumidor. Fix: mesa
(trae EGL headers+egl.pc+libEGL) + libdrm en deps de qtshadertools/qtsvg/
qtdeclarative. Patrón para todo consumidor de Qt6::Gui (KF6 incluido).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Puerta a la Capa 2 (KF6, ~80 frameworks). CMake puro sin compilación; docs
(sphinx/qttools) y tests off ⇒ cmake+samurai, sin dep Qt. Listo para la próxima
tanda de granja tras validar la cadena Qt de Capa 1.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
De-Alpinizadas con el patrón del gate H-Qt (dinámico, wrappers zig cc/c++ en árbol
de fuente, CMAKE_PREFIX_PATH=/usr para hallar qtbase sellado, examples/tests off).
Deps por STEM de archivo (resolver por filename). Cadena a H-QML: qtbase(✓) →
qtshadertools → qtdeclarative (+ qtsvg + qtlanguageserver). Farm desde snapshot
KDE 407438750 (qtbase cache-hit).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
qtbase 6.11.1 SELLÓ (b3:7c7c747d…) — Core/Gui/Widgets/OpenGL + QPA wayland, todo
.so dinámico bajo musl+zig-cc. La app compila y linkea contra él; corrida en el
rootfs musl del worker con QT_QPA_PLATFORM=offscreen crea la ventana y el event
loop sale rc=0. Régimen dinámico del ADR 0011 probado end-to-end.
Hidratación runtime: mesa+libdrm del store + libxkbcommon.so.0 fabricada del .a
(PIC) — deuda Capa 0 (varios libs canónicos son static-only).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
8vo ciclo: entró a Gui, murió con símbolos expat (XML_ParseBuffer…) — fontconfig.a
→ expat pero el link estático no arrastra la transitiva (el .pc no la declara).
En vez de iterar lib-por-lib, bundleo freetype/harfbuzz/libpng/libjpeg en Qt (PIC,
cierre completo) y apago fontconfig. zlib/pcre2 siguen reusándose. Deuda Capa 0.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
7mo ciclo: pasó Network (openssl off), murió linkeando con glib — símbolos
indefinidos g_hmac_ref/g_strv_builder_ref/g_bookmark_file_copy bajo --no-undefined.
El glib.a resuelve lo que Core.so necesitó pero no el cierre completo estricto;
GTK4 lo linkea laxo. Qt tiene event loop propio → glib opcional para una ventana.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6to ciclo: mismo patrón que sqlite, ahora en libQt6Network.so con libcrypto.a
(EVP_SKEYMGMT_free, R_X86_64_PC32 sin -fPIC). zlib entra bien (es libz.so). Una
ventana no usa SSL → openssl OFF. Deuda Capa 0/1: sqlite+openssl shared/PIC para KDE.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5to ciclo: libQt6Core.so LINKEÓ (obj 431) — el régimen dinámico anda con el
closure estático. Único error PIC = libsqlite3.a (sellado sin -fPIC + sin
COLUMN_METADATA) al armar libqsqlite.so. Una ventana Qt no usa SQL → FEATURE_sql=OFF.
Cuando KDE pida Qt SQL (Capa 2): sqlite shared/PIC.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4to ciclo: /tmp/zw/cxx 'not found' (status 127) en compile — /tmp se vacía entre
fase configure y compile; sólo el árbol de fuente persiste. Muevo los wrappers a
$PWD/.zwrap (junto a build/). CMake cachea el path absoluto y sigue válido en compile.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3er ciclo murió en [133/1749] con 'zig -std=gnu++17' (unknown command): CMake
resuelve el symlink cc→/opt/zig/zig al binario real, perdiendo el despacho por
argv[0]; ASM y custom-commands de Qt invocan zig directo sin subcomando. Fix:
scripts /tmp/zw/{cc,cxx} = exec zig cc/c++ -mcpu=baseline; CMAKE_{C,CXX,ASM}_COMPILER
apuntan a ellos. Un script no se canonicaliza ⇒ el subcomando viaja siempre.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2do ciclo: la clausura de deps reconstruyó OK (cmake/glib/openssl/mesa/…) pero
dbus falló — su meson no ve glib-2.0 por pkg-config e intenta bajar glib (sin
red en sandbox). dbus no hace falta para abrir una ventana Qt; se apaga para
el gate. Bug del recipe dbus a arreglar en Capa 2 (KDE sí necesita D-Bus).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
El primer ciclo de granja falló en resolver la dep 'perl' (no hay receta
canónica). Qt6 reemplazó syncqt.pl por un syncqt C++; Alpine lista perl por
precaución. Se quita de deps para el gate; si el build lo reclama, se importa
perl de verdad (de-Alpinización grande, no especulativa).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fija la política (capa GUI adopta linking DINÁMICO: Qt carga plugins .so en
runtime, incompatible con el static-musl del userland CLI), el orden topológico
en 5 capas (sustrato→Qt6→KF6→Plasma→apps), 6 hitos verificables (gate = H-Qt:
qtbase + una ventana Qt bajo el régimen dinámico) y la estrategia de granja
(cola aislada incoming-kde/, cadencia por capa, qtwebengine diferido).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Revierte el experimento de shadow-por-clobber: pisar /usr/lib con libs del base-system deja
arje-zero+hammerd arrancando pero sshd/login mudo (ABI musl del producto disturbado). No-clobber
preserva el producto entero y añade los binarios nuevos (probado VERDE). La sombra de applets busybox
(sed/ps/ip→full) es política del ensamblado del producto (mecanismo 'adelgazar busybox' de coreutils),
que re-linkea el NOMBRE sin tocar /usr/lib — follow-up de empaque documentado en el script.
product-base-system-boot-test.sh: hidrata los 26 paquetes del base-system sobre el product-rootfs
sellado (cp -an, preserva /etc/passwd/shadow/ssh del producto), lo bootea en QEMU y verifica DENTRO
del guest por SSH que corren. VERDE: arje-zero PID1 + sshd + bash 5.3/git 2.54/gpg 2.4.9/useradd/
vim 9.2/119 CA certs. Nota: MEM=6144 (rootfs aumentado ~1.1G en tmpfs). Caveat conocido: ps/ip/sed
resuelven a busybox por precedencia de PATH (los binarios full están, a sus rutas) — mismo patrón
'adelgazar busybox' que el producto ya aplica a coreutils; refinamiento de empaque pendiente.
Cierra el userland foundational: foot (terminal Wayland) + su cadena de libs → canónicas + repo
firmado. incoming-clib queda VACÍO (todo el base-system promovido). Front (d) COMPLETO a nivel build.
b3:2e8e1b2d. Cierra el userland foundational. Patrón meson estilo fcft, -Dprefer_static=true
(fontconfig.a arrastra expat), -Dgrapheme-clustering=enabled (utf8proc). link=dynamic (pixman
canónica es .so-only, la misma de mirada). Trampa real: zig 0.16/clang21 daba un binario que
SIGSEGV antes de main (relro→NULL) → zig_version=0.13.0 como pixman/wayland. foot+footclient
--version OK. Runtime: necesita compositor Wayland (frente mirada) + TERM/terminfo aparte.
b3:9cdb6274. Patrón meson --default-library=static -Ddocs=disabled -Dsvg-backend=none. deps:
tllist+utf8proc+freetype+fontconfig+harfbuzz+pixman (+libpng/zlib/expat por .pc transitivos).
Todas las deps de foot ya existen.
product-userland-from-repo.sh ahora hidrata el userland foundational C (bash/git/sudo/util-linux/
shadow/red/disco/TLS/gpg/…) además de la capa CLI Rust, todo desde el repo firmado con
--require-signed (verifica firma → reproduce del .swm → hidrata FHS). BASE_SYSTEM_PKGS + CLI_RUST_PKGS.
b3:f9de6d2a. deps = cadena canónica sellada (libgpg-error/libgcrypt/libassuan/libksba/npth/zlib).
Fase configure explícita --disable-{tofu,scdaemon,dirmngr,doc,bzip2} + --with-*-prefix=/usr. gpg+gpgv
estáticos; round-trip cifrado simétrico -c/-d + --print-md SHA512 verificados. Nota: NO apareció el
ubsan de libz.a (el zlib limpio de este mismo commit-set ya se materializa). base-system-3 completo.
b3:a141de41. Patrón meson -Dprefer_static=true (sin él meson enlaza libudev.so → link estático falla).
deps: libusb (nueva) + libudev-zero (stub del catálogo, satisface la dep dura de libudev>=196 en
meson.build; hwdb name-lookup queda stub pero lsusb corre). Cierra el chain libusb→usbutils.
b3:14ab12e0. Lib 3/3 de la cadena gnupg. Fase configure explícita --with-libgpg-error-prefix=/usr
--enable-static. deps: libgpg-error+linux-headers+pkgconf. La cadena crypto de gnupg está completa.
b3:f6a4fa5f. Fase configure explícita --disable-udev (backend netlink/sysfs) --enable-static.
Deja libusb-1.0.a + .pc + header para que usbutils la halle.
b3:2623a403 (antes tenía 77 refs __ubsan_handle_*). Sin -O explícito, zig cc emite el runtime UBSan
que el .a estático arrastra → rompía el link estático de todo lo que enlaza -lz (git/curl/mandoc/
pciutils…). Fix de raíz: -O2 (apropiado para lib de compresión) + opt-out explícito. No está en el
camino de reproducibilidad selfhost/rust (verificado); los ~45 dependientes sellados siguen cacheados,
los rebuilds futuros toman el libz.a limpio y ya no necesitan workarounds ad-hoc.
b3:d4aa8f26. deps→linux-headers; fase configure explícita --enable-mpers=no --without-{libunwind,
libdw,libselinux}; make -C src (tests/ rompe con zig cc -E - por -mcpu= vacío). Deuda menor: zig
FUERZA sus headers UAPI por delante de -I (io_uring zcrx tiene 2 campos más nuevos que zig) → quité
esas 2 líneas de decode; strace traza todo lo demás igual.
b3:a07b7b14. Suite completa estática. Fase configure explícita --without-{libbsd,libpam,fcaps}
(libbsd ausente→usa readpassphrase de fábrica; fcaps→setcap falla en sandbox); make LDFLAGS=-all-static
(libtool ignora -static, gotcha util-linux); limpié install de pam.d de aports. Habilita usuarios
reales (antes sólo root).
b3:a7b8a634. Quité shared-libmandoc.patch (forzaba .so); fase configure explícita que escribe
configure.local (PREFIX=/usr, LDFLAGS=-static, CC='zig cc'). 3er caso del libz.a-UBSan: acá se
resuelve fijando CC=zig cc (su compiler-rt trae __ubsan_handle_*). TODO durable: rebuildear zlib
sin instrumentación UBSan (afecta a todo lo que linkee libz.a estático).
b3:b87f0307. deps→linux-headers (perl/bash eran el fallo de carga). El tarball trae el Configure
viejo (sh, no autotools) → ./Configure -n linux + make CC='cc -static' (Configure genera su propia
línea de link que ignora los LDFLAGS del lab).
b3:e6f71fc4 (procps-ng 4.0.6). compiler=gcc gueto + ncursesw + -no-pie (patrón vim), fase configure
explícita --without-systemd --enable-static. Gotcha: patch a un .am dispara regeneración automake
(ausente) → reordené timestamps de fuentes en configure para saltarla. Herramientas de proceso base.
b3:e9b90fe2 (kbd 2.8.0). deps→flex+linux-headers; fase configure explícita --disable-vlock/tests.
Gotcha del incoming-clib compartido: patches con nombres genéricos (busybox.patch/tests.patch) eran
de STRACE, no de kbd, y rompían el build → patches reducido a [lex.patch]. Cierra el lazo del keymap
que el instalador interactivo ya recogía pero no podía aplicar.
b3:b6ac56cf. make ZLIB=no SHARED=no (sin autotools). Nota recurrente: el libz.a canónico está
instrumentado con UBSan → link estático falla con __ubsan_handle_* (mismo issue que mordió a git);
acá zlib es opcional (pci.ids sin comprimir) → ZLIB=no. TODO durable: rebuildear zlib sin ubsan.
b3:d73a5286. util-linux ya compila y provee libuuid.a + uuid.pc; parted la halla vía
PKG_CHECK_MODULES/pkgconf (dep de build util-linux). Elimina la libuuid v4 mínima que se
horneaba en la fase configure cuando util-linux estaba roto. Verificado: parted --version OK.
Los 17 que construyen de la tanda base-system-1 pasan de recipes/incoming-clib a recipes/
canónicas y al índice firmado (dist/repo, artefacto local): bash git sudo doas util-linux
rsync sed tzdata dbus dhcpcd iproute2 iputils dosfstools e2fsprogs parted vim ca-certificates.
Sólo foot queda staged (stack Wayland, diferido). Cierra el grueso del hueco 'userland
foundational' hacia la distro completa: shell real + VCS + privilegios + red + disco + TLS.
b3:d0d0ebaa (util-linux 2.42.2). De-Alpinizado (deps→linux-headers), fase configure explícita
--without-{python,systemd,udev,ncurses,...}. Bug real del lab parcheado: zig cc -mcpu=baseline
traduce a -mcpu= VACÍO en modo preprocesador (-dM -E -) que zig rechaza; sed filtra ese flag sólo
en tools/all_{errnos,syscalls}. Estáticos vía --enable-static-programs=blkid,fdisk,mount,umount;
lsblk/lscpu quedan musl-dinámicos (libtool ignora -static). Utilería base del sistema.
b3:64b797d2. Reescribí las fases garabateadas (compile hacía _perl_config; install compilaba la
suite de tests) a make all/install limpios con NO_GETTEXT/TCLTK/PYTHON. deps zlib/openssl/curl/
pcre2. Gotchas: FUZZ_PROGRAMS= (oss-fuzz usa --allow-multiple-definition que ld.lld rechaza);
-fsanitize=undefined en compile+install IDÉNTICO (libz.a trae refs __ubsan_* + git relinkea si
GIT-CFLAGS difiere entre fases). El hueco más grande del userland, cerrado.
b3:3d7bb8a7. --disable-device-mapper (sin lvm2) --enable-static; make LDFLAGS=-all-static
(libtool ignora el -static del lab → binario musl-dinámico que segfaultea fuera del sandbox).
parted EXIGE libuuid (uuid_generate p/ GUIDs GPT) y util-linux está roto → horneé una libuuid
mínima (UUID v4 desde /dev/urandom) en la fase configure. Probado: mklabel gpt + mkpart reales.
TODO: reapuntar a la libuuid real de util-linux cuando ésta compile.
b3:d0b9752d. URL/sha256 arreglados (var abuild sin expandir); fase configure explícita;
--without-pam/sssd/skey + --with-secure-path. Clave del link: --disable-shared
--enable-static-sudoers --disable-log-{server,client} (sin eso ld.lld falla por símbolos
versionados sudo_*_v1 de libsudo_util). Install con INSTALL_OWNER= (setuid lo re-aplica la
hidratación). Con doas cubre el escalado de privilegios.
b3:c5a52051. Un solo cambio: [deps] build=[openssl]. La premisa era falsa: c_rehash es un binario
C (no el script perl) que sólo faltaba -lcrypto; perl SÍ está en la dev-fs (mk-ca-bundle.pl corre).
ca-certificates.crt con 119 certs + update-ca-certificates. Sin esto curl/wget HTTPS no validan.
b3:1fdc6fdd. Console-only (--disable-gui --without-x, sin intérpretes). Gotchas: zig-cc
miscompila vim → compiler=gcc (como nano/htop); ncurses del corpus es widec-only (--with-tlib=
ncursesw); termcap usa reubicaciones R_X86_64_32 sobre _nc_globals que no entran en static-PIE →
-fno-pie/-no-pie; vim_cv_* cacheadas para no colgar en musl estático; fase configure explícita.
b3:e2d2244d. configure --without-pam ya andaba (bison=yacc para parse.y); el fallo era el install
(chown root:root falla en el sandbox + doas.conf de aports ausente) → copia manual del binario.