如何在Rust中有条件地编译WebAssembly?

tve*_*eeg 3 rust rust-cargo

如何在有条件地选择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");
}
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

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"
Run Code Online (Sandbox Code Playgroud)

通常我会这样做,#[cfg(target_os = "linux")]但在这种情况下#[cfg(target_os = "unknown")]可能不起作用,因为可能比匹配更多wasm32-unknown-unknown.我是否必须使用组合target_archtarget_os为此工作正常或可能只是target_arch

小智 7

这就是stdweb的做法:

#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
Run Code Online (Sandbox Code Playgroud)

我测试了它,它看起来像这样简单的工作正常:

#[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);
}
Run Code Online (Sandbox Code Playgroud)

Rust中的条件编译允许大量的粒度,因为您可以指定操作系统,体系结构等.如果您不需要这种粒度,那么您不必使用它.

unknownemscriptenOS目标wasm32,所以如果两个平台的代码需要不同,最好区分两者.

Stdweb选择使用更细粒度的方法.如果我这样做,我会按照他们正在做的事情,但似乎它会以任何方式工作.