[bazel] Switch to platforms-based toolchain resolution (#1036)

diff --git a/bazel/.bazelrc b/bazel/.bazelrc
new file mode 100644
index 0000000..fbd75a7
--- /dev/null
+++ b/bazel/.bazelrc
@@ -0,0 +1 @@
+build --incompatible_enable_cc_toolchain_resolution
diff --git a/bazel/BUILD b/bazel/BUILD
index 87fe181..7a13c92 100644
--- a/bazel/BUILD
+++ b/bazel/BUILD
@@ -66,3 +66,10 @@
         "//conditions:default": ":empty",
     }),
 )
+
+platform(
+    name = "platform_wasm",
+    constraint_values = [
+        "@platforms//cpu:wasm32",
+    ],
+)
diff --git a/bazel/README.md b/bazel/README.md
index 8865475..877f2e0 100644
--- a/bazel/README.md
+++ b/bazel/README.md
@@ -17,6 +17,9 @@
 
 load("@emsdk//:emscripten_deps.bzl", emsdk_emscripten_deps = "emscripten_deps")
 emsdk_emscripten_deps(emscripten_version = "2.0.31")
+
+load("@emsdk//:toolchains.bzl", "register_emscripten_toolchains")
+register_emscripten_toolchains()
 ```
 The SHA1 hash in the above `strip_prefix` and `url` parameters correspond to the git revision of
 [emsdk 2.0.31](https://github.com/emscripten-core/emsdk/releases/tag/2.0.31). To get access to
@@ -26,8 +29,13 @@
 
 ## Building
 
-### Using wasm_cc_binary (preferred)
-First, write a new rule wrapping your `cc_binary`.
+Put the following line into your `.bazelrc`:
+
+```
+build --incompatible_enable_cc_toolchain_resolution
+```
+
+Then write a new rule wrapping your `cc_binary`.
 
 ```
 load("@rules_cc//cc:defs.bzl", "cc_binary")
@@ -54,17 +62,3 @@
 is the preferred way, since it also unpacks the resulting tarball.
 
 See `test_external/` for an example using [embind](https://emscripten.org/docs/porting/connecting_cpp_and_javascript/embind.html).
-
-### Using --config=wasm
-
-Put the following lines into your `.bazelrc`:
-```
-build:wasm --crosstool_top=@emsdk//emscripten_toolchain:everything
-build:wasm --cpu=wasm
-build:wasm --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
-```
-
-Simply pass `--config=wasm` when building a normal `cc_binary`. The result of
-this build will be a tar archive containing any files produced by emscripten.
-See the [Bazel documentation](https://docs.bazel.build/versions/main/tutorial/cc-toolchain-config.html)
-for more details
diff --git a/bazel/WORKSPACE b/bazel/WORKSPACE
index a33ee12..bd5cce5 100644
--- a/bazel/WORKSPACE
+++ b/bazel/WORKSPACE
@@ -7,3 +7,7 @@
 load(":emscripten_deps.bzl", "emscripten_deps")
 
 emscripten_deps()
+
+load(":toolchains.bzl", "register_emscripten_toolchains")
+
+register_emscripten_toolchains()
diff --git a/bazel/bazelrc b/bazel/bazelrc
index 85801e8..d1c8aef 100644
--- a/bazel/bazelrc
+++ b/bazel/bazelrc
@@ -1,5 +1,2 @@
-build:wasm --crosstool_top=//emscripten_toolchain:everything
-
-build:wasm --cpu=wasm
-
-build:wasm --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
+build:wasm --incompatible_enable_cc_toolchain_resolution
+build:wasm --platforms=@emsdk//:platform_wasm
diff --git a/bazel/emscripten_toolchain/BUILD.bazel b/bazel/emscripten_toolchain/BUILD.bazel
index d101c67..4486220 100644
--- a/bazel/emscripten_toolchain/BUILD.bazel
+++ b/bazel/emscripten_toolchain/BUILD.bazel
@@ -1,4 +1,4 @@
-load(":crosstool.bzl", "emscripten_cc_toolchain_config_rule")
+load(":toolchain.bzl", "emscripten_cc_toolchain_config_rule")
 
 package(default_visibility = ["//visibility:public"])
 
@@ -86,6 +86,13 @@
     },
 )
 
+toolchain(
+    name = "cc-toolchain-wasm",
+    target_compatible_with = ["@platforms//cpu:wasm32"],
+    toolchain = ":cc-compiler-wasm",
+    toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
+)
+
 py_binary(
     name = "wasm_binary",
     srcs = ["wasm_binary.py"],
diff --git a/bazel/emscripten_toolchain/crosstool.bzl b/bazel/emscripten_toolchain/toolchain.bzl
similarity index 99%
rename from bazel/emscripten_toolchain/crosstool.bzl
rename to bazel/emscripten_toolchain/toolchain.bzl
index a15c200..130405b 100644
--- a/bazel/emscripten_toolchain/crosstool.bzl
+++ b/bazel/emscripten_toolchain/toolchain.bzl
@@ -1105,7 +1105,7 @@
     attrs = {
         "cpu": attr.string(mandatory = True, values = ["asmjs", "wasm"]),
         "em_config": attr.label(mandatory = True, allow_single_file = True),
-        "emscripten_binaries": attr.label(mandatory = True),
+        "emscripten_binaries": attr.label(mandatory = True, cfg = "exec"),
         "script_extension": attr.string(mandatory = True, values = ["sh", "bat"]),
     },
     provides = [CcToolchainConfigInfo],
diff --git a/bazel/emscripten_toolchain/wasm_cc_binary.bzl b/bazel/emscripten_toolchain/wasm_cc_binary.bzl
index 9cf6328..8e4b6fb 100644
--- a/bazel/emscripten_toolchain/wasm_cc_binary.bzl
+++ b/bazel/emscripten_toolchain/wasm_cc_binary.bzl
@@ -32,7 +32,7 @@
         "//command_line_option:features": features,
         "//command_line_option:dynamic_mode": "off",
         "//command_line_option:linkopt": linkopts,
-        "//command_line_option:platforms": [],
+        "//command_line_option:platforms": ["@emsdk//:platform_wasm"],
         "//command_line_option:custom_malloc": "@emsdk//emscripten_toolchain:malloc",
     }
 
diff --git a/bazel/test_external/.bazelrc b/bazel/test_external/.bazelrc
new file mode 100644
index 0000000..fbd75a7
--- /dev/null
+++ b/bazel/test_external/.bazelrc
@@ -0,0 +1 @@
+build --incompatible_enable_cc_toolchain_resolution
diff --git a/bazel/test_external/WORKSPACE b/bazel/test_external/WORKSPACE
index 4fe5772..03f07f5 100644
--- a/bazel/test_external/WORKSPACE
+++ b/bazel/test_external/WORKSPACE
@@ -10,3 +10,7 @@
 load("@emsdk//:emscripten_deps.bzl", "emscripten_deps")
 
 emscripten_deps()
+
+load("@emsdk//:toolchains.bzl", "register_emscripten_toolchains")
+
+register_emscripten_toolchains()
diff --git a/bazel/toolchains.bzl b/bazel/toolchains.bzl
new file mode 100644
index 0000000..6d50b3d
--- /dev/null
+++ b/bazel/toolchains.bzl
@@ -0,0 +1,2 @@
+def register_emscripten_toolchains():
+    native.register_toolchains(str(Label("//emscripten_toolchain:cc-toolchain-wasm")))