MacにGD.pmのインストール

MacBook airMovable Type(MT)環境を作りたいと思い、cpanからいろいろとモジュールをインストール。そこで、GD.pm (ver 2.50)をインストールしようとしたら、エラーになってしまいました。

なんてことですか!

ちなみに、GDそのものは、brewからインストールしました。

$ brew install libgd

libgdのバージョンは2.1です。

GD.pmのインストールエラーの詳細を確認してみるため、cpanのビルドディレクトリを確認します。

$ cd ~/.cpan/build/GD-2.50-xxxxxx
$ make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/GD.t ........ 1/12 Testing using jpeg support.
t/GD.t ........ Failed 7/12 subtests
(less 2 skipped subtests: 3 okay)
t/Polyline.t .. ok

Test Summary Report

                                    • -

t/GD.t (Wstat: 0 Tests: 12 Failed: 7)
Failed tests: 2-7, 10
Files=2, Tests=13, 0 wallclock secs ( 0.03 usr 0.01 sys + 0.16 cusr 0.02 csys = 0.22 CPU)
Result: FAIL
Failed 1/2 test programs. 7/13 subtests failed.
make: *** [test_dynamic] Error 255

 どうやら、13のサブテスト中、7つに失敗しているようです。

 ここから、サブテストの調査がはじまり、大変な目にあってしまうのですが、、、。その長い長い旅路については割愛します^^。
 そもそもMTを動かすならImageMaigckの方が動いていればいいわけであって、GDはインストールしなくてもいいと言えばいいのですが、、、。いつも入れているので、一応、入れるということにします。

 結論からいうと、実はこの7つのサブテストは失敗していても良いみたいです。
というのも、このサブテストで失敗しているのはGDのバージョンが2.1だからで、GD 2.1で作成された画像ファイルが、GD 2.0以前のときのものと違っているためにGD.pmが「作成した画像ファイルが正しくない」と判断して、エラーになっていたようです。

 実際、

$ (sudo) perl t/GD.t --write

を実行すると、--writeオプションにより新しいGDで作成したpngファイルがtディレクトリ(~/.cpan/build/GD-2.50-xxxxxx/t)以下に作成されます。
(このテスト自体、エラーで途中で止まってしまっていますが、気にしなくてOKです。。気にする方は、GD.tの48行目をコメントアウトすればよいです。

# compare(&test9('frog.xpm'),9,'write') if GD::Image->can('newFromXpm');

)

perl t/GD.t --write」で作成されたファイルは、拡張子がpng_newのようになってしまっているので、適当に.pngなどをつけて比較すると、次のようになります。

tディレクトリにもともとある、比較用の画像 (test.out.3.png)

新しくtディレクトリにGD.pmによって作成された画像(test.out.3.png_new)

これを見ると、同じものに見えるのですが、GD 2.1で作成されたものは、比較用においてあるGD 2.0以前で作成されたものとバイナリ的に異なっているため、エラーになってしまっていました。

png以外も確かめたければ、

$ (sudo) env GDIMAGETYPE=jpeg perl t/GD.t --write
$ (sudo) emv GDIMAGETYPE=gif t/GD.t --write

で、作成された画像ファイルをそれぞれチェック出来ます。
チェックするといっても、人間の目で見て問題ないかくらいしかチェックできないので、ちょっと不安も感じますが。

それで問題なければ、make testで引っかかっていても、

make install

すればOKです。GD 2.0のときと、多少バイナリが違っていても、実用上は問題ない(むしろ精度があがってよくなっていると思います)はずです。

なお、9番目のテストのfrog.xpmは、もともとXpmを作成するライブラリを入れてないので、テストは飛ばしているため問題ないと思います。(writeの場合はここでエラーになるので、コメントアウトしていますが)
10番目のテストのfrog.jpgについてですが、実はこれは他と事情が違うのですが、やはり出来たファイルを人間の目で見る限りは違いがないようなので、これでOKとしていいと思います。(後述する述べるように、GD2.0よりさらに前のバージョンのものと比較して、違いがあるため、エラーになっているようです)

さて、上記で7つもサブテストエラーがあって嫌な感じがしたり、もしくは、作成される画像のバイナリに不安がある場合は、GD 2.0系をインストールしましょう。brewの場合は一度現在のlibgdをアンインストールして

$ brew uninstall libgd

それから、ほかのバージョンのものを探してみます。

$ brew versions libgd
2.1.0 git checkout 0d660bb /usr/local/Library/Formula/gd.rb
2.0.36RC1 git checkout cf66ef7 /usr/local/Library/Formula/gd.rb

で、現在では2.0.36TC1が見つかったので、そちらを使います。

$ git checkout cf66ef7 /usr/local/Library/Formula/gd.rb
$ brew install libgd

これで、再度cpanのbuildディレクトリで

$ (sudo) make clean
$ (sudo) perl Makefile.PL
$ (sudo) make
$ (sudo) make test

これで一発でうまくいけばいいのですが、、。今度は、サブテスト1つだけでエラーが出ます。

PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/GD.t ........ 1/12 Testing using png support.
t/GD.t ........ Failed 1/12 subtests
(less 2 skipped subtests: 9 okay)
t/Polyline.t .. ok

Test Summary Report

                                    • -

t/GD.t (Wstat: 0 Tests: 12 Failed: 1)
Failed test: 10
Files=2, Tests=13, 0 wallclock secs ( 0.02 usr 0.00 sys + 0.14 cusr 0.02 csys = 0.18 CPU)
Result: FAIL
Failed 1/2 test programs. 1/13 subtests failed.
make: *** [test_dynamic] Error 255

このエラーは、上で述べたtest 10 (frog.jpg)です。やはり、--writeオプションをつけて書き出してみると

で、比較用の画像は

で、基本的に同じもの。(バイナリは違うのだろうけれど)

ということで良いということにします。

完全にエラーを出さないようにするには、libgdをもっと前のバージョンにする必要があるのでしょう。
GD.pmをそろそろバージョンを上げてほしいです。

2013/10/31 追記
で、結局じゃあ、どうすればよいのかというと、cpanでするなら

cpan> force install GD

で問題なし。(テストでエラーと表示されるが、ちゃんとインストールされている)

自分でmakeしている場合は、make testをしないで、そのままmake installすれば、インストールできます。