My First Wasmtime Experience in Windows 10
A month ago, Mozilla announced WASI (WebAssembly system interface) in their blog post. WASI is a new standardization that allows WebAssembly code to run anywhere. Although WASI is still a work in progress prototype, I can’t wait to try it out.
Building Wasmtime in Windows 10
Wasmtime is a standalone wasm-only runtime for WebAssembly which is an open source project released on GitHub.
To use Wasmtime, we have to build by ourselves. Download the source code:
git clone --recurse-submodules https://github.com/CraneStation/wasmtime.git
To build Wasmtime, you need cargo, clang, and cmake.
Let’s try to build it via cmd.exe:
cargo build --release
Unfortunately, I got the error message:
Done Building Project "G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\SandboxedSystemPrimitives.vcxproj" (default targets) -- FAILED.
Done Building Project "G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\ALL_BUILD.vcxproj" (default targets) -- FAILED.
Done Building Project "G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\install.vcxproj" (default targets) -- FAILED.
Build FAILED.
"G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\install.vcxproj" (default target) (1) ->
"G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\ALL_BUILD.vcxproj" (default target) (3) ->
"G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\SandboxedSystemPrimitives.vcxproj" (default target) (4) ->
(ClCompile target) ->
g:\wasi\wasmtime\wasmtime-wasi\sandboxed-system-primitives\src\str.c(22): warning C4047: 'initializing': 'char \*' differs in levels of indirection from 'int' [G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\SandboxedSystemPrimitives.vcxproj]
"G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\install.vcxproj" (default target) (1) ->
"G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\ALL_BUILD.vcxproj" (default target) (3) ->
"G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\SandboxedSystemPrimitives.vcxproj" (default target) (4) ->
(ClCompile target) ->
g:\wasi\wasmtime\wasmtime-wasi\sandboxed-system-primitives\src\posix.c(16): fatal error C1083: Cannot open include file: 'sys/ioctl.h': No such file or directory [G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\SandboxedSystemPrimitives.vcxproj]
g:\wasi\wasmtime\wasmtime-wasi\sandboxed-system-primitives\src\random.c(15): fatal error C1083: Cannot open include file: 'pthread.h': No such file or directory [G:\wasi\wasmtime\target\release\build\wasmtime-wasi-628aff801f2e5951\out\build\SandboxedSystemPrimitives.vcxproj]
1 Warning(s)
2 Error(s)
The missed header files are only available in Linux. Wasmtime doesn’t yet support Windows according to the feedback from Mozilla’s developer:
Alright, I opted Windows Subsystem for Linux (WSL) as my testing Linux OS.
If you don’t have Cargo installed and try running `cargo’ in the terminal, you will get the prompt:
Command 'cargo' not found, but can be installed with:
sudo apt install cargo
Let’s run the command to see what will happen next.
Once Cargo installed, we can get started to build Wasmtime. However, it’s not as easy as I expected. There’s a new error:
error[E0603]: macro `regex` is private
I checked my cargo version:
cargo -V
It’s 1.31, whereas the latest Cargo version is 1.34. Maybe the error will be fixed by updating the Cargo version. The recommended installation is to use rustup:
curl https://sh.rustup.rs -sSf | sh
Note: it will fail if you have an old version installed:
info: downloading installer
error: it looks like you have an existing installation of Rust at:
error: /usr/bin
error: rustup cannot be installed alongside Rust. Please uninstall first
error: if this is what you want, restart the installation with '-y'
error: cannot install while Rust is installed
Remove Rust and run the installation command again:
sudo apt remove cargo rustc
sudo apt autoremove
curl https://sh.rustup.rs -sSf | sh
It didn’t work. The issue has been submitted to GitHub. The right way is to download the rustup-init.sh and then run:
RUSTUP_INIT_SKIP_PATH_CHECK=yes sh ./rustup-init.sh
After updating Cargo to the latest version, I could successfully build the Wasmtime.
Running Wasm File in Both Command Line Tool and Web Browser
Create a `hello world’ project:
cargo new --bin helloworld
Install Rust nightly and enable WASI support:
rustup toolchain install nightly
rustup target add wasm32-unknown-wasi --toolchain nightly
Build the project:
cargo +nightly build --target wasm32-unknown-wasi
Run the app:
<wasmtime repository root directory>/target/release/wasmtime <hello world project root directory>/target/wasm32-unknown-wasi/debug/helloworld.wasm
We can also run the app in browser polyfill: