首页 > 解决方案 > Bazel 是否为所有可能的定义标志创建多个构建?

问题描述

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

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

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

标签: buildconfigbazel

解决方案


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

可能的解决方案:

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

build --copt -D__flag1__

推荐阅读