7

質問の時点で、同じ貨物プロジェクトにビンとライブラリがあり、特定の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 に取り組んでくれたすべての人に感謝します。全体として、仕事をするのに快適な環境であり、言語が大好きです。良い仕事を続けてください。

4

1 に答える 1

6

私があなたを正しく理解していれば、Cargosの機能がここで役立つはずです:

src/lib.rs

#[cfg(feature = "dosomething")]
pub use self::with_cfg::dosomething;

#[cfg(not(feature = "dosomething"))]
pub use self::without_cfg::dosomething;

#[cfg(feature = "dosomething")]
mod with_cfg {
    pub fn dosomething() {
        println!("config option");
    }
}

#[cfg(not(feature = "dosomething"))]
mod without_cfg {
    pub fn dosomething() {
        println!("no config option");
    }
}

src/main.rs

extern crate what;

use what::dosomething;

fn main() {
    dosomething();
}

貨物.toml

[package]
name = "what"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]

[features]
dosomething = []

ここで、どちらのモードでもコンパイルまたは実行できる場合:

$ cargo run
   Compiling what v0.1.0 (file:///private/tmp/what)
     Running `target/debug/what`
no config option

$ cargo run --features dosomething
   Compiling what v0.1.0 (file:///private/tmp/what)
     Running `target/debug/what`
config option
于 2015-05-25T21:48:01.817 に答える