きりかノート 3冊め

おあそびプログラミング

merge.rb で ユニバーサルバイナリ

先週の話になるけれど merge.rb というツールのアナウンスが MacPorts-dev ML に流れていたのでチェック。複数のアーキテクチャのバイナリを lipo やらなにやらでユニバーサルバイナリ化することができるというもの。(タイトルに "SoC" とあるけど、Summer of Code と関係あるのかよくわからん)

試しに実行できるように、ページで紹介されている build_libpng.sh を実行すると、ppc ppc64 i386 x86_64 の 4つのアーキテクチャの libpng が /tmp/libpng 以下に作成される。これで merge.rb を実行する準備ができる。たとえば、

 % merge.rb -i /tmp/libpng ppc ppc64 i386 x86_64
% lipo -info ./out/usr/local/lib/libpng.dylib
Architectures in the fat file: out/usr/local/lib/libpng.dylib are: ppc ppc64
i386 x86_64

と、それぞれ作成したバイナリと他のヘッダファイル・man などが ./out 以下にマージして作成される(らしい)。単純に lipo するだけでなく、バイナリでないファイルも扱える(マージしない)のが特長なのかな。

たいていのプログラムでは CFLAGS/CPPFLAGS や LDFLAGS をいじるだけでユニバーサルバイナリを生成することができるけれど、そうでないケースもある。たとえば、ruby(1.8.6) では LDSHARED がひっかかって、--enable-shared なユニバーサルバイナリは一発では作ることができなかったりする。多くのソフトウェアを相手にするパッケージシステムでは、こういうアプローチが有効かもしれんね。Xcode もビルド時のログ出力を見ていると、アーキテクチャごとにビルドしてから lipo で fat 化しているみたいだし。