2017-06-21 23 views
1

比方说,我有一个规则:如何将当前工作空间名称包含在规则的默认参数值中?

blah = rule(
    attrs = { 
     "foo": attr.string(default = "@[email protected]"), 
    }, 
) 

我想要的foo的默认值包含调用规则的工作区的名称。我怎样才能做到这一点? (注意:一个可接受的方法是在值中留下一个占位符,并在规则使用该属性时将其替换,但我无法弄清楚如何获取当前工作空间。最接近的我可以找到的是ctx.label.workspace_root,但对于“主”工作空间是空的,例如external/foo用于其他事情。)

ctx.workspace_name不能给出正确的答案。例如,如果我print("'%s' -> '%s'", (ctx.label.workspace_root, ctx.workspace_name)),我得到如下结果:

'externals/foo' -> 'main' 
'externals/bar' -> 'main' 

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

回答

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 

每克里斯蒂娜在原来的问题的答案和注释,这可以被用来替换参数值中的占位符。

1

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

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

blah = rule(
    implementation = _impl, 
) 
+0

不,这会在主工作区以外给出错误答案。 (查看更新后的问题。) – Matthew

+1

哦,好点。它实际上应该在将来给出正确的结果(一旦https://github.com/bazelbuild/bazel/issues/1262在),但在那之前你会被卡住的黑客脚本(抱歉)。 – kristina

相关问题