BoostのMac用dylibのビルドで、install_nameを変更する
b2の引数等いろいろ調べたり試したりしたけど、ダメで、結局*.jamファイルを変更した。
Boost.Logを使おうと思ったところ、どうにもMacはstaticライブラリが使えないようで...Macでsharedライブラリを使用する場合install nameを相対にできないと、配布時に困ると思ったので調べてたけど、まあ、コレが難儀しまして。
方々調べて、どうもclang-darwin.jamなどでinstall_nameを指定してるっぽいことが分かったので、いじってみたらなんとかなりました。
あまりにスマートじゃないので、マジかって感じですが、他の手段もよくわからず。
clang-darwin.jamファイル
ダウンロードして解凍したboostフォルダの次のファイル。
boost_1_54_0/tools/build/v2/tools/clang-darwin.jam
GCCの場合はdarwin.jamと思われるけど、目的のBoost.LogはGCCでビルドできないので、選択の余地なし。
とかく、ファイル内をみると actions link.dll bind LIBRARIESの中で、-install_pathの記述があるので...
actions link.dll bind LIBRARIES { ... -install_name "$(<[1]:D=)" ... }
無理矢理変えます。
actions link.dll bind LIBRARIES { ... -install_name "@executable_path/../libs/$(<[1]:D=)" ... }
ビルドと確認
そいで、clangでビルド。logだけ。本来はprefix指定して、installまでしてしまいますが、諸事情により省略。clangビルドはこちらを参考にしました。
$ cd boost_1_54_0 $ ./bootstrap.sh --with-toolset=clang $ ./b2 toolset=clang cxxflags="-std=c++11 -stdlib=libc++" linkflags="-stdlib=libc++" threading=multi --with-log
boost_1_54_0/stage/libsにできるので、otoolで調べてみます。
$ cd stage/lib $ otool -D libboost_log.dylib libboost_log.dylib: @executable_path/../libs/libboost_log.dylib
うまいこと変わってます。-Lでみてもいい感じに。
$ otool -L libboost_log.dylib libboost_log.dylib: @executable_path/../libs/libboost_log.dylib (compatibility version 0.0.0, current version 0.0.0) @executable_path/../libs/libboost_chrono.dylib (compatibility version 0.0.0, current version 0.0.0) @executable_path/../libs/libboost_thread.dylib (compatibility version 0.0.0, current version 0.0.0) @executable_path/../libs/libboost_filesystem.dylib (compatibility version 0.0.0, current version 0.0.0) @executable_path/../libs/libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0) @executable_path/../libs/libboost_date_time.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 28.4.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
Xcodeでサンプルを作ってみたところ、意図通りに動作。これでようやく使えるかな。