首页 > 解决方案 > 从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。

标签: androidbuildbazeltoolchain

解决方案


问题是由以下代码引起的:

工作空间:

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。


推荐阅读