build - 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 对象没有被修改。这是如何运作的?谢谢你。
解决方案
defines
标志仅对foo_binary
目标和所有目标可见,这取决于foo_binary
(在您的情况下没有这样的目标)。foo_library
因此,您的定义在源文件中将不可见。没关系,因为 Bazel 对非循环构建图进行操作,并且您想创建一个循环:foo_binary
依赖于foo_library
代码,并且foo_library
依赖于foo_binary
defines
.
可能的解决方案:
cc_library
为每个可能的defines
组合区分,defines
在cc_library
规则中使用(推荐)- 使您的库成为仅标头库,因此所有代码都将受到当前目标标志的影响(但它也会减慢编译时间)
- set 使用或在命令行调用期间定义全局级别的标志
.bazelrc
(不推荐,因为它影响每个目标)
# .bazelrc
build --copt -D__flag1__
推荐阅读
- api - Sonos API 订阅回调已停止
- java - hibernate.cfg.xml 在阴影 jar 中的根目录中的多个依赖项
- python - 如何向dask提交大量长时间运行的并行任务?
- python - SettingWithCopyWarning - 如何修复此警告?
- angular - Angular 材质扩展面板默认关闭,但带有 routerLinkActive 的面板除外
- javascript - 为什么我在 JS 中的计时器功能不会开始倒计时?
- odoo - 在树视图中禁用创建按钮,但在 odoo 中保留导入
- azure - 无法从 Visual Studio for Mac 发布 Azure 函数
- java - 线程“GameThread”javax.media.j3d.CapabilityNotSetException 中的异常:组:无法设置转换
- c++ - 如何使用boost asio stable timer expiry获取执行时间点