From ec6d470985220df0f7215b86041b2c4a70c261c0 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 9 Jan 2024 21:36:10 -0800 Subject: [PATCH 1/9] build: only build embedded lib when targeting macos specifically --- build.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.zig b/build.zig index 9d3fc1641..f0093f693 100644 --- a/build.zig +++ b/build.zig @@ -444,8 +444,8 @@ pub fn build(b: *std.Build) !void { b.installFile("images/icons/icon_256x256@2x@2x.png", "share/icons/hicolor/256x256@2/apps/com.mitchellh.ghostty.png"); } - // On Mac we can build the embedding library. - if (builtin.target.isDarwin() and target.result.isDarwin()) { + // On Mac we can build the embedding library. This only handles the macOS lib. + if (builtin.target.isDarwin() and target.result.os.tag == .macos) { const static_lib_aarch64 = lib: { const lib = b.addStaticLibrary(.{ .name = "ghostty", From c0722b3652e5e207f34d220f64a03d9d53e93ad0 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 9 Jan 2024 21:53:01 -0800 Subject: [PATCH 2/9] build: use Xcode for the macOS SDK --- pkg/apple-sdk/build.zig | 36 +++++++++++++++++++++++++++++------- pkg/apple-sdk/build.zig.zon | 7 +------ pkg/cimgui/build.zig | 2 +- pkg/harfbuzz/build.zig | 2 +- pkg/macos/build.zig | 2 +- 5 files changed, 33 insertions(+), 16 deletions(-) diff --git a/pkg/apple-sdk/build.zig b/pkg/apple-sdk/build.zig index b8863cff2..602526052 100644 --- a/pkg/apple-sdk/build.zig +++ b/pkg/apple-sdk/build.zig @@ -7,12 +7,34 @@ pub fn build(b: *std.Build) !void { _ = optimize; } -pub fn addPaths(b: *std.Build, step: *std.Build.Step.Compile) !void { - _ = b; - @import("macos_sdk").addPaths(step); -} +pub fn addPaths(b: *std.Build, step: anytype) !void { + // The active SDK we want to use + const sdk = "MacOSX14.sdk"; -pub fn addPathsModule(b: *std.Build, m: *std.Build.Module) !void { - _ = b; - @import("macos_sdk").addPathsModule(m); + // Get the path to our active Xcode installation. If this fails then + // the zig build will fail. + const path = std.mem.trim( + u8, + b.run(&.{ "xcode-select", "--print-path" }), + " \r\n", + ); + + step.addSystemFrameworkPath(.{ + .cwd_relative = b.pathJoin(&.{ + path, + "Platforms/MacOSX.platform/Developer/SDKs/" ++ sdk ++ "/System/Library/Frameworks", + }), + }); + step.addSystemIncludePath(.{ + .cwd_relative = b.pathJoin(&.{ + path, + "Platforms/MacOSX.platform/Developer/SDKs/" ++ sdk ++ "/usr/include", + }), + }); + step.addLibraryPath(.{ + .cwd_relative = b.pathJoin(&.{ + path, + "Platforms/MacOSX.platform/Developer/SDKs/" ++ sdk ++ "/usr/lib", + }), + }); } diff --git a/pkg/apple-sdk/build.zig.zon b/pkg/apple-sdk/build.zig.zon index b41c9ac0d..226c3b088 100644 --- a/pkg/apple-sdk/build.zig.zon +++ b/pkg/apple-sdk/build.zig.zon @@ -1,10 +1,5 @@ .{ .name = "apple-sdk", .version = "0.1.0", - .dependencies = .{ - .macos_sdk = .{ - .url = "https://github.com/mitchellh/zig-build-macos-sdk/archive/ee70f27c08680307fa35ada92e6b2c36e0ff84c6.tar.gz", - .hash = "1220b415f529f1c04ed876c2b481e9f8119d353d4e3d4d7c8607ee302d2142e13eca", - }, - }, + .dependencies = .{}, } diff --git a/pkg/cimgui/build.zig b/pkg/cimgui/build.zig index d37cfc538..e1ad769b0 100644 --- a/pkg/cimgui/build.zig +++ b/pkg/cimgui/build.zig @@ -61,7 +61,7 @@ pub fn build(b: *std.Build) !void { if (target.result.isDarwin()) { if (!target.query.isNative()) { try @import("apple_sdk").addPaths(b, lib); - try @import("apple_sdk").addPathsModule(b, module); + try @import("apple_sdk").addPaths(b, module); } lib.addCSourceFile(.{ .file = imgui.path("backends/imgui_impl_metal.mm"), diff --git a/pkg/harfbuzz/build.zig b/pkg/harfbuzz/build.zig index 25d1ff00b..c1eb91ec9 100644 --- a/pkg/harfbuzz/build.zig +++ b/pkg/harfbuzz/build.zig @@ -62,7 +62,7 @@ pub fn build(b: *std.Build) !void { if (coretext_enabled) { try flags.appendSlice(&.{"-DHAVE_CORETEXT=1"}); try apple_sdk.addPaths(b, lib); - try apple_sdk.addPathsModule(b, module); + try apple_sdk.addPaths(b, module); lib.linkFramework("ApplicationServices"); module.linkFramework("ApplicationServices", .{}); } diff --git a/pkg/macos/build.zig b/pkg/macos/build.zig index 05035aa6a..b879e5ad4 100644 --- a/pkg/macos/build.zig +++ b/pkg/macos/build.zig @@ -40,7 +40,7 @@ pub fn build(b: *std.Build) !void { if (!target.query.isNative()) { try apple_sdk.addPaths(b, lib); - try apple_sdk.addPathsModule(b, module); + try apple_sdk.addPaths(b, module); } b.installArtifact(lib); From fde52e9eca6be4e5e9fca0055265bb736ef3101e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 9 Jan 2024 21:58:56 -0800 Subject: [PATCH 3/9] pkg/macos: only link apple paths on darwin target --- pkg/macos/build.zig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/macos/build.zig b/pkg/macos/build.zig index b879e5ad4..556e1f1ce 100644 --- a/pkg/macos/build.zig +++ b/pkg/macos/build.zig @@ -36,11 +36,11 @@ pub fn build(b: *std.Build) !void { module.linkFramework("CoreGraphics", .{}); module.linkFramework("CoreText", .{}); module.linkFramework("CoreVideo", .{}); - } - if (!target.query.isNative()) { - try apple_sdk.addPaths(b, lib); - try apple_sdk.addPaths(b, module); + if (!target.query.isNative()) { + try apple_sdk.addPaths(b, lib); + try apple_sdk.addPaths(b, module); + } } b.installArtifact(lib); From 829776bebddc5ea24257797ab78d5e6b93281485 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 9 Jan 2024 22:11:03 -0800 Subject: [PATCH 4/9] pkg/apple-sdk: always require a module --- build.zig | 2 +- pkg/apple-sdk/build.zig | 8 ++++---- pkg/cimgui/build.zig | 2 +- pkg/harfbuzz/build.zig | 2 +- pkg/macos/build.zig | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build.zig b/build.zig index f0093f693..5a998bdbd 100644 --- a/build.zig +++ b/build.zig @@ -792,7 +792,7 @@ fn addDeps( // We always require the system SDK so that our system headers are available. // This makes things like `os/log.h` available for cross-compiling. if (step.rootModuleTarget().isDarwin()) { - try @import("apple_sdk").addPaths(b, step); + try @import("apple_sdk").addPaths(b, &step.root_module); } // We always need the Zig packages diff --git a/pkg/apple-sdk/build.zig b/pkg/apple-sdk/build.zig index 602526052..2f883e129 100644 --- a/pkg/apple-sdk/build.zig +++ b/pkg/apple-sdk/build.zig @@ -7,7 +7,7 @@ pub fn build(b: *std.Build) !void { _ = optimize; } -pub fn addPaths(b: *std.Build, step: anytype) !void { +pub fn addPaths(b: *std.Build, m: *std.Build.Module) !void { // The active SDK we want to use const sdk = "MacOSX14.sdk"; @@ -19,19 +19,19 @@ pub fn addPaths(b: *std.Build, step: anytype) !void { " \r\n", ); - step.addSystemFrameworkPath(.{ + m.addSystemFrameworkPath(.{ .cwd_relative = b.pathJoin(&.{ path, "Platforms/MacOSX.platform/Developer/SDKs/" ++ sdk ++ "/System/Library/Frameworks", }), }); - step.addSystemIncludePath(.{ + m.addSystemIncludePath(.{ .cwd_relative = b.pathJoin(&.{ path, "Platforms/MacOSX.platform/Developer/SDKs/" ++ sdk ++ "/usr/include", }), }); - step.addLibraryPath(.{ + m.addLibraryPath(.{ .cwd_relative = b.pathJoin(&.{ path, "Platforms/MacOSX.platform/Developer/SDKs/" ++ sdk ++ "/usr/lib", diff --git a/pkg/cimgui/build.zig b/pkg/cimgui/build.zig index e1ad769b0..b846671fa 100644 --- a/pkg/cimgui/build.zig +++ b/pkg/cimgui/build.zig @@ -60,7 +60,7 @@ pub fn build(b: *std.Build) !void { if (target.result.isDarwin()) { if (!target.query.isNative()) { - try @import("apple_sdk").addPaths(b, lib); + try @import("apple_sdk").addPaths(b, &lib.root_module); try @import("apple_sdk").addPaths(b, module); } lib.addCSourceFile(.{ diff --git a/pkg/harfbuzz/build.zig b/pkg/harfbuzz/build.zig index c1eb91ec9..8efd532d9 100644 --- a/pkg/harfbuzz/build.zig +++ b/pkg/harfbuzz/build.zig @@ -61,7 +61,7 @@ pub fn build(b: *std.Build) !void { }); if (coretext_enabled) { try flags.appendSlice(&.{"-DHAVE_CORETEXT=1"}); - try apple_sdk.addPaths(b, lib); + try apple_sdk.addPaths(b, &lib.root_module); try apple_sdk.addPaths(b, module); lib.linkFramework("ApplicationServices"); module.linkFramework("ApplicationServices", .{}); diff --git a/pkg/macos/build.zig b/pkg/macos/build.zig index 556e1f1ce..5d2108ed2 100644 --- a/pkg/macos/build.zig +++ b/pkg/macos/build.zig @@ -38,7 +38,7 @@ pub fn build(b: *std.Build) !void { module.linkFramework("CoreVideo", .{}); if (!target.query.isNative()) { - try apple_sdk.addPaths(b, lib); + try apple_sdk.addPaths(b, &lib.root_module); try apple_sdk.addPaths(b, module); } } From 22648d60e7d9ee5a4a2f885e7c42a09c3050deec Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 9 Jan 2024 22:24:34 -0800 Subject: [PATCH 5/9] pkg/apple-sdk: detect apple sdk based on target --- pkg/apple-sdk/build.zig | 44 ++++++++++++++++++++++++----------------- pkg/cimgui/build.zig | 6 +++++- pkg/harfbuzz/build.zig | 4 +++- pkg/macos/build.zig | 6 +++++- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/pkg/apple-sdk/build.zig b/pkg/apple-sdk/build.zig index 2f883e129..34a1e92ce 100644 --- a/pkg/apple-sdk/build.zig +++ b/pkg/apple-sdk/build.zig @@ -9,7 +9,7 @@ pub fn build(b: *std.Build) !void { pub fn addPaths(b: *std.Build, m: *std.Build.Module) !void { // The active SDK we want to use - const sdk = "MacOSX14.sdk"; + const sdk = try SDK.fromTarget(m.resolved_target.?.result); // Get the path to our active Xcode installation. If this fails then // the zig build will fail. @@ -19,22 +19,30 @@ pub fn addPaths(b: *std.Build, m: *std.Build.Module) !void { " \r\n", ); - m.addSystemFrameworkPath(.{ - .cwd_relative = b.pathJoin(&.{ - path, - "Platforms/MacOSX.platform/Developer/SDKs/" ++ sdk ++ "/System/Library/Frameworks", - }), - }); - m.addSystemIncludePath(.{ - .cwd_relative = b.pathJoin(&.{ - path, - "Platforms/MacOSX.platform/Developer/SDKs/" ++ sdk ++ "/usr/include", - }), - }); - m.addLibraryPath(.{ - .cwd_relative = b.pathJoin(&.{ - path, - "Platforms/MacOSX.platform/Developer/SDKs/" ++ sdk ++ "/usr/lib", - }), + // Base path + const base = b.fmt("{s}/Platforms/{s}.platform/Developer/SDKs/{s}{s}.sdk", .{ + path, + sdk.platform, + sdk.platform, + sdk.version, }); + + 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) { + .macos => .{ .platform = "MacOSX", .version = "14.2" }, + else => { + std.log.err("unsupported os={}", .{target.os.tag}); + return error.UnsupportedOS; + }, + }; + } +}; diff --git a/pkg/cimgui/build.zig b/pkg/cimgui/build.zig index b846671fa..34585bac9 100644 --- a/pkg/cimgui/build.zig +++ b/pkg/cimgui/build.zig @@ -5,7 +5,11 @@ pub fn build(b: *std.Build) !void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); - const module = b.addModule("cimgui", .{ .root_source_file = .{ .path = "main.zig" } }); + const module = b.addModule("cimgui", .{ + .root_source_file = .{ .path = "main.zig" }, + .target = target, + .optimize = optimize, + }); const imgui = b.dependency("imgui", .{}); const freetype = b.dependency("freetype", .{ diff --git a/pkg/harfbuzz/build.zig b/pkg/harfbuzz/build.zig index 8efd532d9..280b66a57 100644 --- a/pkg/harfbuzz/build.zig +++ b/pkg/harfbuzz/build.zig @@ -18,6 +18,8 @@ pub fn build(b: *std.Build) !void { const module = b.addModule("harfbuzz", .{ .root_source_file = .{ .path = "main.zig" }, + .target = target, + .optimize = optimize, .imports = &.{ .{ .name = "freetype", .module = freetype.module("freetype") }, .{ .name = "macos", .module = macos.module("macos") }, @@ -59,7 +61,7 @@ pub fn build(b: *std.Build) !void { "-DHAVE_FT_DONE_MM_VAR=1", "-DHAVE_FT_GET_TRANSFORM=1", }); - if (coretext_enabled) { + if (coretext_enabled and target.result.isDarwin()) { try flags.appendSlice(&.{"-DHAVE_CORETEXT=1"}); try apple_sdk.addPaths(b, &lib.root_module); try apple_sdk.addPaths(b, module); diff --git a/pkg/macos/build.zig b/pkg/macos/build.zig index 5d2108ed2..3891553f2 100644 --- a/pkg/macos/build.zig +++ b/pkg/macos/build.zig @@ -6,7 +6,11 @@ pub fn build(b: *std.Build) !void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); - const module = b.addModule("macos", .{ .root_source_file = .{ .path = "main.zig" } }); + const module = b.addModule("macos", .{ + .root_source_file = .{ .path = "main.zig" }, + .target = target, + .optimize = optimize, + }); const lib = b.addStaticLibrary(.{ .name = "macos", From 12db2bc962dd5f737818d4bb663336fa70f0f333 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 9 Jan 2024 22:25:47 -0800 Subject: [PATCH 6/9] nix: update package hash --- nix/zigCacheHash.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix/zigCacheHash.nix b/nix/zigCacheHash.nix index 0e4626c77..7b0bd5cb5 100644 --- a/nix/zigCacheHash.nix +++ b/nix/zigCacheHash.nix @@ -1,3 +1,3 @@ # This file is auto-generated! check build-support/check-zig-cache-hash.sh for # more details. -"sha256-iRXzPgzOkt+TTcqPCRQubP3dN6lS+Wvn17l+0I/pDGg=" +"sha256-1qlnSOyr2C9DtUdf+4QRNrBr4vUM1nVnv/mVUXxE5fA=" From 7e1f1d360f45e50f021e7e144bb481873c527a10 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 9 Jan 2024 22:32:39 -0800 Subject: [PATCH 7/9] pkg/apple-sdk add comment --- pkg/apple-sdk/build.zig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/apple-sdk/build.zig b/pkg/apple-sdk/build.zig index 34a1e92ce..f52b62c36 100644 --- a/pkg/apple-sdk/build.zig +++ b/pkg/apple-sdk/build.zig @@ -7,6 +7,9 @@ pub fn build(b: *std.Build) !void { _ = optimize; } +/// Add the SDK framework, include, and library paths to the given module. +/// 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); From 41de9c6e97d26f434be36f4221bf0c3d58dd79d6 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 10 Jan 2024 09:32:24 -0800 Subject: [PATCH 8/9] pkg/apple-sdk: depend on macOS 14 SDK --- pkg/apple-sdk/build.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/apple-sdk/build.zig b/pkg/apple-sdk/build.zig index f52b62c36..bf2d9943d 100644 --- a/pkg/apple-sdk/build.zig +++ b/pkg/apple-sdk/build.zig @@ -41,7 +41,7 @@ const SDK = struct { pub fn fromTarget(target: std.Target) !SDK { return switch (target.os.tag) { - .macos => .{ .platform = "MacOSX", .version = "14.2" }, + .macos => .{ .platform = "MacOSX", .version = "14" }, else => { std.log.err("unsupported os={}", .{target.os.tag}); return error.UnsupportedOS; From 5bca3a4044a4a25b983acb427a4251b15797f388 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 10 Jan 2024 09:34:49 -0800 Subject: [PATCH 9/9] pkg/apple-sdk: only exec to get xcode path once per build --- pkg/apple-sdk/build.zig | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/pkg/apple-sdk/build.zig b/pkg/apple-sdk/build.zig index bf2d9943d..62f1372c6 100644 --- a/pkg/apple-sdk/build.zig +++ b/pkg/apple-sdk/build.zig @@ -15,12 +15,16 @@ pub fn addPaths(b: *std.Build, m: *std.Build.Module) !void { const sdk = try SDK.fromTarget(m.resolved_target.?.result); // Get the path to our active Xcode installation. If this fails then - // the zig build will fail. - const path = std.mem.trim( - u8, - b.run(&.{ "xcode-select", "--print-path" }), - " \r\n", - ); + // 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; + }; // Base path const base = b.fmt("{s}/Platforms/{s}.platform/Developer/SDKs/{s}{s}.sdk", .{