gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

⎇ main recipes/uutils.toml TOML · 51 lines · 3.2 KB History raw

busybox: los 23 applets sin dueño eran 79 — el reparto era juicio, y medido no da 64005efcb · Sergio ·

1# uutils/coreutils 0.9.0 — coreutils en Rust (reemplazo Rust-nativo de busybox/GNU coreutils).
2#
3# Primera pieza de la Etapa C (userland Rust-nativo): adopta una reimplementación MADURA (MIT) como
4# receta Cargo, el mismo patrón que hammerd/arje-zero — no se escribe de cero. Multicall: un binario
5# `coreutils` + un symlink por applet (ls/cp/mkdir/…). Esquiva el bug de zig por construcción: el
6# codegen lo hace rustc/LLVM, no el path C de zig (sólo se usa `zig cc` como linker).
7#
8# Fuente git pinned al tag 0.9.0 (ADR 0006); uutils commitea su Cargo.lock ⇒ vendor + `--locked`
9# bit-reproducible. Estático musl con zig cc (sin loader del host).
10
11name    = "uutils"
12version = "0.9.0"
13license = "MIT"
14
15[source]
16repo   = "https://github.com/uutils/coreutils"
17commit = "9eefc3705093910ad8e8bbcf7e5f84a49720340f"
18
19[build]
20compiler = "zig-cc"
21target   = "x86_64-linux-musl"
22link     = "static"
23# `--bin coreutils`: el paquete coreutils tiene lib + bin; `cargo rustc -- <flags>` exige UN solo
24# target (a diferencia de arje-zero, que tiene un único bin y bastaba `-p`). Seleccionamos el binario
25# multicall.
26#
27# ⚠ `--features feat_os_unix_musl` (2026-09-21): las DEFAULT features son `feat_common_core`, y ese
28# set **no trae 25 applets** que el plan de botar busybox daba por cubiertos. Medido sobre el
29# artefacto sellado `b3:9005da83…`: instalaba 78 symlinks, y el propio multicall contestaba
30# `coreutils: unknown program 'chmod'`. O sea que `chmod`, `chown`, `id`, `uname`, `stat` y 20 más
31# los seguía dando **sólo busybox** en la imagen, con `uutils` ya hidratado encima (el
32# `USERLAND_COMPONENTS` de takana-bootstrap ensombrece lo que existe, y lo que no existe no
33# ensombrece nada). El feature sale del `Cargo.toml` del tag pineado y cubre exactamente esos 25:
34#   feat_Tier1            → arch hostname nproc sync uname whoami
35#   feat_require_unix_core→ chgrp chmod chown chroot groups id install kill logname mkfifo mknod
36#                           nice nohup stat stty timeout
37#   …_hostid / …_utmpx    → hostid · pinky uptime users who
38# Es la variante `_musl` y no `feat_os_unix` a propósito: upstream excluye `stdbuf` en musl porque
39# necesita un cdylib (rust-lang/rust#82193), y con `feat_os_unix` el build falla al enlazarlo.
40#
41# ⚠ Y lo que el feature NO arregla, dicho para que nadie lo lea como cubierto: `who`, `users`,
42# `uptime` y `pinky` compilan contra los stubs de utmpx de musl, así que **contestan vacío**. No es
43# regresión —el `who` de busybox en musl está igual de ciego— pero tampoco es una sustitución real.
44flags    = ["--bin", "coreutils", "--features", "feat_os_unix_musl"]
45
46# Install custom (sólo esta fase; configure/compile siguen auto-Cargo): instala el multicall en
47# /usr/bin/coreutils y crea un symlink RELATIVO por applet (ls→coreutils, cp→coreutils, …), igual
48# layout que busybox/GNU-coreutils multicall ⇒ drop-in. `--list` lo da el propio binario (static
49# musl, corre en el sandbox). El loop cubre los applets embebidos por las features de arriba.
50[build.phases]
51install = "mkdir -p /out/usr/bin && cp target/release/coreutils /out/usr/bin/coreutils && for u in $(/out/usr/bin/coreutils --list); do ln -sf coreutils /out/usr/bin/\"$u\"; done"