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 |
|
|
TimJentzsch
left a comment
There was a problem hiding this comment.
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! |
|
@bushrat011899 cam you get CI green, then bug me for a review and merge? Skimming this it looks fine. |
Original implementation uses outdated `futures-lite` version relying on unmaintained `instant`.
|
@alice-i-cecile Ok so the fix for the check-advisory was a little unfortunate. The problem is All tests that |
alice-i-cecile
left a comment
There was a problem hiding this comment.
That's unfortunate. I think I agree with your choice though, and the rest of this LGTM. Merging.
|
@bushrat011899 those CI failures look real <3 |
|
Ok so the issue here is we would like
Since I had to already inline This required some light refactoring for the relevant features, but it now means that |
|
Thank you to everyone involved with the authoring or reviewing of this PR! This work is relatively important and needs release notes! Head over to bevyengine/bevy-website#2001 if you'd like to help out. |
# Objective - Fixes bevyengine#15460 (will open new issues for further `no_std` efforts) - Supersedes bevyengine#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>
Objective
no_stdBevy #15460 (will open new issues for furtherno_stdefforts)no_stdsupport forbevyandbevy_internal#17715Solution
compile-check-no-stdfrom internalcitool since GitHub CI can now simply checkbevyitself nowbevyonthumbv6m-none-eabito ensureportable-atomicsupport is still valid 1Testing
Release Notes
Bevy now has support for
no_stddirectly from thebevycrate.Users can disable default features and enable a new
default_no_stdfeature instead, allowingbevyto be used inno_stdapplications and libraries.default_no_stdenables certain required features, such aslibmandcritical-section, and as many optional crates as possible (currently justbevy_state). For atomically-challenged platforms such as the Raspberry Pi Pico,portable-atomicwill be used automatically.For library authors, we recommend depending on
bevywithdefault-features = falseto allowstdandno_stdusers to both depend on your crate. 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.
We encourage library authors to experiment with
no_stdsupport. For libraries relying exclusively onbevyand no other dependencies, it may be as simple as adding#![no_std]to yourlib.rsand exposing features as above! Bevy can also provide manystdtypes, such asHashMap,Mutex, andInstanton all platforms. Seebevy::platform_supportfor details on what's available out of the box!Migration Guide
bevywith default features disabled, you may need to enable thestdandasync_executorfeatures.bevy_reflecthas had itsbevyfeature removed. If you were relying on this feature, simply enablesmallvecandsmol_strinstead.Footnotes
This may be controversial, since it could be interpreted as implying Bevy will maintain support for
thumbv6m-none-eabigoing forward. In reality, just likex86_64-unknown-none, this is a canary target to make it clear whenportable-atomicno 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. ↩