如何将当前工作空间名称包含在规则的默认参数值中?

时间:2017-06-21 20:27:49

标签: bazel

假设我有一条规则:

blah = rule(
    attrs = {
        "foo": attr.string(default = "@HELP@"),
    },
)

我希望默认值foo包含调用规则的工作空间的名称。我怎么能做到这一点?

(注意:一种可接受的方法是在值中留一个占位符并在规则使用属性时替换它,但我无法弄清楚如何获取当前工作空间。我能找到的最接近的是{ {1}},但“主”工作区为空,例如ctx.label.workspace_root为其他东西。)

external/foo没有给出正确的答案。例如,如果我ctx.workspace_name,我得到的结果如下:

print("'%s' -> '%s'", (ctx.label.workspace_root, ctx.workspace_name))

......这是错的;那些应该是'foo'和'bar',而不是'main'('main'是我的主要/ root工作空间)。请注意,来自这些上下文的标签是例如'@foo //:foo',所以Bazel显然知道正确的工作区名称。

2 个答案:

答案 0 :(得分:1)

您可以使用占位符属性,然后在实现中使用ctx.workspace_name

def _impl(ctx):
  print("ws: %s" % ctx.workspace_name)

blah = rule(
    implementation = _impl,
)

答案 1 :(得分:1)

就获取工作区名称而言,这似乎不是最佳的,但似乎也有效:

def _workspace(ctx):
    """Compute name of current workspace."""

    # Check for meaningful workspace_root
    workspace = ctx.label.workspace_root.split("/")[-1]
    if len(workspace):
        return workspace

    # If workspace_root is empty, assume we are the root workspace
    return ctx.workspace_name

Per Kristina在原始问题中的回答和评论,然后可以用它来替换参数值中的占位符。