mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 15:56:13 +03:00
Merge pull request #1384 from mitchellh/apple-sdk-fix
apple-sdk: use zig's libstd getSdk to get active Apple SDK
This commit is contained in:
@ -11,46 +11,37 @@ pub fn build(b: *std.Build) !void {
|
||||
/// The module target is used to determine the SDK to use so it must have
|
||||
/// a resolved target.
|
||||
pub fn addPaths(b: *std.Build, m: *std.Build.Module) !void {
|
||||
// The active SDK we want to use
|
||||
const sdk = try SDK.fromTarget(m.resolved_target.?.result);
|
||||
// The cache. This always uses b.allocator and never frees memory
|
||||
// (which is idiomatic for a Zig build exe).
|
||||
const Cache = struct {
|
||||
const Key = struct {
|
||||
arch: std.Target.Cpu.Arch,
|
||||
os: std.Target.Os.Tag,
|
||||
abi: std.Target.Abi,
|
||||
};
|
||||
|
||||
// Get the path to our active Xcode installation. If this fails then
|
||||
// the zig build will fail. We store this in a struct variable so its
|
||||
// static and only calculated once per build.
|
||||
const Path = struct {
|
||||
var value: ?[]const u8 = null;
|
||||
};
|
||||
const path = Path.value orelse path: {
|
||||
const path = std.mem.trim(u8, b.run(&.{ "xcode-select", "--print-path" }), " \r\n");
|
||||
Path.value = path;
|
||||
break :path path;
|
||||
var map: std.AutoHashMapUnmanaged(Key, ?[]const u8) = .{};
|
||||
};
|
||||
|
||||
// Base path
|
||||
const base = b.fmt("{s}/Platforms/{s}.platform/Developer/SDKs/{s}{s}.sdk", .{
|
||||
path,
|
||||
sdk.platform,
|
||||
sdk.platform,
|
||||
sdk.version,
|
||||
const target = m.resolved_target.?.result;
|
||||
const gop = try Cache.map.getOrPut(b.allocator, .{
|
||||
.arch = target.cpu.arch,
|
||||
.os = target.os.tag,
|
||||
.abi = target.abi,
|
||||
});
|
||||
|
||||
m.addSystemFrameworkPath(.{ .cwd_relative = b.pathJoin(&.{ base, "/System/Library/Frameworks" }) });
|
||||
m.addSystemIncludePath(.{ .cwd_relative = b.pathJoin(&.{ base, "/usr/include" }) });
|
||||
m.addLibraryPath(.{ .cwd_relative = b.pathJoin(&.{ base, "/usr/lib" }) });
|
||||
}
|
||||
|
||||
const SDK = struct {
|
||||
platform: []const u8,
|
||||
version: []const u8,
|
||||
|
||||
pub fn fromTarget(target: std.Target) !SDK {
|
||||
return switch (target.os.tag) {
|
||||
.ios => .{ .platform = "iPhoneOS", .version = "" },
|
||||
.macos => .{ .platform = "MacOSX", .version = "14" },
|
||||
else => {
|
||||
std.log.err("unsupported os={}", .{target.os.tag});
|
||||
return error.UnsupportedOS;
|
||||
},
|
||||
};
|
||||
// This executes `xcrun` to get the SDK path. We don't want to execute
|
||||
// this multiple times so we cache the value.
|
||||
if (!gop.found_existing) {
|
||||
gop.value_ptr.* = std.zig.system.darwin.getSdk(
|
||||
b.allocator,
|
||||
m.resolved_target.?.result,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
// The active SDK we want to use
|
||||
const path = gop.value_ptr.* orelse return error.AppleSDKNotFound;
|
||||
m.addSystemFrameworkPath(.{ .cwd_relative = b.pathJoin(&.{ path, "/System/Library/Frameworks" }) });
|
||||
m.addSystemIncludePath(.{ .cwd_relative = b.pathJoin(&.{ path, "/usr/include" }) });
|
||||
m.addLibraryPath(.{ .cwd_relative = b.pathJoin(&.{ path, "/usr/lib" }) });
|
||||
}
|
||||
|
Reference in New Issue
Block a user