Bazel 声明包含源C++;编译操作无效

Bazel 声明包含源C++;编译操作无效,bazel,Bazel,(来自) 如果小组/开发人员已经询问并回答了这一问题,请原谅我 “声明包含源文件”列表是C++编译的操作键的一个组成部分。p> 这意味着将头扩展文件添加到cc_*目标的SRC或HDR中会导致所有可以看到声明列表内容的编译操作无效(在hdrs中,是传递的) 有人能解释一下,当include prunning应该为编译提供最小的可能无效源集时,这是如何必要的吗?当规则的定义更改时(您将一个文件添加到srcs/hdrs),Bazel必须假设更改可能会影响编译结果,即使其他文件都没有更改。(例如,您刚刚

(来自)

如果小组/开发人员已经询问并回答了这一问题,请原谅我

“声明包含源文件”列表是C++编译的操作键的一个组成部分。p> 这意味着将头扩展文件添加到cc_*目标的SRC或HDR中会导致所有可以看到声明列表内容的编译操作无效(在hdrs中,是传递的)


有人能解释一下,当include prunning应该为编译提供最小的可能无效源集时,这是如何必要的吗?

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


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

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


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

声誉阻止我对您的答案发表评论,而重新发布意味着我不拥有该问题,但问题不仅仅是“重新验证”:

声明的包含源是通过传递方式派生的,导致操作失效,并对依赖目标中的所有编译重新执行(而不是简单地重新验证,其定义对我来说是模糊的)


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

声誉阻止我对您的答案发表评论,而重新发布意味着我不拥有该问题,但问题不仅仅是“重新验证”:

声明的包含源是通过传递方式派生的,导致操作失效,并对依赖目标中的所有编译重新执行(而不是简单地重新验证,其定义对我来说是模糊的)


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

“声誉使我无法对您的答案发表评论,而重新发布意味着我不拥有该问题”——很抱歉,我没有预料到这个问题。通过“重新验证”我的意思是Bazel重新运行该操作,但如果其输出与上次运行时相同,则Bazel认为下游操作(取决于此文件)是最新的。我认为添加头文件可能会影响编译,例如,如果已经包含具有相同名称的文件,但在不同的包含路径中找到该文件。示例:您将自己的“stdio.h”添加到
srcs
。我认识到bazel的动作缓存和体系结构很难做到这一点,但这会造成“可能导致修改”目标的难以处理的横截面。虽然stdio.h示例是有效的(尽管本地/系统引号/尖括号包含路径很复杂),但基名的实际限制,更不用说解析路径,被完全忽略了,添加我的“new_header.h”(没有出现在任何现有的已声明包含列表中)的成本高得离谱。您是否注意到,在添加了new_header.h之后,依赖于您的cc_库的所有内容都会重建?您是否将其添加到
srcs
hdrs
?如果是前者,并且没有任何内容包含此标头,那么Bazel应该只重新生成这一个规则,并注意生成的对象文件与上一个生成中的相同,并且不会根据这一个重新生成任何规则(除非它们依赖于也发生了更改的其他内容)。也可能会发生这样的情况:头被该包中的
glob
拾取,重建的目标依赖于该包。你有重播吗?“声誉阻止我对你的答案发表评论,重播意味着我不拥有这个问题”--很抱歉,我没有预料到这个问题。通过“重新验证”,我的意思是Bazel重新运行该操作,但如果其输出与上次运行时相同,Bazel会考虑下游操作(取决于此文件)是最新的。我认为添加头文件可能会影响编译,例如,如果已包含同名文件,但在不同的包含路径中找到该文件。例如:添加自己的“stdio.h”我认识到bazel的动作缓存和体系结构很难做到这一点,但这造成了“可能导致修改”目标的难以处理的横截面