diff --git a/Cargo.lock b/Cargo.lock index 557c3bde2..4c6e7f019 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3785,10 +3785,8 @@ dependencies = [ "js-sys", "macro-wasmer-universal-test", "more-asserts", - "nuke-dir", "serde", "serde-wasm-bindgen", - "serde_cbor", "target-lexicon 0.12.4", "tempfile", "thiserror", @@ -3804,7 +3802,6 @@ dependencies = [ "wasmer-vm", "wasmparser 0.83.0", "wat", - "webc", "winapi", ] @@ -4219,6 +4216,7 @@ dependencies = [ name = "wasmer-wasi" version = "3.0.0-rc.1" dependencies = [ + "anyhow", "bincode", "bytes", "cfg-if 1.0.0", @@ -4227,7 +4225,9 @@ dependencies = [ "generational-arena", "getrandom", "libc", + "nuke-dir", "serde", + "serde_cbor", "thiserror", "tracing", "tracing-wasm", @@ -4235,11 +4235,13 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-test", "wasmer", + "wasmer-emscripten", "wasmer-vbus", "wasmer-vfs", "wasmer-vnet", "wasmer-wasi-local-networking", "wasmer-wasi-types", + "webc", "winapi", ] diff --git a/lib/api/Cargo.toml b/lib/api/Cargo.toml index 96341f3d4..499ef9ec3 100644 --- a/lib/api/Cargo.toml +++ b/lib/api/Cargo.toml @@ -30,10 +30,6 @@ bytes = "1" # - Optional shared dependencies. wat = { version = "1.0", optional = true } tracing = { version = "0.1", optional = true } -webc = { version = "3.0.0", optional = true, default-features = false, features = ["std", "mmap"] } -serde_cbor = { version = "0.11.2", optional = true } -nuke-dir = { version = "0.1.0", optional = true } -anyhow = { version = "1.0.66", optional = true } # Dependencies and Development Dependencies for `sys`. [target.'cfg(not(target_arch = "wasm32"))'.dependencies] @@ -47,8 +43,6 @@ target-lexicon = { version = "0.12.2", default-features = false } wasmer-compiler-singlepass = { path = "../compiler-singlepass", version = "=3.0.0-rc.1", optional = true } wasmer-compiler-cranelift = { path = "../compiler-cranelift", version = "=3.0.0-rc.1", optional = true } wasmer-compiler-llvm = { path = "../compiler-llvm", version = "=3.0.0-rc.1", optional = true } -wasmer-emscripten = { path = "../emscripten", version = "=3.0.0-rc.1", optional = true } -wasmer-wasi = { path = "../wasi", version = "=3.0.0-rc.1", optional = true } wasm-bindgen = { version = "0.2.74", optional = true } js-sys = { version = "0.3.51", optional = true } @@ -99,9 +93,6 @@ default = ["sys-default"] # default = ["js-default"] std = [] core = ["hashbrown"] -webc_runner = ["webc", "serde_cbor", "anyhow"] -webc_runner_rt_emscripten = ["wasmer-emscripten"] -webc_runner_rt_wasi = ["wasmer-wasi"] # Features for `sys`. sys = [ diff --git a/lib/api/src/lib.rs b/lib/api/src/lib.rs index 8830e152b..663903104 100644 --- a/lib/api/src/lib.rs +++ b/lib/api/src/lib.rs @@ -437,7 +437,3 @@ mod js; #[cfg(feature = "js")] pub use js::*; - -/// Runners for WASI / Emscripten -#[cfg(feature = "webc_runner")] -pub mod runners; diff --git a/lib/c-api/Cargo.toml b/lib/c-api/Cargo.toml index 739bba4bc..b5556e24d 100644 --- a/lib/c-api/Cargo.toml +++ b/lib/c-api/Cargo.toml @@ -92,7 +92,7 @@ wasmer-artifact-load = ["wasmer-compiler/wasmer-artifact-load"] wasmer-artifact-create = ["wasmer-compiler/wasmer-artifact-create"] static-artifact-load = ["wasmer-compiler/static-artifact-load"] static-artifact-create = ["wasmer-compiler/static-artifact-create"] -webc_runner = ["wasmer-api/webc_runner", "wasmer-vfs", "webc"] +webc_runner = ["wasmer-wasi/webc_runner", "wasmer-vfs", "webc"] # Deprecated features. jit = ["compiler"] diff --git a/lib/c-api/src/wasm_c_api/wasi/mod.rs b/lib/c-api/src/wasm_c_api/wasi/mod.rs index 1da58a700..420d20f1b 100644 --- a/lib/c-api/src/wasm_c_api/wasi/mod.rs +++ b/lib/c-api/src/wasm_c_api/wasi/mod.rs @@ -1144,8 +1144,18 @@ unsafe fn wasi_get_imports_inner( let import_object = c_try!(wasi_env.inner.import_object(&mut store_mut, &module.inner)); + imports_set_buffer(&store, &module.inner, import_object, imports)?; + + Some(()) +} + +pub(crate) fn imports_set_buffer( + store: &StoreRef, + module: &wasmer_api::Module, + import_object: wasmer_api::Imports, + imports: &mut wasm_extern_vec_t, +) -> Option<()> { imports.set_buffer(c_try!(module - .inner .imports() .map(|import_type| { let ext = import_object diff --git a/lib/cli/Cargo.toml b/lib/cli/Cargo.toml index 6e198e267..3678e110b 100644 --- a/lib/cli/Cargo.toml +++ b/lib/cli/Cargo.toml @@ -95,7 +95,7 @@ wast = ["wasmer-wast"] wasi = ["wasmer-wasi"] emscripten = ["wasmer-emscripten"] wat = ["wasmer/wat"] -webc_runner = ["wasmer/webc_runner", "nuke-dir", "webc"] +webc_runner = ["wasi", "wasmer-wasi/webc_runner", "wasmer-wasi/webc_runner_rt_wasi", "wasmer-wasi/webc_runner_rt_emscripten", "nuke-dir", "webc"] compiler = [ "wasmer-compiler/translator", "wasmer-compiler/compiler", diff --git a/lib/cli/src/commands/run.rs b/lib/cli/src/commands/run.rs index 7e032b472..9a7f2adc3 100644 --- a/lib/cli/src/commands/run.rs +++ b/lib/cli/src/commands/run.rs @@ -15,7 +15,7 @@ use wasmer::*; use wasmer_cache::{Cache, FileSystemCache, Hash}; use wasmer_types::Type as ValueType; #[cfg(feature = "webc_runner")] -use wasmer::runners::WapmContainer; +use wasmer_wasi::runners::{WapmContainer, Runner}; use crate::cli::SplitVersion; use clap::Parser; use wasmer_registry::PackageDownloadInfo; @@ -371,7 +371,7 @@ impl Run { return r; } - let mut runner = wasmer::runners::wasi::WasiRunner::default(); + let mut runner = wasmer_wasi::runners::wasi::WasiRunner::default(); runner.set_args(args.to_vec()); result = Some(if id.is_empty() { runner.run(&container).map_err(|e| format!("{e}")) @@ -386,7 +386,7 @@ impl Run { return r; } - let mut runner = wasmer::runners::emscripten::EmscriptenRunner::default(); + let mut runner = wasmer_wasi::runners::emscripten::EmscriptenRunner::default(); runner.set_args(args.to_vec()); result = Some(if id.is_empty() { runner.run(&container).map_err(|e| format!("{e}")) diff --git a/lib/wasi/Cargo.toml b/lib/wasi/Cargo.toml index c8c8220a2..45ba6c9b5 100644 --- a/lib/wasi/Cargo.toml +++ b/lib/wasi/Cargo.toml @@ -28,6 +28,11 @@ bincode = { version = "1.3", optional = true } chrono = { version = "^0.4", default-features = false, features = [ "wasmbind", "std", "clock" ], optional = true } derivative = { version = "^2" } bytes = "1" +webc = { version = "3.0.0", optional = true, default-features = false, features = ["std", "mmap"] } +serde_cbor = { version = "0.11.2", optional = true } +nuke-dir = { version = "0.1.0", optional = true } +anyhow = { version = "1.0.66", optional = true } +wasmer-emscripten = { path = "../emscripten", version = "=3.0.0-rc.1", optional = true } [target.'cfg(unix)'.dependencies] libc = { version = "^0.2", default-features = false } @@ -46,6 +51,10 @@ tracing-wasm = "0.2" default = ["sys-default"] wasix = [] +webc_runner = ["webc", "serde_cbor", "anyhow", "serde", "wasmer/compiler", "wasmer/cranelift"] +webc_runner_rt_emscripten = ["wasmer-emscripten"] +webc_runner_rt_wasi = [] + sys = ["wasmer/sys", "wasix", "wasmer-wasi-types/sys"] sys-default = ["wasmer/wat", "wasmer/compiler", "sys", "logging", "host-fs", "sys-poll", "host-vnet" ] sys-poll = [] diff --git a/lib/wasi/src/lib.rs b/lib/wasi/src/lib.rs index 97a79b0d5..81a77fc7f 100644 --- a/lib/wasi/src/lib.rs +++ b/lib/wasi/src/lib.rs @@ -40,6 +40,10 @@ mod state; mod syscalls; mod utils; +/// Runners for WASI / Emscripten +#[cfg(feature = "webc_runner")] +pub mod runners; + use crate::syscalls::*; pub use crate::state::{ diff --git a/lib/wasi/src/runners/emscripten.rs b/lib/wasi/src/runners/emscripten.rs index b0b66e9d1..b1970b897 100644 --- a/lib/wasi/src/runners/emscripten.rs +++ b/lib/wasi/src/runners/emscripten.rs @@ -3,7 +3,7 @@ use crate::runners::WapmContainer; use anyhow::anyhow; -use serde_derive::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use std::error::Error as StdError; use std::sync::Arc; use wasmer::{Cranelift, FunctionEnv, Instance, Module, Store}; @@ -24,7 +24,7 @@ impl EmscriptenRunner { } } -impl crate::Runner for EmscriptenRunner { +impl crate::runners::Runner for EmscriptenRunner { type Output = (); fn can_run_command(&self, _: &str, command: &Command) -> Result> { @@ -48,7 +48,7 @@ impl crate::Runner for EmscriptenRunner { let mut module = Module::new(&store, atom_bytes)?; module.set_name(&atom_name); - let (mut globals, mut env) = + let (mut globals, env) = prepare_emscripten_env(&mut store, &module, container.webc.clone(), &atom_name)?; exec_module( @@ -82,9 +82,9 @@ fn prepare_emscripten_env( )); } - let mut env = FunctionEnv::new(store, EmEnv::new()); + let env = FunctionEnv::new(store, EmEnv::new()); let emscripten_globals = EmscriptenGlobals::new(store, &env, &module); - let mut emscripten_globals = emscripten_globals.map_err(|e| anyhow!("{}", e))?; + let emscripten_globals = emscripten_globals.map_err(|e| anyhow!("{}", e))?; env.as_mut(store) .set_data(&emscripten_globals.data, Default::default()); diff --git a/lib/wasi/src/runners/wasi.rs b/lib/wasi/src/runners/wasi.rs index d63d519d0..85b61a1c3 100644 --- a/lib/wasi/src/runners/wasi.rs +++ b/lib/wasi/src/runners/wasi.rs @@ -4,11 +4,11 @@ use wasmer_vfs::webc_fs::WebcFileSystem; use crate::runners::WapmContainer; use anyhow::{anyhow, Context}; -use serde_derive::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use std::error::Error as StdError; use std::sync::Arc; use wasmer::{Cranelift, FunctionEnv, Instance, Module, Store}; -use wasmer_wasi::{VirtualFile, WasiFunctionEnv, WasiState}; +use crate::{VirtualFile, WasiFunctionEnv, WasiState}; use webc::{Command, WebCMmap}; #[derive(Debug, Default, Clone, PartialEq, PartialOrd, Hash, Serialize, Deserialize)] @@ -22,7 +22,7 @@ impl WasiRunner { } } -impl crate::Runner for WasiRunner { +impl crate::runners::Runner for WasiRunner { type Output = (); fn can_run_command( @@ -94,7 +94,7 @@ fn prepare_webc_env( pub(crate) fn exec_module( store: &mut Store, module: &Module, - mut wasi_env: wasmer_wasi::WasiFunctionEnv, + wasi_env: crate::WasiFunctionEnv, ) -> Result<(), anyhow::Error> { let import_object = wasi_env.import_object(store, &module)?; let instance = Instance::new(store, &module, &import_object)?;