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>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
3 archivos · +45 −3
- recipes/pata-centro.toml +15 −1
- recipes/pata-llimphi.toml +15 −1
- recipes/pata-notify-panel.toml +15 −1
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]