Ghostty 如何为系统软件包制作离线构建并安装到指定 DESTDIR
【免费下载链接】ghostty👻 Ghostty is a fast, feature-rich, and cross-platform terminal emulator that uses platform-native UI and GPU acceleration.项目地址: https://gitcode.com/GitHub_Trending/gh/ghostty
当你要为发行版打包 Ghostty 时,通常需要在构建机上把构建过程和安装过程分离:构建机可能只有很短时间的网络窗口(甚至完全没有网络),而最终文件要落进一个暂存目录(DESTDIR),再由打包流程用mv或cp移入包管理器的预期位置。PACKAGING.md 给出了面向系统软件包维护者的标准做法:先用一个脚本把全部构建依赖拉进本地离线缓存,再用zig build --system指向该缓存完成不联网的构建,并通过DESTDIR环境变量控制安装位置。
需要注意的是,PACKAGING.md 开头明确声明:该文档只对与其同处一份 Ghostty 源码的版本有效,不要拿它去构建其他版本的 Ghostty。
准备条件
- 使用 source tarball,而不是 Git checkout。打包时推荐使用官方发布的源码包:带稳定校验和的 tarball 为 tag 版本提供,格式为
release.files.ghostty.org/VERSION/ghostty-VERSION.tar.gz,其中VERSION是不带前缀的版本号(如1.0.0),同时提供.minisig签名文件,使用 minisign 签名,公钥为RWQlAjJC23149WL2sEpT/l0QKy7hMIFhYdQOFy0Z7z7PbneUgvlsnYcV。如果一定要用 Git checkout,文档提示步骤相同,但可能需要本文没有列出的额外依赖。 - 安装 Ghostty 要求的 Zig 版本。构建 Ghostty 必须使用与当前版本匹配的已发布 Zig 版本。查版本的方法是查看 build.zig 中相关的
required_zig常量(文档举例时 Ghostty 要求 Zig 0.14.0,具体以你所构建的源码树中实际写明的值为准)。 - 构建机上准备好一个可写的临时目录用于缓存和
DESTDIR,文档示例中分别使用/tmp/offline-cache和/tmp/ghostty。
第一步:联网拉取依赖到离线缓存
这是整个流程中唯一需要互联网访问的步骤:
ZIG_GLOBAL_CACHE_DIR=/tmp/offline-cache ./nix/build-support/fetch-zig-cache.sh这条命令的工作方式是:ZIG_GLOBAL_CACHE_DIR告诉 Zig 把下载包放入/tmp/offline-cache,脚本本身则逐行读取 build.zig.zon.txt 中列出的依赖 URL,对每一行执行zig fetch。
执行 nix/build-support/fetch-zig-cache.sh 时有两个判断依据:
- 脚本开头检查
ZIG_GLOBAL_CACHE_DIR是否已设置,未设置会直接报错must set ZIG_GLOBAL_CACHE_DIR!并以退出码 1 结束; - 任一行依赖拉取失败时,脚本向 stderr 输出
Failed to fetch: <url>并退出。
脚本头部的注释说明这是一个临时机制:目前zig build --fetch还不能拉取传递依赖,等该问题在 Zig 中修复后,维护者可以改直接用zig build --fetch。
第二步:离线构建并安装到 DESTDIR
缓存就绪后,构建步骤不再需要互联网:
DESTDIR=/tmp/ghostty \ zig build \ --prefix /usr \ --system /tmp/offline-cache/p \ -Doptimize=ReleaseFast \ -Dcpu=baseline各部分的用途:
DESTDIR=/tmp/ghostty配合--prefix /usr:最终文件被安装到/tmp/ghostty下,二进制位于/tmp/ghostty/usr/bin/ghostty。这种"构建和安装分离"的方式正是系统包常用的模式,后续安装步骤可以直接对该目录做mv或cp。--system /tmp/offline-cache/p:指向离线缓存目录,从此禁用一切从互联网拉取包的行为。该标志还会默认让所有依赖走动态链接,并默认把二进制构建成 PIE(Position Independent Executable),需要覆盖时用-Dpie。-Doptimize=ReleaseFast:开启优化并禁用安全检查,是文档推荐的发行构建模式(文档说明安全构建对这类性能敏感的程序当前太慢)。其他可用模式还有Debug、ReleaseSafe、ReleaseSmall。-Dcpu=baseline:按目标架构的"baseline" CPU 构建,避免使用并非所有目标机器都具备的较新 CPU 特性。
所有可用的构建选项可以用zig build --help查看全部。
需要指定目标三元组时
如果系统包需要声明特定的最低 Linux 版本、glibc 版本等,追加目标三元组:
-Dtarget=$arch-$os-$abi$arch-$os-$abi是文档中的模板写法,需要用实际的架构/系统/ABI 组合替换;运行zig targets可以获取完整的目标列表。
结果验证
- 构建成功后,检查
/tmp/ghostty/usr/bin/ghostty是否存在(文档示例中DESTDIR=/tmp/ghostty、--prefix /usr组合下的预期位置)。存在即可进入打包阶段,把/tmp/ghostty下的内容移入包管理器预期位置。 - 依赖拉取阶段若出现
Failed to fetch: <url>,说明网络窗口内该依赖没拉全,需要回到第一步重新执行缓存脚本。
限制说明
--system除了断开网络依赖外,还会默认改变链接方式(动态链接)和可执行属性(PIE),如果你要静态链接或非 PIE 产物,需要用-Dpie等选项显式覆盖。- 本文路径只覆盖 Linux 发行版场景下的系统包构建方式;文档中另有 libghostty-vt 的 WebAssembly 打包说明(
zig build -Demit-lib-vt -Dtarget=wasm32-freestanding -Doptimize=ReleaseSmall,产物为zig-out/bin/ghostty-vt.wasm),那是给浏览器和 wasm 运行时的打包者用的,与 DESTDIR 式的系统包流程相互独立。
【免费下载链接】ghostty👻 Ghostty is a fast, feature-rich, and cross-platform terminal emulator that uses platform-native UI and GPU acceleration.项目地址: https://gitcode.com/GitHub_Trending/gh/ghostty
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考