# takana — EL BINARIO DEL PROYECTO, empaquetado como una receta más del corpus. # # POR QUÉ EXISTE (SDD 28 §3.4). El corpus construía 869 recetas y no la suya: `takana` sólo existía # como `cargo build --release` sobre un clon del repo. Eso bloqueaba lo de arriba de todo — que un # servidor takana **se sirva sus propios paquetes a su propio host**: el host necesita `takana` # instalado para consumir el repo, y no podía instalarlo DESDE el repo porque no estaba en el repo. # # Receta Cargo, mismo patrón que `hammerd`/`netup`/`arje-zero`: crate del workspace takana a un # commit fijado (ADR 0006), deps vendoreadas en el fetch para un build hermético `--offline`, enlace # estático con `zig cc`. Sin dependencias C: el CLI es Rust puro (clap/serde/toml/nix/tracing). # # ⚠ EL ALIAS DEL ADR 0016 VOLVÍA AL CRATE INEMPAQUETABLE, y se descubrió acá porque takana nunca se # había empaquetado. `takana-cli` declara DOS `[[bin]]` sobre el mismo `main.rs` (`takana` y `hammer`, # la compatibilidad de la etapa 2). El camino Cargo del corpus invoca `cargo rustc … -- -C # target-feature=+crt-static`, y **`cargo rustc` con argumentos extra sólo admite UN target**: # # error: extra arguments to `rustc` can only be passed to one target, consider filtering # the package by passing, e.g., `--lib` or `--bin NAME` to specify a single target # # Por eso `--bin takana` en los flags. Y `hammer` se repone en la fase de instalación como ENLACE, no # como segundo binario: en el ÁRBOL DE BUILD un symlink no sobrevive (`cargo clean` lo borra y la # siembra de la granja excluye `/target` — por eso el ADR eligió dos `[[bin]]`), pero en el ARTEFACTO # sellado es permanente y no duplica los megas. # # Que `hammer` esté en el artefacto TAPA además un agujero real: `arje-zero` todavía invoca el binario # por el nombre viejo — en el primer arranque de la caja de producción se leyó `hammer no corre, sin # menú de arranque` — y viene pineado desde tawasuyu, así que no se arregla desde este repo. Cuando la # etapa 6 retire el alias, hay que subir arje-zero ANTES. name = "takana" version = "0.0.1" license = "MIT" [source] # El repo del propio takana: el `commit` es el identificador inmutable; la URL es sólo locator y no # entra en `hash_inputs` (ADR 0013 §1). Subirlo cuando el CLI avance. repo = "https://git.gioser.net/sergio/takana.git" commit = "0d0ab79092b282f45bfb1158694f4eaf5df58af5" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" # Split de la info de depuración (SDD 23 etapa 4). Entra en `hash_inputs`. strip_debug = true flags = ["-p", "takana-cli", "--bin", "takana"] [build.phases] # Sobrescribe el `find target/release …` por defecto: hay que reponer el alias `hammer` (ver arriba). install = "mkdir -p /out/usr/bin && cp target/release/takana /out/usr/bin/takana && ln -s takana /out/usr/bin/hammer" [deps] build = ["binutils"]