Mac の Python をビルドするときに GNU Readline ライブラリを有効にする
Mac OS X では GNU の Readline ライブラリがインストールには含まれておらず、Readline 互換の Libedit というライブラリへのシンボリックリンクとなっている(こうなっている理由はライセンス上の問題からだと思われる。GNU の Readline ライブラリは GPL で、Libedit は BSD ライセンスだ)。
しかし、これが原因で Readline 対応のプログラムがコンパイルできない、コンパイルできてもヒストリ機能などが使えない、といった問題がしばしば起こる。
Python は後者の例で、configure
スクリプトはちゃんと readline ライブラリを認識し make
も問題なく通るのだが、実際には Readline ライブラリが無効になったバイナリがインストールされてしまう。
% ./configure
...
checking for readline in -lreadline... yes
checking for rl_callback_handler_install in -lreadline... yes
checking for rl_pre_input_hook in -lreadline... yes
checking for rl_completion_matches in -lreadline... no
...
% make
...
% find . -name readline.so
# readline.so が出来ていない
ヒストリ機能やキャレット移動のショートカットが使えないのは、やはり不便だ。これはなんとかしたい。
MacPorts で GNU Readline ライブラリをインストール
まずは GNU Readline ライブラリをインストールしよう。MacPorts を利用するのが簡単だろう。
% sudo port install readline
/opt/local/lib
以下にインストールされる。
% l /opt/local/lib/libreadline.*
-r-xr-xr-x 2 root admin 448300 Nov 13 2006 /opt/local/lib/libreadline.5.1.dylib
lrwxr-xr-x 1 root admin 21 Nov 13 2006 /opt/local/lib/libreadline.5.dylib -> libreadline.5.1.dylib
-rw-r--r-- 2 root admin 574188 Nov 13 2006 /opt/local/lib/libreadline.a
lrwxr-xr-x 1 root admin 21 Nov 13 2006 /opt/local/lib/libreadline.dylib -> libreadline.5.1.dylib
GNU Readline ライブラリの場所を指定して Python をビルド
あとは新しくインストールされたライブラリの場所を指定して、Python をビルドしなおすだけだ。
% CPPFLAGS=-I/opt/local/include LDFLAGS=-L/opt/local/lib ./configure
% make
% find . -name readline.so
./build/lib.macosx-10.3-i386-2.5/readline.so
% sudo make install
こうしてビルドした Python のインタプリタでは、ヒストリ機能やキャレット移動のショートカットが有効になっている。