Как правильно построить цель C ++ с android ndk toolchain, используя bazel - PullRequest
1 голос
/ 28 января 2020

У меня есть один код. cpp с выводом модели tflite. Этот файл исходного кода является частью рабочей области Bazel. Я хочу собрать его с помощью стандартного компилятора рабочего стола и пользовательского набора инструментов arm64 из ndk, затем запустить его на P C и мобильном устройстве и сравнить результат. Как я могу указать собственный компилятор из ndk toolchain (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. Go до репо tenenflow / third_party / android и поместите эти файлы в ваш проект.

  2. Установите путь и версию android sdk в android_configure.bzl. (Это самый простой способ, но вы можете сделать это с помощью .bazelr c переменных)

Пример:

_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"
Добавить в WORKSPACE.

Пример:

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()
Создайте цель со следующими флагами, вставьте ее на устройство android и запустите.

1 Ответ

2 голосов
/ 28 января 2020

Сначала убедитесь, что в вашем файле WORKSPACE установлено правило android_ndk_repository (либо вручную, либо с помощью скрипта configure TensorFlow), затем попробуйте следующие флаги bazel:

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

С помощью Android crosstool, --cpu может быть одним из arm64-v8a, armeabi-v7a, x86 или x86_64

Обратите внимание, что эти флаги необходимы, только если вы перестраивать cc_binary. Если вы строите правила android_binary, cc_library в зависимостях этого android_binary, то автоматически будет использоваться Android crosstool.

...