Bazel select() 基于构建配置

Vic*_*tor 2 bazel

我试图根据用户是否运行bazel testbazel build.

具体来说,我想要 a 的条件依赖cc_library.deps和 中的条件定义cc_library.defines

我发现这select()是要走的路,但我不知道如何知道用户运行什么操作。

dms*_*dms 5

我不知道有什么方法可以使用 来检测当前命令(buildvs test) ,但我认为您可以使用自定义键select()实现类似的功能。

您可以定义config_setting如下所示的块:

# BUILD
config_setting(
  name = "custom",
  values = {
    "define": "enable_my_flag=true"
  }
)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

# .bazelrc
test --define enable_my_flag=true
Run Code Online (Sandbox Code Playgroud)

现在,每次运行时都会附加标志,并且将使用已定义的方式构建bazel test :mylib_test库。defineMY_FLAG

出于好奇,为什么要在使用一组不同的定义/依赖项构建的库上运行测试?这可能会违背测试的目的,因为最终您要测试的内容与您要使用的库不同。

  • 我发现这个例子非常令人困惑——自定义配置设置的名称是“custom”,但它没有出现在命令行的任何地方。它的定义是建立一个将`define`映射到`enable_my_flag=true`的键值对。目前尚不清楚“define”是否是一个 bazel 概念,或者它如何公开“#define”的 C 概念。但由于某种原因,我们用于设置的密钥是我们在命令行上放置的内容...并且我们将其设置为一个字符串值,看起来像设置一个变量,但我猜这只是一个字符串? (4认同)