Perl 5.14.2とImageMagick/PerlMagickのアップデート

毎年年末年始に帰省しないせいか、いつも休みに入るとサーバー関係の更新作業を行っているのだが、今年は長らく懸案事項となっていたPerlのバージョンアップとImageMagick/PerlMagickのアップデートをやってみることにした。Perlのバージョンアップ自体はたいした作業ではないのでメモレベルなのだが、PerlMagickが異様に難しいので、バイナリパッケージをインストールって言う人は手を出しちゃいけません。
ImageMagick/PerlMagickは最後にうまくビルドできた6.4.1からバージョンを上げることができず、それでいながらMovableTypeでは必須。ということで、今回も懲りずに6.7.4-2にアップデートしてみてから、PerlMagickにトライすることにした。今回の作業をまとめると、いままでPerlMagickがインストールできなかったのは、どうもImageMagickやPerlMagickだけでなく、Perlのコンパイルオプションにも秘密が隠されていた。(おそらくamd64環境で問題になりそうで、x86だと問題ないと思う。) 我が家のOS環境はFreeBSD9.0RC3であるが、OS付属以外のユーザーランドはFreeBSD7環境なので、作業自体はFreeBSD7を導入しているマシンで行い、rsyncでバイナリを同期している。GCC周りで問題もあろうと思うので、いつかの段階でLLVM/Clangに乗り換える必要がありそう。CPANライブラリはMovableTypeが動かせるようにそろえるというこれまで通りの方針で進める。

Perlのインストール

./Configure -Dprefix=/usr/local/perl-5.14.2 \
  -Dvendorprefix=/usr/local/perl-5.14.2 -des -Accflags=-fPIC
make
make test
sudo make install

ポイントはCCFLAGSに-fPICを渡すこと。PICにする御利益は「bkブログ: Linux の共有ライブラリを作るとき PIC でコンパイルするのはなぜか」を参照することとして、ライブラリの呼び出し元の要求だから合わせざる得ない。いずれにしてもlibperlが-PICでコンパイルされてないとダメだった。
ImageMagickのインストール

これは割と普通にインストールできるが、うちの環境ではPangoとかでコンパイルエラーとなるので、–without-xとした。ImageMagickを使い始めてもう10年以上になるはずだが一度もXで動かしたことがない・・・ Magick++のコンパイル中にこけるので、GCCを4.4系に入れ替えててビルド。(最近いろんなアプリケーションのC++のコンパイルが通らなくなっているように思う。) あとこの設定でCGIからImageMagickを呼び出すと・・・ libgomp.so.1: Undefined symbol “pthread_create” なるエラーがでるので、OpenMPを無効化。まあいらんでしょう。

./configure CC=/usr/local/gcc4/bin/gcc CXX=/usr/local/gcc4/bin/g++ \
  CPP=/usr/local/gcc4/bin/cpp CXXCPP=/usr/local/gcc4/bin/cpp \
  --prefix=/usr/local/ImageMagick-6.7.4-2 --with-included-ltdl \
  --with-ltdl-include=/usr/local/gnu/include \
  --with-ltdl-lib=/usr/local/gnu/lib --without-x --disable-openmp
make -j3
make install
make cllean

PerlMagickのインストール

さてはまりの本題。いろいろビルド過程を見ているとlibperlを探せていないので、直接指定することとした。PerlMagickのMakefile.PLにて、

my $LIBS_magick = '-L../magick/.libs -lMagickCore -lperl -lm';

のライブラリ指定箇所を

my $LIBS_magick = '-L/usr/local/perl-5.14.2/lib/5.14.2/amd64-freebsd/CORE -L/usr/local/ImageMagick-6.7.4-2/lib -L../magick/.libs -lMagickCore -lperl -lm';

として・・・

make perl Makefile.PL
make
sudo make install

で、OKのようです。こんなのわからんわ・・・ あとlibMagick.soが探せないとか言うことがあるので、ldconfigのキャッシュを書き換えましょう。うちの場合はchroot環境でhttpdを動かしているので、そっちは単純にchrootした環境で/var/runにキャッシュファイルをコピー。

sudo /etc/rc.d/ldconfig restart
cp /var/run/ld-elf* /chroot/var/run

XML::LibXMLとXML::Parser

WebをさまよっているとXML関係のライブラリをインストールできないような記事が多いのだが、これは純粋にlibxml2とlibexpat依存なので、ちゃんと指定すればOK。うちの環境ではテキスト処理関係は/usr/local/text、GNU関係は/usr/local/GNUにまとめてインストールしているので、適当に読み替えること。
まずXML::LibXMLの方はライブラリをLIBSで、includeファイルをINCできっちり指定することと、FreeBSDの場合はlibiconvも必要なので、こちらも指定。こんな感じ。

perl Makefile.PL LIBS='-L/usr/local/text/lib -L/usr/local/gnu/lib' \
  INC='-I/usr/local/text/include/libxml2 -I/usr/local/gnu/include'
make
make install

XML::Parserはlibexpatを指定すればいいので、

perl Makefile.PL EXPATLIBPATH=/usr/local/text/lib \
  EXPATINCPATH=/usr/local/text/include
make
make install

でおしまい。
DBD::mysql

あとビルドに使っているPCではMySQLのバイナリは置いてあるもののMySQLは動かしていないので、DBD::mysqlのインストールはどうしたものかと思っていたが、テストをすっ飛ばせばインストールできるだろうと言うことで、make testしないでインストール。DBD::mysqlのパッケージディレクトリにて、

perl Makefile.PL --libs="-L/usr/local/mysql/lib/mysql -lmysqlclient -lz" \
  --cflags=-I/usr/local/mysql/include/mysql --testhost=127.0.0.1
make
make install

まあ巧く動いていそうなので問題ないでしょう。
追記

うちの環境ではPortsやpkgsrcは使っていません。それぞれのアプリケーションは/usr/localみたいなディレクトリにアプリケーション名-バージョンのようなディレクトリを作成してそこにインストール。/etc/rc.confにて

ldconfig_paths=`echo /usr/lib /usr/lib/compat /usr/*/lib /usr/local/*/lib`

みたいな感じでライブラリを検索しています。(それ故このメモも自分か、ああなるほどという人にしか通用しない個人的なメモの域を出ない。)