wasm32-wasip1

级别:2

wasm32-wasip1 目标是一个 WebAssembly 编译目标,它假设标准库中可以使用 [WASIp1] (又名 “WASI preview1”) 一组“系统调用”。从历史上看,Rust 编译器中的这个目标是 WebAssembly 的首批目标之一,Rust 和 C 代码明确地打算在此互操作。

在深入探讨之前,有必要先解释一下该目标的一些历史和当前开发情况。从历史上看,这个目标最初在 rustc 和 Clang 中都称为 wasm32-wasi。它于 2019 年首次添加到 Rust 中。在 2024 年之前的几年里,WASI 标准不断发展,并最终基于 组件模型“重新构建”。这是 WASI 规范的重大变更,并于 2024 年 1 月以 0.2.0 版本(俗称 “WASIp2”)发布。rustc 中之前的目标名称 wasm32-wasi,随后被重命名为 wasm32-wasip1,以避免与即将添加到 rustc 中的新目标 wasm32-wasip2 混淆。更多上下文可以在这些 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,因为在将 WebAssembly 代码链接在一起时需要 LLVM 的用于 LLD 的 wasm-ld 驱动程序。Rust 的构建系统会自动从 WASI_SDK_PATH 中选取任何必要的二进制文件和程序。

构建 Rust 程序

wasm32-wasip1 目标随 rustup 一起提供,因此用户可以使用以下命令安装该目标

rustup target add wasm32-wasip1

可以为该目标构建 Rust 程序

rustc --target wasm32-wasip1 your-code.rs

交叉编译

此目标可以从任何主机进行交叉编译。

测试

此目标在 rust-lang/rust CI 中对所有合并进行测试。测试的子集在 test-various 构建器中运行,例如 UI 测试和 libcore 测试。可以在本地进行测试,例如,使用

./x.py test --target wasm32-wasip1 tests/ui

有条件地编译代码

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

#[cfg(all(target_os = "wasi", target_env = "p1"))]

请注意,target_env = "p1" 条件首次出现在 Rust 1.80 中。在 Rust 1.80 之前,未设置 target_env 条件。

启用的 WebAssembly 功能

当前为编译启用的默认 WebAssembly 功能集与 wasm32-unknown-unknown 相同。有关更多信息,请参阅该处的文档。