parent
7596c89a29
commit
472e581064
1 changed files with 73 additions and 2 deletions
@ -1,6 +1,77 @@ |
|||||||
# wasmslime |
# wasmslime |
||||||
|
|
||||||
.. is a library providing [Wasmtime] bindings for use with the [Zig] language. |
.. is a library providing [Wasmtime] bindings for use with the [Zig] language. This is my first project I've tackled with Zig, as I wanted to play around with WebAssembly for sandboxing reasons, and the libraries I have found are both outdated and incomplete. Though they did provide some starting help. |
||||||
|
|
||||||
|
Of course, this library too is likely very much incomplete, maybe even broken. I just wanted to share it as I'm quite proud and perhaps someone else finds some use in it. Feel free to yoink anything from `wasmslime` as you see fit. |
||||||
|
|
||||||
|
## Example |
||||||
|
|
||||||
|
```zig |
||||||
|
const wat_bytes = |
||||||
|
\\(module |
||||||
|
\\ (func $hello (import "env" "print_hello")) |
||||||
|
\\ (func (export "main") (call $hello))) |
||||||
|
; |
||||||
|
|
||||||
|
fn print_hello() void { |
||||||
|
const stdout = @import("std").io.getStdOut().writer(); |
||||||
|
stdout.print("Hello, Slime!\n", .{}) catch unreachable; |
||||||
|
} |
||||||
|
|
||||||
|
pub fn main() !void { |
||||||
|
const wasm = @import("wasmslime"); |
||||||
|
// Should deinit Wasm objects. Omitted for brevity. |
||||||
|
var engine = try wasm.Engine.initDefault(); |
||||||
|
var module = try wasm.Module.initFromWat(engine, wat_bytes, null); |
||||||
|
var linker = wasm.Linker.init(engine); |
||||||
|
try linker.defineFuncFromFn("env", "print_hello", print_hello, null); |
||||||
|
var store = wasm.Store.init(engine); |
||||||
|
var context = store.getContext(); |
||||||
|
var instance = try linker.instantiate(context, module, null); |
||||||
|
const run_func = try instance.getFunc(context, "main"); |
||||||
|
try run_func.call(context, .{}, void, null); |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
## Setup as Dependency |
||||||
|
|
||||||
|
Currently requires [Wasmtime] to be installed as a system library. Unsure about the possibility of statically linking it instead, and the up- and downsides that come with that. I may look into this in the future. |
||||||
|
|
||||||
|
`wasmslime` uses Zig version `0.11` and thus makes use of its new [Package Management] feature. Since this is a pretty new feature that currently isn't documented beyond what's shared in the release notes, I'll give a brief overview of how to add it as a dependency to your project. |
||||||
|
|
||||||
|
### `build.zig.zon` |
||||||
|
|
||||||
|
```zig |
||||||
|
.{ |
||||||
|
.name = "my_amazing_project", |
||||||
|
.version = "0.1.0", |
||||||
|
.dependencies = .{ |
||||||
|
.wasmslime = .{ |
||||||
|
.url = "https://git.mcft.net/copygirl/wasmslime/archive/main.tar.gz", |
||||||
|
.hash = "00000000000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
Providing an invalid hash will make the build system complain about what it should actually be. Keep in mind the string needs to be the correct length, however. This way I don't have to update the README each commit. |
||||||
|
|
||||||
|
Downloaded packages end up in `~/.cache/zig/`. If the hash already matches an existing package here, it will be used regardless of the source URL. If you run into issues, you could consider clearing Zig's cache folder. |
||||||
|
|
||||||
|
### `build.zig` |
||||||
|
|
||||||
|
```zig |
||||||
|
... |
||||||
|
const exe = b.addExecutable(...); |
||||||
|
|
||||||
|
const wasmslime = b.dependency("wasmslime", .{ .target = target, .optimize = optimize }); |
||||||
|
exe.addModule("wasmslime", wasmslime.module("wasmslime")); |
||||||
|
exe.linkLibrary(wasmslime.artifact("wasmslime")); |
||||||
|
|
||||||
|
b.installArtifact(exe); |
||||||
|
... |
||||||
|
``` |
||||||
|
|
||||||
[Wasmtime]: https://wasmtime.dev/ |
[Wasmtime]: https://wasmtime.dev/ |
||||||
[Zig]: ziglang.org/ |
[Zig]: https://ziglang.org/ |
||||||
|
[Package Management]: https://ziglang.org/download/0.11.0/release-notes.html#Package-Management |
||||||
|
Loading…
Reference in new issue