👻

Ghostty on Ubuntu 22.04

2024/12/29に公開

一部界隈で話題になっていた Ghostty をUbuntu 22.04でインストールしてみたのでメモ。ソースからビルドする手順はいくつかありそうだけど、Nixを使った手順はあんまりなさそう。

ghostty
GTKで動いているので見た目がよい

ghostty-on-ubuntu-22.04
ちゃんと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上のパッケージからも使えるようにする仕組み

手順

  1. Nixの導入
  2. Flakeとかを使えるようにする
  3. 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で管理できる気はするが、以下の方法で有効化できる。

~/.config/nix/nix.conf
experimental-features = nix-command flakes

Home-manager + Ghosttyのインストール

flake.nix の定義

以下のように flake.nix というファイルをどこかに作る。ふんわりと理解している構成は以下の通り。

  • inputs ... このFlakeが参照する上流のレジストリ的なやつを定義している
    • nixpkgs がNixがパッケージマネージャーとして提供しているソフトウェアのレジストリ
    • 上記に追加で、 home-manager, ghostty, nixgl を導入する
  • outputs ... ここで定義したものが最終的なパッケージの情報となる
flake.nix
{
  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 )。

packages.nix
{ 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 updatehome-manager switch ... できる。

ToDo

  • NVIDIAのGPUで動かしてみる。 nixGL.defaultWrappernvidia にしてみたが動かなかった…
    • 一応NVIDIAのGPUを積んでいるラップトップで mesa ドライバーで動かしたけど、今のところ気になる挙動はなさそう

References

Discussion