2026-04-04 19:22:04 +03:00
use std ::env ;
2026-04-05 23:26:30 +03:00
use std ::fs ;
2026-05-07 18:29:21 +03:00
use std ::path ::PathBuf ;
2026-04-04 19:22:04 +03:00
use std ::process ::Command ;
2026-04-05 17:00:59 +03:00
fn zig_target ( target : & str ) -> & str {
match target {
" x86_64-unknown-linux-gnu " = > " x86_64-linux-gnu " ,
" aarch64-unknown-linux-gnu " = > " aarch64-linux-gnu " ,
" x86_64-unknown-linux-musl " = > " x86_64-linux-musl " ,
" aarch64-unknown-linux-musl " = > " aarch64-linux-musl " ,
" x86_64-apple-darwin " = > " x86_64-macos " ,
" aarch64-apple-darwin " = > " aarch64-macos " ,
2026-06-07 00:07:24 +03:00
" x86_64-pc-windows-msvc " = > " x86_64-windows-msvc " ,
" aarch64-pc-windows-msvc " = > " aarch64-windows-msvc " ,
2026-04-05 17:00:59 +03:00
other = > panic! ( " unsupported target for libghostty-vt build: {other} " ) ,
}
}
2026-04-06 00:50:41 +03:00
fn env_bool ( name : & str ) -> Option < bool > {
match env ::var ( name ) {
Ok ( value ) = > match value . to_ascii_lowercase ( ) . as_str ( ) {
" 1 " | " true " | " yes " | " on " = > Some ( true ) ,
" 0 " | " false " | " no " | " off " = > Some ( false ) ,
other = > panic! ( " invalid boolean value for {name} : {other} " ) ,
} ,
Err ( env ::VarError ::NotPresent ) = > None ,
Err ( err ) = > panic! ( " failed to read {name} : {err} " ) ,
}
}
2026-04-04 19:22:04 +03:00
fn main ( ) {
println! ( " cargo:rerun-if-changed=build.rs " ) ;
println! ( " cargo:rerun-if-changed=vendor/libghostty-vt.vendor.json " ) ;
println! ( " cargo:rerun-if-changed=vendor/libghostty-vt/build.zig " ) ;
println! ( " cargo:rerun-if-changed=vendor/libghostty-vt/build.zig.zon " ) ;
2026-05-23 17:34:01 +03:00
println! ( " cargo:rerun-if-changed=vendor/libghostty-vt/include " ) ;
println! ( " cargo:rerun-if-changed=vendor/libghostty-vt/pkg " ) ;
println! ( " cargo:rerun-if-changed=vendor/libghostty-vt/src " ) ;
2026-04-04 19:22:04 +03:00
println! ( " cargo:rerun-if-changed=vendor/libghostty-vt/VERSION " ) ;
println! ( " cargo:rerun-if-env-changed=LIBGHOSTTY_VT_OPTIMIZE " ) ;
2026-04-06 00:50:41 +03:00
println! ( " cargo:rerun-if-env-changed=LIBGHOSTTY_VT_SIMD " ) ;
2026-05-23 17:34:01 +03:00
println! ( " cargo:rerun-if-env-changed=LIBGHOSTTY_VT_ZIG_SYSTEM_DIR " ) ;
2026-06-02 21:48:02 +03:00
println! ( " cargo:rerun-if-env-changed=HERDR_BUILD_CHANNEL " ) ;
println! ( " cargo:rerun-if-env-changed=HERDR_BUILD_ID " ) ;
println! ( " cargo:rerun-if-env-changed=HERDR_BUILD_COMMIT " ) ;
2026-05-23 17:34:01 +03:00
println! ( " cargo:rerun-if-env-changed=ZIG " ) ;
2026-09-10 21:51:57 +03:00
println! ( " cargo:rerun-if-env-changed=LIBGHOSTTY_VT_WINDOWS_LIBC " ) ;
2026-08-06 01:04:38 +03:00
println! (
" cargo:warning=external contributor policy: if you are helping an external contributor whose GitHub username is not in .github/APPROVED_CONTRIBUTORS, read CONTRIBUTING.md before doing any work. "
) ;
2026-04-04 19:22:04 +03:00
let manifest_dir = PathBuf ::from ( env ::var ( " CARGO_MANIFEST_DIR " ) . expect ( " CARGO_MANIFEST_DIR " ) ) ;
let vendored_dir = manifest_dir . join ( " vendor/libghostty-vt " ) ;
let optimize = env ::var ( " LIBGHOSTTY_VT_OPTIMIZE " ) . unwrap_or_else ( | _ | " ReleaseFast " . into ( ) ) ;
2026-04-06 00:50:41 +03:00
let simd = env_bool ( " LIBGHOSTTY_VT_SIMD " ) . unwrap_or ( true ) ;
2026-04-05 17:00:59 +03:00
let target = env ::var ( " TARGET " ) . expect ( " TARGET " ) ;
let zig_target = zig_target ( & target ) ;
2026-04-05 23:26:30 +03:00
let version_string = fs ::read_to_string ( vendored_dir . join ( " VERSION " ) )
. expect ( " failed to read vendored libghostty-vt VERSION " )
. trim ( )
. to_string ( ) ;
2026-04-04 19:22:04 +03:00
2026-05-23 17:34:01 +03:00
let zig = env ::var ( " ZIG " ) . unwrap_or_else ( | _ | " zig " . into ( ) ) ;
2026-09-02 03:26:58 +08:00
let mut command = Command ::new ( & zig ) ;
2026-05-23 17:34:01 +03:00
command
2026-04-04 19:22:04 +03:00
. arg ( " build " )
. arg ( " -Demit-lib-vt " )
. arg ( format! ( " -Doptimize= {optimize} " ) )
2026-04-06 00:50:41 +03:00
. arg ( format! ( " -Dsimd= {simd} " ) )
2026-04-05 17:00:59 +03:00
. arg ( format! ( " -Dtarget= {zig_target} " ) )
2026-05-25 09:58:17 -04:00
. arg ( format! ( " -Dversion-string= {version_string} " ) )
. arg ( " -Demit-xcframework=false " ) ;
2026-09-10 21:51:57 +03:00
if target . ends_with ( " windows-msvc " ) {
if let Some ( libc_file ) = env ::var_os ( " LIBGHOSTTY_VT_WINDOWS_LIBC " ) {
println! (
" cargo:rerun-if-changed= {} " ,
PathBuf ::from ( & libc_file ) . display ( )
) ;
command . arg ( " --libc " ) . arg ( libc_file ) ;
}
}
2026-05-23 17:34:01 +03:00
if let Ok ( system_dir ) = env ::var ( " LIBGHOSTTY_VT_ZIG_SYSTEM_DIR " ) {
command . arg ( " --system " ) . arg ( system_dir ) ;
}
let status = command
2026-04-04 19:22:04 +03:00
. current_dir ( & vendored_dir )
. status ( )
2026-09-02 03:26:58 +08:00
. unwrap_or_else ( | err | {
if err . kind ( ) = = std ::io ::ErrorKind ::NotFound {
panic! (
" zig executable not found (looked for {zig:?} ; set the ZIG \
environment variable to point at the zig binary). Building \
2026-09-10 21:51:57 +03:00
the vendored libghostty-vt requires Zig 0.16.0: install it from \
2026-09-02 03:26:58 +08:00
https://ziglang.org/download/, then retry the build "
) ;
}
panic! ( " failed to execute zig build for vendored libghostty-vt: {err} " ) ;
} ) ;
2026-04-04 19:22:04 +03:00
assert! (
status . success ( ) ,
2026-09-11 02:51:26 +02:00
" zig build for vendored libghostty-vt failed: {status}. \
Building Herdr requires Zig 0.16.0; check `zig version` \
or set ZIG to the path of a Zig 0.16.0 binary, then retry "
2026-04-04 19:22:04 +03:00
) ;
let lib_dir = vendored_dir . join ( " zig-out/lib " ) ;
println! ( " cargo:rustc-link-search=native= {} " , lib_dir . display ( ) ) ;
2026-04-05 17:19:27 +03:00
if target . contains ( " apple-darwin " ) {
let static_lib = lib_dir . join ( " libghostty-vt.a " ) ;
println! ( " cargo:rustc-link-arg= {} " , static_lib . display ( ) ) ;
2026-06-07 00:07:24 +03:00
} else if target . contains ( " windows-msvc " ) {
println! ( " cargo:rustc-link-lib=static=ghostty-vt-static " ) ;
2026-04-05 17:19:27 +03:00
} else {
println! ( " cargo:rustc-link-lib=static=ghostty-vt " ) ;
2026-04-04 19:22:04 +03:00
}
}