6 dependency-management rust rust-cargo rust-no-std
我希望增加在没有标准库的情况下使用我的板条箱的可能性。一些核心功能确实依赖于浮点函数,这些函数在 no-std 模式下需要由 libm 提供。
我见过的无标准设置的通常方法是使用一个名为“std”的功能来启用标准库,但在这种情况下,我希望该功能能够删除 libm 依赖项。我可以将“附加”功能称为“无标准”,但这会导致一个问题,即我有某些功能很难在无标准模式下实现,所以我希望它们依赖于启用标准。
货物是否可以指定仅在未启用功能时才存在的可选依赖项?
不,Cargo 功能无法删除依赖项。
可以指定optional = true不包含的依赖项,除非通过功能启用,但该机制无法禁用依赖项。请参阅Cargo Book 中的可选依赖项了解其工作原理。货物功能通常被设计为可附加的,因此添加一项功能通常不应删除功能。
您的用例有点不符合规范,因此您最好的路线是遵循@Masklinn 的建议并创建“互斥”功能(不受官方支持):
具有"std"和"libm"功能,使得该"libm"功能启用 libm 依赖项
[features]
default = ["std"]
std = []
libm = ["dep:libm"]
[dependencies]
libm = { version = "*", optional = true }
Run Code Online (Sandbox Code Playgroud)
如果两者都启用,则触发编译器错误:
#[cfg(all(feature = "std", feature = "libm"))]
compile_error!("features \"std\" and \"libm\" cannot be enabled simultaneously")
Run Code Online (Sandbox Code Playgroud)
仍然不理想,因为 Cargo 功能通常被设计为附加功能,并且由于功能统一,两者可能会无意中启用,但至少上面的编译器错误消息应该有所帮助。