wasm32v1-none
级别:2
wasm32v1-none
目标是一个 WebAssembly 编译目标,它:
- 不从其宿主环境导入任何内容
- 不启用任何超出 W3C WebAssembly Core 1.0 规范的提案/特性
该目标与 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
,仅支持 core
和 alloc
。由于它不从其环境导入任何内容,任何使用操作系统设施的 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 目标特性标志:
- 1.0 之后的提案(集成到 WebAssembly core 2.0 规范中)
- 2.0 之后的提案
当然,未来的其他提案默认情况下也不会启用。
相对于 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
区别在于如何编译 core
和 alloc
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
这不仅会重建 std
、core
和 alloc
(这有些昂贵且令人讨厌),而且更重要的是,需要使用 nightly Rust 工具链(对于 -Zbuild-std
标志)。对于目标受众(由那些优先考虑稳定性、简单性和/或安全性而不是功能支持的 WebAssembly 实现的人员组成)来说,这是非常不希望的。
此 wasm32v1-none
目标作为一种替代方案存在,可在稳定的 Rust 工具链上工作,而无需重建 stdlib。