TL;DR
同じクレートに対して異なるフィーチャの指定があるとき、Rust のビルドツール Cargo が、すべての指定の和集合を有効にしてそのクレートをビルドする仕組みである。
なぜ必要か
Cargo は依存グラフの中で同じクレートを 1 つだけビルドし、コピーが複数できないようにするために、フィーチャを統合する。
仕組み
あるクレートが crate-a と crate-b に依存しているとする。crate-a は serde クレートの derive フィーチャを、crate-b は std フィーチャを指定している。この場合、serde はビルド時に derive と std の両方が有効になる。
依存グラフ内の各クレートで、どのフィーチャが有効になっているかは次のコマンドで確認できる。
$ cargo tree --edges features注意点
フィーチャ統合があるので、フィーチャは「追加的(additive)」に設計する。フィーチャを有効にしたことで機能が無効になってはならず、どの組み合わせで有効にしても安全であるべきだ。たとえば no_std 環境に対応したいときは、no_std フィーチャを作るのではなく、std を有効にする std フィーチャを作る。