Files

56 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Build libopus (static) + opus_fec_wrapper.c → ../../src/wasm-libopus-fec/libopus-fec.js (SINGLE_FILE ES6).
set -euo pipefail
ROOT="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$ROOT/../.." && pwd)"
OPUS_VERSION="1.4"
OPUS_ARCHIVE="opus-${OPUS_VERSION}.tar.gz"
BUILD_DIR="$ROOT/build"
OUT_DIR="$REPO_ROOT/src/wasm-libopus-fec"
OUT_JS="$OUT_DIR/libopus-fec.js"
EMS_ENV="$REPO_ROOT/.emsdk/emsdk_env.sh"
if [[ ! -f "$EMS_ENV" ]]; then
echo "Missing emsdk. Clone and install once:"
echo " git clone https://github.com/emscripten-core/emsdk.git $REPO_ROOT/.emsdk"
echo " cd $REPO_ROOT/.emsdk && ./emsdk install 3.1.74 && ./emsdk activate 3.1.74"
exit 1
fi
# shellcheck source=/dev/null
source "$EMS_ENV"
mkdir -p "$BUILD_DIR" "$OUT_DIR"
cd "$BUILD_DIR"
if [[ ! -d "opus-${OPUS_VERSION}" ]]; then
curl -fsSL -o "$OPUS_ARCHIVE" "https://downloads.xiph.org/releases/opus/$OPUS_ARCHIVE"
tar xzf "$OPUS_ARCHIVE"
fi
cd "opus-${OPUS_VERSION}"
if [[ ! -f Makefile ]]; then
# Cross-compile for WASM (config.sub accepts wasm32-* OS like "none", not "emscripten").
emconfigure ./configure \
--host=wasm32-unknown-none \
--disable-shared \
--enable-static \
--disable-doc \
--disable-extra-programs \
--disable-intrinsics
fi
emmake make -j"$(nproc 2>/dev/null || echo 4)"
emcc -O3 \
"$ROOT/opus_fec_wrapper.c" \
"$BUILD_DIR/opus-${OPUS_VERSION}/.libs/libopus.a" \
-I"$BUILD_DIR/opus-${OPUS_VERSION}/include" \
-o "$OUT_JS" \
-sMODULARIZE=1 \
-sEXPORT_ES6=1 \
-sEXPORT_NAME=createLibopusFecModule \
-sALLOW_MEMORY_GROWTH=1 \
-sENVIRONMENT=web,worker \
-sSINGLE_FILE=1 \
-sEXPORTED_FUNCTIONS=_malloc,_free,_gcall_opus_decoder_create,_gcall_opus_decode_float,_gcall_opus_decoder_destroy \
-sEXPORTED_RUNTIME_METHODS=ccall,cwrap,HEAPF32,HEAPU8
echo "Built $OUT_JS ($(wc -c < "$OUT_JS") bytes)"