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 化しているみたいだし。
| 固定リンク
最近のコメント