endaaman.com

2017-02-21

Tips

termiteとGNOME Terminalを共存させる

「GNOME Terminal アンインストール出来ないの?wwww」と笑われた気がしたので頑張った

GNOME Terminal と termite 、 vte と vte-ng の関係について

皆さんご存知だと思いますがArchでは GNOME Terminal と termite はそれぞれが依存する vte とその派生である vte-ng がコンフリクトしているため併存させることができません(他のディストロも同じかな?)。ただそれは vte と vte-ng のパッケージに含まれるファイルが被っているからであって、片方はパッケージマネージャで /usr 直下にインストールして、もう片方は /usr/local に入れれば問題はありません。

私は GNOME Terminal をアンインストールできない民なので、今回は派生の方である vte-ng と termite をコンパイルしてインストールしてみます。

vte-ng のコンパイルとインストール

インストールするパッケージの管理には GNU Stow を使います。 /usr/local/stow/ 以下にインストールするとよしなにシンボリックリンクを張ってくれるという、Homebrewやバージョン管理ツールのリンクだけしてくれるような存在です。

Releases · thestinger/vte-ng から 0.46.1.a をダウンロードします( 0.46.1 は一部関数がエクスポート漏れしていて termite をコンパイルできません )。

# cd /usr/local/src
# mv ~/Downloads/vte-ng-0.46.1.a.tar.gz ./
# tar xf vte-ng-0.46.1.a.tar.gz
# cd vte-ng-0.46.1.a
# mv ../vte-ng-0.46.1.a.tar.gz ./   // tar ballはとっておく主義
# ./autogen.sh  --prefix=/usr/local/stow/vte-ng-0.46.1.a

Stow で管理するには /usr/local/stow/ 以下にインストールします。

# make

Important

※※※ ここから2017年2月17日の話 ※※※

でコンパイルするんですが、これはコンパイルに失敗します。これを修正するPRが来てますが

PR者「コンパイルエラー治したで」

vte-ng作者「本家の方で治してもらってくれ」

PR者「本家で治ったで」

といったところから進展がありません(たった18日前の話だけど)。ただ私は気が短く、今すぐコンパイルして使いたいのでその修正を手元で行います。

# wget -O fix_type_errors.patch https://github.com/thestinger/vte-ng/pull/16.patch
# patch -p1 < fix_type_errors.patch

PRのパッチをダウンロードし、それを適用します。これで再びコンパイルすれば成功してくれるはずです。

:::color:red ※※※ ここまで2017年2月17日の話 ※※※ :::

でコンパイルして Stow でリンクします。

# make -n install   // 念の為インストール先を再度確認
# make install
# cd /usr/local/stow
# stow -vv vte-ng-0.46.1.a

これで vte-ng のコンパイルは終わりです。

termite のコンパイルとインストール

Releases · thestinger/termite からソースコードをダウンロードして

# cd /usr/local/src
# mv ~/Downloads/termite-12.tar.gz ./
# tar xf termite-12.tar.gz
# cd termite-12
# mv ../termite-12.tar.gz ./   // tar ballはとっておく主義
# git clone git://github.com/thestinger/util.git   // 依存する submodule を取ってくる

からコンパイルするんですが、依存する vte-ng は /usr/local/lib 以下に入っているので $PKG_CONFIG_PATH にそのパス追加します(そのまま make すると /usr/lib にある本家 vte にリンクしようとしてコンパイルに失敗します)。

env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH make

これでコンパイルできると思います。これも Stow で管理したいのですが termite の Makefile はインストール先が /usr/local に決め打ちされているので、インストールする前に Makefile を書き換えます。

# cp Makefile Makefile.old
# vim Makefile

--- Makefile.old        2017-02-17 01:55:35.508330182 +0900
+++ Makefile    2017-02-17 01:56:02.832415519 +0900
@@ -1,5 +1,5 @@
 VERSION = $(shell git describe --tags)
-PREFIX = /usr/local
+PREFIX = /usr/local/stow/termite-12
 GTK = gtk+-3.0
 VTE = vte-2.91
 TERMINFO = ${PREFIX}/share/terminfo

こんな感じに書き換えます。あとはインストールしてリンクして終わりです

# make -n install   // 念の為確認する
# make install

このまま Stow でリンクを作成してしまうと termite は /usr/lib の本家の vte を使おうとしてしまいます。普通に起動しますが vte-ng 独自の関数を使うモード切り替えなどの機能を使おうとすると関数が見つからずにハングします。また、 /usr/local/lib に vte-ng をインストールしたからと言って /etc/ld.so.conf の頭に /usr/local/lib を付けてしまうと今度は GNOME Terminal が vte-ng の方を使ってしまいます(普通に動くが vte-ng が vte のすべてをサポートしてるとも限らないので動作保証はない)。なので

# stow -vv --ignore="bin/termite" termite-12

でバイナリは無視してリンクを作成し、 termite だけ例外的に /usr/local/lib/libvte-2.91.so.0 を使わせるための処置として /usr/local/bin/termite

#!/bin/bash

env LD_LIBRARY_PATH=/usr/local/lib:/usr/lib /usr/local/stow/termite-12/bin/termite $@

という感じの起動スクリプトを用意します。これで GNOME Terminal は本家 vte を使うようにしたまま、 termite はコンパイルした vte-ng を使って起動するようになり、独自のモード切替機能を使えるようになります。

最後は仲良くツーショットでお別れ

歴史的邂逅……ッ!


©2024 endaaman.com