Ubuntu 11.04 Natty で PIL をビルドする方法

原則として、PILはeasy_installやpipで問題が起こりやすいので、手動で python setup.py install を行う。*1

Ubuntu Natty では、 libjpeg や libpng をはじめ、多くのライブラリファイルが /usr/lib ではなくて /usr/lib/x86_64-linux-gnu *2に置かれている。
setup.py build は存在するライブラリを探して自動で JPEG や PNG のサポートの有効、無効を切り替えるのだが、このディレクトリを検索してくれないために、 libjpeg-dev をインストールしてあっても JPEG サポートがOFFになってしまう。

ライブラリの場所を指定するには、 setup.py を直接編集する。 setup.py の中の上の方に、次のような場所がある。

# --------------------------------------------------------------------
# Library pointers.
#
# Use None to look for the libraries in well-known library locations.
# Use a string to specify a single directory, for both the library and
# the include files.  Use a tuple to specify separate directories:
# (libpath, includepath).  Examples:
#
# JPEG_ROOT = "/home/libraries/jpeg-6b"
# TIFF_ROOT = "/opt/tiff/lib", "/opt/tiff/include"
#
# If you have "lib" and "include" directories under a common parent,
# you can use the "libinclude" helper:
#
# TIFF_ROOT = libinclude("/opt/tiff")

TCL_ROOT = None
JPEG_ROOT = None
ZLIB_ROOT = None
TIFF_ROOT = None
FREETYPE_ROOT = None
LCMS_ROOT = None

ここで、ライブラリのパスを指定してやる。

# TIFF_ROOT = libinclude("/opt/tiff")

TCL_ROOT = None
JPEG_ROOT = '/usr/lib/x86_64-linux-gnu', '/usr/include'
ZLIB_ROOT = JPEG_ROOT
TIFF_ROOT = None
FREETYPE_ROOT = JPEG_ROOT
LCMS_ROOT = None

これで python setup.py build で JPEG や PNG のサポートが有効になった。

Nattyのライブラリパスの変更は、ソフトウェアを自分でビルドすることが多い人に取ってはかなり面倒な状況だ。今回は PIL を紹介したが、 Python 自体のビルドでも手動で設定しないといけない箇所が少しあった。
Python や PIL はまだ設定でなんとかなるからマシな方で、php では ROOT/lib, ROOT/include の ROOT を指定できるものの今回のように個別指定する方法が見当たらないので、configureのエラーを見ては該当するチェックをスルーするようにconfigureを修正するという泥臭い作業をしていた。

*1:最近は大丈夫なのかもしれない

*2:amd64の場合

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。