aboutsummaryrefslogtreecommitdiff
path: root/vendor/libghostty-vt/src/build/GhosttyExe.zig
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-04-04 19:22:04 +0300
committerCan Celik <ogulcancelik@gmail.com>2026-04-05 01:23:06 +0300
commit41dd733ca7123c9ac4bfc6c781697a660e95b052 (patch)
tree3fc91815ca139ef2e0b281bba0abda4ef15175f4 /vendor/libghostty-vt/src/build/GhosttyExe.zig
parent55c138263e190a1e79d4b997bfb9397306c0ec1f (diff)
feat: finish ghostty pane backend integration
Diffstat (limited to 'vendor/libghostty-vt/src/build/GhosttyExe.zig')
-rw-r--r--vendor/libghostty-vt/src/build/GhosttyExe.zig127
1 files changed, 127 insertions, 0 deletions
diff --git a/vendor/libghostty-vt/src/build/GhosttyExe.zig b/vendor/libghostty-vt/src/build/GhosttyExe.zig
new file mode 100644
index 00000000..caa564bf
--- /dev/null
+++ b/vendor/libghostty-vt/src/build/GhosttyExe.zig
@@ -0,0 +1,127 @@
+const Ghostty = @This();
+
+const std = @import("std");
+const Config = @import("Config.zig");
+const SharedDeps = @import("SharedDeps.zig");
+
+/// The primary Ghostty executable.
+exe: *std.Build.Step.Compile,
+
+/// The install step for the executable.
+install_step: *std.Build.Step.InstallArtifact,
+
+pub fn init(b: *std.Build, cfg: *const Config, deps: *const SharedDeps) !Ghostty {
+ const exe: *std.Build.Step.Compile = b.addExecutable(.{
+ .name = "ghostty",
+ .root_module = b.createModule(.{
+ .root_source_file = b.path("src/main.zig"),
+ .target = cfg.target,
+ .optimize = cfg.optimize,
+ .strip = cfg.strip,
+ .omit_frame_pointer = cfg.strip,
+ .unwind_tables = if (cfg.strip) .none else .sync,
+ }),
+ // Crashes on x86_64 self-hosted on 0.15.1
+ .use_llvm = true,
+ });
+ const install_step = b.addInstallArtifact(exe, .{});
+
+ // Set PIE if requested
+ if (cfg.pie) exe.pie = true;
+
+ // Add the shared dependencies. When building only lib-vt we skip
+ // heavy deps so cross-compilation doesn't pull in GTK, etc.
+ if (!cfg.emit_lib_vt) _ = try deps.add(exe);
+
+ // Check for possible issues
+ try checkNixShell(exe, cfg);
+
+ // Patch our rpath if that option is specified.
+ if (cfg.patch_rpath) |rpath| {
+ if (rpath.len > 0) {
+ const run = std.Build.Step.Run.create(b, "patchelf rpath");
+ run.addArgs(&.{ "patchelf", "--set-rpath", rpath });
+ run.addArtifactArg(exe);
+ install_step.step.dependOn(&run.step);
+ }
+ }
+
+ // OS-specific
+ switch (cfg.target.result.os.tag) {
+ .windows => {
+ exe.subsystem = .Windows;
+ exe.addWin32ResourceFile(.{
+ .file = b.path("dist/windows/ghostty.rc"),
+ });
+ },
+
+ else => {},
+ }
+
+ return .{
+ .exe = exe,
+ .install_step = install_step,
+ };
+}
+
+/// Add the ghostty exe to the install target.
+pub fn install(self: *const Ghostty) void {
+ const b = self.install_step.step.owner;
+ b.getInstallStep().dependOn(&self.install_step.step);
+}
+
+/// If we're in NixOS but not in the shell environment then we issue
+/// a warning because the rpath may not be setup properly. This doesn't modify
+/// our build in any way but addresses a common build-from-source issue
+/// for a subset of users.
+fn checkNixShell(exe: *std.Build.Step.Compile, cfg: *const Config) !void {
+ // Non-Linux doesn't have rpath issues.
+ if (cfg.target.result.os.tag != .linux) return;
+
+ // When cross-compiling, we don't need to worry about matching our
+ // Nix shell rpath since the resulting binary will be run on a
+ // separate system.
+ if (!cfg.target.query.isNativeCpu()) return;
+ if (!cfg.target.query.isNativeOs()) return;
+
+ // Verify we're in NixOS
+ std.fs.accessAbsolute("/etc/NIXOS", .{}) catch return;
+
+ // If we're in a nix shell, not a problem
+ if (cfg.env.get("IN_NIX_SHELL") != null) return;
+
+ try exe.step.addError(
+ "\x1b[" ++ color_map.get("yellow").? ++
+ "\x1b[" ++ color_map.get("d").? ++
+ \\Detected building on and for NixOS outside of the Nix shell environment.
+ \\
+ \\The resulting ghostty binary will likely fail on launch because it is
+ \\unable to dynamically load the windowing libs (X11, Wayland, etc.).
+ \\We highly recommend running only within the Nix build environment
+ \\and the resulting binary will be portable across your system.
+ \\
+ \\To run in the Nix build environment, use the following command.
+ \\Append any additional options like (`-Doptimize` flags). The resulting
+ \\binary will be in zig-out as usual.
+ \\
+ \\ nix develop -c zig build
+ \\
+ ++
+ "\x1b[0m",
+ .{},
+ );
+}
+
+/// ANSI escape codes for colored log output
+const color_map = std.StaticStringMap([]const u8).initComptime(.{
+ &.{ "black", "30m" },
+ &.{ "blue", "34m" },
+ &.{ "b", "1m" },
+ &.{ "d", "2m" },
+ &.{ "cyan", "36m" },
+ &.{ "green", "32m" },
+ &.{ "magenta", "35m" },
+ &.{ "red", "31m" },
+ &.{ "white", "37m" },
+ &.{ "yellow", "33m" },
+});