Perl5は実にさまざまな環境で動く。すると当然だが、C/XSでコードを書くときはその辺りも考慮にいれつつコードを書くのが良い。
File::MMagic::XSはApacheもmod_mime_magicをXSから直接使えるようにポートした物だ。これをPerl用にポートするとなると当然APRが使えないので環境の差を吸収してくれるレイヤーがなくなってしまう。んじゃあそのままCの関数使えばいいのかというと・・・Perl5がすでに吸収してくれるところが結構おおいのだな。
perldoc perlclibとすると、その辺りのC関数→Perlの内部関数の対応表を出してくれる。
が。書いてないものもある。そういうのはperlのソースコードを展開したところで.hファイルを色々grepしてるとでてくるので積極的に使っていくといいと思う。ちなみに今回そもそもこのエントリを書こうと思ったのはstat()に対応する関数はないのかと思って探してみたからだ。そしたらStat()というものを発見。S_ISDIR()とか、そのまわりの処理も結構マクロがかかれていて便利
あと、Perl API自体もバージョンによってちょっぴり違う事があるので、そういう時はDevel::PPPortを使ってppport.hを作成するといい。このppport.hはマクロでバージョン毎の違いを吸収してくれるとともに、その差異に該当する構文がディストリビューション内に存在するのかどうかをチェックしてくれるPerl スクリプトでもある:
perl -MDevel::PPPort -e 'Devel::PPPort::WriteFile()' # ppport.h作成
perl ppport.h # 実行!
あとは表示される診断結果に従って、#defineをファイルに入れていくだけ。便利よ!
コメント