« ADCサンプル BoundButton | トップページ | Cocoa の例外についての詳しい説明 @MacDevCenter »

2007.07.31

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 化しているみたいだし。

|

« ADCサンプル BoundButton | トップページ | Cocoa の例外についての詳しい説明 @MacDevCenter »