Bazel 是否为所有可能的定义标志创建多个构建?

Does Bazel create multiple builds for all possible defines flags?

我正在使用 bazel 构建一个 c++ 项目。我有一个 foo_binary.cc,其构建文件如下所示:

cc_binary (
name = "foo_binary",
srcs = ["foo_binary.cc", ],
linkopts = ["-lm"],
defines = ["__flag1__"],
deps = ["//......./foo_library",])

上面的定义标志可以取两个值:“flag1”或“flag2”。使用#ifdef,这些标志值在 foo_library.h 文件中用于在编译期间设置常量。因此,每当我构建 foo_binary 时,它是否会根据 cc_binary 配置中的标志创建不同的 foo_library 对象?我观察到它没有。我尝试将定义值从“flag1”更改为“flag2”,但未修改 foo_library 对象。这是如何运作的?谢谢。

defines 标志仅对 foo_binary 目标和所有目标可见,这取决于 foo_binary (在您的情况下没有这样的目标)。因此,您的定义在 foo_library 源文件中是不可见的。没关系,因为 Bazel 在非循环构建图上运行,而你想创建一个循环:foo_binary 取决于 foo_library 代码,而 foo_library 取决于 foo_binary defines.

可能的解决方案:

  • 为每个可能的 defines 组合区分 cc_library,在 cc_library 规则中使用 defines(推荐)
  • 让你的库成为一个只有头文件的库,这样所有代码都会受到当前目标标志的影响(但它也会减慢你的编译时间)
  • set 在全局级别使用 .bazelrc 或在命令行调用期间定义标志(不推荐,因为它会影响每个目标)
# .bazelrc

build --copt -D__flag1__