Changes to Rust's WASI targets
WASI 0.2 was recently stabilized, and Rust has begun implementing first-class support for it in the form of a dedicated new target. Rust 1.78 will introduce new wasm32-wasip1
(tier 2) and wasm32-wasip2
(tier 3) targets. wasm32-wasip1
is an effective rename of the existing wasm32-wasi
target, freeing the target name up for an eventual WASI 1.0 release. Starting Rust 1.78 (May 2nd, 2024), users of WASI 0.1 are encouraged to begin migrating to the new wasm32-wasip1
target before the existing wasm32-wasi
target is removed in Rust 1.84 (January 5th, 2025).
In this post we'll discuss the introduction of the new targets, the motivation behind it, what that means for the existing WASI targets, and a detailed schedule for these changes. This post is about the WASI targets only; the existing wasm32-unknown-unknown
and wasm32-unknown-emscripten
targets are unaffected by any changes in this post.
Introducing wasm32-wasip2
After nearly five years of work the WASI 0.2 specificationwas recently stabilized. This work builds on WebAssembly Components (think: strongly-typed ABI for Wasm), providing standard interfaces for things like asynchronous IO, networking, and HTTP. This will finally make it possible to write asynchronous networked services on top of WASI, something which wasn't possible using WASI 0.1.
People interested in compiling Rust code to WASI 0.2 today are able to do so using the cargo-componenttool. This tool is able to take WASI 0.1 binaries, and transform them to WASI 0.2 Components using a shim. It also provides native support for common cargo commands such as cargo build
, cargo test
, and cargo run
. While it introduces some inefficiencies because of the additional translation layer, in practice this already works really well and people should be enough able to get started with WASI 0.2 development.
We're however keen to begin making that translation layer obsolete. And for that reason we're happy to share that Rust has made its first steps towards that with the introduction of the tier 3 wasm32-wasip2
target landing in Rust 1.78. This will initially miss a lot of expected features such as stdlib support, and we don't recommend people use this target quite yet. But as we fill in those missing features over the coming months, we aim to eventually hit meet the criteria to become a tier 2 target, at which point the wasm32-wasip2
target would be considered ready for general use. This work will happen through 2024, and we expect for this to land before the end of the calendar year.
Renaming wasm32-wasi
to wasm32-wasip1
The original name for what we now call WASI 0.1 was "WebAssembly System Interface, snapshot 1". Rust shipped support for this in 2019, and we did so knowing the target would likely undergo significant changes in the future. With the knowledge we have today though, we would not have chosen to introduce the "WASI, snapshot 1" target as wasm32-wasi
. We should have instead chosen to add some suffix to the initial target triple so that the eventual stable WASI 1.0 target can just be called wasm32-wasi
.
In anticipation of both an eventual WASI 1.0 target, and to preserve consistency between target names, we'll begin rolling out a name change to the existing WASI 0.1 target. Starting in Rust 1.78 (May 2nd, 2024) a new wasm32-wasip1
target will become available. Starting Rust 1.81 (September 5th, 2024) we will begin warning existing users of wasm32-wasi
to migrate to wasm32-wasip1
. And finally in Rust 1.84 (January 9th, 2025) the wasm32-wasi
target will no longer be shipped on the stable release channel. This will provide an 8 month transition period for projects to switch to the new target name when they update their Rust toolchains.
The name wasip1
can be read as either "WASI (zero) point one" or "WASI preview one". The official specification uses the "preview" moniker, however in most communication the form "WASI 0.1" is now preferred. This target triple was chosen because it not only maps to both terms, but also more closely resembles the target terminology used in other programming languages. This is something the WASI Preview 2 specification also makes note of.
Timeline
This table provides the dates and cut-offs for the target rename fromwasm32-wasi
to wasm32-wasip1
. The dates in this table do not apply to the newly-introduced wasm32-wasi-preview1-threads
target; this will be renamed towasm32-wasip1-threads
in Rust 1.78 without going through a transition period. The tier 3 wasm32-wasip2
target will also be made available in Rust 1.78.
date
Rust Stable
Rust Beta
Rust Nightly
Notes
2024-02-08
1.76
1.77
1.78
wasm32-wasip1
available on nightly
2024-03-21
1.77
1.78
1.79
wasm32-wasip1
available on beta
2024-05-02
1.78
1.79
1.80
wasm32-wasip1
available on stable
2024-06-13
1.79
1.80
1.81
warn if wasm32-wasi
is used on nightly
2024-07-25
1.80
1.81
1.82
warn if wasm32-wasi
is used on beta
2024-09-05
1.81
1.82
1.83
warn if wasm32-wasi
is used on stable
2024-10-17
1.82
1.83
1.84
wasm32-wasi
unavailable on nightly
2024-11-28
1.83
1.84
1.85
wasm32-wasi
unavailable on beta
2025-01-09
1.84
1.85
1.86
wasm32-wasi
unavailable on stable
Conclusion
In this post we've discussed the upcoming updates to Rust's WASI targets. Come Rust 1.78 the wasm32-wasip1
(tier 2) and wasm32-wasip2
(tier 3) targets will be added. In Rust 1.81 we will begin warning if wasm32-wasi
is being used. And in Rust 1.84, the existing wasm32-wasi
target will be removed. This will free up wasm32-wasi
to eventually be used for a WASI 1.0 target. Users will have 8 months to switch to the new target name when they update their Rust toolchains.
The wasm32-wasip2
target marks the start of native support for WASI 0.2. In order to target it today from Rust, people are encouraged to usecargo-component tool instead. The plan is to eventually graduate wasm32-wasip2
to a tier-2 target, at which point cargo-component
will be upgraded to support it natively instead.
With WASI 0.2 finally stable, it's an exciting time for WebAssembly development. We're happy for Rust to begin implementing native support for WASI 0.2, and we're excited for what this will enable people to build.