Exclude ctrlc
from bevy_app
for the Nintendo 3DS (#19453)
## Background/motivation The Nintendo 3DS is supported by the tier 3 rust target [armv6k-nintendo-3ds](https://doc.rust-lang.org/rustc/platform-support/armv6k-nintendo-3ds.html#armv6k-nintendo-3ds). Bevy does not officially support the device, but as more of bevy becomes `no_std` compatible, more targets are being partially supported (e.g. GBA - https://github.com/bevyengine/bevy/discussions/10680, https://github.com/bushrat011899/bevy_mod_gba) officially or not. The Nintendo 3DS runs Horizon as its OS which is [unix-based](4d08223c05/compiler/rustc_target/src/spec/targets/armv6k_nintendo_3ds.rs (L34)
), and the above target (at least partially) supports rust std. It makes sense that you would want to use it, since the 3DS supports things like filesystem reads and the system clock. ## Problem Unlike standard unix targets, armv6k-nintendo-3ds is not one that can use/build the the `ctrlc` dependency in `bevy_app` which is enabled by the bevy `std` cargo feature. Without the `std` feature flag, scheduled systems panic without providing another way for bevy to tick using the `Instant` type (like you might for a [GBA](72d8bbf47b/src/time.rs (L36)
)). <details> <summary>Example</summary> ``` Finished `dev` profile [optimized + debuginfo] target(s) in 1m 39s Building smdh: /home/maya/repos/hyperspace-dj/target/armv6k-nintendo-3ds/debug/hyperspace-dj.smdh Building 3dsx: /home/maya/repos/hyperspace-dj/target/armv6k-nintendo-3ds/debug/hyperspace-dj.3dsx Adding RomFS from /home/maya/repos/hyperspace-dj/romfs Running 3dslink Sending hyperspace-dj.3dsx, 7172344 bytes 2777346 sent (38.72%), 233 blocks starting server server active ... hii we'are about the to start the bevy app thread 'main' panicked at /home/maya/repos/bevy/crates/bevy_platform/src/time/fallback.rs:177:13: An elapsed time getter has not been provided to `Instant`. Please use `Instant::set_elapsed(...)` before calling `Instant::now()` note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` </details> ## Solution This PR simply excludes the `ctrlc` dependency and its uses in `bevy_app` for the 3DS target (`horizon`) with an addition to its existing feature flags. After this fix, we can use the `std` feature, and regular scheduled systems no longer panic because of missing `Instant` (system clock) support. ## Testing I compiled and ran a binary with the modified version of bevy, using `no_default_features` and feature flags `default_no_std` and `std` on a physical 3DS (classic) using homebrew and `cargo-3ds`. Toolchain: [armv6k-nintendo-3ds](https://doc.rust-lang.org/rustc/platform-support/armv6k-nintendo-3ds.html#armv6k-nintendo-3ds) (nightly-2025-03-31) Project reference:440fc10184
## Considerations It could be that we don't want to add specific exceptions inside bevy to support specific hardware with weird quirks inside general bevy code, but it's not obvious to me what we should use instead of an exception to (pre-existing) target cfg: every change here is merely an addition to a cfg that already checks for both the target family and the `std` flag. It is not clear to me if this PR is exhaustive enough to be considered an adequate solution for the larger goal of partially supporting the 3DS, but it seems to be a step in the right direction because it at least lets trivial App::run setups with scheduled systems work.
This commit is contained in:
parent
4d4170d834
commit
f93e5c5622
@ -88,7 +88,7 @@ tracing = { version = "0.1", default-features = false, optional = true }
|
||||
log = { version = "0.4", default-features = false }
|
||||
cfg-if = "1.0.0"
|
||||
|
||||
[target.'cfg(any(unix, windows))'.dependencies]
|
||||
[target.'cfg(any(all(unix, not(target_os = "horizon")), windows))'.dependencies]
|
||||
ctrlc = { version = "3.4.4", optional = true }
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||
|
@ -31,7 +31,7 @@ mod plugin_group;
|
||||
mod schedule_runner;
|
||||
mod sub_app;
|
||||
mod task_pool_plugin;
|
||||
#[cfg(all(any(unix, windows), feature = "std"))]
|
||||
#[cfg(all(any(all(unix, not(target_os = "horizon")), windows), feature = "std"))]
|
||||
mod terminal_ctrl_c_handler;
|
||||
|
||||
pub use app::*;
|
||||
@ -42,7 +42,7 @@ pub use plugin_group::*;
|
||||
pub use schedule_runner::*;
|
||||
pub use sub_app::*;
|
||||
pub use task_pool_plugin::*;
|
||||
#[cfg(all(any(unix, windows), feature = "std"))]
|
||||
#[cfg(all(any(all(unix, not(target_os = "horizon")), windows), feature = "std"))]
|
||||
pub use terminal_ctrl_c_handler::*;
|
||||
|
||||
/// The app prelude.
|
||||
|
@ -19,7 +19,7 @@ plugin_group! {
|
||||
#[cfg(feature = "bevy_window")]
|
||||
bevy_a11y:::AccessibilityPlugin,
|
||||
#[cfg(feature = "std")]
|
||||
#[custom(cfg(any(unix, windows)))]
|
||||
#[custom(cfg(any(all(unix, not(target_os = "horizon")), windows)))]
|
||||
bevy_app:::TerminalCtrlCHandlerPlugin,
|
||||
#[cfg(feature = "bevy_asset")]
|
||||
bevy_asset:::AssetPlugin,
|
||||
|
Loading…
Reference in New Issue
Block a user