diff --git a/crates/wasm/build.sh b/crates/wasm/build.sh index 900c1868c08..22814b74936 100755 --- a/crates/wasm/build.sh +++ b/crates/wasm/build.sh @@ -6,6 +6,21 @@ function require_command { exit 1 fi } +function check_installed { + if ! command -v "$1" >/dev/null 2>&1; then + echo "$1 is not installed. Please install it." >&2 + return 1 + fi + return 0 +} +function run_or_fail { + "$@" + local status=$? + if [ $status -ne 0 ]; then + echo "Command '$*' failed with exit code $status" >&2 + exit $status + fi +} require_command toml2json require_command jq @@ -13,10 +28,21 @@ require_command cargo require_command wasm-bindgen require_command wasm-opt -export pname=$(toml2json < Cargo.toml | jq -r .package.name) +self_path=$(dirname "$(readlink -f "$0")") +export pname=$(toml2json < ${self_path}/Cargo.toml | jq -r .package.name) +export CARGO_TARGET_DIR=$self_path/target + +rm -rf $self_path/outputs >/dev/null 2>&1 +rm -rf $self_path/result >/dev/null 2>&1 + +if [ -v out ]; then + echo "Will install package to $out (defined outside installPhase.sh script)" +else + out="$self_path/outputs/out" + echo "Will install package to $out" +fi -./preBuild.sh -cargo build --lib --release --package noir_wasm --target wasm32-unknown-unknown -./postBuild.sh -./installPhase.sh +run_or_fail ${self_path}/buildPhaseCargoCommand.sh +run_or_fail ${self_path}/installPhase.sh +ln -s $out $self_path/result diff --git a/crates/wasm/buildPhaseCargoCommand.sh b/crates/wasm/buildPhaseCargoCommand.sh new file mode 100755 index 00000000000..5fff9eff808 --- /dev/null +++ b/crates/wasm/buildPhaseCargoCommand.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +function run_or_fail { + "$@" + local status=$? + if [ $status -ne 0 ]; then + echo "Command '$*' failed with exit code $status" >&2 + exit $status + fi +} +function run_if_available { + if command -v "$1" >/dev/null 2>&1; then + "$@" + else + echo "$1 is not installed. Please install it to use this feature." >&2 + fi +} + +export self_path=$(dirname "$(readlink -f "$0")") + +# Clear out the existing build artifacts as these aren't automatically removed by wasm-pack. +if [ -d ${self_path}/pkg/ ]; then + rm -rf ${self_path}/pkg/ +fi + +# TODO: Handle the wasm target being built in release mode +TARGET=wasm32-unknown-unknown +WASM_BINARY=${self_path}/../../target/${TARGET}/release/${pname}.wasm + +NODE_DIR=${self_path}/pkg/nodejs/ +BROWSER_DIR=${self_path}/pkg/web/ +NODE_WASM=${NODE_DIR}/${pname}_bg.wasm +BROWSER_WASM=${BROWSER_DIR}/${pname}_bg.wasm + +# Build the new wasm package +run_or_fail cargo build --lib --release --package noir_wasm --target wasm32-unknown-unknown +run_or_fail wasm-bindgen $WASM_BINARY --out-dir $NODE_DIR --typescript --target nodejs +run_or_fail wasm-bindgen $WASM_BINARY --out-dir $BROWSER_DIR --typescript --target web +run_if_available wasm-opt $NODE_WASM -o $NODE_WASM -O +run_if_available wasm-opt $BROWSER_WASM -o $BROWSER_WASM -O diff --git a/crates/wasm/installPhase.sh b/crates/wasm/installPhase.sh index 4dd1473b941..f57875f4780 100755 --- a/crates/wasm/installPhase.sh +++ b/crates/wasm/installPhase.sh @@ -1,9 +1,14 @@ #!/usr/bin/env bash +export self_path=$(dirname "$(readlink -f "$0")") mkdir -p $out -cp ./crates/wasm/README.md $out/ -cp ./crates/wasm/package.json $out/ -cp -r ./pkg/* $out/ + +cp ${self_path}/README.md ${self_path}/pkg/ +cp ${self_path}/package.json ${self_path}/pkg/ +cp -r ${self_path}/pkg/* $out/ echo "## Tracking" >> $out/README.md echo "Built from [noir-lang/noir@$GIT_COMMIT](https://github.com/noir-lang/noir/tree/$GIT_COMMIT)" >> $out/README.md + +# Cleanup temporary pkg directory +rm -r $self_path/pkg diff --git a/crates/wasm/postBuild.sh b/crates/wasm/postBuild.sh deleted file mode 100755 index 1b01901adbe..00000000000 --- a/crates/wasm/postBuild.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -# TODO: Handle the wasm target being built in release mode -WASM_BINARY=./target/wasm32-unknown-unknown/release/${pname}.wasm -NODE_WASM=./pkg/nodejs/${pname}_bg.wasm -BROWSER_WASM=./pkg/web/${pname}_bg.wasm - -wasm-bindgen $WASM_BINARY --out-dir ./pkg/nodejs --typescript --target nodejs -wasm-bindgen $WASM_BINARY --out-dir ./pkg/web --typescript --target web -wasm-opt $NODE_WASM -o $NODE_WASM -O -wasm-opt $BROWSER_WASM -o $BROWSER_WASM -O diff --git a/crates/wasm/preBuild.sh b/crates/wasm/preBuild.sh deleted file mode 100644 index aa334e022c6..00000000000 --- a/crates/wasm/preBuild.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -# Clear out the existing build artifacts as these aren't automatically removed by wasm-pack. -if [ -d ./pkg/ ]; then - rm -rf ./pkg/ -fi \ No newline at end of file diff --git a/flake.nix b/flake.nix index a7bd0e39a7e..ea677501147 100644 --- a/flake.nix +++ b/flake.nix @@ -306,8 +306,8 @@ toml2json ]; - postBuild = '' - bash crates/wasm/postBuild.sh + buildPhaseCargoCommand = '' + bash crates/wasm/buildPhaseCargoCommand.sh ''; installPhase = ''