【问题标题】:Declared include source C++ compile action invalidation声明包含源 C++ 编译操作无效
【发布时间】:2017-06-12 21:54:57
【问题描述】:

(来自https://groups.google.com/d/msg/bazel-discuss/HEpui0DLvnA/RzuwICDmBgAJ

如果小组/开发人员提出并回答了这个问题,请原谅我。

“声明的包含源”文件列表是 C++ 编译操作键的一个组件。

这意味着向 cc_* 目标的 srcs 或 hdrs 添加头扩展文件会导致所有可以看到声明的列表内容的编译操作无效(在 hdrs 的情况下,传递性地)。

任何人都可以解释这如何是必要的,什么时候包含修剪应该为编译提供最小的可能失效源集?

【问题讨论】:

    标签: bazel


    【解决方案1】:

    声誉使我无法对您的回答发表评论,而转发意味着我不拥有该问题,但问题不仅仅是“重新验证”:

    声明的包含源是传递派生的,导致依赖目标中的所有编译的操作无效和重新执行(不仅仅是重新验证,其定义充其量对我来说是模糊的)。

    这篇文章的目的是讨论(因此 bazel-discuss)是否有任何方式可以通过添加(而不是讨论删除)的定义来影响以前编译的输出头文件,不更改与先前编译相关的任何源。输入集将被修剪以匹配使用的头文件,应该(必须)足够准确地描述动作重新执行的唯一可能触发器。任何编译依赖于新添加的标头的能力为零,无需进一步更改操作输入集的实际内容。

    【讨论】:

    • “声誉使我无法对您的答案发表评论,而转贴意味着我不拥有该问题”——抱歉,我没有预料到这个问题。
    • “重新验证”是指 Bazel 重新运行该操作,但如果其输出与上次运行时相同,则 Bazel 认为下游操作(取决于此文件)是向上的迄今为止。我认为添加头文件会影响编译,例如如果已包含同名文件但在不同的包含路径中找到。示例:您将自己的“stdio.h”添加到srcs
    • 我认识到 bazel 的动作缓存和架构的难度,但这会创建一个“可能导致修改”目标的笨拙横截面。虽然 stdio.h 示例是有效的(虽然与本地/系统引用/尖括号包含路径很复杂),但基本名称的实际限制,更不用说解析的路径,被完全忽略,添加了我的 'new_header.h'没有出现在 任何 现有可用的声明包含列表中,价格昂贵得离谱。
    • 您是否发现在添加 new_header.h 后,依赖于您的 cc_library 的所有内容都被重建了?您是将其添加到srcs 还是hdrs?如果是前者,并且没有包含这个头文件,那么 Bazel 应该只重建这一个规则,并注意生成的目标文件与前一个构建中的相同,并且不重建任何依赖于这个的规则(除非它们依赖于其他也发生了变化的东西)。也可能发生标题被该包中的glob 拾取,重建目标所依赖的。你有复制品吗?
    【解决方案2】:

    当规则的定义改变时(你添加一个文件到 srcs/hdrs),Bazel 必须假设改变可能会影响编译结果,即使其他文件都没有改变。 (例如,您刚刚添加了一个之前缺少的标头。)

    如果您重建目标 Bazel 将重新运行编译操作。如果该(目标文件)的输出与 Bazel 上次运行该操作时相同,它将重新验证下游操作而不重新执行它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-12
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2016-06-18
      • 2019-08-26
      • 1970-01-01
      相关资源
      最近更新 更多