--- src/3rdparty/chromium/third_party/angle/src/libANGLE/renderer/metal/BUILD.gn.orig	2025-09-30 11:40:35
+++ src/3rdparty/chromium/third_party/angle/src/libANGLE/renderer/metal/BUILD.gn	2025-09-30 11:44:16
@@ -24,21 +24,56 @@
 }
 
 if (metal_internal_shader_compilation_supported) {
+  template("run_metal_tool") {
+    action(target_name) {
+      forward_variables_from(invoker,
+                             [
+                               "deps",
+                               "sources",
+                               "outputs",
+                               "metal_tool",
+                             ])
+      script = "shaders/metal_wrapper.py"
+      if (use_system_xcode) {
+        # System Xcode: run metal and metallib via xcrun. Since Xcode 26.0, the
+        # Metal toolchain has been unbundled from Xcode, and must be installed
+        # separately by running `xcodebuild -downloadComponent MetalToolchain`.
+        # There is a vestigial metal executable in mac_bin_path, but it’s
+        # incapable of running successfuly without the
+        # rest of the Metal toolchain surrounding it. `xcrun` is able to find
+        # and run the correct Metal toolchain when properly installed.
+        #
+        # If you’re using system Xcode and your build fails with this message:
+        #   error: error: cannot execute tool 'metal' due to missing Metal Toolchain; use: xcodebuild -downloadComponent MetalToolchain
+        # then do what the error message suggests, and then retry your build.
+        args = [
+          "xcrun",
+          metal_tool,
+        ]
+      } else {
+        # Hermetic Xcode: at least for now, the Metal toolchain is
+        # “spliced” into the location in the hermetic toolchain where it lived
+        # before Xcode 26.0, so it can be run directly from there.
+        args = [ mac_bin_path + metal_tool ]
+      }
+
+      args += invoker.args
+    }
+  }
+
   _metal_internal_shaders_air_file =
       "$root_gen_dir/angle/mtl_internal_shaders_autogen.air"
 
-  action("angle_metal_internal_shaders_to_air") {
-    script = "shaders/metal_wrapper.py"
-
-    outputs = [ _metal_internal_shaders_air_file ]
-
+  run_metal_tool("angle_metal_internal_shaders_to_air") {
     _metal_internal_shaders_metal_source =
         "shaders/mtl_internal_shaders_autogen.metal"
     sources = [ _metal_internal_shaders_metal_source ]
 
+    outputs = [ _metal_internal_shaders_air_file ]
+
+    metal_tool = "metal"
+
     args = [
-      "xcrun",
-      "metal",
       "-c",
       rebase_path(_metal_internal_shaders_metal_source, root_build_dir),
       "-o",
@@ -61,18 +96,16 @@
   _metal_internal_shaders_metallib_file =
       "$root_gen_dir/angle/mtl_internal_shaders_autogen.metallib"
 
-  action("angle_metal_internal_shaders_to_mtllib") {
-    script = "shaders/metal_wrapper.py"
+  run_metal_tool("angle_metal_internal_shaders_to_mtllib") {
+    deps = [ ":angle_metal_internal_shaders_to_air" ]
 
-    outputs = [ _metal_internal_shaders_metallib_file ]
-
     sources = [ _metal_internal_shaders_air_file ]
 
-    deps = [ ":angle_metal_internal_shaders_to_air" ]
+    outputs = [ _metal_internal_shaders_metallib_file ]
 
+    metal_tool = "metallib"
+
     args = [
-      "xcrun",
-      "metallib",
       rebase_path(_metal_internal_shaders_air_file, root_build_dir),
       "-o",
       rebase_path(_metal_internal_shaders_metallib_file, root_build_dir),
