Commit 5389d30

Eric Bower  ·  2026-04-26 22:48:18 -0400 EDT
parent b79c8c7
feat: cross-compile from linux to mac

Latest version of libghostty now supports cross-compiling without needing
Apple sdk tools.
3 files changed,  +32, -36
+17, -21
......@@ -36,15 +36,14 @@ pub fn build(b: *std.Build) void {
3636 });
3737 exe_mod.addOptions("build_options", options);
3838
39- if (b.lazyDependency("ghostty", .{
39+ const dep = b.dependency("ghostty", .{
4040 .target = target,
4141 .optimize = optimize,
42- })) |dep| {
43- exe_mod.addImport(
44- "ghostty-vt",
45- dep.module("ghostty-vt"),
46- );
47- }
42+ });
43+ exe_mod.addImport(
44+ "ghostty-vt",
45+ dep.module("ghostty-vt"),
46+ );
4847
4948 // Run
5049 {
......@@ -69,15 +68,14 @@ pub fn build(b: *std.Build) void {
6968 .target = target,
7069 .optimize = optimize,
7170 });
72- if (b.lazyDependency("ghostty", .{
71+ const test_dep = b.dependency("ghostty", .{
7372 .target = target,
7473 .optimize = optimize,
75- })) |dep| {
76- test_module.addImport(
77- "ghostty-vt",
78- dep.module("ghostty-vt"),
79- );
80- }
74+ });
75+ test_module.addImport(
76+ "ghostty-vt",
77+ test_dep.module("ghostty-vt"),
78+ );
8179 const exe_unit_tests = b.addTest(.{
8280 .root_module = test_module,
8381 });
......@@ -108,15 +106,13 @@ pub fn build(b: *std.Build) void {
108106 check.dependOn(&exe_check.step);
109107 }
110108
111- // Release step - macOS can cross-compile to Linux,
112- // but Linux cannot cross-compile to macOS (needs SDK)
109+ // Release step - cross-compile to all targets from any host
113110 {
114111 const release_step = b.step(
115112 "release",
116- "Build release binaries (macOS builds all, Linux builds Linux only)",
113+ "Build release binaries for all platforms",
117114 );
118- const native_os = @import("builtin").os.tag;
119- const release_targets = if (native_os == .macos) linux_targets ++ macos_targets else linux_targets;
115+ const release_targets = linux_targets ++ macos_targets;
120116 for (release_targets) |release_target| {
121117 const resolved = b.resolveTargetQuery(release_target);
122118 const release_mod = b.createModule(.{
......@@ -129,8 +125,8 @@ pub fn build(b: *std.Build) void {
129125 if (b.lazyDependency("ghostty", .{
130126 .target = resolved,
131127 .optimize = .ReleaseSafe,
132- })) |dep| {
133- release_mod.addImport("ghostty-vt", dep.module("ghostty-vt"));
128+ })) |release_dep| {
129+ release_mod.addImport("ghostty-vt", release_dep.module("ghostty-vt"));
134130 }
135131
136132 const release_exe = b.addExecutable(.{
+2, -2
......@@ -1135,7 +1135,7 @@ const Daemon = struct {
11351135 }
11361136
11371137 pub fn handleOutput(self: *Daemon, payload: []const u8, vt_stream: anytype) !void {
1138- try vt_stream.nextSlice(payload);
1138+ vt_stream.nextSlice(payload);
11391139 self.has_pty_output = true;
11401140 for (self.clients.items) |client| {
11411141 try ipc.appendMessage(self.alloc, &client.write_buf, .Output, payload);
......@@ -2417,7 +2417,7 @@ fn daemonLoop(daemon: *Daemon, server_sock_fd: i32, pty_fd: i32) !void {
24172417 break :daemon_loop;
24182418 } else {
24192419 // Feed PTY output to terminal emulator for state tracking
2420- try vt_stream.nextSlice(buf[0..n]);
2420+ vt_stream.nextSlice(buf[0..n]);
24212421 daemon.has_pty_output = true;
24222422
24232423 // When no real terminal client has attached yet, respond to
+13, -13
......@@ -980,9 +980,9 @@ test "serializeTerminalState excludes synchronized output replay" {
980980 var stream = term.vtStream();
981981 defer stream.deinit();
982982
983- try stream.nextSlice("\x1b[?2004h"); // Bracketed paste
984- try stream.nextSlice("\x1b[?2026h"); // Synchronized output
985- try stream.nextSlice("hello");
983+ stream.nextSlice("\x1b[?2004h"); // Bracketed paste
984+ stream.nextSlice("\x1b[?2026h"); // Synchronized output
985+ stream.nextSlice("hello");
986986
987987 try testing.expect(term.modes.get(.bracketed_paste));
988988 try testing.expect(term.modes.get(.synchronized_output));
......@@ -1005,7 +1005,7 @@ fn testCreateTerminal(alloc: std.mem.Allocator, cols: u16, rows: u16, vt_data: [
10051005 if (vt_data.len > 0) {
10061006 var stream = term.vtStream();
10071007 defer stream.deinit();
1008- try stream.nextSlice(vt_data);
1008+ stream.nextSlice(vt_data);
10091009 }
10101010 return term;
10111011 }
......@@ -1036,7 +1036,7 @@ fn serializeRoundtrip(alloc: std.mem.Allocator, source: *ghostty_vt.Terminal) !g
10361036 });
10371037 var stream = dest.vtStream();
10381038 defer stream.deinit();
1039- try stream.nextSlice(serialized);
1039+ stream.nextSlice(serialized);
10401040 return dest;
10411041 }
10421042
......@@ -1107,11 +1107,11 @@ test "serializeTerminalState with scrollback preserves visible content" {
11071107 var buf: [32]u8 = undefined;
11081108 for (0..80) |i| {
11091109 const line = std.fmt.bufPrint(&buf, "SCROLL_{d}\r\n", .{i}) catch unreachable;
1110- try stream.nextSlice(line);
1110+ stream.nextSlice(line);
11111111 }
11121112
11131113 // Clear screen and place markers at specific positions
1114- try stream.nextSlice("\x1b[2J" ++
1114+ stream.nextSlice("\x1b[2J" ++
11151115 "\x1b[2;5HMARK_A" ++
11161116 "\x1b[6;15HMARK_B" ++
11171117 "\x1b[10;30HMARK_C" ++
......@@ -1149,9 +1149,9 @@ test "serializeTerminalState nested roundtrip preserves content" {
11491149 var buf: [32]u8 = undefined;
11501150 for (0..60) |i| {
11511151 const line = std.fmt.bufPrint(&buf, "SCROLL_{d}\r\n", .{i}) catch unreachable;
1152- try inner_stream.nextSlice(line);
1152+ inner_stream.nextSlice(line);
11531153 }
1154- try inner_stream.nextSlice("\x1b[2J" ++
1154+ inner_stream.nextSlice("\x1b[2J" ++
11551155 "\x1b[3;10HINNER_A" ++
11561156 "\x1b[12;25HINNER_B" ++
11571157 "\x1b[20;5H");
......@@ -1173,7 +1173,7 @@ test "serializeTerminalState nested roundtrip preserves content" {
11731173 {
11741174 var outer_stream = outer.vtStream();
11751175 defer outer_stream.deinit();
1176- try outer_stream.nextSlice(inner_serialized);
1176+ outer_stream.nextSlice(inner_serialized);
11771177 }
11781178
11791179 // Serialize outer (simulates outer daemon re-attach after detach)
......@@ -1240,9 +1240,9 @@ test "serializeTerminalState scrollback + size mismatch nested roundtrip" {
12401240 var buf: [32]u8 = undefined;
12411241 for (0..80) |i| {
12421242 const line = std.fmt.bufPrint(&buf, "LINE_{d}\r\n", .{i}) catch unreachable;
1243- try inner_stream.nextSlice(line);
1243+ inner_stream.nextSlice(line);
12441244 }
1245- try inner_stream.nextSlice("\x1b[2J" ++
1245+ inner_stream.nextSlice("\x1b[2J" ++
12461246 "\x1b[3;10HSTRESS_A" ++
12471247 "\x1b[12;25HSTRESS_B" ++
12481248 "\x1b[16;20H");
......@@ -1264,7 +1264,7 @@ test "serializeTerminalState scrollback + size mismatch nested roundtrip" {
12641264 {
12651265 var outer_stream = outer.vtStream();
12661266 defer outer_stream.deinit();
1267- try outer_stream.nextSlice(inner_ser);
1267+ outer_stream.nextSlice(inner_ser);
12681268 }
12691269
12701270 var client = try serializeRoundtrip(alloc, &outer);