# akllay — el `awk` del producto. Código takana-PROPIO, no una adopción. # # Mismo patrón de receta que simi/netup/hammerd: un crate del workspace a un commit fijado, deps # vendoreadas para build hermético `--offline`, link estático con zig cc. Sólo depende de libc. # # ── EL NOMBRE, Y LA COLISIÓN QUE CASI SE COLÓ ─────────────────────────────────────────────────── # *akllay* = escoger, seleccionar (separando, como los granos). Es lo que hace awk: elige los # registros que casan un patrón y escoge campos de cada uno. # # ⚠ Se llamó `qillqa` («escritura») durante un commit, y ese nombre **estaba tomado**: en # `tawasuyu/02_ruway/qillqa` hay un producto entero —registro público a prueba de manipulación, 16 # crates, SDD propio— cuyo `qillqa-cli` instala un binario llamado exactamente `qillqa`. Dos # binarios homónimos en el mismo `/usr/bin` es una colisión de la que **no avisa nada**: gana el # último que hidrate, y takana empaqueta recetas de tawasuyu. Verificado ahora en los dos repos y # contra los 2193 nombres de binario del store: `akllay` libre, y `simi` también lo estaba. # # ── POR QUÉ PROPIO (decisión del usuario, 2026-09-22: «awk soberano») ─────────────────────────── # El ADR pendiente de `docs/plan-botar-busybox.md` tenía tres candidatos y ninguno era gratis: # · gawk — C, con extensiones GNU que los `configure` del corpus sí usan. Adoptarlo es adoptar # un dialecto más grande que POSIX y una cadena que no es la nuestra. # · goawk — Go. Rompe la premisa de soberanía de cadena de la Etapa C. # · frawk — Rust, pero es otro dialecto (JIT, semántica propia). # La cuarta opción, escribirlo, es la que se tomó. 3531 líneas, cero crates de terceros, y un motor # de expresiones regulares propio: POSIX es leftmost-LONGEST y el crate `regex` es leftmost-first, # y esa diferencia decide qué borra un `sub()` y cuánto vale `RLENGTH`. # # ── LO MEDIDO ─────────────────────────────────────────────────────────────────────────────────── # Banco diferencial contra DOS oráculos —`busybox awk` y `gawk --posix`— con 109 casos: 104 iguales # a los dos, 0 divergencias, 5 discrepancias ENTRE los oráculos (cuatro las tenemos del lado de # POSIX). Más los 59 programas awk reales de este repo, que acepta todos, y 29 pruebas propias. # # ⚠ Falta la prueba que de verdad decide, y esta cabecera no la finge: un `configure` de autotools # con akllay como `/usr/bin/awk`. Es la lección de brush, que pasó 56/57 casos POSIX y no construía # una sola receta. name = "akllay" version = "0.0.1" license = "MIT" [source] # El propio takana. El commit es el identificador inmutable; subirlo cuando akllay avance. repo = "https://git.gioser.net/sergio/takana.git" commit = "c0ded9acb285ee6c7c6b191590c9635a6242a274" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" # Split de la info de depuración, igual que hammerd y simi. Entra en `hash_inputs`. strip_debug = true # Sólo el binario `akllay` del workspace. flags = ["-p", "akllay"] # El BuildSys::Cargo instala el binario; el enlace `awk` lo pone esta receta porque **ese sí es # contrato**: lo llaman los `configure` del corpus y los guiones del producto. A diferencia de # `simi`, donde el symlink `sh` lo decide el ensamblado del rootfs —quién es /bin/sh es una # decisión de la raíz de confianza—, acá no hay nada que disputar: en el corpus no existe otro awk # declarado en ningún perfil. [build.phases] install = "mkdir -p /out/usr/bin && cp target/release/akllay /out/usr/bin/akllay && ln -sf akllay /out/usr/bin/awk"