如何将 select 个对象连接到 bazel 中的列表

How to concantenate select objects to a list in bazel

我有一个 bazel 目标,其属性必须是一个列表。

但是,我需要select根据 select 的结果向列表中主动添加元素。

glob_tests(
    # some stuff
    exclude = [
        "a.foo",
    ] + if_A([
        "x.foo",
    ]) + if_B([
        "y.foo",
    ]),
)

在上面的代码片段中,函数 if_A 和 if_B return select 对象。

但是当我按原样 运行 时,我收到一条错误消息,指出需要一个序列对象,但遇到了一个 select 对象。

如何将 select 对象转换为序列对象?

(我假设 glob_test 是调用内置函数 glob 的宏。)在加载 BUILD 文件时评估 glob,这是在已知任何配置之前。这意味着 glob 不能将任何 select 对象作为输入,因为不存在将 select 对象转换为列表的知识。

解决这个问题的方法是像这样将 select 调用提升到 globs 之上

some_test(
   name = "some_test",
   srcs = select({
       "//cond1": glob(["t*", "s*"], exclude=["thing"]),
       "//cond2": glob(["t*", "s*"], exclude=["something else"]),
   }),
)

而不是

some_test(
   name = "some_test",
   srcs = glob(
       ["t*", "s*"],
       exclude=select({
           "//cond1": ["thing"],
           "//cond2": ["something else"],
       }),
   ),
)