如何制作一个配置标志,有条件地选择wasm32-unknown-unkown
目标?
我使用以下build.rs
打印了当前环境:
use std::env;
fn main() {
for (key, value) in env::vars() {
if key.starts_with("CARGO_CFG_") {
println!("{}: {:?}", key, value);
}
}
panic!("stop and dump stdout");
}
哪些打印:
CARGO_CFG_DEBUG_ASSERTIONS: ""
CARGO_CFG_TARGET_ARCH: "wasm32"
CARGO_CFG_TARGET_ENDIAN: "little"
CARGO_CFG_TARGET_ENV: ""
CARGO_CFG_TARGET_HAS_ATOMIC: "16,32,8,ptr"
CARGO_CFG_TARGET_OS: "unknown"
CARGO_CFG_TARGET_POINTER_WIDTH: "32"
CARGO_CFG_TARGET_VENDOR: "unknown"
通常我会做#[cfg(target_os = "linux")]
但在这种情况下可能不起作用,因为#[cfg(target_os = "unknown")]
可能匹配超过 wasm32-unknown-unknown
.我是否必须结合使用target_arch
和target_os
才能正常工作,或者只是target_arch
?
这就是 stdweb 的做法:
#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
我对其进行了测试,看起来像这样简单的东西就可以了:
#[cfg(target_arch = "wasm32")]
fn add_seven(x: i32) -> i32 {
x + 7
}
#[cfg(not(target_arch = "wasm32"))]
fn add_seven(x: i32) -> i32 {
x + 6
}
fn main() {
let eight = add_seven(1);
println!("{}", eight);
}
Rust 中的条件编译允许大量的粒度,因为您可以指定操作系统、架构等。如果您不需要该粒度,则不必使用它。
wasm32
有unknown
和emscripten
操作系统目标,因此如果您的代码需要针对两个平台不同,最好区分两者。
Stdweb选择使用更精细的方法。如果我这样做,我会遵循他们正在做的事情,但似乎无论哪种方式都可以。