| #!/bin/bash | |
| # Builds the distributable wamrc: static against a trimmed LLVM (AArch64 + | |
| # X86 backends only), no dylib dependencies, shippable beside the editor. | |
| # Usage: build_wamrc_dist.sh <work_dir> [wamr_source_dir] | |
| set -e | |
| WORK="${1:?work dir required}" | |
| SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" | |
| # Default to the vendored, patched clone two packages over; CI passes its own. | |
| WAMR_SRC="${2:-$(ls -d "$SCRIPT_DIR"/../../rive-cli/dependencies/bytecodealliance_wasm-micro-runtime_WAMR-* 2>/dev/null | head -1)}" | |
| [ -d "$WAMR_SRC/wamr-compiler" ] || { | |
| echo "wamr source not found: $WAMR_SRC" >&2 | |
| exit 1 | |
| } | |
| mkdir -p "$WORK" | |
| cd "$WORK" | |
| # WAMR 2.4.x builds against LLVM release/18.x. | |
| if [ ! -d llvm ]; then | |
| git clone --depth 1 --branch release/18.x \ | |
| https://github.com/llvm/llvm-project.git llvm | |
| fi | |
| cmake -S llvm/llvm -B llvm-build -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DLLVM_TARGETS_TO_BUILD="AArch64;X86" \ | |
| -DLLVM_BUILD_LLVM_DYLIB=OFF \ | |
| -DLLVM_ENABLE_BINDINGS=OFF \ | |
| -DLLVM_ENABLE_LIBEDIT=OFF \ | |
| -DLLVM_ENABLE_TERMINFO=OFF \ | |
| -DLLVM_ENABLE_ZSTD=OFF \ | |
| -DLLVM_ENABLE_ZLIB=ON \ | |
| -DLLVM_INCLUDE_BENCHMARKS=OFF \ | |
| -DLLVM_INCLUDE_DOCS=OFF \ | |
| -DLLVM_INCLUDE_EXAMPLES=OFF \ | |
| -DLLVM_INCLUDE_TESTS=OFF \ | |
| -DLLVM_INCLUDE_UTILS=OFF \ | |
| -DLLVM_APPEND_VC_REV=OFF \ | |
| -DLLVM_TOOL_LTO_BUILD=OFF \ | |
| -DLLVM_TOOL_REMARKS_SHLIB_BUILD=OFF \ | |
| -DLLVM_OPTIMIZED_TABLEGEN=ON | |
| cmake --build llvm-build | |
| cmake -S "$WAMR_SRC/wamr-compiler" -B wamrc-build -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DWAMR_BUILD_WITH_CUSTOM_LLVM=1 \ | |
| -DLLVM_DIR="$PWD/llvm-build/lib/cmake/llvm" | |
| cmake --build wamrc-build | |
| strip -x wamrc-build/wamrc -o wamrc | |
| # The dist contract: no non-system dylibs, or it cannot ship in a bundle. | |
| if otool -L wamrc | grep -vE "wamrc:|/usr/lib/" | grep -q .; then | |
| echo "wamrc links non-system dylibs:" >&2 | |
| otool -L wamrc >&2 | |
| exit 1 | |
| fi | |
| ./wamrc --version | |
| ls -la wamrc | awk '{print "dist wamrc size:", $5, "bytes"}' |