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…

TOML 815Rust 56Shell 37Markdown 291229 Definiciones

fix(recetas): un bug de tawasuyu que su propio build --workspace esconde

`pata-notify-panel` murió así, y con él `pata-llimphi` y `pata-centro` van al mismo sitio:

```
error[E0433]: cannot find module or crate `libm`
   --> 02_ruway/llimphi/widgets/scroll/src/lib.rs:351:9  (libm::powf)
   --> 02_ruway/llimphi/widgets/scroll/src/lib.rs:363:9  (libm::logf)
```

**Es un bug real en tawasuyu, no de la receta.** El workspace declara el widget con
`default-features = false` (raíz, línea 1735), así que **`std` llega APAGADO a todos sus
consumidores**; el código entonces toma el camino `libm::` bajo `cfg(not(feature = "std"))`, y `libm`
es dep **opcional** detrás del feature `libm` que **nadie enciende** en todo el repo.

⚠ **Y no les muerde porque un build `--workspace` enciende `std` por UNIFICACIÓN DE FEATURES desde
otro miembro.** Construir UN binario con `-p` —que es exactamente lo que hace una receta— destapa el
bug que el build completo esconde. Es la misma lección que `cadcraft.toml` anotó hoy sobre `eframe`:
los features son aditivos y los enciende otro, así que leer el manifiesto de la app da la respuesta
equivocada; lo que manda es lo que aparece al construir.

Del lado de takana se arregla eligiendo el backend desde la receta, que es **lo correcto y no un
parche**: el crate dice literalmente «Un widget NO elige backend: lo elige quien ensambla la app», y
el que ensambla acá es la receta. Para un binario de Linux, `std`.

⚠ Y va en la fase `compile`, NO en `flags`: estas tres tienen fase propia por el asunto de
`LOCKSTEP_XML_PATH`, y una fase propia **ignora `flags`** — ponerlos ahí habría sido no cambiar nada
mientras el diff decía que sí.

Para quien lea esto desde tawasuyu: el arreglo del lado de ustedes es que el `cfg` del camino sin
`std` sea `cfg(all(not(feature = "std"), feature = "libm"))` más un `compile_error!` en el caso
restante — el mismo patrón que ya usa `llimphi-text`. Así un consumidor sin `std` ni `libm` recibe
el motivo en vez de un `E0433` a tres crates de distancia. Afecta a `widgets/scroll` y
`widgets/text-input`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

95dd155f373c5392682e6d42f11ebe4b9453dbff · por Sergio · (hace 8 d) · padre dcf125eb6 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

3 archivos · +45 −3

diff --git a/recipes/pata-centro.toml b/recipes/pata-centro.toml
index 768c6af4..029dd0be 100644
--- a/recipes/pata-centro.toml
+++ b/recipes/pata-centro.toml
@@ -23,6 +23,20 @@ target   = "x86_64-linux-musl"
 link     = "dynamic"
 # ⚠ \`link = "dynamic"\`: pinta, así que necesita \`dlopen\` de Vulkan/Wayland en runtime — mismo
 # motivo que \`llimphi-counter\`, que es la plantilla probada del stack llimphi.
+# ⚠ `--features llimphi-widget-scroll/std` NO es un adorno: el workspace declara ese widget con
+# `default-features = false`, así que `std` llega APAGADO a todo consumidor, y su código toma el
+# camino `libm::powf`/`libm::logf` bajo `cfg(not(feature = "std"))` con `libm` como dep OPCIONAL
+# que nadie enciende ⇒ `error[E0433]: cannot find module or crate `libm``.
+#
+# No les muerde en su repo porque un build `--workspace` enciende `std` por UNIFICACIÓN DE
+# FEATURES desde otro miembro; construir UN binario con `-p` —que es lo que hace una receta—
+# destapa el bug que el build completo esconde. Es la misma lección que `cadcraft.toml` anotó
+# sobre `eframe`: los features son aditivos y los enciende otro, así que leer el manifiesto de la
+# app da la respuesta equivocada.
+#
+# Y el crate mismo dice que la elección es de quien ensambla («Un widget NO elige backend: lo
+# elige quien ensambla la app»), así que que la RECETA elija `std` para un binario de Linux es
+# exactamente lo correcto, no un parche.
 flags    = ["-p", "pata-centro-llimphi", "--bin", "pata-centro"]
 
 [build.phases]
@@ -54,7 +68,7 @@ printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64
 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"
-CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo rustc --release --locked --offline -p pata-centro-llimphi --bin pata-centro -- -C target-feature=-crt-static
+CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo rustc --release --locked --offline --features llimphi-widget-scroll/std,llimphi-widget-text-input/std -p pata-centro-llimphi --bin pata-centro -- -C target-feature=-crt-static
 '''
 
 [deps]
diff --git a/recipes/pata-llimphi.toml b/recipes/pata-llimphi.toml
index 91b50316..02d96335 100644
--- a/recipes/pata-llimphi.toml
+++ b/recipes/pata-llimphi.toml
@@ -21,6 +21,20 @@ target   = "x86_64-linux-musl"
 link     = "dynamic"
 # ⚠ \`link = "dynamic"\`: pinta, así que necesita \`dlopen\` de Vulkan/Wayland en runtime — mismo
 # motivo que \`llimphi-counter\`, que es la plantilla probada del stack llimphi.
+# ⚠ `--features llimphi-widget-scroll/std` NO es un adorno: el workspace declara ese widget con
+# `default-features = false`, así que `std` llega APAGADO a todo consumidor, y su código toma el
+# camino `libm::powf`/`libm::logf` bajo `cfg(not(feature = "std"))` con `libm` como dep OPCIONAL
+# que nadie enciende ⇒ `error[E0433]: cannot find module or crate `libm``.
+#
+# No les muerde en su repo porque un build `--workspace` enciende `std` por UNIFICACIÓN DE
+# FEATURES desde otro miembro; construir UN binario con `-p` —que es lo que hace una receta—
+# destapa el bug que el build completo esconde. Es la misma lección que `cadcraft.toml` anotó
+# sobre `eframe`: los features son aditivos y los enciende otro, así que leer el manifiesto de la
+# app da la respuesta equivocada.
+#
+# Y el crate mismo dice que la elección es de quien ensambla («Un widget NO elige backend: lo
+# elige quien ensambla la app»), así que que la RECETA elija `std` para un binario de Linux es
+# exactamente lo correcto, no un parche.
 flags    = ["-p", "pata-llimphi", "--bin", "pata-llimphi"]
 
 [build.phases]
@@ -52,7 +66,7 @@ printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64
 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"
-CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo rustc --release --locked --offline -p pata-llimphi --bin pata-llimphi -- -C target-feature=-crt-static
+CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo rustc --release --locked --offline --features llimphi-widget-scroll/std,llimphi-widget-text-input/std -p pata-llimphi --bin pata-llimphi -- -C target-feature=-crt-static
 '''
 
 [deps]
diff --git a/recipes/pata-notify-panel.toml b/recipes/pata-notify-panel.toml
index 0970e0ee..9f3fbde4 100644
--- a/recipes/pata-notify-panel.toml
+++ b/recipes/pata-notify-panel.toml
@@ -21,6 +21,20 @@ target   = "x86_64-linux-musl"
 link     = "dynamic"
 # ⚠ \`link = "dynamic"\`: pinta, así que necesita \`dlopen\` de Vulkan/Wayland en runtime — mismo
 # motivo que \`llimphi-counter\`, que es la plantilla probada del stack llimphi.
+# ⚠ `--features llimphi-widget-scroll/std` NO es un adorno: el workspace declara ese widget con
+# `default-features = false`, así que `std` llega APAGADO a todo consumidor, y su código toma el
+# camino `libm::powf`/`libm::logf` bajo `cfg(not(feature = "std"))` con `libm` como dep OPCIONAL
+# que nadie enciende ⇒ `error[E0433]: cannot find module or crate `libm``.
+#
+# No les muerde en su repo porque un build `--workspace` enciende `std` por UNIFICACIÓN DE
+# FEATURES desde otro miembro; construir UN binario con `-p` —que es lo que hace una receta—
+# destapa el bug que el build completo esconde. Es la misma lección que `cadcraft.toml` anotó
+# sobre `eframe`: los features son aditivos y los enciende otro, así que leer el manifiesto de la
+# app da la respuesta equivocada.
+#
+# Y el crate mismo dice que la elección es de quien ensambla («Un widget NO elige backend: lo
+# elige quien ensambla la app»), así que que la RECETA elija `std` para un binario de Linux es
+# exactamente lo correcto, no un parche.
 flags    = ["-p", "pata-notify-panel", "--bin", "pata-notify-panel"]
 
 [build.phases]
@@ -52,7 +66,7 @@ printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64
 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"
-CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo rustc --release --locked --offline -p pata-notify-panel --bin pata-notify-panel -- -C target-feature=-crt-static
+CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo rustc --release --locked --offline --features llimphi-widget-scroll/std -p pata-notify-panel --bin pata-notify-panel -- -C target-feature=-crt-static
 '''
 
 [deps]