現在、TensorFlow のターゲット //tensorflow:libtensorflow_cc.so を Android 用の bazel でコンパイルしようとしています。Android で動作する TensorFlow の javacpp-presets を取得するには、このライブラリが必要です。
次のステートメントを試しました。
bazel build -c opt //tensorflow:libtensorflow_cc.so --crosstool_top=//external:android/crosstool --cpu=armeabi-v7a --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --verbose_failures
ただし、S_IREAD、S_IWRITE が見つからないというエラーが発生します。
external/gif_archive/giflib-5.1.4/lib/egif_lib.c:62:6: error: 'S_IREAD' undeclared (first use in this function)
S_IREAD | S_IWRITE);
^
external/gif_archive/giflib-5.1.4/lib/egif_lib.c:62:6: note: each undeclared identifier is reported only once for each function it appears in
external/gif_archive/giflib-5.1.4/lib/egif_lib.c:62:16: error: 'S_IWRITE' undeclared (first use in this function)
S_IREAD | S_IWRITE);
^
Target //tensorflow:libtensorflow_cc.so failed to build
Android Demo buildの Android build に触発されて、cc_binary 定義を次のコードに変更しようとしましたが、それでも同じエラーが発生しました。
cc_binary(
name = "libtensorflow_cc.so",
copts = tf_copts(),
linkopts = [
"-landroid",
"-ljnigraphics",
"-llog",
"-lm",
"-z defs",
"-s",
"-Wl,--icf=all", # Identical Code Folding
],
linkshared = 1,
linkstatic = 1,
deps = [
"//tensorflow/c:c_api",
"//tensorflow/cc:cc_ops",
"//tensorflow/core:tensorflow",
],
)
グーグルで調べたところ、S_IWRITE フラグが廃止されたため、Android に実装されていないことがわかりました。ただし、この問題を回避する方法がわかりません。
要約すると、Android 用の libtensorflow_cc.so ターゲットをビルドする方法を知っていますか? cc_ops も含める必要があるため、Android サンプルのライブラリ ビルドだけでは十分ではありません。