comparison 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
comparison
equal deleted inserted replaced
178:94705b5986b3 179:8d17f6e6e290
1 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
2 load("@rules_cc//cc:defs.bzl", "cc_toolchain", "cc_toolchain_suite")
3 load(":emscripten_build_file.bzl", "EMSCRIPTEN_BUILD_FILE_CONTENT_TEMPLATE")
4 load(":revisions.bzl", "EMSCRIPTEN_TAGS")
5 load("//emscripten_toolchain:toolchain.bzl", "emscripten_cc_toolchain_config_rule")
6
7 def remote_emscripten_repository(
8 name,
9 bin_extension,
10 **kwargs,
11 ):
12 """Imports an Emscripten from an http archive
13
14 Args:
15 name: A unique name for this Emscripten repository.
16 bin_extension: Extension for the binaries in this Emscripten repository
17 **kwargs: Args for http_archive. Refer to http_archive documentation for more info.
18 """
19 http_archive(
20 name = name,
21 build_file_content = EMSCRIPTEN_BUILD_FILE_CONTENT_TEMPLATE.format(bin_extension = bin_extension),
22 **kwargs
23 )
24
25 def emscripten_toolchain_name(name):
26 return "emscripten_{}".format(name)
27
28 def _get_name_and_target(name):
29 return name, ":" + name
30
31 def create_toolchains(name, repo_name, exec_compatible_with):
32 """Creates toolchain definition for an Emscripten
33
34 Register the toolchains defined by this macro via
35 `register_toolchains("//<path-to-target>:cc-toolchain-wasm-<name>")`
36
37 Args:
38 name: A unique name for this Emscripten toolchain
39 repo_name: The name of the Emscripten repository for this toolchain
40 exec_compatible_with: Execute platform constraints for the Emscripten toolchain associated
41 with this repository.
42 **kwargs: Args for http_archive. Refer to http_archive documentation for more info.
43 """
44 common_files_name, common_files_target = _get_name_and_target("common_files_" + name)
45 compiler_files_name, compiler_files_target = _get_name_and_target("compiler_files_" + name)
46 linker_files_name, linker_files_target = _get_name_and_target("linker_files_" + name)
47 ar_files_name, ar_files_target = _get_name_and_target("ar_files_" + name)
48 all_files_name, all_files_target = _get_name_and_target("all_files_" + name)
49 cc_wasm_name, cc_wasm_target = _get_name_and_target("cc-compiler-wasm-" + name)
50
51 wasm_name = "wasm-" + name
52
53 # These are file groups defined by the build_file_content on the Emscripten http_archive
54 remote_repo = "@{}//".format(repo_name)
55 repo_compiler_files_target = remote_repo + ":compiler_files"
56 repo_linker_files_target = remote_repo + ":linker_files"
57 repo_ar_files_target = remote_repo + ":ar_files"
58
59 native.filegroup(
60 name = common_files_name,
61 srcs = [
62 "@emscripten_cache//:emscripten_config",
63 "@emsdk//emscripten_toolchain:env.sh",
64 "@emsdk//emscripten_toolchain:env.bat",
65 "@nodejs//:node_files",
66 ],
67 )
68
69 native.filegroup(
70 name = compiler_files_name,
71 srcs = [
72 "@emsdk//emscripten_toolchain:emcc.sh",
73 "@emsdk//emscripten_toolchain:emcc.bat",
74 repo_compiler_files_target,
75 common_files_target,
76 ],
77 )
78
79 native.filegroup(
80 name = linker_files_name,
81 srcs = [
82 "@emsdk//emscripten_toolchain:emcc_link.sh",
83 "@emsdk//emscripten_toolchain:emcc_link.bat",
84 "link_wrapper.py",
85 repo_linker_files_target,
86 common_files_target,
87 ],
88 )
89
90 native.filegroup(
91 name = ar_files_name,
92 srcs = [
93 "@emsdk//emscripten_toolchain:emar.sh",
94 "@emsdk//emscripten_toolchain:emar.bat",
95 repo_ar_files_target,
96 common_files_target,
97 ],
98 )
99
100 native.filegroup(
101 name = all_files_name,
102 srcs = [
103 ar_files_target,
104 compiler_files_target,
105 linker_files_target,
106 ],
107 )
108
109 emscripten_cc_toolchain_config_rule(
110 name = wasm_name,
111 cpu = "wasm",
112 em_config = "@emscripten_cache//:emscripten_config",
113 emscripten_binaries = repo_compiler_files_target,
114 nodejs_bin = "@nodejs//:node",
115 script_extension = select({
116 "@bazel_tools//src/conditions:host_windows": "bat",
117 "//conditions:default": "sh",
118 }),
119 )
120
121 cc_toolchain(
122 name = cc_wasm_name,
123 all_files = all_files_target,
124 ar_files = ar_files_target,
125 as_files = ":empty",
126 compiler_files = compiler_files_target,
127 dwp_files = ":empty",
128 linker_files = linker_files_target,
129 objcopy_files = ":empty",
130 strip_files = ":empty",
131 toolchain_config = wasm_name,
132 toolchain_identifier = "emscripten-wasm-" + name,
133 )
134
135 native.toolchain(
136 name = "cc-toolchain-wasm-" + name,
137 target_compatible_with = ["@platforms//cpu:wasm32"],
138 exec_compatible_with = exec_compatible_with,
139 toolchain = cc_wasm_target,
140 toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
141 )
142
143 cc_toolchain_suite(
144 name = "everything-" + name,
145 toolchains = {
146 "wasm": cc_wasm_target,
147 "wasm|emscripten": cc_wasm_target,
148 },
149 )