PerlMagick のインストールではまる
- 2008.02.07 Thursday
- dev
Movable Type や Serene Bach などのブログツールで、アップロードしたイメージのサムネイル画像を作成するために利用されるライブラリのひとつに ImageMagick があります。
Mac OS X では標準でインストールされていないため、別途インストールする必要があります。
ImageMagick をインストールして、それを perl で利用できるようにするために、以下のような手順で行いました。
- MacPorts のインストール
- ImageMagick のインストール
- PerlMagick のインストール
MacPorts のインストール
MacPorts は ImageMagick をはじめとした各種 UNIX ツールのインストールをサポートしてくれるツールです。パッケージの依存関係をきっちり押さえてくれますし、アップデートなども簡単に行うことができます。
同様なツールに Fink があります。MacPorts の方が Intel Mac への対応が早かったため、私は MacPorts を使っています。
MacPorst のインストールは簡単です。
- MacPorts 公式サイトの「Installing MacPorts」よりアーカイブをダウンロード
- ダウンロードしたパッケージファイルを開いてインストール
配布アーカイブは Mac OS X のバージョンによって分かれています。私の場合、Mac OS X 10.4 を利用しているので、Tiger のパッケージをダウンロードしました。
MacPorts は基本的にコマンドラインツールです。使い方などは MacWiki - MacPorts に詳細があります。
MacPorts インストール後は MacPorts のデータベースを最新の状態に更新しておきます。
ターミナル上で以下のようなコマンドを入力します。
$ sudo /opt/local/bin/port -d selfupdate
ここで、「$ 」はコマンドプロンプトです。実際に入力するのは強調された部分になります。これより先にも同様な引用が出てきますが、同じように記述しています。
ImageMagick のインストール
MacPorts のコマンド群は「/opt/local/bin
」というパスにインストールされます。
一々、「/opt/local/bin/port
」 のように入力するのは面倒なので、PATH を通しておくと楽です。
$ export PATH=/opt/local/bin:$PATH
bash の場合。tcsh, csh など他のシェルを使われている時はパスの通し方が異なります。
ImageMagick のインストールは MacPorts のメインコマンドである port を使います。
$ sudo port install ImageMagick +jpeg2
「+jpeg2
」というオプションは必須ではありません。ImageMagick で jpeg2000 ファイルを扱えるようにしたい場合は指定しておきます。
ImageMagick は以下の場所にインストールされます。
- バイナリ
/opt/local/bin
- ライブラリ
/opt/local/lib
- ヘッダ
/opt/local/include
PerlMagick のインストール
最後に perl から ImageMagick を利用するためのモジュールをインストールします。
CPAN からアーカイブを取得します。「PerlMagick」で検索すれば、あっさり見つかると思います。
アーカイブからの perl モジュールのインストールは、基本的にはどれも一緒で、
$ tar zxf (MODULE).tar.gz $ cd (MODULE) $ perl Makefile.PL $ make $ make test $ sudo make install
のように機械的にコマンドを実行すればいいだけです。(MODULE)
の部分は、ダウンロードしたファイルによって変わるので、PerlMagick の場合、
$ tar zxf PerlMagick-6.32.tar.gz $ cd PerlMagick-6.32 $ perl Makefile.PL $ make $ make test $ sudo make install
しかし、PerlMagick の場合、そのままではインストールできません。「make
」と入力した後、ずらっとエラーが表示されてしまいます。
ひとつの要因が MacPorts を利用していることに起因します。MacPorts を利用しているので、インストール場所がデフォルトとは異なるためです。
そこで Makefile.PL を修正する必要があります。PerlMagick 6.32 の場合、修正箇所は 46 行目から 65 行目にかけてです。
# Header search specfication and preprocessor flags 'INC' => '-I../ -I.. -I/opt/local/include -I/opt/local/include/freetype2 -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I/opt/local/include/libxml2', # C compiler flags (e.g. -O -g) 'CCFLAGS' => "-L/opt/local/lib $Config{'ccflags'} -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -O3 -g -Wall -pthread", # C pre-processor flags (e.g. -I & -D options) # 'CPPFLAGS' => "$Config{'cppflags'} -I/usr/include/librsvg-2 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/gtk-2.0 -I/usr/include/graphviz -I/usr/include/freetype2 -I/usr/include/libxml2", # Linker flags for building an executable 'LDFLAGS' => "-L/usr/lib -L/opt/local/lib $Config{'ldflags'}", # Linker flags for building a dynamically loadable module 'LDDLFLAGS' => "-L/usr/lib -L/opt/local/lib $Config{'lddlflags'}", # Install PerlMagick binary into ImageMagick bin directory 'INSTALLBIN' => '/opt/local/bin', # Library specification 'LIBS' => ['-L/opt/local/lib -lMagick -L/usr/X11R6/lib -L/usr/lib -ltiff -ljpeg -lpng -ldpstk -ldps -lXext -lXt -lSM -lICE -lX11 -lbz2 -lxml2 -lpthread -lm -lpthread'],
これで makefile が、Intel Mac 向けに生成されます。
以前はこの修正だけで正しくインストールできたのですが、ImageMagick 6.3.8 と PerlMagick 6.32 というバージョンの組み合わせではうまくいきません。
2008.02.07 時点で、MacPorts でインストールされる ImageMagick のバージョンは 6.3.8 になります。一方 CPAN から取得できる PerlMagick の最新バージョンは 6.3.2 です。
[2007.02.08 追記] ふうこさんからのコメント通り、ImageMagick 公式サイトからダウンロードできる「Source」の方に最新の PerlMagick が添付されていました。それに対応した Magick.xs がきちんと添付されているので、そちらを使うのが最も確実です。MacPorts を利用してインストールした場合、PerlMagick はついてきませんので、バイナリではなくソースの方を別途ダウンロードする必要があります。
PerlMagick 6.3.2 に添付されている Magick.xs で利用されている定数・メンバー名が ImageMagick 6.3.8 と一部互換性がありません。
[2007.02.08 追記] ImageMagick 公式サイトからダウンロードできるソースには対応した PerlMagick が添付されていて、PerlMagick 6.3.8 となっています。
例えば、
Magick.xs:203: error: ‘MagickCompositeOptions’ undeclared (first use in this function) Magick.xs:203: error: (Each undeclared identifier is reported only once Magick.xs:203: error: for each function it appears in.)
のようなエラーが表示されて、正しくインストールできません。これは列挙型 MagickOption
の列挙定数の名称が一部変更されているために生じるエラーです。
ざっくり調べたところ、PerlMagick 6.3.2 vs ImageMagick 6.3.8 では以下のような差異があります。
MagickCompositeOptions
→MagickComposeOptions
MagickCompressionOptions
→MagickCompressOptions
MagickImageOptions
→MagickTypeOptions
MagickLayersOptions
→MagickLayerOptions
また、構造体 _Image
に存在していた origin
というメンバは tile_offset
という名称に変わっています。
image->origin
のように ->origin
となっている箇所を
image->tile_offset
と変更します。
ここまでの一連の作業を行うことで、make が通るようになり、インストールが可能になります。
$ perl Makefile.PL $ make $ make test $ sudo make install
最後にきちんとインストールされているかどうか確認しておきます。
$ perl -MImage::Magick -e 'print $Image::Magick::VERSION . "\n"'
最後に私が作業した分のパッチファイル PerlMagick-6.32.osx_tiger.patch.gz を置いておきます。これは以下の環境で動作します。
- Intel Mac
- Mac OS X 10.4
- MacPorts 利用
- ImageMagick 6.3.8
- PerlMagick 6.32
スポンサーリンク