使用 bazel 使用 android ndk 工具链构建 C++ 目标的正确方法是什么

What is a proper way to build C++ target with android ndk toolchain using bazel

我有一个带有 tflite 模型推理的 .cpp 代码。此源代码文件是 bazel 工作区的一部分。我想使用默认桌面编译器和 ndk 的 arm64 自定义工具链构建它,然后 运行 在 PC 和移动设备上构建它并比较结果。如何从 ndk 工具链 (someandroidndkpath/toolchains/arm64/bin/clang) 指定自定义编译器?

我的 BUILD 文件中有一个简单的目标:

cc_binary(
    name = "Evaluation",
    srcs = ["evaluation.cpp"],
    visibility = ["//visibility:public"],
    deps = [
        "@org_tensorflow//tensorflow/lite:framework",
        "@org_tensorflow//tensorflow/lite/kernels:builtin_ops",
    ],
)

编辑: 感谢@ahumesky,它有效。我想阐明如何配置 android_ndk_repository 规则。

  1. 转到 tf repo tensorflow/third_party/android 并将这些文件放入您的项目。

  2. 将android sdk 的路径和版本设置为android_configure.bzl。 (这是最简单的方法,但你可以使用 .bazelrc 变量)

示例:

_ANDROID_NDK_HOME = "~/Android/Sdk/ndk/20.1.5948944/"
_ANDROID_SDK_HOME = "~/Android/Sdk/"
_ANDROID_NDK_API_VERSION = "29"
_ANDROID_SDK_API_VERSION = "29"
_ANDROID_BUILD_TOOLS_VERSION = "29.0.2"
  1. 添加到工作区。

示例:

load("//third_party/android:android_configure.bzl", "android_configure")
android_configure(name = "local_config_android")
load("@local_config_android//:android.bzl", "android_workspace")
android_workspace()
  1. 使用以下标志构建目标,将其推送到 android 设备和 运行。

首先确保您在 WORKSPACE 文件中设置了 android_ndk_repository 规则(您手动设置,或通过 TensorFlow 的 configure 脚本设置),然后尝试这些bazel 标志:

--crosstool_top=//external:android/crosstool
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain
--cpu=arm64-v8a

使用 Android 交叉工具,--cpu 可以是 arm64-v8aarmeabi-v7ax86x86_64[=23 之一=]

请注意,只有在构建 cc_binary 时才需要这些标志。如果您正在构建 android_binaryandroid_binary 的依赖项中的 cc_library 规则将自动使用 Android crosstool。