如何使用`cfg`和Cargo进行条件编译?

时间:2014-12-24 06:40:40

标签: rust rust-cargo

我想使用货物cfg有条件地编译我的源代码, 谷歌搜索一段时间后, 似乎解决方案是使用cargo --features

http://doc.crates.io/manifest.html

我尝试添加一些

#[cfg(feature = "foo")]
源代码中的

cargo build --features foo

,但它说

Package `xxx v0.0.1 (file:///C:/yyy/xxx)` does not have these features: `foo`

我如何让货物识别这些功能?我是否必须在Cargo.toml中添加内容?

以下是我正在使用的rustccargo的版本:

C:\>rustc --version
rustc 0.13.0-nightly (42deaa5e4 2014-12-16 17:51:23 +0000)

C:\>cargo --version
cargo 0.0.1-pre-nightly (5af754d 2014-12-18 01:50:48 +0000)

2 个答案:

答案 0 :(得分:18)

您必须在Cargo.toml中介绍现有功能。

通过执行以下操作,我能够有条件地编译:

  • Cargo.toml中,创建一个features部分并介绍某个功能名称:

    [features]
    
    customfeature = [] # feature has no explicit dependencies
    

    如果您希望自己的功能具有特定的依赖关系,请选中the examples in the documentation

  • 在您的代码中,使用#[cfg(feature="customfeature")]

  • 运行cargo build --features customfeature

由于您的步骤2& 3似乎没问题,你的Cargo.toml可能存在问题。

答案 1 :(得分:0)

如其他答案所述,您可以使用features。我想补充一点,这些功能不仅允许您有条件地编译部分代码,而且还可以有条件地包含可能是该代码一部分的依赖项。请考虑以下片段:

您可以使用功能标记来激活条件代码,如其他答案中所述:

cargo build --features customfeature

您需要将条件代码标记为仅在启用customfeature时存在:

#[cfg(feature = "customfeature")]
fn my_func() {
    my_optional_dependency::do_something(); 
}

// This includes dependencies only when customfeature is enabled
#[cfg(feature = "customfeature")] 
extern crate my_optional_dependency;
....

#[cfg(feature = "customfeature")]
use my_optional_dependency::*;
....

您的Cargo.toml需要包含以下部分:

[dependencies.my_optional_dependency]
version = "1.2.3"
optional = true

[features]
customfeature = ["my_optional_dependency"]

这使您仅在启用功能后才能激活代码的某些部分及其依赖项。