我们如何在 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 工作站调整它们的行为。
检测目标的方法有很多种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 工作站调整它们的行为。