![]() # Objective - Contributes to #16877 ## Solution - Initial creation of `bevy_platform_support` crate. - Moved `bevy_utils::Instant` into new `bevy_platform_support` crate. - Moved `portable-atomic`, `portable-atomic-util`, and `critical-section` into new `bevy_platform_support` crate. ## Testing - CI --- ## Showcase Instead of needing code like this to import an `Arc`: ```rust #[cfg(feature = "portable-atomic")] use portable_atomic_util::Arc; #[cfg(not(feature = "portable-atomic"))] use alloc::sync::Arc; ``` We can now use: ```rust use bevy_platform_support::sync::Arc; ``` This applies to many other types, but the goal is overall the same: allowing crates to use `std`-like types without the boilerplate of conditional compilation and platform-dependencies. ## Migration Guide - Replace imports of `bevy_utils::Instant` with `bevy_platform_support::time::Instant` - Replace imports of `bevy::utils::Instant` with `bevy::platform_support::time::Instant` ## Notes - `bevy_platform_support` hasn't been reserved on `crates.io` - ~~`bevy_platform_support` is not re-exported from `bevy` at this time. It may be worthwhile exporting this crate, but I am unsure of a reasonable name to export it under (`platform_support` may be a bit wordy for user-facing).~~ - I've included an implementation of `Instant` which is suitable for `no_std` platforms that are not Wasm for the sake of eliminating feature gates around its use. It may be a controversial inclusion, so I'm happy to remove it if required. - There are many other items (`spin`, `bevy_utils::Sync(Unsafe)Cell`, etc.) which should be added to this crate. I have kept the initial scope small to demonstrate utility without making this too unwieldy. --------- Co-authored-by: TimJentzsch <TimJentzsch@users.noreply.github.com> Co-authored-by: Chris Russell <8494645+chescock@users.noreply.github.com> Co-authored-by: François Mockers <francois.mockers@vleue.com> |
||
---|---|---|
.. | ||
src | ||
Cargo.toml | ||
README.md |
Bevy Platform Support
Rust is a fantastic multi-platform language with extensive support for modern targets through its standard library.
However, some items within the standard library have alternatives that are better suited for Bevy and game engines in general.
Additionally, to support embedded and other esoteric platforms, it's often necessary to shed reliance on std
, making your crate no_std
.
These needs are handled by this crate, bevy_platform_support
.
The goal of this crate is to provide alternatives and extensions to the Rust standard library which minimize friction when developing with and for Bevy across multiple platforms.
Getting Started
Like any dependency from crates.io, use cargo
to add it to your Cargo.toml
file:
cargo add bevy_platform_support
Now, instead of importing from std
you can use bevy_platform_support
for items it has alternative for.
See the documentation for what items are available, and explanations for why you may want to use them.
no_std
Support
By default, bevy_platform_support
will activate the std
feature, requiring access to the std
crate for whichever platforms you're targeting.
To use this crate on no_std
platforms, disable default features:
bevy_platform_support = { version = "x.y.z", default-features = false }
Features
std
(default)
Enables usage of the standard library. Note that where this crate has alternatives to the standard library that it considers better than what's provided, it will provide the alternative even when std
is enabled.
This is explicitly incompatible with no_std
targets.
alloc
(default)
Enables usage of the alloc
crate. Note that this feature is automatically enabled when enabling std
.
This is compatible with most no_std
targets, but not all.
portable-atomic
Switches to using portable-atomic
as a backend for atomic types, such as Arc
, AtomicU8
, etc.
You may need to enable this feature on platforms without full support for atomic types or certain operations, such as atomic CAS.
critical-section
Switches to using critical-section
as a backend for synchronization.
You may need to enable this feature on platforms with little to no support for atomic operations, and is often paired with the portable-atomic
feature.