Description
In Rust it is the best practice to have features to be strictly additive. extension-module
, instead, subtracts from the crate by not linking python. This can result in weird and difficult to resolve failure modes in e.g. workspaces.
For instance consider…
💥 Reproducing
[workspace]
members = [
"extension",
"some_binary",
]
where both extension
and some_binary
use as a dependency pyo3
, but extension
enables the extension-module
feature, while some_binary
explicitly disables the features.
When cargo build
is run from the workspace root, then both of the binaries will get a pyo3
with extension-module
feature enabled and some_binary
will fail to link.
This behaviour is entirely valid from cargo
’s standpoint – it dictates that features should be additive and thus there must not be a way to write any single crate in a way that would fail when additional features are enabled in its dependencies.
To be honest, I don’t see a good way to fix it, other than spiting pyo3
into two separate crates.