Etapa G: cosecha tanda CLI Rust — 5 promovidos estáticos (corpus 154→159)

Drenada la cola de 14 staged. 5 sellados+publicados al repo firmado, todos
ESTÁTICOS y ejecutan (versión correcta):
  - topgrade 17.6.1, git-absorb 0.9.0, cargo-audit 0.22.1, yazi 26.5.6, cargo-edit 0.13.11

Patrón común de de-Alpinización (estilo zellij): el lab NO trae `cargo auditable`
⇒ reescritas LIMPIAS sin él ni manpage/completions. Claves de la tanda:
  - SIN fase compile custom ⇒ path default del lab (aplica crt-static tras `cargo
    rustc --`, sólo el bin top, NO en RUSTFLAGS donde rompería los proc-macros) +
    linker zig-cc ⇒ binario estático. Las fases custom con `cargo build` salían
    DINÁMICAS (musl pie) y no corrían en el host — corregido.
  - compiler="gcc" donde hay deps-C de build-script (git2/openssl/ring/mlua-lua/
    jemalloc/onig): el CC=zig global rechaza el triple x86_64-alpine-linux-musl; el
    gueto gcc-musl los compila, linker sigue zig-cc. +deps zlib en git-absorb/cargo-audit.
  - cargo-edit: 4 bins (cargo-add/rm/upgrade/set-version, no hay bin `cargo-edit`);
    el path default (`cargo rustc -- flags`) exige un único target ⇒ fase custom que
    itera los 4 bins con crt-static por-bin.
  - yazi: dropeado el patch system-lua + dep lua5.5 ⇒ mlua vendorea su Lua.

Diferidos a incoming/.deferred (frontera dura, motivo documentado):
  - jless → libxcb (clipboard X11, dep real sin receta)
  - b3sum → proyecto anidado con Cargo.lock propio (el vendor del lab no lo alcanza)
  - dprint/mprocs → libclang.a/bindgen (clang-sys estático)
  - hck → libz-sys (-lz no hallado), kalker → gmp, dura → Cargo.lock stale,
    xcp → libfs i32/u64 musl, mdcat → #![deny(warnings)] en lib (path default no
    deja inyectar --cap-lints)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 17:49:50 -04:00
co-authored by Claude Opus 4.8
parent 3ebee950ab
commit 71bc228102
20 changed files with 132 additions and 231 deletions
+21
View File
@@ -0,0 +1,21 @@
# cargo-audit 0.22.1 — audita Cargo.lock contra la base RustSec. Etapa G, tier CLI Rust con dep-C.
# Reescrita LIMPIA estilo zellij: sin `cargo auditable`. SIN fases ⇒ path default (crt-static +
# linker zig ⇒ ESTÁTICO). `--features fix` añade el subcomando `cargo audit fix` (como Alpine).
# - compiler="gcc": deps-C de build-script (ring/constant_time, git2 vía la feature fix); el gueto
# gcc los compila (el CC=zig global no traga el triple alpine), linker zig-cc.
# - deps.build=["zlib"]: git2/openssl-sys enlazan -lz.
name = "cargo-audit"
version = "0.22.1"
[source]
tarball = "https://github.com/RustSec/cargo-audit/archive/cargo-audit/v0.22.1.tar.gz"
sha256 = "262d42fcca5db8629b6220d84e62e7ffda913846a36089a847ffe276e6b09446"
[build]
compiler = "gcc"
target = "x86_64-linux-musl"
link = "static"
flags = ["--features", "fix", "--bin", "cargo-audit"]
[deps]
build = ["zlib"]
+31
View File
@@ -0,0 +1,31 @@
# cargo-edit 0.13.11 — cargo add/rm/upgrade/set-version. Etapa G, tier CLI Rust.
# Caso especial: produce 4 bins (gated por las features default add/rm/upgrade/set-version) y NO
# hay un bin `cargo-edit`. El path default del lab usa `cargo rustc -- <flags>` que exige UN único
# target ⇒ inservible para multi-bin. Por eso una fase compile custom que REPLICA el setup estático
# del lab (wrapper .hammer-zig-cc que reescribe --target + crt-static) pero con `cargo build` (todos
# los bins). crt-static va TRAS `cargo rustc --` (sólo el bin top), NUNCA en RUSTFLAGS: ahí alcanza
# a los proc-macros (clap_derive) y rustc aborta ("cannot produce proc-macro ... crt-static"). Como
# `cargo rustc --` exige un único target, itero los 4 bins. El install lo auto-genera el lab.
name = "cargo-edit"
version = "0.13.11"
[source]
repo = "https://github.com/killercup/cargo-edit"
commit = "98d58b713cb9a7715c01053dbd36cb84f3be1e4f"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
[build.phases]
compile = '''
printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64-linux-musl ;; esac' 'set -- "$@" "$a"' 'shift' 'done' 'exec zig cc -mcpu=baseline "$@"' > "$PWD/.hammer-zig-cc"
chmod +x "$PWD/.hammer-zig-cc"
RF="-C linker=$PWD/.hammer-zig-cc"
rustc -vV | grep -q 'host: .*-alpine-' || RF="$RF -C link-self-contained=no"
for b in cargo-add cargo-rm cargo-upgrade cargo-set-version; do
CC=gcc CXX=g++ AR=ar RUSTFLAGS="$RF" cargo rustc --release --locked --bin "$b" -- -C target-feature=+crt-static -C relocation-model=static
done
'''
+21
View File
@@ -0,0 +1,21 @@
# git-absorb 0.9.0 — autogenera commits fixup! y los absorbe. Etapa G, tier CLI Rust con dep-C.
# Reescrita LIMPIA estilo zellij: sin `cargo auditable` (no está en el lab) ni manpage (asciidoc).
# SIN fases ⇒ path default (crt-static + linker zig ⇒ ESTÁTICO).
# - compiler="gcc": git2/libgit2-sys vendorea libgit2 en C (build-script cc-rs); el gueto gcc lo
# compila (el CC=zig global no traga el triple alpine), el linker sigue zig-cc.
# - deps.build=["zlib"]: libgit2-sys enlaza -lz; el lab materializa libz.a en /usr/lib.
name = "git-absorb"
version = "0.9.0"
[source]
tarball = "https://github.com/tummychow/git-absorb/archive/refs/tags/0.9.0.tar.gz"
sha256 = "a0f74e6306d7fbd746d2b4a6856621d46a7f82e3e88b6bb8b6fc0480cf811f53"
[build]
compiler = "gcc"
target = "x86_64-linux-musl"
link = "static"
flags = ["--bin", "git-absorb"]
[deps]
build = ["zlib"]
+25
View File
@@ -0,0 +1,25 @@
# Importada de Alpine aports por `hammer import-alpine` (Etapa G). Reescrita LIMPIA
# (patrón zellij/xsv): sin `cargo auditable` (no está en el lab). Deps espurias de Alpine
# dropeadas: python3 (sólo para tests), libxcb (no lo usa el build del binario).
name = "jless"
version = "0.9.0"
[source]
tarball = "https://github.com/PaulJuliusMartinez/jless/archive/refs/tags/v0.9.0.tar.gz"
sha256 = "43527a78ba2e5e43a7ebd8d0da8b5af17a72455c5f88b4d1134f34908a594239"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
# CC=gcc: el shim C libc-stdhandle (dep) se compila con cc-rs, y el CC=zig global del
# sandbox rechaza el triple x86_64-alpine-linux-musl (el wrapper .hammer-zig-cc sólo opera
# en el path default, no en fases custom). gcc-musl nativo del rootfs lo compila limpio.
[build.phases]
compile = "CC=gcc CXX=g++ AR=ar cargo build --frozen --release"
install = '''
mkdir -p /out/usr/bin
cp target/release/jless /out/usr/bin/jless
'''
-37
View File
@@ -1,37 +0,0 @@
# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
name = "cargo-audit"
version = "0.22.1"
[source]
tarball = "https://github.com/RustSec/cargo-audit/archive/cargo-audit/v0.22.1.tar.gz"
# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
# sha512 = "bafc8e553c4d82c1e709de8e6e416ad1ee13a73b7e6f2169783bec8bd5816244badb8df78050f8cabb40bb1ab85fa159ae7d0d7be21708fa3a9275518e8a3795"
sha256 = "262d42fcca5db8629b6220d84e62e7ffda913846a36089a847ffe276e6b09446"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
[build.phases]
# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
compile = '''
_abuild_phase() {
cargo build --release --frozen --features fix
}
_abuild_phase
'''
# de package() de Alpine (traducido $pkgdir→/out):
install = '''
_abuild_phase() {
install -Dm 755 target/release/cargo-audit -t "/out/usr/bin"
install -Dm 644 -t "/out/usr/share/doc/cargo-audit" README.md
}
_abuild_phase
'''
[deps]
build = ["openssl"]
-22
View File
@@ -1,22 +0,0 @@
# Importada de nixpkgs por `hammer import-nix` (Etapa G). PUNTO DE PARTIDA, no final:
# - el build usa el lab de hammer (zig-cc / musl estático), NO el stdenv de nix ⇒ revisá
# compiler/link/phases y adaptá hasta que compile.
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-edit"
version = "0.13.11"
[source]
repo = "https://github.com/killercup/cargo-edit"
commit = "98d58b713cb9a7715c01053dbd36cb84f3be1e4f"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = ["--bin", "cargo-edit"]
[build.phases]
install = "mkdir -p /out/usr/bin && cp target/release/cargo-edit /out/usr/bin/cargo-edit"
# buildInputs de nix (NO deps de hammer — cargo vendorea; backend Rust por
# defecto). Si algún sys-crate C falla, adaptá per-paquete (patch/feature): openssl, zlib
-48
View File
@@ -1,48 +0,0 @@
# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
name = "git-absorb"
version = "0.9.0"
[source]
tarball = "https://github.com/tummychow/git-absorb/archive/refs/tags/0.9.0.tar.gz"
# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
# sha512 = "5a02cbbb4df65340705dd6ef721cd40d8ae7eadf6926f9682de3a6ade20d9a2b1caf51e69d32b9c47e2b7a16c864f58992fbe486387c480965cc816f2b713011"
sha256 = "a0f74e6306d7fbd746d2b4a6856621d46a7f82e3e88b6bb8b6fc0480cf811f53"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
[build.phases]
# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
compile = '''
_abuild_phase() {
cargo auditable build --frozen --release
target/release/git-absorb --gen-completions bash > git-absorb.bash
target/release/git-absorb --gen-completions fish > git-absorb.fish
target/release/git-absorb --gen-completions zsh > _git-absorb
make -C Documentation git-absorb.1
}
_abuild_phase
'''
# de package() de Alpine (traducido $pkgdir→/out):
install = '''
_abuild_phase() {
install -Dm755 --target-directory="/out"/usr/bin target/release/git-absorb
install -Dm644 git-absorb.bash "/out"/usr/share/bash-completion/completions/git-absorb
install -Dm644 git-absorb.fish "/out"/usr/share/fish/vendor_completions.d/git-absorb.fish
install -Dm644 _git-absorb "/out"/usr/share/zsh/site-functions/_git-absorb
install -Dm644 --target-directory="/out"/usr/share/man/man1 Documentation/git-absorb.1
}
_abuild_phase
'''
[deps]
build = ["asciidoc", "libgit2"]
-36
View File
@@ -1,36 +0,0 @@
# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
name = "jless"
version = "0.9.0"
[source]
tarball = "https://github.com/PaulJuliusMartinez/jless/archive/refs/tags/v0.9.0.tar.gz"
# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
# sha512 = "2c0f4b5d662f7e93727b25ef6b138368b453dc7246a6a2a3d14c158e15baeaf70df00252b0e1a813016837504bd6f75585d6e21760c52fc3ba76d61fc094ec7a"
sha256 = "43527a78ba2e5e43a7ebd8d0da8b5af17a72455c5f88b4d1134f34908a594239"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
[build.phases]
# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
compile = '''
_abuild_phase() {
cargo auditable build --frozen --release
}
_abuild_phase
'''
# de package() de Alpine (traducido $pkgdir→/out):
install = '''
_abuild_phase() {
install -Dm0755 target/release/jless "/out"/usr/bin/jless
}
_abuild_phase
'''
[deps]
build = ["python3", "libxcb"]
-47
View File
@@ -1,47 +0,0 @@
# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
name = "topgrade"
version = "17.6.1"
[source]
tarball = "https://github.com/topgrade-rs/topgrade/archive/refs/tags/v17.6.1.tar.gz"
# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
# sha512 = "4473e971a3c744ce4f07096c7b6e38d384b2d1eb8698cfa26bd6018c361a667f971f14410d265b2c82119d805485c9247d4d16465dc0e7e2b4b5f7b4529b600b"
sha256 = "c25274461f61b8fa469c1645a892bb5b52236bb64dc448152c6f485f9ec1cb1d"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
[build.phases]
# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
compile = '''
_abuild_phase() {
cargo auditable build --release --frozen
target/release/topgrade --gen-completion bash > topgrade.bash
target/release/topgrade --gen-completion fish > topgrade.fish
target/release/topgrade --gen-completion zsh > _topgrade
target/release/topgrade --gen-manpage > topgrade.8
}
_abuild_phase
'''
# de package() de Alpine (traducido $pkgdir→/out):
install = '''
_abuild_phase() {
install -Dm755 target/release/topgrade "/out"/usr/bin/topgrade
install -Dm644 LICENSE "/out"/usr/share/licenses/topgrade/LICENSE
install -Dm644 topgrade.bash "/out"/usr/share/bash-completion/completions/topgrade
install -Dm644 topgrade.fish "/out"/usr/share/fish/vendor_completions.d/topgrade.fish
install -Dm644 _topgrade "/out"/usr/share/zsh/site-functions/_topgrade
install -Dm644 config.example.toml "/out"/usr/share/doc/topgrade/config.example.toml
install -Dm644 topgrade.8 "/out"/usr/share/man/man8/topgrade.8
}
_abuild_phase
'''
-41
View File
@@ -1,41 +0,0 @@
# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
name = "yazi"
version = "26.5.6"
[source]
tarball = "https://github.com/sxyazi/yazi/archive/refs/tags/v26.5.6.tar.gz"
# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
# sha512 = "2f1b980753c82f5e4186759ec6c40df6c2d740b3521fe31edaff69802701b0c5292c03fde5a1e775e17e91c694ea63c0b16a149fa39ccc609b4780281421d38e"
sha256 = "a18445df86a20068f7b17609d12d6f635de488958579ae7a2b143a244ba7e63f"
patches = ["system-lua.patch"]
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
[build.phases]
# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
compile = '''
_abuild_phase() {
YAZI_GEN_COMPLETIONS=true cargo auditable build --release --frozen --workspace --no-default-features
}
_abuild_phase
'''
# de package() de Alpine (traducido $pkgdir→/out):
install = '''
_abuild_phase() {
install -Dm755 target/release/yazi "/out"/usr/bin/yazi
install -Dm644 yazi-boot/completions/yazi.bash "/out"/usr/share/bash-completion/completions/yazi
install -Dm644 yazi-boot/completions/yazi.fish "/out"/usr/share/fish/vendor_completions.d/yazi.fish
install -Dm644 yazi-boot/completions/_yazi "/out"/usr/share/zsh/site-functions/_yazi
install -Dm644 LICENSE "/out"/usr/share/licenses/yazi/LICENSE
}
_abuild_phase
'''
[deps]
build = ["lua5.5"]
+16
View File
@@ -0,0 +1,16 @@
# topgrade 17.6.1 — actualiza todas las herramientas del sistema de una. Etapa G, tier CLI Rust.
# Reescrita LIMPIA estilo zellij: el import de Alpine traía `cargo auditable` (no está en el lab)
# + manpage/completions. SIN fases ⇒ el lab autodetecta Cargo y usa el path default (que aplica
# crt-static + linker zig-cc ⇒ binario ESTÁTICO). Pure-Rust ⇒ zig-cc baseline.
name = "topgrade"
version = "17.6.1"
[source]
tarball = "https://github.com/topgrade-rs/topgrade/archive/refs/tags/v17.6.1.tar.gz"
sha256 = "c25274461f61b8fa469c1645a892bb5b52236bb64dc448152c6f485f9ec1cb1d"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = ["--bin", "topgrade"]
+18
View File
@@ -0,0 +1,18 @@
# yazi 26.5.6 — file manager de terminal (blazing-fast, async). Etapa G, tier CLI Rust con dep-C.
# Reescrita LIMPIA estilo zellij: sin `cargo auditable`, sin el patch system-lua (mlua VENDOREA su
# Lua). SIN fases ⇒ path default (crt-static + linker zig ⇒ ESTÁTICO).
# - compiler="gcc": mlua-sys (Lua C), tikv-jemalloc-sys, onig_sys y ring compilan C vía cc-rs; el
# gueto gcc los compila (el CC=zig global no traga el triple alpine), linker zig-cc.
# - --no-default-features: evita los plugins que pedirían un Lua externo.
name = "yazi"
version = "26.5.6"
[source]
tarball = "https://github.com/sxyazi/yazi/archive/refs/tags/v26.5.6.tar.gz"
sha256 = "a18445df86a20068f7b17609d12d6f635de488958579ae7a2b143a244ba7e63f"
[build]
compiler = "gcc"
target = "x86_64-linux-musl"
link = "static"
flags = ["--no-default-features", "--bin", "yazi"]