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
相同。有关更多信息,请参阅该处的文档。