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__
我正在使用 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__