diff third_party/emsdk/bazel/emscripten_deps.bzl @ 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/bazel/emscripten_deps.bzl	Thu Jan 22 21:23:17 2026 -0800
@@ -0,0 +1,99 @@
+load(":remote_emscripten_repository.bzl", "remote_emscripten_repository")
+load(":revisions.bzl", "EMSCRIPTEN_TAGS")
+
+def _parse_version(v):
+    return [int(u) for u in v.split(".")]
+
+def _empty_repository_impl(ctx):
+    ctx.file("MODULE.bazel", """module(name = "{}")""".format(ctx.name))
+    ctx.file("BUILD.bazel", "")
+
+_empty_repository = repository_rule(
+    implementation = _empty_repository_impl,
+)
+
+def emscripten_repo_name(name):
+    return "emscripten_bin_{}".format(name)
+
+def _emscripten_deps_impl(ctx):
+    version = None
+
+    for mod in ctx.modules:
+        for config in mod.tags.config:
+            if config.version and version != None:
+                fail("More than one emscripten version specified!")
+            version = config.version
+    if version == None:
+        version = "latest"
+
+    if version == "latest":
+        version = reversed(sorted(EMSCRIPTEN_TAGS.keys(), key = _parse_version))[0]
+
+    revision = EMSCRIPTEN_TAGS[version]
+
+    emscripten_url = "https://storage.googleapis.com/webassembly/emscripten-releases-builds/{}/{}/wasm-binaries{}.{}"
+
+    remote_emscripten_repository(
+        name = emscripten_repo_name("linux"),
+        bin_extension = "",
+        sha256 = revision.sha_linux,
+        strip_prefix = "install",
+        type = "tar.xz",
+        url = emscripten_url.format("linux", revision.hash, "", "tar.xz"),
+    )
+
+    # Not all versions have a linux/arm64 release: https://github.com/emscripten-core/emsdk/issues/547
+    if hasattr(revision, "sha_linux_arm64"):
+        remote_emscripten_repository(
+            name = emscripten_repo_name("linux_arm64"),
+            bin_extension = "",
+            sha256 = revision.sha_linux_arm64,
+            strip_prefix = "install",
+            type = "tar.xz",
+            url = emscripten_url.format("linux", revision.hash, "-arm64", "tar.xz"),
+        )
+    else:
+        _empty_repository(
+            name = emscripten_repo_name("linux_arm64"),
+        )
+
+    remote_emscripten_repository(
+        name = emscripten_repo_name("mac"),
+        bin_extension = "",
+        sha256 = revision.sha_mac,
+        strip_prefix = "install",
+        type = "tar.xz",
+        url = emscripten_url.format("mac", revision.hash, "", "tar.xz"),
+    )
+
+    remote_emscripten_repository(
+        name = emscripten_repo_name("mac_arm64"),
+        bin_extension = "",
+        sha256 = revision.sha_mac_arm64,
+        strip_prefix = "install",
+        type = "tar.xz",
+        url = emscripten_url.format("mac", revision.hash, "-arm64", "tar.xz"),
+    )
+
+    remote_emscripten_repository(
+        name = emscripten_repo_name("win"),
+        bin_extension = ".exe",
+        sha256 = revision.sha_win,
+        strip_prefix = "install",
+        type = "zip",
+        url = emscripten_url.format("win", revision.hash, "", "zip"),
+    )
+
+emscripten_deps = module_extension(
+    tag_classes = {
+        "config": tag_class(
+            attrs = {
+                "version": attr.string(
+                    doc = "Version to use. 'latest' to use latest.",
+                    values = ["latest"] + EMSCRIPTEN_TAGS.keys(),
+                ),
+            },
+        ),
+    },
+    implementation = _emscripten_deps_impl,
+)