Mercurial
diff third_party/emsdk/bazel/remote_emscripten_repository.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/remote_emscripten_repository.bzl Thu Jan 22 21:23:17 2026 -0800 @@ -0,0 +1,149 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load("@rules_cc//cc:defs.bzl", "cc_toolchain", "cc_toolchain_suite") +load(":emscripten_build_file.bzl", "EMSCRIPTEN_BUILD_FILE_CONTENT_TEMPLATE") +load(":revisions.bzl", "EMSCRIPTEN_TAGS") +load("//emscripten_toolchain:toolchain.bzl", "emscripten_cc_toolchain_config_rule") + +def remote_emscripten_repository( + name, + bin_extension, + **kwargs, +): + """Imports an Emscripten from an http archive + + Args: + name: A unique name for this Emscripten repository. + bin_extension: Extension for the binaries in this Emscripten repository + **kwargs: Args for http_archive. Refer to http_archive documentation for more info. + """ + http_archive( + name = name, + build_file_content = EMSCRIPTEN_BUILD_FILE_CONTENT_TEMPLATE.format(bin_extension = bin_extension), + **kwargs + ) + +def emscripten_toolchain_name(name): + return "emscripten_{}".format(name) + +def _get_name_and_target(name): + return name, ":" + name + +def create_toolchains(name, repo_name, exec_compatible_with): + """Creates toolchain definition for an Emscripten + + Register the toolchains defined by this macro via + `register_toolchains("//<path-to-target>:cc-toolchain-wasm-<name>")` + + Args: + name: A unique name for this Emscripten toolchain + repo_name: The name of the Emscripten repository for this toolchain + exec_compatible_with: Execute platform constraints for the Emscripten toolchain associated + with this repository. + **kwargs: Args for http_archive. Refer to http_archive documentation for more info. + """ + common_files_name, common_files_target = _get_name_and_target("common_files_" + name) + compiler_files_name, compiler_files_target = _get_name_and_target("compiler_files_" + name) + linker_files_name, linker_files_target = _get_name_and_target("linker_files_" + name) + ar_files_name, ar_files_target = _get_name_and_target("ar_files_" + name) + all_files_name, all_files_target = _get_name_and_target("all_files_" + name) + cc_wasm_name, cc_wasm_target = _get_name_and_target("cc-compiler-wasm-" + name) + + wasm_name = "wasm-" + name + + # These are file groups defined by the build_file_content on the Emscripten http_archive + remote_repo = "@{}//".format(repo_name) + repo_compiler_files_target = remote_repo + ":compiler_files" + repo_linker_files_target = remote_repo + ":linker_files" + repo_ar_files_target = remote_repo + ":ar_files" + + native.filegroup( + name = common_files_name, + srcs = [ + "@emscripten_cache//:emscripten_config", + "@emsdk//emscripten_toolchain:env.sh", + "@emsdk//emscripten_toolchain:env.bat", + "@nodejs//:node_files", + ], + ) + + native.filegroup( + name = compiler_files_name, + srcs = [ + "@emsdk//emscripten_toolchain:emcc.sh", + "@emsdk//emscripten_toolchain:emcc.bat", + repo_compiler_files_target, + common_files_target, + ], + ) + + native.filegroup( + name = linker_files_name, + srcs = [ + "@emsdk//emscripten_toolchain:emcc_link.sh", + "@emsdk//emscripten_toolchain:emcc_link.bat", + "link_wrapper.py", + repo_linker_files_target, + common_files_target, + ], + ) + + native.filegroup( + name = ar_files_name, + srcs = [ + "@emsdk//emscripten_toolchain:emar.sh", + "@emsdk//emscripten_toolchain:emar.bat", + repo_ar_files_target, + common_files_target, + ], + ) + + native.filegroup( + name = all_files_name, + srcs = [ + ar_files_target, + compiler_files_target, + linker_files_target, + ], + ) + + emscripten_cc_toolchain_config_rule( + name = wasm_name, + cpu = "wasm", + em_config = "@emscripten_cache//:emscripten_config", + emscripten_binaries = repo_compiler_files_target, + nodejs_bin = "@nodejs//:node", + script_extension = select({ + "@bazel_tools//src/conditions:host_windows": "bat", + "//conditions:default": "sh", + }), + ) + + cc_toolchain( + name = cc_wasm_name, + all_files = all_files_target, + ar_files = ar_files_target, + as_files = ":empty", + compiler_files = compiler_files_target, + dwp_files = ":empty", + linker_files = linker_files_target, + objcopy_files = ":empty", + strip_files = ":empty", + toolchain_config = wasm_name, + toolchain_identifier = "emscripten-wasm-" + name, + ) + + native.toolchain( + name = "cc-toolchain-wasm-" + name, + target_compatible_with = ["@platforms//cpu:wasm32"], + exec_compatible_with = exec_compatible_with, + toolchain = cc_wasm_target, + toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", + ) + + cc_toolchain_suite( + name = "everything-" + name, + toolchains = { + "wasm": cc_wasm_target, + "wasm|emscripten": cc_wasm_target, + }, + )