1 //! Pre-compiling a Wasm program. 2 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 } 52