Cargo 详解 - 检查条件配置

本文旨在总结 Cargo 与 unexpected_cfgs lint 和 --check-cfg 标志交互的主要方式。它不提供各个细节,详情请参考--check-cfg 文档Cargo 手册

Cargo 功能

有关详细信息,请参阅Cargo 手册中的 [features] 部分

通过 [features] 表,Cargo 提供了一种表达条件编译和可选依赖项的机制。Cargo 会自动为每个 feature 声明相应的 cfg,正如预期。

Cargo.toml:

[features]
serde = ["dep:serde"]
my_feature = []

[lints.rust] 表中的 check-cfg

有关详细信息,请参阅Cargo 手册中的 [lints] 部分

当使用静态已知的自定义配置(即不依赖于构建脚本)时,Cargo 在 [lints.rust.unexpected_cfgs] 下提供了自定义 lint 配置 check-cfg

它可用于设置自定义的静态--check-cfg 参数,当预期 cfg 列表提前已知时,它非常有用。

Cargo.toml:

[lints.rust]
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(has_foo)'] }

build.rs/构建脚本的 cargo::rustc-check-cfg

有关详细信息,请参阅Cargo 手册中的 cargo::rustc-check-cfg 部分

当使用 cargo::rustc-cfg 设置自定义配置时,Cargo 提供了必然的结果指令:cargo::rustc-check-cfg,用于期望自定义配置。

build.rs:

fn main() {
    println!("cargo::rustc-check-cfg=cfg(has_foo)");
    //        ^^^^^^^^^^^^^^^^^^^^^^ new with Cargo 1.80
    if has_foo() {
        println!("cargo::rustc-cfg=has_foo");
    }
}