PPysolate SpineREAD THE CODE · UNDERSTAND THE SYSTEM
章节目录
源码索引 / 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"