我们如何在 Rust 中检测主机 OS 类型(而不是目标 OS)?

How can we detect the host OS type (not the target OS) in Rust?

检测目标的方法有很多种OS,例如 #[cfg(windows)]#[cfg(unix)]std::env::consts::OS。对于交叉编译,我们如何检测我们的 Rust 程序在其上编译的 OS?

因为 build.rs 在工作站(不是目标)上是 运行,我猜它可以检测到一些与工作站相关的属性,然后 generate features (cfg) 可以在target相关代码中进行测试。

例如,这里有一个 build.rs 脚本,可以检测您工作站上的特定文件。

fn main() {
    // detected on the workstation (not the target)
    if let Ok(_attr) = std::fs::metadata("dummy_file.txt") {
        println!("cargo:rustc-cfg=detected");
    }
    if cfg!(windows) {
        println!("cargo:rustc-cfg=from_windows");
    }
    if cfg!(unix) {
        println!("cargo:rustc-cfg=from_unix");
    }
}

然后,src/main.rs可以测试检测到的特征。

#[cfg(detected)]
fn hello() {
    if cfg!(from_windows) {
        println!("hello from windows with detected file");
    }
    if cfg!(from_unix) {
        println!("hello from unix with detected file");
    }
}

#[cfg(not(detected))]
fn hello() {
    if cfg!(from_windows) {
        println!("hello from windows");
    }
    if cfg!(from_unix) {
        println!("hello from unix");
    }
}

fn main() {
    // run on the target (not the workstation)
    hello();
}

根据构建项目时工作站上是否存在 dummy_file.txt,生成的目标二进制文件将使用 hello() 的一个版本或另一个版本。 这两个功能中的每一个都可以根据 OS 工作站调整它们的行为。