boost 1.35でUniversal Binaryを作成する方法

Building Boost as Universal Binary on Mac OS X
Boost総合スレ part6
によると、

bjam --toolset=darwin architecture=combined address-model=32,64 threading=multi link=static,shared runtime_link=static,shared release debug stage

でも、Core Duoな我がMacBookでは64-bitのコンパイルが通らないのか?(そんなことはないと思うんだけどなぁ)address-model=32,64を入れると、エラーが出てコンパイルされませんでした。

デバッグができないのはともかくコンパイルができないのはおかしいと思って、address-model=64だけだとコンパイルできます。どうやらエラーメッセージを読んでみると、32ビットと64ビットで同じファイル名でかぶるみたいなエラーでした。

そこで、address-modelを32と64でコンパイルしたものをそれぞれ用意し、Universal Binaryを作成するためのコマンドlipoでくっつけることにしました。

lipoの使い方は単純で

lipo -create 32ビットのファイル 64ビットのファイル -output くっつけた後のファイル

とやるだけです。

一つ一つやると面倒なので、rubyでスクリプトを書きました。

もう一つ問題があります。64ビットのバイナリを作成するとき、iostreamやらmpiやらは依存するライブラリ(zlibとか)の64ビット版が10.4のSDKには含まれていません。なので、途中でコンパイルエラーが起きます。これはbjamのオプションにさらにmacosx-version=10.5と指定することで解決します(でも、これで作ったバイナリはTigerで使えるのか謎です)。

まとめ!

bjam --toolset=darwin macosx-version=10.5 architecture=combined address-model=32 threading=multi link=static,shared runtime_link=static,shared release debug stage

bjam --toolset=darwin macosx-version=10.5 architecture=combined address-model=64 threading=multi link=static,shared runtime_link=static,shared release debug stage

で各々32ビットと64ビットのバイナリを作った後にlipoでくっつける。

ということになりました。