Debian sid環境でGhosttyをbuild

最近1.0.0がリリースされ話題になっているGhosttyというターミナルエミュレータがあります．最近Debian sid amd64環境のAlacrittyの上でNeovim+iBus Mozcで日本語入力時に遅延して?日本語が入力されて使い物にならないのもあり試してみようと思いました．(mltermだと大丈夫)

Ghostty

Debianで次回に動くバイナリは提供されていません．Ubuntuについては第三者がパッケージを提供されています．(apt sourcesは無い)

Binaries and Packages – Install

mkasberg/ghostty-ubuntu: Ubuntu (.deb) packages for Ghostty

恐らくUbuntu版はDebianでも動作すると思いますがsourceからBuildしてみました．少し嵌ったのでメモしておきます．

手順は以下に書かれています．

Build from Source – Install

関連パッケージの導入

$ sudo apt install libgtk-4-dev libadwaita-1-dev git

zigの導入

$ wget2 -c -v https://ziglang.org/download/0.13.0/zig-linux-x86_64-0.13.0.tar.xz \
https://ziglang.org/download/0.13.0/zig-linux-x86_64-0.13.0.tar.xz.minisig
zig-linux-x86_64-0.1 100% [============================================================================================================================================>] 325 --.-KB/s
zig-linux-x86_64-0.1 100% [============================================================================================================================================>] 44.90M 761.78KB/s
[Files: 2 Bytes: 44.90M [553.07KB/s] Redirects: 0 Todo: 0 Errors: 0
$ minisign -Vm ./zig-linux-x86_64-0.13.0.tar.xz -P 'RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U'
Signature and comment signature verified
Trusted comment: timestamp:1717729444 file:zig-linux-x86_64-0.13.0.tar.xz hashed

zigをfuse-archiveでmount(もしくはtar xfで展開)

$ fuse-archive ./zig-linux-x86_64-0.13.0.tar.xz

Ghosttyのsource入手

$ git clone https://github.com/ghostty-org/ghostty
$ cd ghostty

Note

fontなんかも同梱されていて結構サイズが大きく --depth=1 でもcloneに失敗するのでリモートでcloneしてrsyncしました．releasesのsource archiveから入手してもいいかもしれません．

細い回線でgit cloneに失敗 – matoken’s meme

zigにPATHを通してGhosttyのbuild

$ PATH=~/Downloads/zig-linux-x86_64-0.13.0/zig-linux-x86_64-0.13.0/:$PATH \
zig build -Doptimize=ReleaseFast
$ ls zig-out/bin/ghostty
zig-out/bin/ghostty

Note

build時に以下のメッセージで数時間経っても進まなくなりました．Ctrl+cで中断して再度実行することで進みました．恐らく回線の問題．

Compile Build Script
└─ [53/46] Fetch Packages
├─ wuffs
└─ iterm2_themes

Ghosttyを実行…… Segmentation fault

$ zig-out/bin/ghostty
info: ghostty version=1.0.2-main+60611b8
info: ghostty build optimize=ReleaseFast
info: runtime=apprt.Runtime.gtk
info: font_backend=font.main.Backend.fontconfig_freetype
info: dependency harfbuzz=8.4.0
info: dependency fontconfig=21402
info: renderer=renderer.OpenGL
info: libxev backend=main.Backend.io_uring
info(os): setlocale from env result=ja_JP.UTF-8
info(gtk): GTK version build=4.16.7 runtime=4.16.7
info(config): creating template config file: path=/home/matoken/.config/ghostty/config
warning(config): error creating template config file err=error.FileNotFound
info(config): default shell source=env value=/bin/bash
warning(sentry): crash report written to disk path=/home/matoken/.local/state/ghostty/crash/68ce5038-f588-4d61-ef88-4217099bbfc4.ghosttycrash
EGL API version 1.5 found
- Vendor: Mesa Project
- Version: 1.5
- Device: /dev/dri/renderD128, 226 128
- Client APIs: OpenGL OpenGL_ES
- Extensions:
EGL_ANDROID_blob_cache
EGL_ANDROID_native_fence_sync
EGL_ANGLE_sync_control_rate
EGL_CHROMIUM_sync_control
EGL_EXT_buffer_age
EGL_EXT_config_select_group
EGL_EXT_create_context_robustness
EGL_EXT_image_dma_buf_import
EGL_EXT_image_dma_buf_import_modifiers
EGL_EXT_pixel_format_float
EGL_EXT_query_reset_notification_strategy
EGL_EXT_surface_compression
EGL_EXT_swap_buffers_with_damage
EGL_IMG_context_priority
EGL_KHR_cl_event2
EGL_KHR_config_attribs
EGL_KHR_context_flush_control
EGL_KHR_create_context
EGL_KHR_create_context_no_error
EGL_KHR_fence_sync
EGL_KHR_get_all_proc_addresses
EGL_KHR_gl_colorspace
EGL_KHR_gl_renderbuffer_image
EGL_KHR_gl_texture_2D_image
EGL_KHR_gl_texture_3D_image
EGL_KHR_gl_texture_cubemap_image
EGL_KHR_image
EGL_KHR_image_base
EGL_KHR_image_pixmap
EGL_KHR_no_config_context
EGL_KHR_reusable_sync
EGL_KHR_surfaceless_context
EGL_KHR_swap_buffers_with_damage
EGL_KHR_wait_sync
EGL_MESA_configless_context
EGL_MESA_drm_image
EGL_MESA_gl_interop
EGL_MESA_image_dma_buf_export
EGL_MESA_query_driver
EGL_MESA_x11_native_visual_id
EGL_NOK_texture_from_pixmap
EGL_WL_bind_wayland_display
- Selected fbconfig: R8G8B8A8, depth 0, stencil 0
high depth: none
Creating EGL context version 3.2 (debug:no, forward:no, legacy:no, es:no)
Using OpenGL backend EGL
info(gtk): libadwaita version build=1.6.2 runtime=1.6.2
error(gtk): Read method failed: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such interface “org.freedesktop.portal.Settings” on object at path /org/freedesktop/portal/desktop
Creating EGL context version 3.2 (debug:no, forward:no, legacy:no, es:no)
OpenGL version: 4.6 (core)
GLSL version: 4.60
Max texture size: 16384
Enabled features (use GDK_GL_DISABLE env var to disable):
debug: ✓
unpack-subimage: ✓
half-float: ✓
sync: ✓
base-instance: ✓
buffer-storage: ✓
OpenGL version: 4.6 (core)
GLSL version: 4.60
Max texture size: 16384
Enabled features (use GDK_GL_DISABLE env var to disable):
debug: ✓
unpack-subimage: ✓
half-float: ✓
sync: ✓
base-instance: ✓
buffer-storage: ✓

(ghostty:3475525): Gtk-WARNING **: 02:44:03.441: GtkImage 0x31a0b830 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.441: GtkImage 0x31a09b60 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.441: GtkImage 0x319c7740 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.442: GtkImage 0x31a79170 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.442: GtkImage 0x31a754f0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.442: GtkImage 0x31a7b370 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.443: GtkImage 0x318aed70 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.443: GtkImage 0x31a812a0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.443: GtkImage 0x31a80400 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.444: GtkImage 0x31a83150 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.444: GtkImage 0x319bb340 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.455: GtkImage 0x33e3da10 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.
Creating EGL context version 3.3 (debug:no, forward:no, legacy:no, es:no)
OpenGL version: 4.6 (core)
GLSL version: 4.60
Max texture size: 16384
Enabled features (use GDK_GL_DISABLE env var to disable):
debug: ✓
unpack-subimage: ✓
half-float: ✓
sync: ✓
base-instance: ✓
buffer-storage: ✓
info(grid): loaded OpenGL 4.6
info(io_exec): found Ghostty resources dir: /home/matoken/src/ghostty/zig-out/share/ghostty
info(io_exec): shell integration automatically injected shell=termio.shell_integration.Shell.bash
warning(gtk): unimplemented action=apprt.action.Action.Key.cell_size
warning(gtk): unimplemented action=apprt.action.Action.Key.size_limit
info(io_exec): started subcommand path=/bin/sh pid=3475569
info(io_exec): subcommand cgroup=-
error(gtk): Read method failed: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such interface “org.freedesktop.portal.Settings” on object at path /org/freedesktop/portal/desktop

(ghostty:3475525): Gtk-WARNING **: 02:44:03.490: GtkImage 0x33e52760 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.498: GtkImage 0x31a7b370 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.498: GtkImage 0x342b77c0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.498: GtkImage 0x342b84c0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.498: GtkImage 0x31a7f490 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.498: GtkImage 0x31a80400 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.499: GtkImage 0x31a821f0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x31a7b370 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x342b77c0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x342b84c0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x33e52760 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x31a7f490 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x31a80400 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x31a821f0 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.506: GtkImage 0x33e3da10 reported baselines of minimum -2147483648 and natural -2147483648, but sizes of minimum 16 and natural 16. Baselines must be inside the widget size.

(ghostty:3475525): Gtk-WARNING **: 02:44:03.509: fb setup not supported (8cd6)

(ghostty:3475525): Gtk-WARNING **: 02:44:03.524: fb setup not supported (8cd6)

(ghostty:3475525): Gtk-WARNING **: 02:44:03.550: fb setup not supported (8cd6)

(ghostty:3475525): GLib-GObject-CRITICAL **: 02:44:03.634: g_object_ref: assertion 'G_IS_OBJECT (object)' failed

(ghostty:3475525): GLib-GObject-CRITICAL **: 02:44:03.634: g_object_ref: assertion 'G_IS_OBJECT (object)' failed
Segmentation fault

Segmentation faultになってしまいます．エラーメッセージで検索して以下のIssueを見つけました．

Dupe, best guess currently is a GTK bug. Please search to find similar discussions (not issues).

— Fail to run binary on Debian/Cinnamon · Issue #3370 · ghostty-org/ghostty

GTKのbugではとのことですがUbuntu版があるのでそちらではどうなってるのだろうと.debを入手して試してみます．

Ubuntu向けGhosttyの.debを入手してarchiveをmountして実行

$ wget2 -c -v https://github.com/mkasberg/ghostty-ubuntu/releases/download/1.0.1-0-ppa1/ghostty_1.0.1-0.ppa1_amd64_24.10.deb (1)
0 files 0% [<=> ] 0 B/s
[Files: 0 Bytes: 0 [0 B/s] Redirects: 1 Todo: 0 Errors: 1
$ fuse-archive ghostty_1.0.1-0.ppa1_amd64_24.10.deb (2)
fuse-archive: Created mount point 'ghostty_1.0.1-0.ppa1_amd64_24.10'
$ fuse-archive ghostty_1.0.1-0.ppa1_amd64_24.10/data.tar.zst ~/fuse/tmp (3)
fuse-archive: Using existing mount point '/home/matoken/fuse/tmp'
$ /home/matoken/fuse/tmp/usr/bin/ghostty (4)

一番環境の近そうなUbuntu 22.10 amd64版を入手

fuse-archiveでmount(もしくはunarコマンドなどで展開)

fuse-archiveで適当な場所にdata.tarをmount(もしくはtar xfなどで展開)

Ghosttyを実行

Ubuntu向けGhosttyは起動しました．
debian/patchesを覗くと1つpatchがありますが関係が無さそう．試しに 000-libbz2.patch を適用してみましたがやはり起動できません．
https://github.com/mkasberg/ghostty-ubuntu/tree/main/debian/patches

resetしてもとに戻して今度は debian/rules を参考に zig build を試しましたがこれも動作変わらず．
https://github.com/mkasberg/ghostty-ubuntu/blob/main/debian/rules

GhosttyのIssueを探すとまさにDebian sid amd64での回答がありました．
最近のpangoの更新で引っかかるようになったようです．以下のbuild optionを指定することで回避できるようです．

Upd: just build with -fsys=fontconfig parameter

— Pull requests · ghostty-org/ghostty

-fsys=fontconfig を付与してbuildし直し

$ PATH=~/Downloads/zig-linux-x86_64-0.13.0/zig-linux-x86_64-0.13.0/:$PATH \
zig build -Doptimize=ReleaseFast -fsys=fontconfig
$ zig-out/bin/ghostty

動作するようになりました :)

適当なPATHの通っている場所にcpしておく

$ rsync -av zig-out/* ~/usr/
$ which ghostty
/home/matoken/usr/bin/ghostty

ということで最近のDebian sid amd64環境などではしばらくはbuildオプションに -fsys=fontconfig を付けてあげる必要がありそうです．

$ zig build -Doptimize=ReleaseFast

↓

$ zig build -Doptimize=ReleaseFast -fsys=fontconfig

環境

$ zig-out/bin/ghostty --version
Ghostty 1.0.2-main+60611b8

Version
- version: 1.0.2-main+60611b8
- channel: tip
Build Config
- Zig version: 0.13.0
- build mode : builtin.OptimizeMode.ReleaseFast
- app runtime: apprt.Runtime.gtk
- font engine: font.main.Backend.fontconfig_freetype
- renderer : renderer.OpenGL
- libxev : main.Backend.io_uring
- GTK version:
build : 4.16.7
runtime : 4.16.7
- libadwaita : enabled
build : 1.6.2
runtime : 1.6.2
- libX11 : enabled
$ dpkg-query -W libgtk-4-dev libadwaita-1-dev git
git 1:2.45.2-1.3
libadwaita-1-dev:amd64 1.6.2-1
libgtk-4-dev:amd64 4.16.7+ds-1
$ dpkg-query -W libpango* gir1.2-pango-1.0 | grep -v i386
gir1.2-pango-1.0:amd64 1.55.0+ds-3
libpango-1.0-0:amd64 1.55.0+ds-3
libpango1.0-dev:amd64 1.55.0+ds-3
libpango1.0-doc
libpangocairo-1.0-0:amd64 1.55.0+ds-3
libpangoft2-1.0-0:amd64 1.55.0+ds-3
libpangomm-1.4-1
libpangomm-1.4-1v5:amd64 2.46.4-1+b2
libpangomm-1.4-dev:amd64 2.46.4-1+b2
libpangomm-2.48-1
libpangomm-2.48-1t64:amd64 2.54.0-1
libpangoxft-1.0-0:amd64 1.55.0+ds-3