build: use `xcrun --sdk <sdk> metal` for metal paths

This wasn't working before but it just requires a restart of the machine
for the changes to take effect. The namespace runners have this prebuilt
so this should work now.

The other workaround was flaky for unknown reasons so I'd prefer to go
back to this.
pull/7619/head
Mitchell Hashimoto 2025-06-17 16:23:15 -07:00
parent 7d01332574
commit 559fd92295
No known key found for this signature in database
GPG Key ID: 523D5DC389D273BC
1 changed files with 7 additions and 26 deletions

View File

@ -22,10 +22,11 @@ step: *Step,
output: LazyPath,
pub fn create(b: *std.Build, opts: Options) ?*MetallibStep {
switch (opts.target.result.os.tag) {
.macos, .ios => {},
else => return null, // Only macOS and iOS are supported.
}
const sdk = switch (opts.target.result.os.tag) {
.macos => "macosx",
.ios => "iphoneos",
else => return null,
};
const self = b.allocator.create(MetallibStep) catch @panic("OOM");
@ -37,31 +38,11 @@ pub fn create(b: *std.Build, opts: Options) ?*MetallibStep {
else => unreachable,
};
// Find the metal and metallib executables. The Apple docs
// at the time of writing (June 2025) say to use
// `xcrun --sdk <sdk> metal` but this doesn't work with Xcode 26.
//
// I don't know if this is a bug but the xcodebuild approach also
// works with Xcode 15 so it seems safe to use this instead.
//
// Reported bug: FB17874042.
var code: u8 = undefined;
const metal_exe = std.mem.trim(u8, b.runAllowFail(
&.{ "xcodebuild", "-find-executable", "metal" },
&code,
.Ignore,
) catch return null, "\r\n ");
const metallib_exe = std.mem.trim(u8, b.runAllowFail(
&.{ "xcodebuild", "-find-executable", "metallib" },
&code,
.Ignore,
) catch return null, "\r\n ");
const run_ir = RunStep.create(
b,
b.fmt("metal {s}", .{opts.name}),
);
run_ir.addArgs(&.{ metal_exe, "-o" });
run_ir.addArgs(&.{ "/usr/bin/xcrun", "-sdk", sdk, "metal", "-o" });
const output_ir = run_ir.addOutputFileArg(b.fmt("{s}.ir", .{opts.name}));
run_ir.addArgs(&.{"-c"});
for (opts.sources) |source| run_ir.addFileArg(source);
@ -81,7 +62,7 @@ pub fn create(b: *std.Build, opts: Options) ?*MetallibStep {
b,
b.fmt("metallib {s}", .{opts.name}),
);
run_lib.addArgs(&.{ metallib_exe, "-o" });
run_lib.addArgs(&.{ "/usr/bin/xcrun", "-sdk", sdk, "metallib", "-o" });
const output_lib = run_lib.addOutputFileArg(b.fmt("{s}.metallib", .{opts.name}));
run_lib.addFileArg(output_ir);
run_lib.step.dependOn(&run_ir.step);