読者です 読者をやめる 読者になる 読者になる

tmuxがCygwin上で動作するようになったのでインストール手順をまとめてみた

CygwinWindows上で動作するUNIXライクなプログラミング環境で、個人的にはよく使っている。コンパイラなどのインストールも、Cygwin自身のインストールの際に用いるsetup.exeを呼び出すだけで出来てしまう。自分は使ってはいないが、aptライクなパッケージ管理ツールも人気のようだ。
tmuxは言わずもがな、ターミナル分割に使われるソフトウェアで一つのターミナルを疑似的に複数のターミナルに分割してくれる。
ただしこのtmux、長い間Cygwin上では動作しなかった。ソースコードを入手してビルドを通すことは出来ても、コマンドを入力した瞬間に落ちてしまっていた。これは残念。

今年の5月辺りからCygwin対応が進んでいた

しかし、個人的には最大の不満点だった、この「tmuxがCygwin上で使えない!」という問題に関して今年の5月位からMLにて議論が進んでいた。
patch for tmux on cygwin

このパッチは現在tmuxのレポジトリに適用されているようで、メンテナがtmuxの時期バージョンであるtmux1.9でのCygwin版のサポートを(ほぼ公式に?)宣言している。
Re: tmux on Cygwin

というわけで、Cygwin上にtmuxをインストールするためのマニュアルを簡単に作ってみる。
基本的に以下のページを参考にしており、自分がインストールする際の手順を纏めただけのものなので注意されたし。
Steps to install tmux in Cygwin

以下、適当なディレクトリ(自分の場合は$HOME/work)で作業。

tmuxのインストール手順

依存パッケージのインストール

依存するlibeventとncursesもダウンロード。別途、setup.exeを使ってautomake, gcc, git, pkg-configをインストールしておくこと。

wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz

依存パッケージのビルド

Cygwinなだけあって時間かかりますね。

tar xvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr
make && make install
cd ..

tar xvf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=/usr
make && make install
cd ..

ここまでは上手くいくだろう。さて、tmuxは入るだろうか...

tmuxのインストール

git clone http://git.code.sf.net/p/tmux/tmux-code tmux-tmux-code
cd tmux-tmux-code
./autogen.sh
CFLAGS="-I/usr/include/ncurses" ./configure --prefix=/usr
make && make install

しかしビルドに失敗する...

tty-term.o:tty-term.c:(.rdata$.refptr.cur_term[.refptr.cur_term]+0x0): undefined reference to `cur_term'
collect2: error: ld returned 1 exit status

やむなく以下の変更を行う。とりあえずコメントアウトして再度make install。(こんなんで良いのか...)
2014.2.25追記 tmux1.9以降では不要な操作となりました。

diff --git a/tty-term.c b/tty-term.c
index a3292eb..50af6e9 100644
--- a/tty-term.c
+++ b/tty-term.c
@@ -389,10 +389,10 @@ tty_term_find(char *name, int fd, const char *overrides, char **cause)
 	tty_term_override(term, overrides);
 
 	/* Delete curses data. */
-#if !defined(NCURSES_VERSION_MAJOR) || NCURSES_VERSION_MAJOR > 5 || \
-    (NCURSES_VERSION_MAJOR == 5 && NCURSES_VERSION_MINOR > 6)
-	del_curterm(cur_term);
-#endif
+//#if !defined(NCURSES_VERSION_MAJOR) || NCURSES_VERSION_MAJOR > 5 || \
+//    (NCURSES_VERSION_MAJOR == 5 && NCURSES_VERSION_MINOR > 6)
+//	del_curterm(cur_term);
+//#endif
 
 	/* These are always required. */
 	if (!tty_term_has(term, TTYC_CLEAR)) {

結果、動きました

何はともあれtmuxが無事動いたようなので何より。
今回は若干手間取りましたが、今後tmux 1.9リリースに向けて種々の問題は解消されていくことでしょう。*1
雑なパッチによりどんな不具合があるか想像出来ないため、ビルドし直したいところ。

2014.1.9追記


とのことです。
ありがとうございました。

2014.2.25追記

tmux1.9のリリースに伴いCygwinが正式にサポートされました。
tmux1.9のコードは以下のURLから入手可能です。
http://tmux.sourceforge.net/

*1:レポジトリは2013.11.27時点の最新版3e498cdb49c4ef9fcc5a4bf742407768561e795a