Bazel select()基于构建配置

时间:2019-08-06 19:48:26

标签: bazel

我试图根据用户运行bazel test还是bazel build在编译时提供一些预处理器定义。

具体来说,我希望有一个cc_library.deps的条件依赖项和一个cc_library.defines中的条件定义。

我发现select()是可行的方法,但我不知道如何知道用户会执行什么操作。

1 个答案:

答案 0 :(得分:1)

我不知道有什么方法可以使用build检测当前命令(testselect()),但是我认为您可以使用custom keys来实现类似的目的

您可以定义一个config_setting块,如下所示:

# BUILD
config_setting(
  name = "custom",
  values = {
    "define": "enable_my_flag=true"
  }
)

并在您的库中使用它来控制defines

# BUILD - continued
cc_library(
  name = "mylib",
  hdrs = ["mylib.h"],
  srcs = ["mylib.cc"],
  defines = select({
    ":custom": ["MY_FLAG"],
    "//conditions:default": [],
  })
)

现在使用bazel build :mylib构建库将导致默认情况-没有定义存在,但是如果使用bazel build :mylib --define enable_my_flag=true构建,则将选择另一个分支,并且MY_FLAG将被定义。

例如,可以通过将--define添加到您的.bazelrc中来轻松扩展到测试用例:

# .bazelrc
test --define enable_my_flag=true

现在,每次您运行bazel test :mylib_test时,都会附加define标志,并且将使用定义的MY_FLAG来构建库。

出于好奇,为什么要在使用一组不同的定义/依赖关系构建的库上运行测试?这可能会破坏测试的目的,因为最后您要测试与将要使用的库不同的东西。