是否可以以某种方式设置构建链,以便忽略注释(或空白)中的任何更改?例如,只要更改了头文件中的注释,就会重新编译包含它的每个源文件,即使这完全没有必要。
当预处理器完成从修改后的文件中删除注释时,构建链可以首先检查输出是否实际发生了变化。如果没有,它应该表现为文件本身没有改变。
我正在使用Visual Studio 2010 btw。
编辑:@MikeSeymour,VS的cl.exe有一个开关/ Gm用于最小化重建。它没有很好的记录,但我认为它有点像我要求的。 但它与使用多核的/ MP交换机不兼容。在我的双核(w /超线程)上,/ Gm需要平均跳过4个单元中的~3个的编译。虽然我发现这种情况令人怀疑,但我甚至不确定如何评估/ Gm是否值得。
答案 0 :(得分:2)
是。你必须有一个构建系统,如果某个谓词为真,你可以触发构建事件。你喜欢的是一个谓词,"这个文件以语义上有趣的方式改变了#34;。
这种谓词的良好近似存在于我们的SmartDifferencers工具系列的形式,它们使用源代码结构的深层知识(例如,生产解析器)来比较源代码文件。特别是,SmartDifferencer将根据语言结构的变化(例如,标识符,语句,声明,块)和合理的编辑操作(插入,替换,删除,移动,重命名,重命名块等)来显示源代码的变化。 )。它对布局或评论不感兴趣(除非你强迫它)。因此,让SmartDifferencer判断源代码文件是否更改了注释或空格以外的内容非常容易。 SmartDifferencers适用于各种语言。
现在,您如何让构建系统合作? Unix在谓词上创建触发器,但不是这种类型;它实际上做的是根据与目标相比的文件日期的新近度触发实体上的构建事件。你可以通过依赖于" changed_signal"来伪装它。文件,通过制造这样的文件,如果SmartDifferencer看到一个有趣的差异。
答案 1 :(得分:0)
没有
编译器如何知道您对文件所做的唯一更改是在评论中,直到编译该文件为止?
然后必须重新编译后续文件,因为依赖文件确实发生了变化,即使生成的二进制文件是相同的。
答案 2 :(得分:0)
有许多技术可以避免很多相互依赖。尝试使用前向声明。
使用前向声明,您只需要编译实际使用代码的代码。斯科特迈尔斯的书可以告诉你更多。有关这个主题的好几页。