Как условно скомпилировать WebAssembly в Rust?

Как я могу сделать флаг конфигурации, в котором я условно выбираю цель 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?


person tversteeg    schedule 19.01.2018    source источник


Ответы (1)


Вот как это делает 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 выбрал более детальный подход. Если бы я делал это, я бы следил за тем, что они делают, но похоже, что это сработает в любом случае.

person Daniel Wilkins    schedule 19.01.2018
comment
Есть target_os="emscripten" для wasm32-unknown-emscripten. hellorust.com/emscripten, которые, возможно, стоит различать. Зависит от того, что нужно коду пользователя. - person loganfsmyth; 20.01.2018
comment
Извините, у меня в голове ошиблась тройная цель. Тройка имеет общий формат ‹arch› ‹sub› - ‹vendor› - ‹sys› - ‹abi›. Системной частью этого обычно является ОС, которая является emscripten в случае wasm32-unknown-emscripten. Обновлю пост, чтобы исправить. - person Daniel Wilkins; 20.01.2018