From 14ce66e4ea14d16619faa52c3f2ebafc87834de3 Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 11:41:48 +0200 Subject: [PATCH] build: handle Metal toolchain being unbundled from Xcode 26 (#48471) * chore: add metal patch dir Co-authored-by: Keeley Hammond * chore: cherry-pick 2f564f1ca07b from angle (#48465) Co-authored-by: Keeley Hammond * chore: update patch Co-authored-by: Keeley Hammond --------- Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Keeley Hammond --- patches/angle/.patches | 1 + patches/angle/cherry-pick-2f564f1ca07b.patch | 125 +++++++++++++++++++ patches/config.json | 3 +- 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 patches/angle/.patches create mode 100644 patches/angle/cherry-pick-2f564f1ca07b.patch diff --git a/patches/angle/.patches b/patches/angle/.patches new file mode 100644 index 000000000000..30503ef3561d --- /dev/null +++ b/patches/angle/.patches @@ -0,0 +1 @@ +cherry-pick-2f564f1ca07b.patch diff --git a/patches/angle/cherry-pick-2f564f1ca07b.patch b/patches/angle/cherry-pick-2f564f1ca07b.patch new file mode 100644 index 000000000000..06060e5968f3 --- /dev/null +++ b/patches/angle/cherry-pick-2f564f1ca07b.patch @@ -0,0 +1,125 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mark Mentovai +Date: Tue, 16 Sep 2025 16:46:36 -0400 +Subject: mac: handle Metal toolchain being unbundled from Xcode 26 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The Metal toolchain was formerly part of Xcode, but in Xcode 26, it has +been unbundled and is now a separate install. Attempting to use the +Metal toolchain without installing it results in a build error, such as: + +error: error: cannot execute tool 'metal' due to missing Metal +Toolchain; use: xcodebuild -downloadComponent MetalToolchain + +By running the suggested command, the Metal toolchain can be installed, +but the existing angle build does not know how to find it correctly. + +For system Xcode installations, tools from the Metal toolchain (`metal` +and `metallib`) can be run via `xcrun`. This construct should work +equally well for older Xcode versions, for situations where it’s still +in use. + +For the hermetic toolchain, we’ll continue splicing the Metal toolchain +into the location it had previously been avialable (see +https://chromium-review.googlesource.com/c/6950738), although this is +subject to change in the future. + +Bug: chromium:423933062, chromium:445400016 +Change-Id: I139eca51938f7cecfec9b90fd488947160ef4ec9 +Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6955000 +Auto-Submit: Mark Mentovai +Commit-Queue: Mark Mentovai +Reviewed-by: Geoff Lang + +diff --git a/src/libANGLE/renderer/metal/BUILD.gn b/src/libANGLE/renderer/metal/BUILD.gn +index 96e9ee8420810f6a3ca9a0c290d4a654200eb7b9..50ac42a5b9a0f7c8b3b161af40c598cb34ff132a 100644 +--- a/src/libANGLE/renderer/metal/BUILD.gn ++++ b/src/libANGLE/renderer/metal/BUILD.gn +@@ -24,20 +24,56 @@ config("angle_metal_backend_config") { + } + + 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 = [ +- mac_bin_path + "metal", + "-c", + rebase_path(_metal_internal_shaders_metal_source, root_build_dir), + "-o", +@@ -60,17 +96,16 @@ if (metal_internal_shader_compilation_supported) { + _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" +- +- outputs = [ _metal_internal_shaders_metallib_file ] ++ run_metal_tool("angle_metal_internal_shaders_to_mtllib") { ++ deps = [ ":angle_metal_internal_shaders_to_air" ] + + sources = [ _metal_internal_shaders_air_file ] + +- deps = [ ":angle_metal_internal_shaders_to_air" ] ++ outputs = [ _metal_internal_shaders_metallib_file ] ++ ++ metal_tool = "metallib" + + args = [ +- mac_bin_path + "metallib", + rebase_path(_metal_internal_shaders_air_file, root_build_dir), + "-o", + rebase_path(_metal_internal_shaders_metallib_file, root_build_dir), diff --git a/patches/config.json b/patches/config.json index 8d297c0fd3e6..37f4600e246f 100644 --- a/patches/config.json +++ b/patches/config.json @@ -12,5 +12,6 @@ { "patch_dir": "src/electron/patches/ReactiveObjC", "repo": "src/third_party/squirrel.mac/vendor/ReactiveObjC" }, { "patch_dir": "src/electron/patches/webrtc", "repo": "src/third_party/webrtc" }, { "patch_dir": "src/electron/patches/reclient-configs", "repo": "src/third_party/engflow-reclient-configs" }, - { "patch_dir": "src/electron/patches/sqlite", "repo": "src/third_party/sqlite/src" } + { "patch_dir": "src/electron/patches/sqlite", "repo": "src/third_party/sqlite/src" }, + { "patch_dir": "src/electron/patches/angle", "repo": "src/third_party/angle" } ]