源码索引 / CURRENT IMPLEMENTATION
build-guest.sh
38 行 · 构建时读取的实际文件,不是讲解用伪代码。
#!/usr/bin/env bash
# Relink CPython's cached WASI libraries with OUR C bridge and OUR bootstrap.
set -euo pipefail
ROOT=$(cd "$(dirname "$0")" && pwd)
INPUTS=${SPINE_BUILD_INPUTS:?Set SPINE_BUILD_INPUTS to extracted CPython/WASI build inputs}
[[ $(uname -sm) == "Linux x86_64" ]] || { printf 'Requires Linux x86_64\n' >&2; exit 1; }
SDK="$INPUTS/tools/wasi-sdk"
PY="$INPUTS/cpython"
WASI="$PY/cross-build/wasm32-wasip1"
mkdir -p "$ROOT/build" "$ROOT/dist"
WORK=$(mktemp -d "$ROOT/build/guest.XXXXXX")
trap 'rm -rf "$WORK"' EXIT
"$SDK/bin/clang" --target=wasm32-wasip1 --sysroot="$SDK/share/wasi-sysroot" -O2 \
-I"$PY/Include" -I"$WASI" -mexec-model=reactor \
"$ROOT/guest/runtime.c" "$WASI/libpython3.14.a" \
"$WASI/Modules/_decimal/libmpdec/libmpdec.a" \
"$WASI"/Modules/_hacl/*.a "$WASI/Modules/expat/libexpat.a" \
"$INPUTS/tools/wasi-vfs-lib/libwasi_vfs.a" \
-ldl -lwasi-emulated-getpid -lwasi-emulated-signal -lwasi-emulated-process-clocks \
-lpthread -lm -Wl,--export-memory -Wl,--initial-memory=134217728 \
-Wl,--max-memory=536870912 -Wl,-z,stack-size=16777216 -Wl,--strip-all \
-o "$WORK/raw.wasm"
python3 - "$PY/Lib" "$WORK/lib" "$ROOT/guest/bootstrap.py" <<'PY'
from pathlib import Path
import shutil, sys
source, target, bootstrap = map(Path, sys.argv[1:])
shutil.copytree(source, target, ignore=shutil.ignore_patterns('__pycache__', '*.pyc', 'test', 'tests'))
shutil.copyfile(bootstrap, target / 'spine_bootstrap.py')
shutil.copyfile(bootstrap.parent / 'plm.py', target / 'plm.py')
shutil.copyfile(bootstrap.parent / 'prefix.py', target / 'prefix.py')
PY
"$INPUTS/tools/wasi-vfs-cli/wasi-vfs" pack "$WORK/raw.wasm" \
--dir "$WORK/lib::/usr/lib/python3.14" -o "$WORK/spine.wasm"
"$INPUTS/tools/wasm-tools/wasm-tools" validate "$WORK/spine.wasm"
mv "$WORK/spine.wasm" "$ROOT/dist/spine.wasm"
printf 'Built %s\n' "$ROOT/dist/spine.wasm"