web-dev-qa-db-ja.com

`cfg`とCargoで条件付きコンパイルを使用するにはどうすればよいですか?

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)
20
盛安安

_Cargo.toml_に既存の機能を導入する必要があります。

次のようにして、条件付きでコンパイルすることができました。

  • _Cargo.toml_で、featuresセクションを作成し、特定の機能名を導入します。

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

    機能に特定の依存関係を持たせたい場合は、 ドキュメントの例 を確認してください。

  • コードでは、#[cfg(feature="customfeature")]を使用します

  • _cargo build --features customfeature_を実行します

手順2と3は問題ないように思われるため、_Cargo.toml_に問題がある可能性があります。

19
bluenote10

他の回答で述べられているように、これには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"]

これにより、機能が有効になっている場合にのみ、コードの特定の部分とその依存関係をアクティブ化できます。

0
AlexLiesenfeld