从 bazel 3.6.0 切换到 3.7.0 时如何解决 @bazel_tools//tools/android:databinding_exec

How to resolve @bazel_tools//tools/android:databinding_exec when switching from bazel 3.6.0 to 3.7.0

一直在用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 目标不再构建,我收到此错误:

ERROR: While resolving toolchains for target @bazel_tools//tools/android:databinding_exec: No matching toolchains found for types @bazel_tools//tools/cpp:toolchain_type. Maybe --incompatible_use_cc_configure_from_rules_cc has been flipped and there is no default C++ toolchain added in the WORKSPACE file? See https://github.com/bazelbuild/bazel/issues/10134 for details and migration instructions.

我试图找出哪个bazel版本开始抛出这个错误,我发现我仍然可以用3.6.0构建我的项目,但是如果我切换到3.7.0我开始出现上面的错误或 3.7.1.

查看 3.6.0 与 3.7.0 的变化,我想知道新的 create_dummy_sdk_toolchain 调用 tools/android/android_sdk_repository_template .bzl 会导致此失败,或者还有其他我遗漏的东西(比如 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,
)

错误:

ERROR: While resolving toolchains for target @bazel_tools//tools/android:instrumentation_test_check: No matching toolchains found for types @bazel_tools//tools/cpp:toolchain_type. Maybe --incompatible_use_cc_configure_from_rules_cc has been flipped and there is no default C++ toolchain added in the WORKSPACE file? See https://github.com/bazelbuild/bazel/issues/10134 for details and migration instructions.

你能告诉我解决由 3.6.0 与 3.7.0 差异引起的问题所需的项目缺少什么吗,我们现在需要为 [=81= 定义一个合适的工具链吗? ](我们不能再依赖 bazel 来弄清楚如何构建 android 目标)吗?

更新Dec/16/2020

看起来问题是由这段代码引起的:

工作空间:

register_execution_platforms(
    "//tools/config:host_platform",
)

在 BUILD 文件中:

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",
    ],
)

出于某种原因,这在 bazel 3.6.0 中有效,即使主机是 Linux,但它在 3.7.0 中不再有效。

问题是由这段代码引起的:

工作空间:

register_execution_platforms(
    "//tools/config:host_platform",
)

在 BUILD 文件中:

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",
    ],
)

出于某种原因,这在 bazel 3.6.0 中工作,即使主机是 Linux,但它不再在 3.7.0 中工作。

当我做 bazel build --platforms=//:linux_arm64 它给了我同样的错误: 为目标 @io_bazel_rules_go//:cgo_context_data 解析工具链时:找不到类型 @bazel_tools//tools/cpp:toolchain_type 的匹配工具链。也许 --incompatible_use_cc_configure_from_rules_cc 被翻转了,WORKSPACE 文件中没有添加默认的 C++ 工具链?有关详细信息和迁移说明,请参阅 https://github.com/bazelbuild/bazel/issues/10134

跟随命令有效 bazel build --platforms=@io_bazel_rules_go//go/toolchain:linux_arm64