Ghostty on Ubuntu 22.04
一部界隈で話題になっていた Ghostty をUbuntu 22.04でインストールしてみたのでメモ。ソースからビルドする手順はいくつかありそうだけど、Nixを使った手順はあんまりなさそう。
GTKで動いているので見た目がよい
ちゃんとUbuntu 22.04で動く。画像も表示できる
Glossary
- Ghostty ... Hashicorpの共同創業者のMichell Hashimotoが主導して作ったターミナル。 Zig で作られているらしい
- Nix ... 関数型のパッケージマネージャー。これをベースにしたLinux Distroもある。宣言的にパッケージを管理できる。 これ なんかがわかりやすかった
-
Flake ... JavaScriptでいうところの
package.json
的な、Nixのパッケージのインプットなどを管理するための仕組み - home-manager ... dotfilesとか、ホームディレクトリを管理するための仕組み。パッケージをホームディレクトリ内にインストールすることも可能
- nixGL ... Nixでインストールされたソフトウェアは、基本的にNix内のソフトウェアだけを参照するように作られており、そうすると一部のシステム側のパッケージに依存するものが使えない。OpenGLなどがその例で、これらをNix上のパッケージからも使えるようにする仕組み
手順
- Nixの導入
- Flakeとかを使えるようにする
- home-manager + Ghosttyをインストール
Nixの導入
Download ページにあるコードでインストールする。裏でユーザーとかいろいろ作るが、そういうもんらしい。
ここまでやると、ひとまずNixが使えるようになる。以下のようにNixで提供されているソフトウェアをAd hocに試せるようになるのでいろいろ楽しい。
$ nix-shell -p hello
#(a bunch of logs to install some dependencies)
[nix-shell:~]$ hello
Hello, world!
Flakeとかを使えるようにする
Flakeは一応まで実験的な機能という扱いになっており、有効にしてあげる必要がある。これ自体もhome-managerで管理できる気はするが、以下の方法で有効化できる。
experimental-features = nix-command flakes
Home-manager + Ghosttyのインストール
flake.nix
の定義
以下のように flake.nix
というファイルをどこかに作る。ふんわりと理解している構成は以下の通り。
-
inputs
... このFlakeが参照する上流のレジストリ的なやつを定義している-
nixpkgs
がNixがパッケージマネージャーとして提供しているソフトウェアのレジストリ - 上記に追加で、
home-manager
,ghostty
,nixgl
を導入する
-
-
outputs
... ここで定義したものが最終的なパッケージの情報となる
{
description = "My Nix configuration";
# This section defines which package sources it should look up
inputs = {
# NixOS official package source
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
# home-manager's repository
home-manager = {
url = "github:nix-community/home-manager";
# It instructs home-manager to use the same packages as nixpkgs in this file
inputs.nixpkgs.follows = "nixpkgs";
};
# Ghostty
ghostty = {
url = "github:ghostty-org/ghostty";
inputs.nixpkgs-stable.follows = "nixpkgs";
inputs.nixpkgs-unstable.follows = "nixpkgs";
};
# nixGL is required if you're not in NixOS, so that packages can refer to
# openGL-related libraries under Nix's management
nixgl = {
url = "github:nix-community/nixgl";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nixpkgs, home-manager, ghostty, nixgl, ... }@inputs: let
selectPkgs = system: import nixpkgs {
inherit system;
# This makes ghostty available through a single source (`pkgs` below)
overlays = [
(final: prev: {
ghostty = ghostty.packages.${system}.ghostty;
})
];
};
in {
homeConfigurations = {
ubuntu = home-manager.lib.homeManagerConfiguration {
pkgs = selectPkgs "x86_64-linux";
extraSpecialArgs = {
inherit nixgl;
};
modules = [
./packages.nix
];
};
};
};
}
パッケージ情報の定義
以下のファイルを flake.nix
と同じディレクトリ内に定義(別に分けてもよいが、その場合は flake.nix
内の参照を修正する)。
nixGLでパッケージをWrapするのは、元々いろいろ複雑な感じだったっぽいが、最近はごく簡単に定義できるようになっている(cf. GPU on non-NixOS systems )。
{ config, pkgs, nixgl, ... }:
{
# This code is required to enable nixGL
nixGL.packages = import nixgl {
inherit pkgs;
};
nixGL.defaultWrapper = "mesa"; # or whatever wrapper you need
nixGL.installScripts = [ "mesa" ];
home.username = "youruser"; # 適宜変更する
home.homeDirectory = "/home/youruser"; # 適宜変更する
home.stateVersion = "24.11";
home.packages = with pkgs; [
(config.lib.nixGL.wrap ghostty)
(config.lib.nixGL.wrap kitty)
];
programs.home-manager.enable = true;
}
パッケージのインストール
Nixは自前で定義したファイルはGit commitを参照して管理するので、適当にGitのレポジトリを作って、これらのファイルをコミットしておく。
以下のコマンドでインストールできる。ビルドはそこそこ時間がかかる。
nix#ubuntu
部分は flake.nix
を置いたディレクトリへの参照 # homeConfiguration
内で指定した名前、という感じ。
$ nix-shell -p home-manager
[nix-shell:path/to/nix-files]$ cd path/to/nix-files
[nix-shell:path/to/nix-files]$ nix flake update
[nix-shell:path/to/nix-files]$ home-manager switch --flake '.#ubuntu'
初回インストール後は、 home-manager
自体もインストール済みになるので、 nix-shell -p home-manager
のところは飛ばして、 nix flake update
と home-manager switch ...
できる。
ToDo
-
NVIDIAのGPUで動かしてみる。
nixGL.defaultWrapper
をnvidia
にしてみたが動かなかった…- 一応NVIDIAのGPUを積んでいるラップトップで
mesa
ドライバーで動かしたけど、今のところ気になる挙動はなさそう
- 一応NVIDIAのGPUを積んでいるラップトップで
Discussion