# Objective - Fixes #15460 (will open new issues for further `no_std` efforts) - Supersedes #17715 ## Solution - Threaded in new features as required - Made certain crates optional but default enabled - Removed `compile-check-no-std` from internal `ci` tool since GitHub CI can now simply check `bevy` itself now - Added CI task to check `bevy` on `thumbv6m-none-eabi` to ensure `portable-atomic` support is still valid [^1] [^1]: This may be controversial, since it could be interpreted as implying Bevy will maintain support for `thumbv6m-none-eabi` going forward. In reality, just like `x86_64-unknown-none`, this is a [canary](https://en.wiktionary.org/wiki/canary_in_a_coal_mine) target to make it clear when `portable-atomic` no longer works as intended (fixing atomic support on atomically challenged platforms). If a PR comes through and makes supporting this class of platforms impossible, then this CI task can be removed. I however wager this won't be a problem. ## Testing - CI --- ## Release Notes Bevy now has support for `no_std` directly from the `bevy` crate. Users can disable default features and enable a new `default_no_std` feature instead, allowing `bevy` to be used in `no_std` applications and libraries. ```toml # Bevy for `no_std` platforms bevy = { version = "0.16", default-features = false, features = ["default_no_std"] } ``` `default_no_std` enables certain required features, such as `libm` and `critical-section`, and as many optional crates as possible (currently just `bevy_state`). For atomically-challenged platforms such as the Raspberry Pi Pico, `portable-atomic` will be used automatically. For library authors, we recommend depending on `bevy` with `default-features = false` to allow `std` and `no_std` users to both depend on your crate. Here are some recommended features a library crate may want to expose: ```toml [features] # Most users will be on a platform which has `std` and can use the more-powerful `async_executor`. default = ["std", "async_executor"] # Features for typical platforms. std = ["bevy/std"] async_executor = ["bevy/async_executor"] # Features for `no_std` platforms. libm = ["bevy/libm"] critical-section = ["bevy/critical-section"] [dependencies] # We disable default features to ensure we don't accidentally enable `std` on `no_std` targets, for example. bevy = { version = "0.16", default-features = false } ``` While this is verbose, it gives the maximum control to end-users to decide how they wish to use Bevy on their platform. We encourage library authors to experiment with `no_std` support. For libraries relying exclusively on `bevy` and no other dependencies, it may be as simple as adding `#![no_std]` to your `lib.rs` and exposing features as above! Bevy can also provide many `std` types, such as `HashMap`, `Mutex`, and `Instant` on all platforms. See `bevy::platform_support` for details on what's available out of the box! ## Migration Guide - If you were previously relying on `bevy` with default features disabled, you may need to enable the `std` and `async_executor` features. - `bevy_reflect` has had its `bevy` feature removed. If you were relying on this feature, simply enable `smallvec` and `smol_str` instead. --------- Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
146 lines
5.9 KiB
Rust
146 lines
5.9 KiB
Rust
use bevy_app::{plugin_group, Plugin};
|
|
|
|
plugin_group! {
|
|
/// This plugin group will add all the default plugins for a *Bevy* application:
|
|
pub struct DefaultPlugins {
|
|
bevy_app:::PanicHandlerPlugin,
|
|
#[cfg(feature = "bevy_log")]
|
|
bevy_log:::LogPlugin,
|
|
bevy_app:::TaskPoolPlugin,
|
|
bevy_diagnostic:::FrameCountPlugin,
|
|
bevy_time:::TimePlugin,
|
|
#[custom(cfg(any(feature = "libm", feature = "std")))]
|
|
bevy_transform:::TransformPlugin,
|
|
bevy_diagnostic:::DiagnosticsPlugin,
|
|
#[custom(cfg(any(feature = "libm", feature = "std")))]
|
|
bevy_input:::InputPlugin,
|
|
#[custom(cfg(not(feature = "bevy_window")))]
|
|
bevy_app:::ScheduleRunnerPlugin,
|
|
#[cfg(feature = "bevy_window")]
|
|
bevy_window:::WindowPlugin,
|
|
#[cfg(feature = "bevy_window")]
|
|
bevy_a11y:::AccessibilityPlugin,
|
|
#[cfg(feature = "std")]
|
|
#[custom(cfg(any(unix, windows)))]
|
|
bevy_app:::TerminalCtrlCHandlerPlugin,
|
|
#[cfg(feature = "bevy_asset")]
|
|
bevy_asset:::AssetPlugin,
|
|
#[cfg(feature = "bevy_scene")]
|
|
bevy_scene:::ScenePlugin,
|
|
#[cfg(feature = "bevy_winit")]
|
|
bevy_winit:::WinitPlugin,
|
|
#[cfg(feature = "bevy_render")]
|
|
bevy_render:::RenderPlugin,
|
|
// NOTE: Load this after renderer initialization so that it knows about the supported
|
|
// compressed texture formats.
|
|
#[cfg(feature = "bevy_render")]
|
|
bevy_render::texture:::ImagePlugin,
|
|
#[cfg(feature = "bevy_render")]
|
|
#[custom(cfg(all(not(target_arch = "wasm32"), feature = "multi_threaded")))]
|
|
bevy_render::pipelined_rendering:::PipelinedRenderingPlugin,
|
|
#[cfg(feature = "bevy_core_pipeline")]
|
|
bevy_core_pipeline:::CorePipelinePlugin,
|
|
#[cfg(feature = "bevy_sprite")]
|
|
bevy_sprite:::SpritePlugin,
|
|
#[cfg(feature = "bevy_text")]
|
|
bevy_text:::TextPlugin,
|
|
#[cfg(feature = "bevy_ui")]
|
|
bevy_ui:::UiPlugin,
|
|
#[cfg(feature = "bevy_pbr")]
|
|
bevy_pbr:::PbrPlugin,
|
|
// NOTE: Load this after renderer initialization so that it knows about the supported
|
|
// compressed texture formats.
|
|
#[cfg(feature = "bevy_gltf")]
|
|
bevy_gltf:::GltfPlugin,
|
|
#[cfg(feature = "bevy_audio")]
|
|
bevy_audio:::AudioPlugin,
|
|
#[cfg(feature = "bevy_gilrs")]
|
|
bevy_gilrs:::GilrsPlugin,
|
|
#[cfg(feature = "bevy_animation")]
|
|
bevy_animation:::AnimationPlugin,
|
|
#[cfg(feature = "bevy_gizmos")]
|
|
bevy_gizmos:::GizmoPlugin,
|
|
#[cfg(feature = "bevy_state")]
|
|
bevy_state::app:::StatesPlugin,
|
|
#[cfg(feature = "bevy_dev_tools")]
|
|
bevy_dev_tools:::DevToolsPlugin,
|
|
#[cfg(feature = "bevy_ci_testing")]
|
|
bevy_dev_tools::ci_testing:::CiTestingPlugin,
|
|
#[plugin_group]
|
|
#[cfg(feature = "bevy_picking")]
|
|
bevy_picking:::DefaultPickingPlugins,
|
|
#[doc(hidden)]
|
|
:IgnoreAmbiguitiesPlugin,
|
|
}
|
|
/// [`DefaultPlugins`] obeys *Cargo* *feature* flags. Users may exert control over this plugin group
|
|
/// by disabling `default-features` in their `Cargo.toml` and enabling only those features
|
|
/// that they wish to use.
|
|
///
|
|
/// [`DefaultPlugins`] contains all the plugins typically required to build
|
|
/// a *Bevy* application which includes a *window* and presentation components.
|
|
/// For the absolute minimum number of plugins needed to run a Bevy application, see [`MinimalPlugins`].
|
|
}
|
|
|
|
#[derive(Default)]
|
|
struct IgnoreAmbiguitiesPlugin;
|
|
|
|
impl Plugin for IgnoreAmbiguitiesPlugin {
|
|
#[expect(
|
|
clippy::allow_attributes,
|
|
reason = "`unused_variables` is not always linted"
|
|
)]
|
|
#[allow(
|
|
unused_variables,
|
|
reason = "The `app` parameter is used only if a combination of crates that contain ambiguities with each other are enabled."
|
|
)]
|
|
fn build(&self, app: &mut bevy_app::App) {
|
|
// bevy_ui owns the Transform and cannot be animated
|
|
#[cfg(all(feature = "bevy_animation", feature = "bevy_ui"))]
|
|
if app.is_plugin_added::<bevy_animation::AnimationPlugin>()
|
|
&& app.is_plugin_added::<bevy_ui::UiPlugin>()
|
|
{
|
|
app.ignore_ambiguity(
|
|
bevy_app::PostUpdate,
|
|
bevy_animation::advance_animations,
|
|
bevy_ui::ui_layout_system,
|
|
);
|
|
app.ignore_ambiguity(
|
|
bevy_app::PostUpdate,
|
|
bevy_animation::animate_targets,
|
|
bevy_ui::ui_layout_system,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
plugin_group! {
|
|
/// This plugin group will add the minimal plugins for a *Bevy* application:
|
|
pub struct MinimalPlugins {
|
|
bevy_app:::TaskPoolPlugin,
|
|
bevy_diagnostic:::FrameCountPlugin,
|
|
bevy_time:::TimePlugin,
|
|
bevy_app:::ScheduleRunnerPlugin,
|
|
#[cfg(feature = "bevy_ci_testing")]
|
|
bevy_dev_tools::ci_testing:::CiTestingPlugin,
|
|
}
|
|
/// This plugin group represents the absolute minimum, bare-bones, bevy application.
|
|
/// Use this if you want to have absolute control over the plugins used.
|
|
///
|
|
/// It includes a [schedule runner (`ScheduleRunnerPlugin`)](crate::app::ScheduleRunnerPlugin)
|
|
/// to provide functionality that would otherwise be driven by a windowed application's
|
|
/// *event loop* or *message loop*.
|
|
///
|
|
/// By default, this loop will run as fast as possible, which can result in high CPU usage.
|
|
/// You can add a delay using [`run_loop`](crate::app::ScheduleRunnerPlugin::run_loop),
|
|
/// or remove the loop using [`run_once`](crate::app::ScheduleRunnerPlugin::run_once).
|
|
/// # Example:
|
|
/// ```rust, no_run
|
|
/// # use std::time::Duration;
|
|
/// # use bevy_app::{App, PluginGroup, ScheduleRunnerPlugin};
|
|
/// # use bevy_internal::MinimalPlugins;
|
|
/// App::new().add_plugins(MinimalPlugins.set(ScheduleRunnerPlugin::run_loop(
|
|
/// // Run 60 times per second.
|
|
/// Duration::from_secs_f64(1.0 / 60.0),
|
|
/// ))).run();
|
|
}
|