背景
- Boost をどうしても利用しないといけない状況にある(使いたいライブラリが Boost を使っていて, コードを書き換えるにはめんどいなど)
- Boost の機能全部を利用するわけではない
- Android だと NDK の関係でコンパイラ指定が変わるので(r19 から standalone_toolchain.py でコンパイラのセットアップは deprecated になり, コンパイラの直指定に変わった), 明示的にコンパイラ設定をしたい
- 本当は cmake でのビルドにしたいが, bcm https://github.com/boost-cmake/bcm などがあるが, 理想は boost を submodule としてビルドしたいので, bcm は求めているのと違う感じもするのでとりあえず bjam/b2 でビルドする
対象
- NDK r19c or later
- Boost 1.69.0
ネットでは古い NDK を対象にする記事が多いので, ここでは NDK r19c or later(clang 限定 + standard_toolchain ではなく, aarch64-linux-android28-clang++
のようにコンパイラを直指定のバージョン)を扱います.
ちなみに gcc は NDK18 あたりで廃止され, clang のみ(+ libc++)になりました.
BCP
まず, boost 全部を使う必要はないので, bcp で必要なモジュールだけ抜き出します.
(bjam で --without-***
という手もがあるがめんどい)
bcp では, 使いたい機能(+ file?)を指定すると, 指定したターゲットのディレクトリに一式よろしくファイルをコピーします
$ bcp <<packages>> /path/to/target
ライブラリのコンパイルが不要(header file だけで完結)の場合はここで終了です.
お疲れさまでした.
ライブラリのコンパイルが必要なもの(e.g. system
, thread
)では,
build bootstrap.bat bootstrap.sh boostcpp.jam boost-build.jam
を bcp の <<packages>>
に含めておきます.
ビルドカスタム設定
user-config.jam
で, コンパイラ指定をします.
$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin
にコンパイラがあります.
# Set path to toolchain
local AndroidToolchainRoot =
/home/syoyo/local/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64
;
using clang
: android
: $(AndroidToolchainRoot)/bin/aarch64-linux-android28-clang++
;
など.
b2
の --user-config
オプションでファイルのありかを指定し, toolset=clang
とすることで, user-config.jam
の using clang
の設定を見るようになります.
$ ./configure
$ ./b2 --reconfigure toolset=clang target-os=android link=static --user-config=user-config.jam
などとしてビルドします. デフォルトでは 1 コアしか使わないので, CPU のコア数に応じて -j8
などを追記ください.
実例
の README と boost/user-config.jam
を参考ください.
TODO
- link 周りを改善する(
user-config.jam
で ldflags 指定とか). 現状 .so ビルド(link=dynamic)だと-lrt
が見つからないなどでエラーが出る. - cmake でビルドできるようにしたい(NDK r19c or later で)
- b2 で lzma などの探索を強制的に disable する
-
./configure
時にコンパイラ指定とかできるかしらん?