CLI Options for wasmtime
The wasmtime
CLI is organized into a few subcommands. If no subcommand is provided it'll assume run
, which is to execute a wasm file. The subcommands supported by wasmtime
are:
help
This is a general subcommand used to print help information to the terminal. You can execute any number of the following:
When in doubt, try running the help
command to learn more about functionality!
run
This is the wasmtime
CLI's main subcommand, and it's also the default if no other subcommand is provided. The run
command will execute a WebAssembly module. This means that the module will be compiled to native code, instantiated, and then optionally have an export executed.
The wasmtime
CLI will automatically hook up any WASI-related imported functionality, but at this time, if your module imports anything else, it will fail instantiation.
The run
command takes one positional argument, which is the name of the module to run:
Note that the wasmtime
CLI can take both a binary WebAssembly file (*.wasm
) as well as the text format for WebAssembly (*.wat
):
Running WebAssembly CLI programs
WebAssembly modules or components can behave like a CLI program which means they're intended to look like a normal OS executable with a main
function and run once to completion. This is the default mode of running a wasm provided to Wasmtime.
For core WebAssembly modules this means that the function exported as an empty string, or the _start
export, is invoked. For WebAssembly components this means that the wasi:cli/run
interface is executed.
For both core modules and components, CLI arguments are passed via WASI. Core modules receive arguments via WASIp1 APIs and components receive arguments via WASIp2 or later APIs. Arguments, flags, etc., are passed to the WebAssembly file after the file itself. For example,
Will pass ["foo.wasm", "--bar", "baz"]
as the list of arguments to the module. Note that flags for Wasmtime must be passed before the WebAssembly file, not afterwards. For example,
Will pass --dir .
to the foo.wasm
program, not Wasmtime. If you want to mount the current directory you instead need to invoke
All Wasmtime options must come before the WebAssembly file provided. All arguments afterwards are passed to the WebAssembly file itself.
Running Custom Module exports
If you're not running a "command" but want to run a specific export of a WebAssembly core module you can use the --invoke
argument:
This will invoke the initialize
export of the foo.wasm
module.
When invoking a WebAssembly function arguments to the function itself are parsed from CLI arguments. For example an i32
argument to a WebAssembly module is parsed as a CLI argument for the module:
Note though that this syntax is unstable at this time and may change in the future. If you'd like to rely on this please open an issue, otherwise we request that you please don't rely on the exact output here.
Running Custom Component exports
Like core modules Wasmtime supports invoking arbitrary component exports. Components can export typed interfaces defined by the component model. The --invoke
argument is supported to skip calling wasi:cli/run
and invoke a specific typed export instead. Arguments are passed with WAVE ,a human-oriented text encoding of Wasm Component Model values. For example:
You will notice that (when using WAVE) the exported function's name and exported function's parentheses are both enclosed in one set of single quotes, i.e. 'initialize()'
. This treats the exported function as a single argument in a Unix shell and prevents issues with shell interpretation and signifies function invocation (as apposed to the function name just being referenced). Using WAVE (when calling exported functions of Wasm components) helps to distinguish function calls from other kinds of string arguments. Below are some more examples:
If your function takes a string argument, you surround the string argument in double quotes:
And each individual argument within the parentheses is separated by a comma:
Please note: If you enclose your whole function call using double quotes, your string argument will require its double quotes to be escaped (escaping quotes is more complicated and harder to read and therefore not ideal). For example:
serve
The serve
subcommand runs a WebAssembly component in the wasi:http/proxy
world via the WASI HTTP API, which is available since Wasmtime 18.0.0. The goal of this world is to support sending and receiving HTTP requests.
The serve
command takes one positional argument which is the name of the component to run:
Furthermore, an address can be specified via:
At the time of writing, the wasi:http/proxy
world is still experimental and requires setup of some wit
dependencies. For more information, see the hello-wasi-http example.
wast
The wast
command executes a *.wast
file which is the test format for the official WebAssembly spec test suite. This subcommand will execute the script file which has a number of directives supported to instantiate modules, link tests, etc.
Executing this looks like:
config
This subcommand is used to control and edit local Wasmtime configuration settings. The primary purpose of this currently is to configure how Wasmtime's code caching works. You can create a new configuration file for you to edit with:
And that'll print out the path to the file you can edit.
compile
This subcommand is used to Ahead-Of-Time (AOT) compile a WebAssembly module to produce a "compiled wasm" (.cwasm) file.
The wasmtime run
subcommand can then be used to run a AOT-compiled WebAssembly module:
AOT-compiled modules can be run from hosts that are compatible with the target environment of the AOT-completed module.
settings
This subcommand is used to print the available Cranelift settings for a given target.
When run without options, it will print the settings for the host target and also display what Cranelift settings are inferred for the host:
explore
This subcommand can be used to explore a *.cwasm
file and see how it connects to the original wasm file in a web browser. This will compile an input wasm file and emit an HTML file that can be opened in a web browser:
The output HTML file can be used to compare what WebAssembly instruction compiles to what native instruction. Compilation options can be passed to wasmtime explore
to see the effect of compilation options on generated code.
objdump
Primarily intended as a debugging utility the objdump
subcommand can be used to explore a *.cwasm
file locally on your terminal. This is roughly modeled after native objdump
binaries themselves:
You can also pass various options to configure and annotate the output:
Additional options
Many of the above subcommands also take additional options. For example,
run
serve
compile
explore
wast
are all subcommands which can take additional CLI options of the format
For example, adding --optimize opt-level=0
to a wasmtime compile
subcommand will turn off most optimizations for the generated code.
CLI options using TOML file
Most key-value options that can be provided using the --optimize
, --codegen
, --debug
, --wasm
, and --wasi
flags can also be provided using a TOML file using the --config <FILE>
cli flag, by putting the key-value inside a TOML table with the same name.
For example, with a TOML file like this
the command
would be the same as
assuming the TOML file is called config.toml
. Of course you can put as many key-value pairs as you want in the TOML file.
Options on the CLI take precedent over options specified in a configuration file, meaning they're allowed to shadow configuration values in a TOML configuration file.