Universal Binary な Perl モジュール

Perl モジュールを ビルドするときに Universal Binary にする方法が少しわかってきたので、メモ。
スタートは perlmacosx から。Universal Binary support を読むと、PerlUniversal Binary でビルドする方法が書かれている。まずはこれを試してみる。Configure では、スレッドのサポートを有効にするために、-Dusethreads オプションを追加した。
……が、できあがったモジュール(bundle)を見ると、すべて種類が「バンドル(PowerPC)」になっている。「CPAN モジュールをビルドするときにもこの設定が使われる」と書かれているからてっきりこれで Universal Binary なモジュールを作ることができるのだと思っていたのだけど、どうやらちょっと違うようだ。
あれこれ試してみたところ、どうもバンドルを作成する際には LDFLAGS の指定とは異なる設定が使われていることがわかった。モジュールの Makefile を見てみると、LDFLAGS のすぐ下に LDDLFLAGS という変数が定義されている。どうもこれが使われているらしい。これを LDFLAGS と同じように修正してから make してみると、見事に Universal Binary なモジュール(バンドル)が完成した。
ということは、Perl をビルドするときにもこのオプションを設定してやればいいはず。もう一度 Configure からやり直しだ。-A オプションで lddlflags の値を設定して試してみると、めでたくうまくいった。Configure のオプションは、


./Configure -Accflags="-arch i686 -arch ppc -nostdinc -B$SDK/usr/include/gcc \
 -B$SDK/usr/lib/gcc -isystem$SDK/usr/include \
 -F$SDK/System/Library/Frameworks" \
 -Aldflags="-arch i686 -arch ppc -Wl,-syslibroot,$SDK" \
 -Alddlflags="-arch i686 -arch ppc -Wl,-syslibroot,$SDK" \
 -Dusethreads \
 -de

という形になった(実際には改行を入れずに入力した)。
Perl を新たにインストールする場合はこれで対応できることはわかったが、すれにインストールされている Perl でも同じことができないだろうか。README.macosx に Universal Binary についての記述があるのは perl-5.8.8 からのようなのでうまくいくかどうかわからなかったが、試しに DBI モジュールの Makefile にある CCFLAGS、LDFLAGS、LDDLFLAGS 変数の値を編集して make してみたところ、あっさりうまくいってしまった。make test もスキップされたものを除きすべて成功し、さらにインストールして動かしてみると、Tiger にインストールされている(Universal Binary ではない)Perl でもちゃんと動くことが確認された。
いちいち Makefile を編集するのは面倒なので他に方法がないかと調べてみると、perl Makefile.PL でオプションの指定ができることがわかった。しかしこれもなんだか面倒なので、もっと楽な方法はないものか。Config.pm を編集することによってどんな場合でも Universal Binary にしてしまうという手もありそうだけれど、簡単に切り替えることができればもっと便利だ。このあたりはもう少し研究(?)が必要かな。
あとは、このモジュールが Intel Mac でもちゃんと動くかどうか。これが確認できれば、Intel Mac でもネイティブで動く POPFile を作ることができそうだ。