Skip to content

Instantly share code, notes, and snippets.

@nobbele
Forked from tgolsson/wasm-bindgen-macroquad.sh
Last active October 8, 2023 22:40
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save nobbele/0d932a993786ed081632254fb6b01e25 to your computer and use it in GitHub Desktop.
Save nobbele/0d932a993786ed081632254fb6b01e25 to your computer and use it in GitHub Desktop.
Compatibility shim for combining macroquad with wasm-bindgen.
#!/usr/bin/env bash
set -e
HELP_STRING=$(cat <<- END
usage: build_wasm.sh
Build script for combining a Macroquad project with wasm-bindgen,
allowing integration with the greater wasm-ecosystem.
example: ./build_wasm.sh
This'll go through the following steps:
1. Build as target 'wasm32-unknown-unknown'.
2. Create the directory 'dist' if it doesn't already exist.
3. Run wasm-bindgen with output into the 'dist' directory.
4. Apply patches to the output js file (detailed here: https://github.com/not-fl3/macroquad/issues/212#issuecomment-835276147).
5. Generate coresponding 'index.html' file.
Author: Tom Solberg <me@sbg.dev>
Edit: Nik codes <nik.code.things@gmail.com>
Edit: Nobbele <realnobbele@gmail.com>
Version: 0.2
END
)
die () {
echo >&2 "Error: $@"
echo >&2
echo >&2 "$HELP_STRING"
exit 1
}
# Parse primary commands
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
--release)
RELEASE=yes
shift
;;
-h|--help)
echo "$HELP_STRING"
exit 0
;;
*)
POSITIONAL+=("$1")
shift
;;
esac
done
# Restore positionals
set -- "${POSITIONAL[@]}"
PROJECT_NAME="default-project-name"
HTML=$(cat <<- END
<html lang="en">
<head>
<meta charset="utf-8">
<title>${PROJECT_NAME}</title>
<style>
html,
body,
canvas {
margin: 0px;
padding: 0px;
width: 100%;
height: 100%;
overflow: hidden;
position: absolute;
z-index: 0;
}
</style>
</head>
<body style="margin: 0; padding: 0; height: 100vh; width: 100vw;">
<canvas id="glcanvas" tabindex='1' hidden></canvas>
<script src="https://not-fl3.github.io/miniquad-samples/mq_js_bundle.js"></script>
<script type="module">
import init, { set_wasm } from "./${PROJECT_NAME}.js";
async function impl_run() {
let wbg = await init();
miniquad_add_plugin({
register_plugin: (a) => (a.wbg = wbg),
on_init: () => set_wasm(wasm_exports),
version: "0.0.1",
name: "wbg",
});
load("./${PROJECT_NAME}_bg.wasm");
}
window.run = function() {
document.getElementById("run-container").remove();
document.getElementById("glcanvas").removeAttribute("hidden");
document.getElementById("glcanvas").focus();
impl_run();
}
</script>
<div id="run-container" style="display: flex; justify-content: center; align-items: center; height: 100%; flex-direction: column;">
<p>Game can't play audio unless a button has been clicked.</p>
<button onclick="run()">Run Game</button>
</div>
</body>
</html>
END
)
# Build
cargo build --target wasm32-unknown-unknown
# Generate bindgen outputs
mkdir -p dist
wasm-bindgen target/wasm32-unknown-unknown/debug/$PROJECT_NAME.wasm --out-dir dist --target web --no-typescript
# Shim to tie the thing together
sed -i "s/import \* as __wbg_star0 from 'env';//" dist/$PROJECT_NAME.js
sed -i "s/let wasm;/let wasm; export const set_wasm = (w) => wasm = w;/" dist/$PROJECT_NAME.js
sed -i "s/imports\['env'\] = __wbg_star0;/return imports.wbg\;/" dist/$PROJECT_NAME.js
sed -i "s/const imports = getImports();/return getImports();/" dist/$PROJECT_NAME.js
# Create index from the HTML variable
echo "$HTML" > dist/index.html
@profan
Copy link

profan commented Oct 8, 2023

this seems like it might potentially be wrecked again (new wasm-bindgen changes perhaps?), getting some interesting errors like this:
TypeError: import object field 'wbg' is not an Object
(with macroquad 0.4.4, maybe i should just try using an older version)

i'll dig a little and see if i can figure it out 👁️

right, that particular issue seems to be related to me trying to use ewebsock together with this and macroquad, and if i remove that i end up with... TypeError: import object field 'env' is not an Object instead!

.. figured it out, getImports has become __wbg_get_imports (made a fork with the change)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment