【问题标题】:Conditional compilation for 'nightly' vs 'stable' Rust or compiler version'nightly' vs 'stable' Rust 或编译器版本的条件编译
【发布时间】:2019-12-31 09:49:51
【问题描述】:

我正在使用一些 Rust 不稳定的功能,但我仍然希望能够使用稳定的 Rust 编译我的库的简化版本。我很高兴只在编译器支持时包含那些不稳定的特性,在不支持时排除它们。

我认为使用像#[cfg(rust_version = "nightly")] 这样的条件编译很容易实现这个目标,但似乎'stable' 与'nightly' 不是cfg options

你们如何基于“稳定”与“夜间”或基于编译器版本执行条件编译?

【问题讨论】:

标签: rust


【解决方案1】:

我建议为您的夜间专用代码创建一个feature,该代码默认禁用,即不包含在

Cargo.toml

[features]
default = []
nightly-features = []

由于该功能不是默认功能,因此使用稳定工具链进行编译可以开箱即用。如果您将其命名为nightly-features,您可以分别在您曾经和不想包含在夜间专用版本中的语句、表达式等上使用attributes #[cfg(feature = "nightly-features")]#[cfg(not(feature = "nightly-features"))]。此方法的额外好处是允许您(和您的用户)独立于编译器测试夜间功能(即回答以下问题:编译器是否破坏了我的代码,或者我的 nightly-features 代码是否包含错误?)。

尽管有风险,我还是想自动启用夜间功能

使用build scripts,有时称为build.rs。 (注意:永远不要在库中使用以下内容,否则切换编译器可能会成为重大更改。更喜欢上面解释的解决方案)

build.rs(进入包根目录)

use std::env;

fn main() {
    let rust_toolchain = env::var("RUSTUP_TOOLCHAIN").unwrap();
    if rust_toolchain.starts_with("stable") {
        // do nothing
    } else if rust_toolchain.starts_with("nightly") {
        //enable the 'nightly-features' feature flag
        println!("cargo:rustc-cfg=feature=\"nightly-features\"");
    } else {
        panic!("Unexpected value for rustc toolchain")
    }
}

src/main.rs

fn main() {
    #[cfg(feature = "nightly-features")]
    println!("Hello, nightly!");
    #[cfg(not(feature = "nightly-features"))]
    println!("Hello, stable!");
}

现在,正在运行

➜  cargo +stable run      
Hello, stable!
➜  cargo +nightly run
Hello, nightly!

在夜间编译器上是否可以关闭此功能?

据我所知,没有。由于货物如何将标志传递给 rustc,运行 cargo +nightly run --no-default-features 会保留该功能。程序员可以创建一个特定的环境变量供 build.rs 检查以跳过自动版本检测,但这比没有构建脚本的替代方案更复杂 - cargo build --features=nightly-features

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    相关资源
    最近更新 更多