Barrido de TEXTO puro: 1427 líneas de comentario TOML. Cero ArtifactHash movidos, y eso está MEDIDO, no deducido: hasheé las 741 antes y después y los ficheros de hashes son idénticos byte a byte (723 con hash real + 18 que ya no hasheaban de antes). El guardián valió la pena: el primer barrido, filtrando por 'la línea empieza con #', movió el hash de helix, lsof y steam-runtime-sniper. La causa es que una fase se escribe como compile = <triple> ... <triple> y sus comentarios de SHELL también empiezan con #, pero viven dentro del VALOR — y las fases sí entran en hash_inputs. El barrido ahora calcula los rangos de las cadenas multilínea de TOML y no entra ahí. Quedan intactos a propósito: .hammer-zig-cc y .hammer-cargo-vendor (literales dentro de fases), hammerd, hammer-recover y toda ruta que empiece por /
64 lines
3.8 KiB
TOML
64 lines
3.8 KiB
TOML
# Ejemplo de receta Rust (BuildSys::Cargo) — un front-door de tawasuyu.
|
|
#
|
|
# PINEADA EL 2026-09-02. Hasta hoy su `commit` era `000…0`, un placeholder, y la receta llevaba un
|
|
# ⛔ «NO INTENTES CONSTRUIRLA»: existía para MOSTRAR cómo se escribe una receta Rust gráfica y salía
|
|
# como `never` en el grafo — técnicamente cierto y semánticamente engañoso, porque no era trabajo
|
|
# pendiente sino un ejemplo. Ahora apunta a `v0.1.0` (tag LIGERO ⇒ el sha ya es el commit; ojo que
|
|
# `v0.2.0` sí es objeto tag y hay que pelarlo con `^{commit}`).
|
|
#
|
|
# ⚠ El repo NO trae `vendor/` ni `.cargo/config.toml` en ningún tag, y el comentario de más abajo
|
|
# los pedía como requisito. Ese requisito quedó viejo: takana vendorea en el FETCH a partir del
|
|
# `Cargo.lock` (que el repo sí trae), igual que hace `arje-logind-compat` con el monorepo. El
|
|
# `--offline --locked` del sandbox se cumple porque el vendoreo pasa ANTES, host-side.
|
|
#
|
|
# ⚠ POR QUÉ v0.2.0 Y NO v0.1.0, que es el tag que la versión declaraba. El `Cargo.lock` de v0.1.0
|
|
# está DESINCRONIZADO con sus manifiestos en el propio repo: `cargo vendor --locked` se niega
|
|
# («cannot update the lock file … because --locked was passed»). No es un problema de takana —el
|
|
# vendoreo del fetch arranca bien y muere DENTRO de cargo—. Comprobado con `cargo metadata --locked`
|
|
# en los tres refs: v0.1.0 incoherente, v0.2.0 y main coherentes.
|
|
# ⇒ Un tag no sirve como pin sólo por existir: hay que verificar que su lockfile cierre.
|
|
#
|
|
# Muestra el caso GRÁFICO (el más exigente): wgpu+winit+vello cargan Vulkan/Wayland por
|
|
# `dlopen` en runtime, así que el binario va `link = "dynamic"` (no estático) y el link lo
|
|
# cierra el `zig cc` del lab (provee `libgcc_s`). Un crate NO gráfico (CLI, daemon) usa
|
|
# `link = "static"` y sale como binario monolítico hidratable por hardlink.
|
|
#
|
|
# DOS requisitos para que el build hermético funcione (el sandbox no tiene red):
|
|
# 1. commit FIJADO del repo público (reproducibilidad, ADR 0006).
|
|
# 2. deps VENDOREADAS en la fuente: `cargo vendor` + `.cargo/config.toml`, o el repo ya las
|
|
# trae. `cargo build --offline --locked` falla si falta cualquiera.
|
|
|
|
name = "llimphi-counter"
|
|
version = "0.2.0"
|
|
license = "MIT"
|
|
|
|
[source]
|
|
repo = "https://git.tawasuyu.net/tawasuyu/llimphi.git"
|
|
commit = "93253cc227130680427a9a83bdc504bd82ca71ca" # v0.2.0 PELADO (^{commit}); el tag es objeto
|
|
|
|
[build]
|
|
compiler = "zig-cc" # linker del binario (wrapper zig cc, cierra -lgcc_s)
|
|
target = "x86_64-linux-musl" # se traduce a x86_64-unknown-linux-musl para rustc
|
|
link = "dynamic" # gráfico: necesita dlopen de Vulkan/Wayland en runtime
|
|
# Selección del binario a construir dentro del workspace/crate:
|
|
flags = ["-p", "llimphi-ui", "--example", "counter"]
|
|
|
|
# ⚠ FASE `install` PROPIA, Y ES OBLIGATORIA CON `--example` (2026-09-02). El default de Cargo hace
|
|
# `find target/release -maxdepth 1 -type f -perm -100` y **cargo deja los ejemplos en
|
|
# `target/release/examples/`, no en `target/release/`** ⇒ el find no encuentra nada, sale 0, y takana
|
|
# SELLA UN ARTEFACTO SIN BINARIO. Pasó: 22 min de compilación y un `sealed` con sólo
|
|
# `.hammer/recipe.toml` dentro. No lo atrapa `Store::has` ni el guardián de vacíos, porque el
|
|
# directorio NO está vacío — tiene el manifiesto. Es la regla 3 del CLAUDE.md en su peor forma.
|
|
# Por eso el `test -x` de abajo: que la ausencia falle A GRITOS en vez de sellar en silencio.
|
|
[build.phases]
|
|
install = '''
|
|
set -e
|
|
test -x target/release/examples/counter || { echo "no hay target/release/examples/counter — ¿cambió el layout de cargo?" >&2; exit 1; }
|
|
mkdir -p /out/usr/bin
|
|
cp target/release/examples/counter /out/usr/bin/llimphi-counter
|
|
'''
|
|
|
|
# runtime: en un userland musl coherente (Alpine) el binario dlopea mesa/vulkan/wayland
|
|
# musl-built sin fricción; mezclar con gráficos glibc es lo que rompe (ver M2 del plan
|
|
# arje↔takana en tawasuyu).
|