Mac の Python をビルドするときに GNU Readline ライブラリを有効にする

2008/04/11 10:05am

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 のインタプリタでは、ヒストリ機能やキャレット移動のショートカットが有効になっている。