-
-
Notifications
You must be signed in to change notification settings - Fork 3.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add no_std
support to bevy
#17955
base: main
Are you sure you want to change the base?
Add no_std
support to bevy
#17955
Conversation
_Possibly_ controversial, but support _should_ be relatively easy to maintain
I've removed the The way I see it, this isn't saying "we guarantee Bevy will work on |
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Surprisingly straightforward.
It might be useful to add a tiny overview of what isn't available with no_std yet to the release notes.
With #17570 merging this PR can be simplified (and it wouldn't successfully merge anyway since the |
Ok should be good to go! |
Objective
no_std
Bevy #15460 (will open new issues for furtherno_std
efforts)no_std
support forbevy
andbevy_internal
#17715Solution
compile-check-no-std
from internalci
tool since GitHub CI can now simply checkbevy
itself nowbevy
onthumbv6m-none-eabi
to ensureportable-atomic
support is still valid 1Testing
Release Notes
Bevy now has support for
no_std
directly from thebevy
crate.Users can disable default features and enable a new
default_no_std
feature instead, allowingbevy
to be used inno_std
applications and libraries.default_no_std
enables certain required features, such aslibm
andcritical-section
, and as many optional crates as possible (currently justbevy_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
withdefault-features = false
to allowstd
andno_std
users to both depend on your crate. However, note that certain features are required for Bevy to compile. Below is a table to help understand some of these new features relating to platform compatibility. Note that ✔️ indicates a feature is required for a particular target, ❌ indicates a feature is incompatible, and ➖ indicates a feature can be used with that platform.std
(e.g.,x86_64-pc-windows-msvc
for Windows)no_std
(e.g.,x86_64-unknown-none
)std
async_executor
2edge_executor
2libm
3critical-section
This table may still be confusing, so here are some recommended features a library crate may want to expose:
While this is verbose, it gives the maximum control to end-users to decide how they wish to use Bevy on their platform. For example,
edge_executor
is included forno_std
support, but users may still choose to use it onstd
targets. Making that assumption on behalf of the user takes that control away from them.We encourage library authors to experiment with
no_std
support. For libraries relying exclusively onbevy
and no other dependencies, it may be as simple as adding#![no_std]
to yourlib.rs
and exposing features as above! Bevy can also provide manystd
types, such asHashMap
,Mutex
, andInstant
on all platforms. Seebevy::platform_support
for details on what's available out of the box!Migration Guide
bevy
with default features disabled, you may need to enable thestd
andasync_executor
features.bevy_reflect
has had itsbevy
feature removed. If you were relying on this feature, simply enablesmallvec
andsmol_str
instead.Footnotes
This may be controversial, since it could be interpreted as implying Bevy will maintain support for
thumbv6m-none-eabi
going forward. In reality, just likex86_64-unknown-none
, this is a canary target to make it clear whenportable-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. ↩Note that either
async_executor
oredge_executor
must be enabled for compilation to succeed. This is a tradeoff to reduce the number of dependencies included in typicalstd
builds (whereasync_executor
was already being used). In the future this may change in refactors ofbevy_tasks
. Watch this space! ↩ ↩2libm
is actually quite desirable onstd
targets anyway, since it has better cross-platform determinism, making it better suited for multiplayer games. Onno_std
it becomes required, since certain maths operations are only available fromstd
and not incore
. ↩