Bazel 的 select 没有被解释

Bazel's select isn't interpreted

我正在尝试在当前操作系统上设置条件(在 Bazel 4.2.2 中):

    is_darwin = select({
        "@bazel_tools//src/conditions:darwin": True,
        "//conditions:default": False,
    })

    if is_darwin:
        # a
    else:
        # b

然而我陷入a,即使我在Linux。

我试过打印出来,但是好像没有评价:

DEBUG: WORKSPACE:65:6: select({"@bazel_tools//src/conditions:darwin": True, "//conditions:default": False})

如何正确检查?

Select 仅在 rule implementation functions, not macros like you're using. You'll need to use attr.bool 中评估以创建属性,将 select 传递给它,然后基于该执行逻辑。

你也可以直接用ctx.target_platform_has_constraint来做,不用select:

def _impl(ctx):
  darwin_constraint = ctx.attr._darwin_constraint[platform_common.ConstraintValueInfo]
  if ctx.target_platform_has_constraint(darwin_constraint):
    print('on darwin')
  else:
    print('not darwin')


my_rule = rule(
  implementation = _impl,
  attrs = {
    ...
    '_darwin_constraint': attr.label(default = '@bazel_platforms//os:darwin'),
  },
)

查看差异的另一种方法是加载 BUILD 文件和 运行ning 宏发生在 loading phase 中,但评估 selects 发生在加载和分析阶段之间。相关步骤是:

  1. 加载阶段生成目标图和它们之间的转换。这些目标将规则绑定到一组属性值,其中包括未评估的 selects.
  2. 此图与 command-line 标志相结合,为每个目标生成一个或多个 configurations
  3. 每个目标都使用适用于它的每个配置进行评估,selects 解析为适合该配置。实际上,在评估 selects 之后,实现函数是 运行 以及来自目标的属性值。这会生成配置的目标。