95 lines
3.4 KiB
Zig
95 lines
3.4 KiB
Zig
const std = @import("std");
|
|
|
|
/// Options set by Zig build.zig and exposed via `terminal_options`.
|
|
pub const Options = struct {
|
|
pub const Artifact = enum {
|
|
/// Ghostty application
|
|
ghostty,
|
|
|
|
/// libghostty-vt, Zig module
|
|
lib,
|
|
};
|
|
|
|
/// The target artifact to build. This will gate some functionality.
|
|
artifact: Artifact,
|
|
|
|
/// Whether Oniguruma regex support is available. If this isn't
|
|
/// available, some features will be disabled. This may be outdated,
|
|
/// but the specific disabled features are:
|
|
///
|
|
/// - Kitty graphics protocol
|
|
/// - Tmux control mode
|
|
///
|
|
oniguruma: bool,
|
|
|
|
/// Whether to build SIMD-accelerated code paths. This pulls in more
|
|
/// build-time dependencies and adds libc as a runtime dependency,
|
|
/// but results in significant performance improvements.
|
|
simd: bool,
|
|
|
|
/// True if we should enable the "slow" runtime safety checks. These
|
|
/// are runtime safety checks that are slower than typical and should
|
|
/// generally be disabled in production builds.
|
|
slow_runtime_safety: bool,
|
|
|
|
/// Force C ABI mode on or off. If not set, then it will be set based on
|
|
/// Options.
|
|
c_abi: bool,
|
|
|
|
/// The version of the application.
|
|
version: std.SemanticVersion,
|
|
|
|
/// Add the required build options for the terminal module.
|
|
///
|
|
/// The memory referenced by self is expected to stick around (it isn't
|
|
/// copied), since we expect we're in a build environment.
|
|
pub fn add(
|
|
self: Options,
|
|
b: *std.Build,
|
|
m: *std.Build.Module,
|
|
) void {
|
|
const opts = b.addOptions();
|
|
opts.addOption(Artifact, "artifact", self.artifact);
|
|
opts.addOption(bool, "c_abi", self.c_abi);
|
|
opts.addOption(bool, "oniguruma", self.oniguruma);
|
|
opts.addOption(bool, "simd", self.simd);
|
|
opts.addOption(bool, "slow_runtime_safety", self.slow_runtime_safety);
|
|
|
|
// Kitty graphics is almost always true. This used to be conditional on
|
|
// some other factors but we've since generalized the implementation
|
|
// to support optional PNG decoding, OS capabilities like filesystems,
|
|
// etc. So its safe to always enable it and just have the
|
|
// implementation deal with unsupported features as needed.
|
|
//
|
|
// We disable it on wasm32-freestanding because we at the least
|
|
// require the ability to get timestamps and there is no way to
|
|
// do that with freestanding targets.
|
|
const target = m.resolved_target.?.result;
|
|
opts.addOption(
|
|
bool,
|
|
"kitty_graphics",
|
|
!(target.cpu.arch == .wasm32 and target.os.tag == .freestanding),
|
|
);
|
|
|
|
// These are synthesized based on other options.
|
|
opts.addOption(bool, "tmux_control_mode", self.oniguruma);
|
|
|
|
// Version information.
|
|
opts.addOption(
|
|
[]const u8,
|
|
"version_string",
|
|
b.fmt(
|
|
"{f}",
|
|
.{self.version},
|
|
),
|
|
);
|
|
opts.addOption(usize, "version_major", self.version.major);
|
|
opts.addOption(usize, "version_minor", self.version.minor);
|
|
opts.addOption(usize, "version_patch", self.version.patch);
|
|
opts.addOption(?[]const u8, "version_pre", self.version.pre);
|
|
opts.addOption(?[]const u8, "version_build", self.version.build);
|
|
|
|
m.addOptions("terminal_options", opts);
|
|
}
|
|
};
|