| 3 | use wasmtime::{Config, Engine, Result, Strategy}; |
| 4 | |
| 5 | fn main() -> Result<()> { |
| 6 | // Configure Wasmtime for compiling Wasm programs to x86_64 with the |
| 7 | // Cranelift compiler. |
| 8 | let mut config = Config::new(); |
| 9 | config.strategy(Strategy::Cranelift); |
| 10 | if let Err(error) = config.target("x86_64") { |
| 11 | eprintln!( |
| 12 | "this Wasmtime was not built with the x86_64 Cranelift backend \ |
| 13 | enabled: {error:?}", |
| 14 | ); |
| 15 | return Ok(()); |
| 16 | } |
| 17 | |
| 18 | // Create an `Engine` with that configuration. |
| 19 | let engine = match Engine::new(&config) { |
| 20 | Ok(engine) => engine, |
| 21 | Err(error) => { |
| 22 | println!("Wasmtime build is incompatible with config: {error:?}"); |
| 23 | return Ok(()); |
| 24 | } |
| 25 | }; |
| 26 | |
| 27 | // Pre-compile a Wasm program. |
| 28 | // |
| 29 | // Note that passing the Wasm text format, like we are doing here, is only |
| 30 | // supported when the `wat` cargo feature is enabled. |
| 31 | let precompiled = engine.precompile_module( |
| 32 | r#" |
| 33 | (module |
| 34 | (func (export "add") (param i32 i32) (result i32) |
| 35 | (i32.add (local.get 0) (local.get 1)) |
| 36 | ) |
| 37 | ) |
| 38 | "# |
| 39 | .as_bytes(), |
| 40 | )?; |
| 41 | |
| 42 | // Write the pre-compiled program to a file. |
| 43 | // |
| 44 | // Note that the `.cwasm` extension is conventional for these files, and is |
| 45 | // what the Wasmtime CLI will use by default, for example. |
| 46 | std::fs::write("add.cwasm", &precompiled)?; |
| 47 | |
| 48 | // And we are done -- now a different Wasmtime embedding can load and run |
| 49 | // the pre-compiled Wasm program from that `add.cwasm` file! |
| 50 | Ok(()) |
| 51 | } |