android - 从bazel 3.6.0切换到3.7.0时如何解决@bazel_tools//tools/android:databinding_exec
问题描述
我一直在使用bazel构建一个android项目,最初是从0.24版本开始,然后使用2.0版本的时间更长,现在我正在尝试切换到最新的3.7.0 / 3.7.1版本。
目前,我正在为 android 使用以下重要的 .bazelrc 设置:
build:androidbuild --crosstool_top=@androidndk//:default_crosstool
build:androidbuild --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
build:android-32 --config=androidbuild --cpu=x86 --fat_apk_cpu=x86
所有cc_binary / cc_library目标仍然可以像以前一样构建,但android_binary目标不再构建,我收到此错误:
错误:在解析目标 @bazel_tools//tools/android:databinding_exec 的工具链时:没有为类型 @bazel_tools//tools/cpp:toolchain_type 找到匹配的工具链。也许 --incompatible_use_cc_configure_from_rules_cc 已经被翻转并且 WORKSPACE 文件中没有添加默认的 C++ 工具链?有关详细信息和迁移说明,请参阅 https://github.com/bazelbuild/bazel/issues/10134。
我试图找出开始抛出此错误的 bazel 版本,我发现我仍然可以使用 3.6.0 构建我的项目,但是如果我切换到 3.7.0 或 3.7.1,我开始收到上述错误。
查看 3.6.0 与 3.7.0 的更改,我想知道tools/android/android_sdk_repository_template.bzl中的新create_dummy_sdk_toolchain调用是否会导致此失败,或者我还缺少其他东西(例如cc_flags_supplier.bzl / compiler_flag中的更改.bzl源将incompatible_use_toolchain_transition设置为True)。
我尝试了使用--platforms的方法,但即使在这种情况下我仍然会遇到错误:
build:androidbuild --extra_toolchains=@androidndk//:all
build:android-32 --config=androidbuild --cpu=x86 --platforms=//config:android_x86
和:
platform(
name = "android_x86",
constraint_values = [
"@bazel_tools//platforms:x86_32",
"@bazel_tools//platforms:android",
],
cpu_constraints = [
],
os_constraints = [
],
target_platform = True,
)
错误:
错误:在解析目标 @bazel_tools//tools/android:instrumentation_test_check 的工具链时:没有为类型 @bazel_tools//tools/cpp:toolchain_type 找到匹配的工具链。也许 --incompatible_use_cc_configure_from_rules_cc 已经被翻转并且 WORKSPACE 文件中没有添加默认的 C++ 工具链?有关详细信息和迁移说明,请参阅 https://github.com/bazelbuild/bazel/issues/10134。
您能否告诉我解决由 3.6.0 与 3.7.0 差异引起的问题所需的项目中缺少什么,我们现在是否需要为 Android 定义一个合适的工具链(我们不能再依赖bazel 来弄清楚如何构建 android 目标)?
2020 年 12 月 16 日更新
看起来问题是由以下代码引起的:
工作空间:
register_execution_platforms(
"//tools/config:host_platform",
)
在构建文件中:
platform(
name = "host_platform",
constraint_values = [
],
cpu_constraints = [
"@bazel_tools//platforms:x86_32",
"@bazel_tools//platforms:x86_64",
],
host_platform = True,
os_constraints = [
"@bazel_tools//platforms:windows",
],
)
出于某种原因,即使主机是 Linux,这也适用于 bazel 3.6.0,但它不再适用于 3.7.0。
解决方案
问题是由以下代码引起的:
工作空间:
register_execution_platforms(
"//tools/config:host_platform",
)
在构建文件中:
platform(
name = "host_platform",
constraint_values = [
],
cpu_constraints = [
"@bazel_tools//platforms:x86_32",
"@bazel_tools//platforms:x86_64",
],
host_platform = True,
os_constraints = [
"@bazel_tools//platforms:windows",
],
)
出于某种原因,即使主机是 Linux,这也适用于 bazel 3.6.0,但它不再适用于 3.7.0。
推荐阅读
- elasticsearch - 汇总结果显示的项目少于 doc_count?
- visual-studio - Visual Studio 2019 Preview 1 缺少 windows.h
- swift - 如何快速保存和加载游戏场景?
- android - 解析错误意外令牌邮件传输
- swift - Binary operator '==' cannot be applied to operands of type 'UIImage?' and 'String' - Swift 4
- excel - 如何创建具有可变条件/条件的循环?
- github-pages - 如何在呈现的 Github 页面 README.md 上生成目录 (ToC)?
- python - BeautifulSoup 没有拉动页面上的所有元素
- r - 增加ggplot上轴线和绘图线之间的距离
- php - 如何从 PHP 脚本运行 Nodejs 服务器?