Hi all, is there an instruction for building wasmtime for Android and iOS ?
Wasmtime hasn't been tested on these platforms and likely won't compile there today. The porting work necessary to get this working, though, is likely pretty small!
Thanks !! In free time I will try to port it ...
Seems like there are only some modules not compiled:
error: failed to run custom build command for backtrace-sys v0.1.36
Caused by:
process didn't exit successfully: G:\Projects\Programing\wasmtime\target\release\build\backtrace-sys-f5d9903e1591a6a7\build-script-build
(exit code: 1)
--- stdout
OPT_LEVEL = Some("3")
TARGET = Some("i686-linux-android")
HOST = Some("x86_64-pc-windows-msvc")
CC_i686-linux-android = None
CC_i686_linux_android = None
TARGET_CC = None
CC = None
CFLAGS_i686-linux-android = None
CFLAGS_i686_linux_android = None
TARGET_CFLAGS = None
CFLAGS = None
CRATE_CC_NO_DEFAULTS = None
DEBUG = Some("false")
running: "i686-linux-android-clang" "-O3" "-ffunction-sections" "-fdata-sections" "-fPIC" "--target=i686-linux-android" "-Wall" "-Wextra" "-E" "src/android-api.c"
--- stderr
error occurred: Failed to find tool. Is i686-linux-android-clang
installed? (see https://github.com/alexcrichton/cc-rs#compile-time-requirements for help)
warning: build failed, waiting for other jobs to finish...
error: failed to run custom build command for wasmtime-runtime v0.16.0 (G:\Projects\Programing\wasmtime\crates\runtime)
Caused by:
process didn't exit successfully: G:\Projects\Programing\wasmtime\target\release\build\wasmtime-runtime-9ffa91a42426fedc\build-script-build
(exit code: 1)
--- stdout
cargo:rerun-if-changed=src/helpers.c
TARGET = Some("i686-linux-android")
OPT_LEVEL = Some("3")
HOST = Some("x86_64-pc-windows-msvc")
CC_i686-linux-android = None
CC_i686_linux_android = None
TARGET_CC = None
CC = None
CFLAGS_i686-linux-android = None
CFLAGS_i686_linux_android = None
TARGET_CFLAGS = None
CFLAGS = None
CRATE_CC_NO_DEFAULTS = None
DEBUG = Some("false")
running: "i686-linux-android-clang" "-O3" "-ffunction-sections" "-fdata-sections" "-fPIC" "--target=i686-linux-android" "-Wall" "-Wextra" "-o" "G:\\Projects\\Programing\\wasmtime\\target\\i686-linux-android\\release\\build\\wasmtime-runtime-5cf986442753146a\\out\\src/helpers.o" "-c" "src/helpers.c"
--- stderr
error occurred: Failed to find tool. Is i686-linux-android-clang
installed? (see https://github.com/alexcrichton/cc-rs#compile-time-requirements for help)
warning: build failed, waiting for other jobs to finish...
error: failed to run custom build command for zstd-sys v1.4.15+zstd.1.4.4
Caused by:
process didn't exit successfully: G:\Projects\Programing\wasmtime\target\release\build\zstd-sys-1eeff73c0cda7a4c\build-script-build
(exit code: 1)
--- stdout
TARGET = Some("i686-linux-android")
HOST = Some("x86_64-pc-windows-msvc")
CC_i686-linux-android = None
CC_i686_linux_android = None
TARGET_CC = None
CC = None
CFLAGS_i686-linux-android = None
CFLAGS_i686_linux_android = None
TARGET_CFLAGS = None
CFLAGS = None
CRATE_CC_NO_DEFAULTS = None
DEBUG = Some("false")
running: "i686-linux-android-clang" "-O3" "-ffunction-sections" "-fdata-sections" "-fPIC" "--target=i686-linux-android" "-I" "zstd/lib/" "-I" "zstd/lib/common" "-I" "zstd/lib/legacy" "-fvisibility=hidden" "-DZSTD_LIB_DEPRECATED=0" "-DZSTDLIB_VISIBILITY=" "-DZDICTLIB_VISIBILITY=" "-DZSTDERRORLIB_VISIBILITY=" "-DZSTD_LEGACY_SUPPORT=1" "-o" "G:\\Projects\\Programing\\wasmtime\\target\\i686-linux-android\\release\\build\\zstd-sys-f793a83e8009b4cf\\out\\zstd\\lib\\common\\debug.o" "-c" "zstd\\lib\\common\\debug.c"
running: "i686-linux-android-clang" "-O3" "-ffunction-sections" "-fdata-sections" "-fPIC" "--target=i686-linux-android" "-I" "zstd/lib/" "-I" "zstd/lib/common" "-I" "zstd/lib/legacy" "-fvisibility=hidden" "-DZSTD_LIB_DEPRECATED=0" "-DZSTDLIB_VISIBILITY=" "-DZDICTLIB_VISIBILITY=" "-DZSTDERRORLIB_VISIBILITY=" "-DZSTD_LEGACY_SUPPORT=1" "-o" "G:\\Projects\\Programing\\wasmtime\\target\\i686-linux-android\\release\\build\\zstd-sys-f793a83e8009b4cf\\out\\zstd\\lib\\common\\entropy_common.o" "-c" "zstd\\lib\\common\\entropy_common.c"
--- stderr
error occurred: Failed to find tool. Is i686-linux-android-clang
installed? (see https://github.com/alexcrichton/cc-rs#compile-time-requirements for help)
warning: build failed, waiting for other jobs to finish...
error: build failed
For a project that I'm working on, we are considering switching to wasmtime for our WebAssembly runtime. If I understand correctly, wasmtime currently only supports the x86_64 architecture. For the project that I'm working on, we would love to see support for Android and AArch64 in general. The wasmtime guide, section "Platform Support - JIT compiler support", states "Support for ARM, AArch64, and x86 is planned at this time". I've done some research myself but couldn't find any more info regarding those architectures. Could I have an update on the jit compiler progress for those architectures, if any.
Aarch64 support works pretty well now
(I don't know about support on Android though)
@Max de Danschutter as Joey says, aarch64 is coming along nicely, and our plan ("we" being the SpiderMonkey/Wasm team at Mozilla) is to use this as our optimizing backend for Wasm in Firefox/aarch64 -- so we're aiming for production quality
That's great to hear, especially the production quality! Could I also ask what WebAssembly features aarch64 support currently and what is still missing in general? This would greatly help us out making the decision of moving to wasmtime!
We currently have support for everything in the wasm MVP + some lightweight shipped features (bulk memory ops, etc.), and multi-value. Ongoing work is happening for reference types, SIMD and atomics. Ref types are pretty much done, they require more thorough testing + reviews, etc. SIMD and atomics have started relatively recently, in comparison.
That is quite a lot already. It is indeed coming along nicely. Thanks for the help everyone this should be enough information!
@Max de Danschutter the plan is to get to feature parity for Aarch64 quickly, and then keep it that way. We'll eventually expand that, but for now it'd be safe to view x86_64 and Aarch64 as the two platforms with the highest level of support.
A note on Android: we don't currently run CI tests on Android, or produce builds, but we know anecdotally that Wasmtime works on Android. We'd love to hear about issues and work together on fixing them if you run into any, though!
When we switch to wasmtime there will be issues reported for sure as we intend to run it on as many platforms as possible. However, we will gladly help out as well!
Sounds great — don't hesitate to reach out!
Might be a bit off-topic but I've started my work on converting Wasmer to Wasmtime. In Wasmer, the context of the currently running WebAssemly instance, which is implicitly passed to every WebAssembly function, can have user-supplied contextual data. This is a feature we use quite a lot and I couldn't find a good alternative in Wasmtime. Since I'm no expert at Wasmtime 'yet' could someone tell me what a good alternative is in Wasmtime.
@Alex Crichton can you weigh in on how best to do this? ^
@Max de Danschutter could you describe a bit how it's used for you? Is this something like data associated with callbacks?
@Alex Crichton We have a ModuleContext struct, which is the host state associated with a particular module instance. We use this to map calls from modules into appropriate host side calls and to interact with memory exposed by the instance. If a more detailed explanation is needed let me know!
ah ok, so you're mainly implementing host functions that interpret arguments as pointers into wasm memory?
maybe it is something like wasm_func_new_with_env
/wasm_func_callback_with_env_t
?
@Max de Danschutter if you mainly want to get the memory, there's direct support for that, too. See the third example here: https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Func.html#examples-1
err, the fourth example
Besides accessing wasm memory in host functions we also update our host state that is associated with that particular module instance.
Ah ok, so accessing memory is easily done through Caller
which can access the memory of the caller so long as it's exported. Otherwise there's no native equivalent to this in Wasmtime, but you can create a Func
-per-instance (it should be very cheap with Func::wrap
)
with a Func
-per-instance you can then close over instance-specific state to update it, would that work for your use case?
I could easily see quite a few use cases needing to associate data with an instance, so I wonder if we should add support for that? Instances are heavy enough that adding an additional pointer-sized members should not matter at all, I'd hope
Oh for sure yeah, but callbacks, for example, don't have access to their Instance
we can certainly add the APIs but I'm not sure if it'd solve the use case here
yes, that's what wasm_func_new_with_env
for, and Rust API can do it via closure
Alex Crichton said:
Oh for sure yeah, but callbacks, for example, don't have access to their
Instance
Ah, I see—good point! In that case closures are probably needed, yes. And certainly better than adding overhead to all callbacks
Ah, capturing my ModuleContext
could work but then how should I access that within an import?
@Max de Danschutter the thinking is that you'd make a Func
-per-import, and each Func
is a Rust closure which can close over outer state
Ah, of course, now I see. Quite new to Rust so closures sometimes confuse me a bit :sweat_smile:
That looks like the most straight forward way to do it in wasmtime so I'll try that out!
Last updated: Dec 23 2024 at 12:05 UTC