背景
- TBB を使っているライブラリを Android 向けにビルドしたいため, TBB をビルドせねばならない.
- 昨今だったら, C++11 thread でも十分そうであるが, 既存ライブラリを書き換えるのがめんどい
- TBB オフィシャルでは, 基本 Makefile しか提供されていない
- 一応 Android aarch64 は対応しているが...
TBB のソースコードについて.
ソースコードがカオスです. あんまりいじりたくないですね.
AARCH64 固有のフラグ
aarch64 固有のビルド設定(aarch64 依存のコード)は, DO_ITT_NOTIFY
を off にする以外は特にないようです.
CMake ビルド
add_submodule でビルド
一応すでに対応されているものがあります.
https://github.com/wjakob/tbb
(ちょっとふるい)
また, check_cxx_compiler_flag とか呼び出して CMAKE_CXX_FLAGS
を直接書き換えているので, このまま使うにはおすすめしません.
外部コマンド呼び出しでビルド
オフィシャルにあります.
ただ, cross compile に対応しているかは不明です.
tbb git repo に対して add_submodule
wjakob/tbb
を参考に, CMakeLists.txt だけ別ででっち上げてビルドするのを embree-aarch64 に作りました.
static build だけ対応しています.
ただ, このビルドだと, 実行時にコア数をうまく見つけてくれないようです.
ビルドのメモ
インクルードパス
同名のヘッダファイルが public 用(include
), private 用(src
)にあるので, public 用を先に include path に指定しないとコンパイルエラーになります(tbb ソースでは, public ヘッダファイルも <file.h>
ではなくて "file.h"
で読んでいる).
(また, public ヘッダパスを CMake target_include_dir で INTERFACE だとなぜか include path に追加されない)
ビルド時に生成されるファイル
version_string.ver
が必要です. 適当にでっちあげてもよさそうな感じがあります.
.def ファイル
TBB は, リンク用の .def ファイルを linux, macOS でも作ります.
add_subdirectory() + static link だと不要かと思います.
コンパイルフラッグとか
DO_ITT_NOTIFY : プロファイリング用. x86 だけ. x86 では disable するとなぜかコンパイルできないです.
-mrtm
compiler flag : トランザクショナルメモリ用.
disable してもよさそう?
- deprecated warning :
tbb/src/
のファイルは結構 deprecated warning が出ます. TBB を使っているライブラリが使用していなければ, ビルドからはずすとよいでしょう.
TODO
- 自前ビルドすると, 実行時コア数うまく見つけてくれないらしい問題を解明する
- Makefile ビルドなどとの性能比較をする