Bazel-“:target”没有强制提供者:'TemplateVariableInfo'

时间:2019-12-04 15:15:21

标签: bazel

我想为自己的风格在bazel中创建一个工具链。我创建了一个名为toolchain.bzl的文件,此文件中的源为:

BarInfo = provider(
    fields = {
        "bar": "path to bar executable",
    },
    doc = "Defines a Bar toolchain based on an SDK",
)

def _bar_toolchain_impl(ctx):
    bar_info = ctx.attr.path
    platform_bar_info = platform_common.ToolchainInfo(
        bar_info = BarInfo(bar = bar_info),
    )
    return [platform_bar_info]

bar_toolchain = rule(
    implementation = _bar_toolchain_impl,
    attrs = {
        "path": attr.string(
            doc = "path to bar executable",
            mandatory = False,
        ),
    },
)

这是我在BUILD文件中写的。

load(":toolchain.bzl", "bar_toolchain")

toolchain_type(
    name = "toolchain_type",
    visibility = ["//visibility:public"],
)

bar_toolchain(
    name = "bar_toolchain",
    path = "/usr/local/bin/bar",
    visibility = ["//visibility:public"],
)

toolchain(
    name = "bar_linux",
    target_compatible_with = [
        "@platforms//os:linux",
        "@platforms//cpu:x86_64",
    ],
    toolchain = "//:bar_toolchain",
    toolchain_type = "//:toolchain_type",
    visibility = ["//visibility:public"],
)

genrule(
    name = "build_bar",
    srcs = glob(["**/*.bar"]),
    outs = ["a.sh"],
    cmd = """
        touch a.sh
    """,
    toolchains = ["//:toolchain_type"],
)

但是当我跑步

  

bazel build // :: build_bar

我收到此错误

  

'//:toolchain_type'没有强制提供程序:'TemplateVariableInfo'。

我该怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

genrule的{​​{3}}仅可用于访问特定于工具链的“生成变量”,这些变量被替换为genrule的命令字符串。由于您的工具链没有声明make变量,因此Bazel出错了。 toolchains attribute中介绍了定义工具链的make变量。