| #!/usr/bin/env python3 | |
| # Copyright 2025 Google LLC | |
| # | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| import argparse | |
| import json | |
| import os | |
| import subprocess | |
| import sys | |
| import sysconfig | |
| import textwrap | |
| EMSDK_ROOT = os.path.join('third_party', 'emsdk') | |
| EMSDK_PATH = os.path.join(EMSDK_ROOT, 'emsdk.py') | |
| EMSDK_CONFIG_PATH = os.path.join(EMSDK_ROOT, '.emscripten') | |
| # Run a subprocess with stderr forwarded to stdout. Raise an exception if it fails. | |
| def run_or_exit(name, args): | |
| try: | |
| subprocess.run(args, | |
| encoding='utf-8', | |
| check=True, | |
| stdout=subprocess.PIPE, | |
| stderr=subprocess.STDOUT) | |
| except subprocess.CalledProcessError as ex: | |
| raise Exception(name + ' failed:\n' + ex.stdout) from ex | |
| def main(args): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('--get-emsdk-version', help='Print emsdk version and exit.', action='store_true') | |
| options = parser.parse_args() | |
| if options.get_emsdk_version: | |
| # https://github.com/emscripten-core/emsdk/blob/main/emscripten-releases-tags.json | |
| with open(os.path.join(EMSDK_ROOT, 'emscripten-releases-tags.json')) as f: | |
| print(json.load(f)['aliases']['latest']) | |
| return | |
| # Install and activate the default dependencies for emsdk. | |
| # 'latest' is a static alias in emsdk for the toolchain corresponding to | |
| # this emsdk release, so we can use it stably. | |
| run_or_exit('emsdk install', | |
| [sys.executable, EMSDK_PATH, 'install', 'latest']) | |
| run_or_exit('emsdk activate', | |
| [sys.executable, EMSDK_PATH, 'activate', 'latest']) | |
| # If we ever need to override the Python, Node, and LLVM binaries used by Emscripten, do that | |
| # here. See https://dawn-review.googlesource.com/c/dawn/+/238814/4..5 which removed support. | |
| if __name__ == '__main__': | |
| main(sys.argv) |