This commit is contained in:
2026-06-21 23:55:17 -06:00
commit ef5362cc25
13 changed files with 167 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
use flake
+4
View File
@@ -0,0 +1,4 @@
.direnv/
.shake/
*.out
*.wasm
+2
View File
@@ -0,0 +1,2 @@
https://jsdw.me/posts/wasm-components/
+7
View File
@@ -0,0 +1,7 @@
(module
(func $add (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add)
(export "demo:addcomponent/adder@0.1.0#add" (func $add)))
+9
View File
@@ -0,0 +1,9 @@
package demo:addcomponent@0.1.0;
interface adder {
add: func (a: u32, b: u32) -> u32;
}
world example {
export adder;
}
+37
View File
@@ -0,0 +1,37 @@
import Development.Shake
import Development.Shake.Command
import Development.Shake.FilePath
import Development.Shake.Util
main = shakeArgs shakeOptions $ do
-- action $ do
-- sourceFiles <- getDirectoryFiles "" ["//*.luasm"]
-- need $ (-<.> "luac") <$> sourceFiles
want ["complete.component.wasm"]
alternatives $ do
"complete.component.wasm" %> \out -> do
need ["provider.component.wasm","importing.component.wasm"]
cmd_
"wac plug --plug"
"provider.component.wasm" "importing.component.wasm"
"-o" "complete.component.wasm"
"*.component.wasm" %> \out -> do
let wasm = out `replaceExtensions` "wasm"
need [wasm]
cmd_
"wasm-tools component new"
[wasm]
"-o" [out]
"*.wasm" %> \out -> do
let wit = out -<.> "wit"
let wat = out -<.> "wat"
need [wit,wat]
cmd_
"wasm-tools component embed"
[wit] [wat] "-o" [out]
phony "run" $ do
need ["complete.component.wasm"]
cmd_ "wasmtime run --invoke add(1) complete.component.wasm"
phony "clean" $ do
removeFilesAfter ".shake" ["//*"]
liftIO $ removeFiles "." ["*.wasm"]
+12
View File
@@ -0,0 +1,12 @@
(module
(import "demo:importing/provider@0.1.0" "get" (func $get (result i32)))
(func $add (param $other i32) (result i32)
call $get
local.get $other
i32.add)
(func $mul (param $other i32) (result i32)
call $get
local.get $other
i32.mul)
(export "demo:importing/adder@0.1.0#add" (func $add))
(export "demo:importing/adder@0.1.0#mul" (func $mul)))
+15
View File
@@ -0,0 +1,15 @@
package demo:importing@0.1.0;
interface provider {
get: func () -> u32;
}
interface adder {
add: func (other: u32) -> u32;
mul: func (other: u32) -> u32;
}
world example {
import provider;
export adder;
}
+5
View File
@@ -0,0 +1,5 @@
(module
(func $get (result i32)
i32.const 123)
(export "demo:importing/provider@0.1.0#get" (func $get)))
+9
View File
@@ -0,0 +1,9 @@
package demo:importing@0.1.0;
interface provider {
get: func() -> u32;
}
world example {
export provider;
}
Generated
+27
View File
@@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1781607440,
"narHash": "sha256-rxO+uc/KFbSJp+pgyXRuAX6QlG9hJdnt0BXpEQRXY+U=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "3e41b24abd260e8f71dbe2f5737d24122f972158",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}
+25
View File
@@ -0,0 +1,25 @@
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
};
outputs = inputs:
let
system = "x86_64-linux";
pkgs = import inputs.nixpkgs {
inherit system;
};
shake = pkgs.callPackage ./shake-wrapper.nix {};
in {
devShells.${system}.default = pkgs.mkShell {
packages = [
shake
pkgs.wabt
pkgs.nodejs
pkgs.wasmtime
pkgs.wasm-tools
pkgs.wac-cli
];
};
};
}
+14
View File
@@ -0,0 +1,14 @@
{ runCommandLocal, makeWrapper, lib, haskellPackages }:
let
our-ghc = haskellPackages.ghc.withPackages (ps: [
ps.shake
]);
in runCommandLocal
"shake-wrapper"
{ nativeBuildInputs = [ makeWrapper ]; }
''
mkdir -p $out/bin
makeWrapper ${lib.getExe haskellPackages.shake} $out/bin/shake \
--prefix PATH : ${lib.makeBinPath [our-ghc]}
''