のらりくらり

物理化学分野のポスドクです。プログラミング、読書、自転車などが好きです。

Mac OS X Mountain LionにMatplotlibをインストールする

これが結構手こずった。
Homebrewを使ってインストールされている方は多いみたいだけど、もともと僕はbrewつかっていなくて、このためだけにインストールするのもなぁ。。。と思い、また、皆さんPythonそのものをbrewでインストールしていてそれもなんかなぁという気がしたのでMacOSXにもともとbundleされてるpythonの処理系つかってインストールできないか試してみた。
以下は僕がやったメモ。

1、pipをeasy_installなどを使ってインストール
この工程必要だったかな?とりあえずpipが使える環境だったらOKだと思う。

2、pipでipythonをインストール

$ sudo pip install ipython

このときに--userをオプションとして渡すとそれぞれのユーザ領域にインストールされるのでsudoする必要がなくなる。

3、scipyのインストール
http://akiyoko.hatenablog.jp/entry/2013/06/15/140101を参考にさせていただきました。たしかnumpyのアップデートとかはせずにやってみたけれど今のところ困っていない気がする。うまくいかなければアップデートすれば良いかと思います。

4、一回pipでmatplotlibのインストールを試みる。

$ pip install matplotlib --user

ここでインストールが成功するならはいおめでとうございます終了なわけだが、多分freetypeが無いだとかlibpngが無いだとかそんな感じの事言って怒られます。

で、それらのソースをとってきてローカル領域にビルド・インストールしてみたんだけどどうもうまく行かない。ちなみにlibpngをインストールしてみると、その後OSXのopenコマンドとかもよく分からないtrapに遭ってしまい困ったので僕はアンインストールしました。

その後で知ったのだけど、実はlibpngやlibfreetypeはもとから/usr/X11/libにインストールされている。一方で、これらのバージョン確認などには普通同じprefixのbinディレクトリ、すなわち今回の場合だと/usr/X11/bin/のなかにあるlibpng-configやfreetype-configなどのコマンドをつかうのだけど、Mauntain Lionの初期の状態ではls -lしてみればわかるんだが、実はこれらのバイナリに見えるものは全てxstubという「X11はもうバンドルしなくなったんで自前で頑張ってね」みたいなメッセージを表示するだけのプログラムへのシンボリックリンクになっている。これを解決するために、XQuartzをインストールすることになった。
5、XQuartzのインストール
ここからdmgをダウンロードしてきて、マウント&pkgをインストールする。この作業は多分迷わないと思う。
これが成功すると、

/usr/X11/bin% ls -l
total 53624
lrwxr-xr-x  1 tromso  wheel        7  8 24 01:46 X -> Xquartz
-rwxr-xr-x  1 root    wheel  2880864  9 28  2012 Xephyr
-rwxr-xr-x  1 root    wheel  2975728  9 28  2012 Xfake
-rwxr-xr-x  1 root    wheel  2590624  9 28  2012 Xnest
-rwxr-xr-x  1 root    wheel  3700608  9 28  2012 Xorg
-rwxr-xr-x  1 root    wheel    62336  9 28  2012 Xquartz
-rwxr-xr-x  1 root    wheel  2912624  9 28  2012 Xvfb
-rwxr-xr-x  1 root    wheel    43824  9 28  2012 appres
-rwxr-xr-x  1 root    wheel    51936  9 28  2012 atobm
-rwxr-xr-x  1 root    wheel    43312  9 28  2012 bdftopcf

・・・以下省略

みたいにバイナリの実体で置き換えられている。さらに/usr/X11/includeなどのディレクトリができてヘッダファイルもインストールされているはず。

6、もう一回pipでインストール(3と同様の手順)
多分includeするヘッダが見つからないというエラーがでる。エラーのログを間違って消しちゃったのでお見せできない(すみません)が多分エラー吐かれる。もし成功した人はおめでとうございますなんだけど多分/usr/X11/include/ft2build.hのなかで

/* `<prefix>/include/freetype2' must be in your current inclusion path */
#include <freetype/config/ftheader.h>

この部分でftheader.hが見つからないってエラーが返ってくるんじゃないかと思う。
実はこのヘッダのパスは、/usr/X11/include/freetype2/freetype/config/ftheader.hとなるようになっている。一個余分(?)なディレクトリを経由するのだ!なので、インクルードパスに/usr/X11/include/freetype2/までがはいるようにする必要がある。
ちなみに、ここの部分に関しては僕はここを参考にした。
ここと同様に、

$ export LDFLAGS=-L/usr/X11/lib
$ export CFLAGS="-I/usr/X11/include -I/usr/X11/include/freetype2 -I/usr/X11/include/libpng15"
$ pip install matplotlib --user

とした。ちなみに、libpngまわりのpng.hは/usr/X11/include/libpng15の中だったりlibpng12の中だったりとバージョンによって違うみたいなので、そこはCFLAGSを設定する際に確認する事が重要。これで完成した。

とりあえずipython pylabとして起動するなり、ipython起動した後でimport matplotlibとかして怒られなければ成功です。