
# Objective - Contributes to #15460 - Reduce quantity and complexity of feature gates across Bevy ## Solution - Used `target_has_atomic` configuration variable to automatically detect impartial atomic support and automatically switch to `portable-atomic` over the standard library on an as-required basis. ## Testing - CI ## Notes To explain the technique employed here, consider getting `Arc` either from `alloc::sync` _or_ `portable-atomic-util`. First, we can inspect the `alloc` crate to see that you only have access to `Arc` _if_ `target_has_atomic = "ptr"`. We add a target dependency for this particular configuration _inverted_: ```toml [target.'cfg(not(target_has_atomic = "ptr"))'.dependencies] portable-atomic-util = { version = "0.2.4", default-features = false } ``` This ensures we only have the dependency when it is needed, and it is entirely excluded from the dependency graph when it is not. Next, we adjust our configuration flags to instead of checking for `feature = "portable-atomic"` to instead check for `target_has_atomic = "ptr"`: ```rust // `alloc` feature flag hidden for brevity #[cfg(not(target_has_atomic = "ptr"))] use portable_atomic_util as arc; #[cfg(target_has_atomic = "ptr")] use alloc::sync as arc; pub use arc::{Arc, Weak}; ``` The benefits of this technique are three-fold: 1. For platforms without full atomic support, the functionality is enabled automatically. 2. For platforms with atomic support, the dependency is never included, even if a feature was enabled using `--all-features` (for example) 3. The `portable-atomic` feature no longer needs to virally spread to all user-facing crates, it's instead something handled within `bevy_platform_support` (with some extras where other dependencies also need their features enabled).
161 lines
5.0 KiB
TOML
161 lines
5.0 KiB
TOML
[package]
|
|
name = "bevy_ecs"
|
|
version = "0.16.0-dev"
|
|
edition = "2024"
|
|
description = "Bevy Engine's entity component system"
|
|
homepage = "https://bevyengine.org"
|
|
repository = "https://github.com/bevyengine/bevy"
|
|
license = "MIT OR Apache-2.0"
|
|
keywords = ["ecs", "game", "bevy"]
|
|
categories = ["game-engines", "data-structures"]
|
|
rust-version = "1.85.0"
|
|
|
|
[features]
|
|
default = ["std", "bevy_reflect", "async_executor"]
|
|
|
|
# Functionality
|
|
|
|
## Enables multithreading support. Schedules will attempt to run systems on
|
|
## multiple threads whenever possible.
|
|
multi_threaded = ["bevy_tasks/multi_threaded", "dep:arrayvec"]
|
|
|
|
## Adds serialization support through `serde`.
|
|
serialize = [
|
|
"dep:serde",
|
|
"bevy_utils/serde",
|
|
"bevy_platform_support/serialize",
|
|
"indexmap/serde",
|
|
]
|
|
|
|
## Adds runtime reflection support using `bevy_reflect`.
|
|
bevy_reflect = ["dep:bevy_reflect"]
|
|
|
|
## Extends reflection support to functions.
|
|
reflect_functions = ["bevy_reflect", "bevy_reflect/functions"]
|
|
|
|
## Use the configurable global error handler as the default error handler
|
|
configurable_error_handler = []
|
|
|
|
# Debugging Features
|
|
|
|
## Enables `tracing` integration, allowing spans and other metrics to be reported
|
|
## through that framework.
|
|
trace = ["std", "dep:tracing"]
|
|
|
|
## Enables a more detailed set of traces which may be noisy if left on by default.
|
|
detailed_trace = ["trace"]
|
|
|
|
## Provides system stepping support, allowing them to be paused, stepped, and
|
|
## other debug operations which can help with diagnosing certain behaviors.
|
|
bevy_debug_stepping = []
|
|
|
|
## Provides more detailed tracking of the cause of various effects within the ECS.
|
|
## This will often provide more detailed error messages.
|
|
track_location = []
|
|
|
|
# Executor Backend
|
|
|
|
## Uses `async-executor` as a task execution backend.
|
|
## This backend is incompatible with `no_std` targets.
|
|
async_executor = ["dep:bevy_tasks", "std", "bevy_tasks/async_executor"]
|
|
|
|
## Uses `edge-executor` as a task execution backend.
|
|
## Use this instead of `async-executor` if working on a `no_std` target.
|
|
edge_executor = ["dep:bevy_tasks", "bevy_tasks/edge_executor"]
|
|
|
|
# Platform Compatibility
|
|
|
|
## Allows access to the `std` crate. Enabling this feature will prevent compilation
|
|
## on `no_std` targets, but provides access to certain additional features on
|
|
## supported platforms.
|
|
std = [
|
|
"bevy_reflect?/std",
|
|
"bevy_tasks/std",
|
|
"bevy_utils/std",
|
|
"bitflags/std",
|
|
"concurrent-queue/std",
|
|
"disqualified/alloc",
|
|
"fixedbitset/std",
|
|
"indexmap/std",
|
|
"serde?/std",
|
|
"nonmax/std",
|
|
"arrayvec?/std",
|
|
"log/std",
|
|
"bevy_platform_support/std",
|
|
]
|
|
|
|
## `critical-section` provides the building blocks for synchronization primitives
|
|
## on all platforms, including `no_std`.
|
|
critical-section = [
|
|
"bevy_tasks?/critical-section",
|
|
"bevy_platform_support/critical-section",
|
|
"bevy_reflect?/critical-section",
|
|
]
|
|
|
|
[dependencies]
|
|
bevy_ptr = { path = "../bevy_ptr", version = "0.16.0-dev" }
|
|
bevy_reflect = { path = "../bevy_reflect", version = "0.16.0-dev", features = [
|
|
"smallvec",
|
|
], default-features = false, optional = true }
|
|
bevy_tasks = { path = "../bevy_tasks", version = "0.16.0-dev", default-features = false, optional = true }
|
|
bevy_utils = { path = "../bevy_utils", version = "0.16.0-dev", default-features = false, features = [
|
|
"alloc",
|
|
] }
|
|
bevy_ecs_macros = { path = "macros", version = "0.16.0-dev" }
|
|
bevy_platform_support = { path = "../bevy_platform_support", version = "0.16.0-dev", default-features = false, features = [
|
|
"alloc",
|
|
] }
|
|
|
|
bitflags = { version = "2.3", default-features = false }
|
|
concurrent-queue = { version = "2.5.0", default-features = false }
|
|
disqualified = { version = "1.0", default-features = false }
|
|
fixedbitset = { version = "0.5", default-features = false }
|
|
serde = { version = "1", default-features = false, features = [
|
|
"alloc",
|
|
"serde_derive",
|
|
], optional = true }
|
|
thiserror = { version = "2", default-features = false }
|
|
derive_more = { version = "1", default-features = false, features = [
|
|
"from",
|
|
"display",
|
|
"into",
|
|
"as_ref",
|
|
] }
|
|
nonmax = { version = "0.5", default-features = false }
|
|
arrayvec = { version = "0.7.4", default-features = false, optional = true }
|
|
smallvec = { version = "1", features = ["union", "const_generics"] }
|
|
indexmap = { version = "2.5.0", default-features = false }
|
|
variadics_please = { version = "1.1", default-features = false }
|
|
tracing = { version = "0.1", default-features = false, optional = true }
|
|
log = { version = "0.4", default-features = false }
|
|
bumpalo = "3"
|
|
|
|
[target.'cfg(not(all(target_has_atomic = "8", target_has_atomic = "16", target_has_atomic = "32", target_has_atomic = "64", target_has_atomic = "ptr")))'.dependencies]
|
|
concurrent-queue = { version = "2.5.0", default-features = false, features = [
|
|
"portable-atomic",
|
|
] }
|
|
|
|
[dev-dependencies]
|
|
rand = "0.8"
|
|
static_assertions = "1.1.0"
|
|
serde_test = "1.0"
|
|
|
|
[[example]]
|
|
name = "events"
|
|
path = "examples/events.rs"
|
|
|
|
[[example]]
|
|
name = "resources"
|
|
path = "examples/resources.rs"
|
|
|
|
[[example]]
|
|
name = "change_detection"
|
|
path = "examples/change_detection.rs"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[package.metadata.docs.rs]
|
|
rustdoc-args = ["-Zunstable-options", "--generate-link-to-definition"]
|
|
all-features = true
|