README_WASI.md

Building and running Basis Universal under WASI / Wasmtime

This document describes how to build the basisu command-line tool as a WASI (WebAssembly System Interface) executable, and how to run it using Wasmtime.
WASI builds run the encoder inside a secure, portable WebAssembly sandbox with no native dependencies.


1. Install Wasmtime

Install Wasmtime using the official installer:

curl https://wasmtime.dev/install.sh | bash

Verify:

wasmtime --version

2. Install WASI-SDK (WASI toolchain)

Download the latest WASI SDK from:

https://github.com/WebAssembly/wasi-sdk/releases/latest https://github.com/WebAssembly/wasi-sdk/releases

Example (adjust version if needed):

wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-x86_64-linux.tar.gz
tar xf wasi-sdk-29.0-x86_64-linux.tar.gz

3. Set the WASI_SDK_PATH environment variable

You must set the path so CMake can find the WASI compiler:

export WASI_SDK_PATH=/path/to/wasi-sdk-29.0-x86_64-linux

Example:

export WASI_SDK_PATH=$HOME/wasi-sdk-29.0-x86_64-linux

Verify:

$WASI_SDK_PATH/bin/clang --version

4. Configure the WASI build using CMake

WASI builds come in two modes:

  • Single-threaded (default)
  • Multi-threaded (requires wasi-sdk-pthread.cmake and Wasmtime threading flags)

Create a fresh build directory and configure using the WASI toolchain file:

mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=$WASI_SDK_PATH/share/cmake/wasi-sdk-pthread.cmake -DCMAKE_BUILD_TYPE=Release -DBASISU_WASM_THREADING=ON

Or for a single threaded build (will run much slower):

cmake .. -DCMAKE_TOOLCHAIN_FILE=$WASI_SDK_PATH/share/cmake/wasi-sdk.cmake -DCMAKE_BUILD_TYPE=Release -DBASISU_WASM_THREADING=OFF

5. Build the WASI .wasm executable

Build using:

make

This produces:

bin/basisu.wasm
bin/examples.wasm    (if EXAMPLES=ON)

6. Running basisu.wasm with Wasmtime

WASI programs are sandboxed and cannot access your filesystem unless you explicitly grant permission.

Use one or more --dir= arguments to allow input/output files.

Run internal test suite for ETC1S

bin$ wasmtime run --wasm threads=yes --wasi threads=yes --dir=. --dir=.. --dir=../test_files basisu.wasm -test

Use backslashes under Windows: “wasmtime run --wasm threads=yes --wasi threads=yes --dir=. --dir=.. --dir=..\test_files basisu.wasm -test”

For the single threaded wasm executables, “--wasm threads=yes --wasi threads=yes” isn't needed.

A Windows .cmd batch script example:

wasmtime --dir=. --dir=.. --dir=..\test_files --dir=d:/dev/test_images::/test_images --dir=d:/dev/test_images/bik::/bik basisu.wasm %*

A shell script example:

#!/usr/bin/env bash
wasmtime run --dir=. --dir=../test_files --dir=/mnt/d/dev/test_images::/test_images --dir=/mnt/d/dev/test_images/bik::/test_images/bik --wasm threads=yes --wasi threads=yes ./basisu.wasm "$@"

Example: run compression on a PNG to ETC1S

wasmtime run --wasm threads=yes --wasi threads=yes --dir=. basisu.wasm xmen.png -stats

Example: transcode a KTX2 file to .ktx/.png/etc.

wasmtime run --wasm threads=yes --wasi threads=yes --dir=. basisu.wasm xmen.ktx2


Notes

  • WASI builds run inside a secure sandbox with no filesystem access unless explicitly granted via --dir=.
  • The CMake configuration sets a larger stack size to support ASTC/UASTC compression.
  • WASI SDK and Wasmtime can be installed anywhere; just update WASI_SDK_PATH.

Summary

To build and run BasisU under WASI:

  1. Install Wasmtime
  2. Install WASI SDK
  3. Set WASI_SDK_PATH
  4. Run cmake using the WASI toolchain in “build” directory
  5. Build with make
  6. Run using wasmtime with --dir= permissions on .wasm executables in “bin” directory

This produces a safe, portable, sandboxed version of the Basis Universal encoder that runs anywhere.