more wasm
This commit is contained in:
parent
9d67af9901
commit
9ac87f93e9
5 changed files with 72 additions and 0 deletions
13
Makefile
Normal file
13
Makefile
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
all: out/numbersquare.wasm out/ghc_wasm_jsffi.js
|
||||||
|
|
||||||
|
out/numbersquare.wasm: app/* src/* numbersquare.cabal
|
||||||
|
wasm32-wasi-cabal build
|
||||||
|
wasm32-wasi-cabal install --installdir=out --overwrite-policy=always
|
||||||
|
|
||||||
|
out/ghc_wasm_jsffi.js: out/numbersquare.wasm
|
||||||
|
$(shell wasm32-wasi-ghc --print-libdir)/post-link.mjs -i out/numbersquare.wasm -o out/ghc_wasm_jsffi.js
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf dist-newstyle out/numbersquare.wasm out/ghc_wasm_jsffi.js
|
||||||
12
out/index.html
Normal file
12
out/index.html
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>WASM test</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<script src="./index.js" type="module"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
28
out/index.js
Normal file
28
out/index.js
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
import { WASI, OpenFile, File, ConsoleStdout } from "https://cdn.jsdelivr.net/npm/@bjorn3/browser_wasi_shim@0.3.0/dist/index.js";
|
||||||
|
import ghc_wasm_jsffi from "./ghc_wasm_jsffi.js"
|
||||||
|
|
||||||
|
const args = [];
|
||||||
|
const env = ["GHCRTS=-H64m"];
|
||||||
|
const fds = [
|
||||||
|
new OpenFile(new File([])), // stdin
|
||||||
|
ConsoleStdout.lineBuffered((msg) => console.log(`[WASI stdout] ''${msg}`)),
|
||||||
|
ConsoleStdout.lineBuffered((msg) => console.warn(`[WASI stderr] ''${msg}`)),
|
||||||
|
];
|
||||||
|
const options = { debug: false };
|
||||||
|
const wasi = new WASI(args, env, fds, options);
|
||||||
|
|
||||||
|
let __exports = {};
|
||||||
|
|
||||||
|
const { instance } = await WebAssembly.instantiateStreaming(
|
||||||
|
fetch("numbersquare.wasm"),
|
||||||
|
{
|
||||||
|
ghc_wasm_jsffi: ghc_wasm_jsffi(__exports),
|
||||||
|
wasi_snapshot_preview1: wasi.wasiImport,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
Object.assign(__exports, instance.exports);
|
||||||
|
|
||||||
|
wasi.initialize(instance);
|
||||||
|
console.log(instance)
|
||||||
|
await instance.exports.hs_start(globalThis.example);
|
||||||
|
|
@ -41,6 +41,14 @@ executable:
|
||||||
source-dirs:
|
source-dirs:
|
||||||
- app
|
- app
|
||||||
main: Main.hs
|
main: Main.hs
|
||||||
|
when:
|
||||||
|
- condition: arch(wasm32)
|
||||||
|
ghc-options:
|
||||||
|
-no-hs-main
|
||||||
|
-optl-mexec-model=reactor
|
||||||
|
"-optl-Wl,--export=hs_start"
|
||||||
|
cpp-options:
|
||||||
|
-DWASM
|
||||||
|
|
||||||
tests:
|
tests:
|
||||||
numberspec-test:
|
numberspec-test:
|
||||||
|
|
|
||||||
11
shell.nix
11
shell.nix
|
|
@ -5,6 +5,9 @@
|
||||||
watchexec,
|
watchexec,
|
||||||
wasm32-wasi-cabal,
|
wasm32-wasi-cabal,
|
||||||
wasm32-wasi-ghc,
|
wasm32-wasi-ghc,
|
||||||
|
writeShellApplication,
|
||||||
|
nodejs,
|
||||||
|
python3,
|
||||||
}:
|
}:
|
||||||
haskellPackages.developPackage {
|
haskellPackages.developPackage {
|
||||||
name = "numbersquare";
|
name = "numbersquare";
|
||||||
|
|
@ -18,6 +21,14 @@ haskellPackages.developPackage {
|
||||||
watchexec
|
watchexec
|
||||||
wasm32-wasi-cabal
|
wasm32-wasi-cabal
|
||||||
wasm32-wasi-ghc
|
wasm32-wasi-ghc
|
||||||
|
nodejs
|
||||||
|
(writeShellApplication {
|
||||||
|
name = "dev-server";
|
||||||
|
text = ''
|
||||||
|
python -m http.server -d ./out
|
||||||
|
'';
|
||||||
|
runtimeInputs = [ python3 ];
|
||||||
|
})
|
||||||
]
|
]
|
||||||
++ (with haskellPackages; [
|
++ (with haskellPackages; [
|
||||||
fourmolu
|
fourmolu
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue