Mercurial
diff third_party/emsdk/scripts/update_bazel_workspace.py @ 179:8d17f6e6e290
[ThirdParty] Added emsdk bazel rules that can be supported by bazel 9.0.0
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Thu, 22 Jan 2026 21:23:17 -0800 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/third_party/emsdk/scripts/update_bazel_workspace.py Thu Jan 22 21:23:17 2026 -0800 @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +# This script will update emsdk/bazel/revisions.bzl to the latest version of +# emscripten. It reads emsdk/emscripten-releases-tags.json to get the latest +# version number. Then, it downloads the prebuilts for that version and computes +# the sha256sum for the archive. It then puts all this information into the +# emsdk/bazel/revisions.bzl file. + +import hashlib +import json +import os +import re +import sys + +import requests + +STORAGE_URL = 'https://storage.googleapis.com/webassembly/emscripten-releases-builds' + +EMSDK_ROOT = os.path.dirname(os.path.dirname(__file__)) +RELEASES_TAGS_FILE = EMSDK_ROOT + '/emscripten-releases-tags.json' +BAZEL_REVISIONS_FILE = EMSDK_ROOT + '/bazel/revisions.bzl' +BAZEL_MODULE_FILE = EMSDK_ROOT + '/bazel/MODULE.bazel' + + +def get_latest_info(): + with open(RELEASES_TAGS_FILE) as f: + info = json.load(f) + latest = info['aliases']['latest'] + return latest, info['releases'][latest] + + +def get_sha(platform, archive_fmt, latest_hash, arch_suffix=''): + r = requests.get(f'{STORAGE_URL}/{platform}/{latest_hash}/wasm-binaries{arch_suffix}.{archive_fmt}') + r.raise_for_status() + print(f'Fetching {r.url}') + h = hashlib.new('sha256') + for chunk in r.iter_content(chunk_size=1024): + h.update(chunk) + return h.hexdigest() + + +def revisions_item(version, latest_hash): + return f'''\ + "{version}": struct( + hash = "{latest_hash}", + sha_linux = "{get_sha('linux', 'tar.xz', latest_hash)}", + sha_linux_arm64 = "{get_sha('linux', 'tar.xz', latest_hash, '-arm64')}", + sha_mac = "{get_sha('mac', 'tar.xz', latest_hash)}", + sha_mac_arm64 = "{get_sha('mac', 'tar.xz', latest_hash, '-arm64')}", + sha_win = "{get_sha('win', 'zip', latest_hash)}", + ), +''' + + +def insert_revision(item): + with open(BAZEL_REVISIONS_FILE) as f: + lines = f.readlines() + + lines.insert(lines.index('EMSCRIPTEN_TAGS = {\n') + 1, item) + + with open(BAZEL_REVISIONS_FILE, 'w') as f: + f.write(''.join(lines)) + + +def update_module_version(version): + with open(BAZEL_MODULE_FILE) as f: + content = f.read() + + pattern = r'(module\(\s*name = "emsdk",\s*version = )"\d+.\d+.\d+",\n\)' + # Verify that the pattern exists in the input since re.sub will + # will succeed either way. + assert re.search(pattern, content) + content = re.sub(pattern, fr'\1"{version}",\n)', content) + + with open(BAZEL_MODULE_FILE, 'w') as f: + f.write(content) + + +def main(): + version, latest_hash = get_latest_info() + update_module_version(version) + item = revisions_item(version, latest_hash) + print('inserting item:') + print(item) + insert_revision(item) + + +if __name__ == '__main__': + sys.exit(main())