RHEL (CentOS) 7に静的ビルドなtmuxをユーザーインストールする

諸事情あって RedHat Enterprise Linux (CentOS) 7 系に tmux の最新版 v3.0a を、ログインユーザーだけが使える(他ユーザーに影響を与えない)形でインストールした。具体的には、関連ファイルをすべて ~/.local の下に配置するようにコンパイル・インストールしたので、その手順を備忘録しておく。

(なお CentOS 7 系の OS 標準パッケージでは tmux のバージョンが 1.8 と古いため、.tmux.conf のキーバインド定義の書式が古かったりして面倒くさい。.tmux.conf 内で tmux のバージョンを判定して分岐する方法はあるが、新しい版を入れてしまえば良いのではと思い、今回はそうした。)

動作確認環境

  • CentOS 7.7
    • GCC と make がインストールされている(yum install gcc make 済みである)こと
  • tmux 3.0a
  • libevent 2.1.11 (システム標準パッケージ使用時は 2.0.21)
  • ncurses 6.1 (システム標準パッケージ使用時は 5.9)

なお libevent と ncurses については RHEL/CentOS 7 系の標準パッケージでも問題無く使える。なので、システムへのパッケージ追加が許されるなら以下セットアップ手順ではそれらを省略し、代わりに yum install libevent-devel ncurses-devel とするだけで良い。

手順

  1. 作業用ディレクトリを作成(ここでは ~/src を使用)

    mkdir -p ~/src
    
  2. libevent をローカルインストール(yum install libevent-devel されている環境ならばスキップして良い)

    cd ~/src
    curl -LO https://github.com/libevent/libevent/releases/download/release-2.1.11-stable/libevent-2.1.11-stable.tar.gz
    tar xf libevent-2.1.11-stable.tar.gz
    cd libevent-2.1.11-stable
    ./configure --prefix=$HOME/.local --disable-shared --disable-libevent-regress
    make && make verify && make install
    
    • メモ1:オプション --disable-shared は、動的リンク版の生成を抑止して静的リンク版のみ生成させる指示 (実行時に libevent.so をロード不要=LD_LIBRARY_PATH などを気にしなくとも良くなる)。
    • メモ2:オプション --disable-libevent-regressmake verify で時間のかかる回帰テストを省略する指示(時間に余裕があるならやった方が良いのだけれど)。
  3. ncurses をローカルインストール(yum install ncurses-devel されていれば不要)

    cd ~/src
    curl -LO https://invisible-mirror.net/archives/ncurses/ncurses-6.1.tar.gz
    tar xf ncurses-6.1.tar.gz
    cd ncurses-6.1
    ./configure --prefix=$HOME/.local --enable-pc-files --with-pkg-config=$HOME/.local/lib/pkgconfig
    make && make install
    
    • メモ1:--enable-pc-files--with-pkg-config で pkg-config 用の定義ファイルを生成させる
    • メモ2:ncurses では標準で静的リンク版しか生成しない(動的リンクが好みならば --with-shared を指定する)
  4. (libevent か ncurses のどちらかを自前ビルドした場合)自前ビルドしたライブラリを使えるよう環境変数を定義

    echo "export PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig:$PKG_CONFIG_PATH" >> ~/.bash_profile
    source ~/.bash_profile
    
    • メモ:もちろん元から PKG_CONFIG_PATH を定義しているなら、この手順は不要
  5. tmux をローカルインストール

    cd ~/src
    curl -LO https://github.com/tmux/tmux/releases/download/3.0a/tmux-3.0a.tar.gz
    tar xf tmux-3.0a.tar.gz
    cd tmux-3.0a
    ./configure --prefix=$HOME/.local
    make && make install
    

以上で ~/.local/bin/tmux に tmux 3.0a がインストールされる。なお libeventncurses も静的リンクしているため、~/.local 下にインストールしたそれらのファイルは削除(それぞれのソースディレクトリで make uninstall を実行)しても良い 。

念のため、起動できること、静的リンクできている(動的ロード対象として libevent.so や libncurses.so がリストアップされない)こと、を確認しておく:

$ ~/.local/bin/tmux -V
tmux 3.0a
$ ldd ~/.local/bin/tmux
        linux-vdso.so.1 =>  (0x00007ffe1a71b000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f546d67f000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f546d466000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f546d098000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f546d882000)

あとは、次のように PATH と MANPATH を設定すれば完成:

echo "export PATH=~/.local/bin:$MANPATH" >> ~/.bash_profile
echo "export MANPATH=~/.local/share/man:$MANPATH" >> ~/.bash_profile