如何使用相同的配置选项构建二进制文件和库?

时间:2015-05-23 16:37:16

标签: rust rust-cargo

截至询问时,如果您在同一货物项目中有一个bin和一个lib,并且想要使用特定的rustc cfg选项构建bin和lib,则它不起作用。

您可以使用rustc cfg选项构建其中一个,但不能同时构建两者。如果您尝试构建lib然后在bin编译时bin,则重新编译lib而不使用rustc选项。

有没有办法做到这两点,如果不是为什么?我注定要创建自己的构建脚本吗?如果是这样,有货的重点是什么?

修改

好吧,也许我是一个有点戏剧性的

背景/扩展

说我有类似的东西:

的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();
}

因此,如果我使用dosome的cfg选项编译,我会获得一个版本的函数,但如果我没有配置,我会得到“默认”行为或其他。

现在,如果我尝试使用cargo rustc进行编译,我就永远无法在lib中设置cfg dosomething来获取bin的版本。

我能够在货物中完成所有工作的最接近的是:

cargo rustc -v --lib -- --cfg dosomething
cargo rustc -v --bin [bin name] -- --cfg dosomething

其中第一个命令将使用cfg编译lib,但第二个命令使用重新编译 lib而不使用cfg来创建bin。

我提出的唯一解决方法是:

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。

这是唯一的方法吗?为什么我不能以某种方式指定哪些库/箱获得我想要的rustc cfg选项,即使它在Cargo.toml中?或者我和我都没有意识到这一点?

对于那些要求......

Cargo.toml:

[package]
name = "[bin name]"
version = "0.1.0"
authors = ["[Me] <[my email]>"]

[lib]
name = "modules"
path = "src/lib.rs"

P.S。感谢所有从事过铁锈和货物运输的人,总而言之,我觉得这是一个愉快的工作环境,喜欢这种语言。保持良好的工作。

1 个答案:

答案 0 :(得分: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();
}

<强> Cargo.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