如何编写一个在定义工作区内部或外部工作的bazel select宏?

时间:2016-06-17 14:23:33

标签: bazel

在工作区@base中,假设我有一个"宏"在main / macros.bzl中,例如:

def if_development(if_true, if_false = []):
    return select({
        "//main:development": if_true,
        "//conditions:default": if_false
    })

在main / BUILD中:

package(default_visibility = ["//visibility:public"])

config_setting(
    name = "development",
    values = { "define": "MODE=development" },
)

现在我希望能够从不同的工作区@child加载此宏,例如:

load("@base//main:macros.bzl", "if_development")

然后它会失败,因为//main:development未针对@base工作区解析,而是针对@child工作区解析了它。

ERROR: /path/to/child/src/BUILD:3:1: no such package 'main': BUILD file not found on package path and referenced by '//src:bar'.

但是,如果我完全符合条件,例如:

def if_development(if_true, if_false = []):
    return select({
        "@base//main:development": if_true,
        "//conditions:default": if_false
    })

然后它将在@child中工作,但在定义工作区@base中使用时失败,因为显然您无法使用@main表示法引用自己的工作区:

ERROR: /path/to/base/src/BUILD:3:1: no such package '@base//main': error loading package 'external': The repository named 'base' could not be resolved and referenced by '//src:bar'.

如何以一种在定义工作区内外工作的方式引用宏中的@base//main:development

1 个答案:

答案 0 :(得分:0)

这是一个错误! // main:开发应该解析为@base // main:自动开发。我已经为此提交了an issue

作为一种(烦人的)解决方法,您可以在@ child // main中重新定义配置设置。