質問の時点で、同じ貨物プロジェクトにビンとライブラリがあり、特定のrustc cfgオプションを使用してビンとライブラリをビルドしたい場合、機能しません。
いずれか一方をrustc cfgオプションで構築できますが、両方を構築することはできません。そして、lib をビルドしようとすると、bin がコンパイルされたときに、rustc オプションなしで lib が再コンパイルされます。
両方を行う方法はありますか? いずれにせよ、独自のビルド スクリプトを作成しなければならない運命にあるのでしょうか? もしそうなら、貨物を持つことのポイントは何ですか?
編集
わかりました、多分私は少し劇的でした
背景・展開
次のようなものがあったとします。
src/lib.rs
pub mod mylib {
#[cfg(not(dosomething))]
pub use self::without_cfg::dosomething;
#[cfg(dosomething)]
pub use self::with_cfg::dosomething;
mod with_cfg {
pub fn dosomething() {
println!("config option");
}
}
mod without_cfg {
pub fn dosomething() {
println!("no config option");
}
}
}
src/main.rs
extern crate modules;
use modules::mylib::dosomething;
fn main() {
dosomething();
}
そのため、dosomething の cfg オプションを使用してコンパイルすると、関数の 1 つのバージョンが取得されますが、構成がないと、「デフォルト」の動作などになります。
cargo rustc でコンパイルしようとすると、lib に cfg dosomething が設定されたバージョンの bin を取得できません。
貨物ですべてを実行できるようになったのは、次のとおりです。
cargo rustc -v --lib -- --cfg dosomething
cargo rustc -v --bin [bin name] -- --cfg dosomething
最初のコマンドはcfgを使用してlibをコンパイルしますが、2番目のコマンドはbinを作成するためにcfgを使用せずにlibを再コンパイルします。
私が思いついた唯一の回避策は次のとおりです。
cargo rustc -v --bin [bin name] -- --cfg dosomething
次のように、コマンドがコンパイルするために吐き出すものをコピーします。
rustc src/main.rs --crate-name [bin name] --crate-type bin -g --cfg dosomething --out-dir [/path/to/project]/target/debug --emit=dep-info,link -L dependency=[/path/to/project]/target/debug -L dependency=[/path/to/project]/target/debug/deps --extern modules=[/path/to/project]/target/debug/libmodules.rlib`
次に実行します:
cargo rustc -v --lib -- --cfg dosomething
最後に、以前のrustcコマンドをコピーして貼り付け、cfgオプションが設定されたlibでbinをコンパイルします。
それが唯一の方法ですか?Cargo.toml にある場合でも、希望するrustc cfg オプションを取得するライブラリ/ビンをどうにかして指定できないのはなぜですか? それとも、私と私はそれを認識できませんか?
頼んだ人は…
Cargo.toml:
[package]
name = "[bin name]"
version = "0.1.0"
authors = ["[Me] <[my email]>"]
[lib]
name = "modules"
path = "src/lib.rs"
PS Rust と Cargo に取り組んでくれたすべての人に感謝します。全体として、仕事をするのに快適な環境であり、言語が大好きです。良い仕事を続けてください。