#!/usr/bin/env bash export CURRENT_VERSION=${CURRENT_VERSION:-develop}; if [ "$NODE_ENV" = "production" ]; then export BUILD_MODE="release"; else export BUILD_MODE=${1:-debug}; fi export BUILD_NAME="${BUILD_NAME:-render-wasm}" export CARGO_BUILD_TARGET=${CARGO_BUILD_TARGET:-"wasm32-unknown-emscripten"}; export SKIA_BINARIES_URL=${SKIA_BINARIES_URL:-"https://github.com/penpot/skia-binaries/releases/download/0.87.0/skia-binaries-e551f334ad5cbdf43abf-wasm32-unknown-emscripten-gl-svg-textlayout-binary-cache-webp.tar.gz"} # 256 MB of initial heap to perform less # initial calls to memory grow. export EM_INITIAL_HEAP=$((256 * 1024 * 1024)) # 1.0 doubles the heap on every growth. export EM_MEMORY_GROWTH_GEOMETRIC_STEP="0.8" # Malloc implementation to use. # - dlmalloc: a powerful general-purpose malloc. # - emmalloc: a simple and compact malloc designed for emscripten. # - emmalloc-debug: use emmalloc and add extra assertion checks. # - emmalloc-memvalidate: use emmalloc with assertions+heap consistency checking. # - emmalloc-verbose: use emmalloc with assertions + verbose logging. # - emmalloc-memvalidate-verbose: use emmalloc with assertions + heap consistency checking + verbose logging. # Default: dlmalloc export EM_MALLOC="dlmalloc" export EMCC_CFLAGS="--no-entry \ --js-library src/js/wapi.js \ -sASSERTIONS=1 \ -sALLOW_TABLE_GROWTH=1 \ -sALLOW_MEMORY_GROWTH=1 \ -sINITIAL_HEAP=$EM_INITIAL_HEAP \ -sMEMORY_GROWTH_GEOMETRIC_STEP=$EM_MEMORY_GROWTH_GEOMETRIC_STEP \ -sERROR_ON_UNDEFINED_SYMBOLS=0 \ -sMAX_WEBGL_VERSION=2 \ -sEXPORT_NAME=createRustSkiaModule \ -sEXPORTED_RUNTIME_METHODS=GL,stringToUTF8,HEAPU8,HEAP32,HEAPU32,HEAPF32 \ -sENVIRONMENT=web \ -sMODULARIZE=1 \ -sEXPORT_ES6=1"; export EM_CACHE="/tmp/emsdk_cache"; export CARGO_PARAMS="${@:2}"; if [ "$BUILD_MODE" = "release" ]; then export CARGO_PARAMS="--release $CARGO_PARAMS" export EMCC_CFLAGS="-Os $EMCC_CFLAGS" else # TODO: Extra parameters that could be good to look into: # -gseparate-dwarf # -gsplit-dwarf # -gsource-map export EMCC_CFLAGS="-g $EMCC_CFLAGS -sVERBOSE=1 -sMALLOC=$EM_MALLOC" fi function clean { cargo clean; } function build { cargo build $CARGO_PARAMS; } function copy_artifacts { DEST=$1; cp target/wasm32-unknown-emscripten/$BUILD_MODE/render_wasm.js $DEST/$BUILD_NAME.js; cp target/wasm32-unknown-emscripten/$BUILD_MODE/render_wasm.wasm $DEST/$BUILD_NAME.wasm; sed -i "s/render_wasm.wasm/$BUILD_NAME.wasm?version=$CURRENT_VERSION/g" $DEST/$BUILD_NAME.js; npx esbuild target/wasm32-unknown-emscripten/$BUILD_MODE/render_wasm.js \ --log-level=error \ --outfile=$DEST/worker/render.js \ --platform=neutral \ --format=iife \ --global-name=WasmModule; } function copy_shared_artifact { SHARED_FILE=$(find target/wasm32-unknown-emscripten -name render_wasm_shared.js | head -n 1); cp $SHARED_FILE ../frontend/src/app/render_wasm/api/shared.js; }