//! Build options, available at comptime. Used to configure features. This //! will reproduce some of the fields from builtin and build_options just //! so we can limit the amount of imports we need AND give us the ability //! to shim logic and values into them later. const std = @import("std"); const builtin = @import("builtin"); const options = @import("build_options"); const assert = std.debug.assert; const apprt = @import("apprt.zig"); const font = @import("font/main.zig"); const rendererpkg = @import("renderer.zig"); const WasmTarget = @import("os/wasm/target.zig").Target; const BuildConfig = @import("build/Config.zig"); pub const ReleaseChannel = BuildConfig.ReleaseChannel; /// The semantic version of this build. pub const version = options.app_version; pub const version_string = options.app_version_string; /// The release channel for this build. pub const release_channel = std.meta.stringToEnum(ReleaseChannel, @tagName(options.release_channel)).?; /// The optimization mode as a string. pub const mode_string = mode: { const m = @tagName(builtin.mode); if (std.mem.lastIndexOfScalar(u8, m, '.')) |i| break :mode m[i..]; break :mode m; }; /// The artifact we're producing. This can be used to determine if we're /// building a standalone exe, an embedded lib, etc. pub const artifact = Artifact.detect(); /// Our build configuration. We re-export a lot of these back at the /// top-level so its a bit cleaner to use throughout the code. See the doc /// comments in BuildConfig for details on each. const config = BuildConfig.fromOptions(); pub const exe_entrypoint = config.exe_entrypoint; pub const flatpak = options.flatpak; pub const app_runtime: apprt.Runtime = config.app_runtime; pub const font_backend: font.Backend = config.font_backend; pub const renderer: rendererpkg.Impl = config.renderer; /// The bundle ID for the app. This is used in many places and is currently /// hardcoded here. We could make this configurable in the future if there /// is a reason to do so. /// /// On macOS, this must match the App bundle ID. We can get that dynamically /// via an API but I don't want to pay the cost of that at runtime. /// /// On GTK, this should match the various folders with resources. /// /// There are many places that don't use this variable so simply swapping /// this variable is NOT ENOUGH to change the bundle ID. I just wanted to /// avoid it in Zig coe as much as possible. pub const bundle_id = "com.mitchellh.ghostty"; /// True if we should have "slow" runtime safety checks. The initial motivation /// for this was terminal page/pagelist integrity checks. These were VERY /// slow but very thorough. But they made it so slow that the terminal couldn't /// be used for real work. We'd love to have an option to run a build with /// safety checks that could be used for real work. This lets us do that. pub const slow_runtime_safety = std.debug.runtime_safety and switch (builtin.mode) { .Debug => true, .ReleaseSafe, .ReleaseSmall, .ReleaseFast, => false, }; pub const Artifact = enum { /// Standalone executable exe, /// Embeddable library lib, /// The WASM-targeted module. wasm_module, pub fn detect() Artifact { if (builtin.target.cpu.arch.isWasm()) { assert(builtin.output_mode == .Obj); assert(builtin.link_mode == .Static); return .wasm_module; } return switch (builtin.output_mode) { .Exe => .exe, .Lib => .lib, else => { @compileLog(builtin.output_mode); @compileError("unsupported artifact output mode"); }, }; } };