Files
workinf_Blender_Wasm/tools/web/build-webengine-alembic.py
mes123456 f3e21c6b98
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled
chore: checkpoint web Blender migration source, tools and docs
Accumulated uncommitted work: GHOST Web backend, WebGL/GPU web layer,
web workflow engine and protocol, tooling, docs and task records.
Large generated evidence, user-testing archives, build snapshots and
imported test assets remain untracked.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-11-10 11:18:01 +08:00

60 lines
2.6 KiB
Python

#!/usr/bin/env python3
"""Build Blender's pinned Alembic for the existing Web CacheFile reader."""
import hashlib
from pathlib import Path
import re
import subprocess
import tarfile
import urllib.request
ROOT = Path(__file__).resolve().parents[2]
BASE = ROOT / "build_web_alembic"
OCIO = ROOT / "build_web_ocio/install"
def main():
versions = (ROOT / "blender-5.2.0/build_files/build_environment/cmake/versions.cmake").read_text()
version = re.search(r"set\(ALEMBIC_VERSION ([^)]+)\)", versions)[1]
expected = re.search(r"set\(ALEMBIC_HASH ([^)]+)\)", versions)[1]
algorithm = re.search(r"set\(ALEMBIC_HASH_TYPE ([^)]+)\)", versions)[1].lower()
if not (OCIO / "lib/cmake/Imath/ImathConfig.cmake").is_file():
raise SystemExit("Reuse/build the Web OCIO Imath installation first")
BASE.mkdir(exist_ok=True)
source = BASE / ("alembic-" + version)
if not (source / "CMakeLists.txt").is_file():
archive = BASE / ("alembic-" + version + ".tar.gz")
if not archive.is_file():
with urllib.request.urlopen(
"https://codeload.github.com/alembic/alembic/tar.gz/" + version,
timeout=60,
) as response:
data = response.read()
if hashlib.new(algorithm, data).hexdigest() != expected:
raise SystemExit("Alembic download differs from Blender's pinned source hash")
archive.write_bytes(data)
if hashlib.new(algorithm, archive.read_bytes()).hexdigest() != expected:
raise SystemExit("Alembic archive differs from Blender's pinned source hash")
with tarfile.open(archive) as package:
package.extractall(BASE, filter="data")
toolchain = ROOT / ".emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
subprocess.run([
"cmake", "-S", str(source), "-B", str(BASE / "build"), "-G", "Ninja",
"-DCMAKE_TOOLCHAIN_FILE=" + str(toolchain),
"-DCMAKE_BUILD_TYPE=Release", "-DCMAKE_INSTALL_LIBDIR=lib",
"-DCMAKE_INSTALL_PREFIX=" + str(BASE / "install"),
"-DCMAKE_PREFIX_PATH=" + str(OCIO), "-DCMAKE_FIND_ROOT_PATH=" + str(OCIO),
"-DImath_DIR=" + str(OCIO / "lib/cmake/Imath"),
"-DCMAKE_CXX_FLAGS=-fexceptions", "-DALEMBIC_SHARED_LIBS=OFF",
"-DUSE_HDF5=OFF", "-DUSE_TESTS=OFF", "-DUSE_BINARIES=OFF",
"-DUSE_EXAMPLES=OFF", "-DUSE_PYALEMBIC=OFF", "-DUSE_MAYA=OFF",
"-DUSE_ARNOLD=OFF", "-DUSE_PRMAN=OFF",
], cwd=ROOT, check=True)
subprocess.run(["cmake", "--build", str(BASE / "build"), "--target", "install",
"--parallel", "8"], cwd=ROOT, check=True)
if __name__ == "__main__":
main()