Module::Installのconfigure_requires()とかについて
こんにちは。
以前からImager::QRCodeでCPAN Testerからエラーレポートがあがってきたのを先日一気にfixして上げたのですが、そのときに苦労した点がいくつかあったので記しておきます。
-
苦労した点その1
Imager::QRCodeではlibqrencodeというCのライブラリを使ってQRコードを作成しているのですが、このlibqrencodeのAPIがちょっと見ない間に変っていて(関数の名前とか引数の数とか)、あるバージョン以降のlibqrencodeをインストールした環境ではImager::QRCodeが動かなくなっていました。
どうもあるメジャーバージョンアップの際に関数名の変更が行なわれたっぽいのですが、それを有り難く使わせて頂いているこちらとしては変ってしまったものはしかたがないので、libqrencodeのあるバージョン以前のときはこうして、あるバージョン以降はこうするみたいなことをしなければなりませんでした。
そこで今回の修正ではMakefile.PLの中でそのAPIが使えるかどうかのテストをしてバージョンを判定し、XSをコンパイル時に「-DFOO_BAR」というdefineを付けるようにし、QRCode.xsの中で「#ifdef〜#else〜#endif」でコードを分けるようにしました。
この苦労した点の肝はCのライブラリのバージョンをチェックする方法です。最初libqrencode.soとかをstringsしてバージョン情報とかないかなぁとかいろいろ考えてみたのですが有効な手段がなく、結果的にその関数を使った一時プログラムを作って実際に使えるかどうかテストするしかないなという結論に至りました。
ちなみにこの方法が正しいのかどうかわかりません><
-
苦労した点その2
Imager::QRCodeのMakefile.PLでは、XSのコンパイルオプションに必要なImagerのtypemapなどが定義されたImager::ExtUtilsが必要になります。しかし、以前のバージョン(0.02以前)ではMakefile.PLに「use Imager::ExtUtils;」が書いてあり、元々Imagerがインストールされていない環境では当然「perl Makefile.PL」でコケていました。
でもMakefile.PLで使うモジュールの依存関係を、そのMakefile.PLに書いてはたしてちゃんとCPAN shellがちゃんとインストールしてくれるか疑問だったのですが、今回はインストールのためのモジュールをModule::Installに変更して、configure_requires()という依存関係を記述する関数を使ってImagerをdependencyに加えたところ上手くいきました。
ちなみにconfigure_requires()は、Module::InstallのChangesをみたところ、下記のように0.69からサポートされた関数で、それ以前は関数名はあったものの動いてなかったようです。
0.69 Sat 15 Mar 2008 - Adam Kennedy - Enabling configure_requires support (ADAMK)
この関数がなにをするかというと、Makefile.PLを実行する前に指定されたモジュールをインストールするものらしいです。ただ、100%のCPANクライアント(ほぼCPAN shellのことかな?)がサポートするとは限らない(Module::InstallがPerl 5.004以降のみをサポートしてるからとの記述あり)と書いてあるので、通常はbuild_requires()でやった方がよさげです。
ここについては、まだ正しい解がわかっていないのですが、いまのところconfigure_requires()でちゃんと動いています。
あと今回この問題に付随して1つ疑問があって、CPAN shellでインストールする際にちゃんと依存関係のモジュールも問題なくインストールできるのかどうかをテストしたい場合、CPANにそのモジュールを上げる以外で確認する方法があるのかなのですが、そもそもそのような方法がないのだとしたら一旦作ったモジュールをCPANに上げて世界中に迷惑かけながらテストしなきゃならないのでしょうか…。
#いくつか疑問を残しているのが気持ち悪いので継続して調査したいのですが、もしこれらの疑問を知っている方がもしおられましたら、御教授頂けたらと思います。