wasm32-wasip1
层级:2
wasm32-wasip1
目标是一个 WebAssembly 编译目标,它假设 [WASIp1](也称为“WASI 预览 1”)的“系统调用”集可用于标准库。从历史上看,Rust 编译器中的这个目标是 WebAssembly 的第一个目标之一,其中 Rust 和 C 代码明确地旨在相互操作。
在进一步讨论之前,还值得解释一下目标和当前开发的历史。从历史上看,这个目标最初在 rustc 和 Clang 中都称为 wasm32-wasi
。它于 2019 年首次添加到 Rust 中。在 2024 年之前的几年里,WASI 标准不断发展,最终在 组件模型 之上“重新构建”。这是 WASI 规范的重大变化,并于 2024 年 1 月发布为 0.2.0(俗称“WASIp2”)。rustc 中先前目标的名称 wasm32-wasi
随后被重命名为 wasm32-wasip1
,以避免与将作为 wasm32-wasip2
添加到 rustc 的这个新目标混淆。可以在这些 MCP 中找到更多上下文
目前,wasm32-wasip1
目标旨在与 WASI 标准的第一个版本保持向后兼容。截至目前(2024 年 1 月),WASI 的 0.2.0 目标(“WASIp2”)相对较新。WASI 的状态可能会在几年后发生变化,届时本文档可能会再次更新。
如今,wasm32-wasip1
目标将生成核心 WebAssembly 模块,这些模块将从 wasi_snapshot_preview1
模块导入函数以实现与操作系统相关的功能(例如打印)。
目标维护者
当这个目标被添加到编译器时,平台特定文档当时没有维护。这意味着下面的列表并不详尽,并且还有更多人对这个目标感兴趣。也就是说,自从上次更新本文档以来,对维护这个目标感兴趣的人是
- Alex Crichton,https://github.com/alexcrichton
要求
这个目标是交叉编译的。该目标包括对 std
本身的支持,但并非所有标准库都适用。例如,生成线程将始终返回错误(例如,请参阅 wasm32-wasip1-threads
目标)。另一个例子是生成进程将始终返回错误。但是,打开文件等操作将通过调用 WASI 定义的 API 来实现。
Rust 的 WASI 目标明确地旨在与编译为 WebAssembly 的其他语言(例如 C/C++)相互操作。任何 ABI 差异或不匹配都被视为需要修复的错误。
默认情况下,Rust 中的 WASI 目标与 rustup 一起提供,其中包含 wasi-libc
的预编译副本,这意味着不需要针对 WebAssembly 的 Clang 来使用 Rust 中的 WASI 目标。如果没有与 C 的实际交互,那么 rustup target add wasm32-wasip1
就是开始使用 WASI 所需的全部操作。
但是请注意,此行为可以使用 -Clinker
和 -Clink-self-contained
来控制。通过指定 clang
作为链接器并禁用 link-self-contained
选项,可以使用外部版本的 libc.a
代替。
构建目标
要构建此目标,请先获取 wasi-sdk
的副本。目前,版本 22 是所需的最低版本。
接下来,将 WASI_SDK_PATH
环境变量配置为指向安装位置。例如
export WASI_SDK_PATH=/path/to/wasi-sdk-22.0
接下来,确保在从源代码构建 Rust 时启用 LLD,因为 LLVM 的 wasm-ld
驱动程序(用于 LLD)在将 WebAssembly 代码链接在一起时是必需的。Rust 的构建系统将自动从 WASI_SDK_PATH
中获取所有必要的二进制文件和程序。
构建 Rust 程序
wasm32-wasip1
目标与 rustup 一起提供,因此用户可以使用以下命令安装该目标:
rustup target add wasm32-wasip1
注意:
wasm32-wasip1
目标是新的,可能只在您阅读本文时才在 nightly 上可用。如果wasm32-wasip1
在稳定版 Rust 上不可用,则wasm32-wasi
应该可用。
可以为该目标构建 Rust 程序
rustc --target wasm32-wasip1 your-code.rs
交叉编译
此目标可以从任何主机交叉编译。
测试
此目标在 rust-lang/rust CI 上对所有合并进行测试。test-various
构建器中运行了部分测试,例如 UI 测试和 libcore 测试。这可以在本地进行测试,例如,使用以下命令:
./x.py test --target wasm32-wasip1 tests/ui