ImageMagick をビルドする
ライブラリの依存関係を疑う
ビルドはできているのに PNG ファイルを扱うとエラーになってしまうことの調査。ImageMagick-6.9.1 までは必須でなかった pkg-config
は、6.9.2 からは必要になってしまった。自分の場合、これをインストールしてから問題が生じているので、当初はこれが原因なのではないかと思っていた。
そこで、otool
で convert
がどのライブラリを使っているのか調べてみることにした。簡単に png
に関係する部分の差分だけ以下にあげる。
6.9.1 /opt/X11/lib/libpng15.15.dylib (compatibility version 34.0.0, current version 34.0.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) 6.9.2 /usr/local/lib/libpng16.16.dylib (compatibility version 35.0.0, current version 35.0.0) /usr/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8)
6.9.1 の時は pkg-config
をインストールしていなかったので、/opt/X11/lib
, /usr/lib
を見ていたんだね。pkg-config
を使うと自分がビルドしたものを見てくれている。XQuartz は昔 Gimp で必要だったから入れた、ような気がする……。
実在しているライブラリをそれぞれ見ているのだからここまでは良い。何でエラーになるのだろう?試しに下記を実行してみる。
otool -L /usr/local/lib/libpng16.16.dylib /usr/local/lib/libpng16.16.dylib: /usr/local/lib/libpng16.16.dylib (compatibility version 35.0.0, current version 35.0.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) ...
convert
は /usr/local/lib/libz.1.dylib
を見ているのに、libpng16
の方は /usr/lib/libz.1.dylib
を見ている。これが原因なのだろうか?/usr/local/lib/libz.dylib
を見させるにはどうしたら良いのだろう?
libpng
のソースディレクトリ scripts/makefile.darwin
を見てみると、
# Where the zlib library and include files are located
ZLIBLIB=/usr/lib
ZLIBINC=/usr/include
なんて書いてある。そこで、
make -f scripts/makefile.darwin CC=clang ZLIBLIB=/usr/local/lib ZLIBINC=/usr/local/include
でビルドし直してインストールし、さらに ImageMagick の方もビルドし直してみた。ビルドの途中で
clang: error: no such file or directory: '/usr/local/lib/libpng16.dylib'
というエラーが出てしまったので確認してみると、libpng16.dylib@ -> libpng16.16..dylib
という変なリンクになっていた。これを
sudo rm libpng16.dylib sudo ln -s libpng16.16.dylib libpng16.dylib
で修正してやるとビルドが完了した。早速インストールして実験。
う〜ん、それでもやっぱりこのエラーが出ちゃうなぁ……。
convert a.png a.jpg convert: memory allocation failed `a.png' @ error/png.c/ReadOnePNGImage/2109. convert: no images defined `a.jpg' @ error/convert.c/ConvertImageCommand/3230.
無駄な作業をしていた
結局、下記のオプションでまともな convert
コマンドを生成することができた。
./configure --without-x CC=clang
今までの作業は無駄だったのか?今回もまた何が原因で、何が解決方法なのかわからないままだ……。
自分で理解できないんじゃ、ソースからビルドするのではなく、公式で用意してくれているバイナリをインストールするのがいいのかな。
追記
--without-x
オプションを付けないでビルドして、make test
の結果である test-suite.log
を見てみると、
validate: Application built with libpng-1.5.18 but running with 1.6.18 `' @ warning/png.c/MagickPNGWarningHandler/1656.
validate: memory allocation failed `' @ error/png.c/WriteOnePNGImage/9284.
と書かれていて、やっぱりバージョン関係がおかしい。
で、/opt/X11
の中をぐるぐるまわり、/opt/X11/bin/libpng-config
の中身を見ると version="1.5.18"
となっていた。つまり X11
内のとあるライブラリは libpng-1.5.18
をリンクしているので、--with-x
だとこれらも使うようになるので整合性がつかないと。原因はなんとなく解決したね。
XQuartz は 2.7.7 なのだけれど、これはパッケージ物をインストールしているので、各種ライブラリをアップデートできない。自分は jpg
, png
, tiff
の変換・拡大縮小・結合・トリミングができれば良いので、--without-x
のままでいこう。