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