wasm32v1-none

级别:2

wasm32v1-none 目标是一个 WebAssembly 编译目标,它:

该目标与 wasm32-unknown-unknown 非常相似,并且类似地使用了 LLVM 的 wasm32-unknown-unknown 后端目标。它仅包含三个小的差异:

  • target-cpu 设置为 mvp 而不是默认的 generic。请求 mvp 会禁用所有 WebAssembly 提案/LLVM 目标特性标志。
  • 启用 可变全局变量的导入/导出提案(即 +mutable-globals LLVM 目标特性标志)
  • 根本不编译 std 库,而是使用存根进行编译。

目标维护者

  • Alex Crichton,https://github.com/alexcrichton
  • Graydon Hoare,https://github.com/graydon

要求

此目标是交叉编译的。它不支持 std,仅支持 corealloc。由于它不从其环境导入任何内容,任何使用操作系统设施的 std 部分都会被失败函数存根化,并且使用 wasm32-unknown-unknown 目标中的存根 std 的体验被认为不值得在此重复。

关于此目标的要求、构建、使用和测试的所有其他内容,与 wasm32-unknown-unknown 文档中描述的相同,只是使用目标字符串 wasm32v1-none 代替 wasm32-unknown-unknown

有条件地编译代码

建议使用以下方式有条件地为此目标编译代码:

#[cfg(all(target_family = "wasm", target_os = "none"))]

请注意,无法通过 #[cfg] 判断代码是否将在 Web 上运行。

已启用的 WebAssembly 功能

如上所述,默认情况下,此目标上未启用 1.0 之后的任何 WebAssembly 提案。实际上,此目标的全部意义在于提供一种方法,可以在稳定的 Rust 上为 WebAssembly 的稳定“无 1.0 后提案”子集进行编译。

W3C WebAssembly Core 1.0 规范于 2019 年 12 月被采纳为 W3C 建议,并且只包含一个“MVP 后”提案:可变全局变量的导入/导出提案。

默认情况下,此目标上禁用所有后续提案,但可以通过传递 LLVM 目标特性标志来单独启用它们。

为了方便参考,此处列出了编写时 LLVM 支持的一组提案,此目标默认不启用,以及它们的 LLVM 目标特性标志:

当然,未来的其他提案默认情况下也不会启用。

相对于 wasm32-unknown-unknown 的基本原理

wasm32-unknown-unknown 文档中所述,可以使用 --target wasm32-unknown-unknown 进行编译,并通过传递 -Ctarget-cpu=mvp “手动”禁用所有 WebAssembly 提案。此外,可以通过传递 LLVM 目标特性标志(例如 -Ctarget-feature=+mutable-globals)来逐个启用提案。

因此,合理地想知道以下两者之间的区别是什么:

$ rustc --target wasm32-unknown-unknown -Ctarget-cpu=mvp -Ctarget-feature=+mutable-globals

以及使用以下方式构建:

$ rustc --target wasm32v1-none

区别在于如何编译 corealloc crate 以便与工具链一起分发,以及它是否在稳定的 Rust 工具链上工作,还是需要nightly 工具链。再次参考 wasm32-unknown-unknown 文档,请注意,要禁用该目标上的所有 MVP 后提案,实际上必须使用以下方式进行编译:

$ export RUSTFLAGS="-Ctarget-cpu=mvp -Ctarget-feature=+mutable-globals"
$ cargo +nightly build -Zbuild-std=panic_abort,std --target wasm32-unknown-unknown

这不仅会重建 stdcorealloc(这有些昂贵且令人讨厌),而且更重要的是,需要使用 nightly Rust 工具链(对于 -Zbuild-std 标志)。对于目标受众(由那些优先考虑稳定性、简单性和/或安全性而不是功能支持的 WebAssembly 实现的人员组成)来说,这是非常不希望的。

wasm32v1-none 目标作为一种替代方案存在,可在稳定的 Rust 工具链上工作,而无需重建 stdlib。