Skip to content

Commit f93e5c5

Browse files
authored
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 - #10680, https://github.com/bushrat011899/bevy_mod_gba) officially or not. The Nintendo 3DS runs Horizon as its OS which is [unix-based](https://github.com/rust-lang/rust/blob/4d08223c054cf5a56d9761ca925fd46ffebe7115/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](https://github.com/bushrat011899/bevy_mod_gba/blob/72d8bbf47b33a0ab2f825d80e9ed0b6e5268bf1e/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: https://codeberg.org/pollyglot/hyperspace-dj/commit/440fc1018468885eed4c10c163f6bf3eefc64cb1 ## 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.
1 parent 4d4170d commit f93e5c5

File tree

3 files changed

+4
-4
lines changed

3 files changed

+4
-4
lines changed

crates/bevy_app/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ tracing = { version = "0.1", default-features = false, optional = true }
8888
log = { version = "0.4", default-features = false }
8989
cfg-if = "1.0.0"
9090

91-
[target.'cfg(any(unix, windows))'.dependencies]
91+
[target.'cfg(any(all(unix, not(target_os = "horizon")), windows))'.dependencies]
9292
ctrlc = { version = "3.4.4", optional = true }
9393

9494
[target.'cfg(target_arch = "wasm32")'.dependencies]

crates/bevy_app/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ mod plugin_group;
3131
mod schedule_runner;
3232
mod sub_app;
3333
mod task_pool_plugin;
34-
#[cfg(all(any(unix, windows), feature = "std"))]
34+
#[cfg(all(any(all(unix, not(target_os = "horizon")), windows), feature = "std"))]
3535
mod terminal_ctrl_c_handler;
3636

3737
pub use app::*;
@@ -42,7 +42,7 @@ pub use plugin_group::*;
4242
pub use schedule_runner::*;
4343
pub use sub_app::*;
4444
pub use task_pool_plugin::*;
45-
#[cfg(all(any(unix, windows), feature = "std"))]
45+
#[cfg(all(any(all(unix, not(target_os = "horizon")), windows), feature = "std"))]
4646
pub use terminal_ctrl_c_handler::*;
4747

4848
/// The app prelude.

crates/bevy_internal/src/default_plugins.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ plugin_group! {
1919
#[cfg(feature = "bevy_window")]
2020
bevy_a11y:::AccessibilityPlugin,
2121
#[cfg(feature = "std")]
22-
#[custom(cfg(any(unix, windows)))]
22+
#[custom(cfg(any(all(unix, not(target_os = "horizon")), windows)))]
2323
bevy_app:::TerminalCtrlCHandlerPlugin,
2424
#[cfg(feature = "bevy_asset")]
2525
bevy_asset:::AssetPlugin,

0 commit comments

Comments
 (0)