我正在使用第三方跨平台项目构建器,它使用各种编译器。 这个项目构建器总是完全重建项目,我正在尝试实现“智能重建”机制。
我想在每个.cpp上运行预处理器,crc结果并将其与之前重建的CRC进行比较。如果它们不同,我会标记.cpp进行编译。如果没有,我将使用前一个目标文件。
这种方法足够安全吗?在修改代码/头文件时,我是否可能获得相同的CRC?是否有某种CRC算法可以使其更安全?
答案 0 :(得分:1)
首先要做的明显检查(因为它们没有命中磁盘)是检查.cpp是否仍具有相同的大小。如果没有,浪费时间计算CRC是没有意义的。另一项检查是文件日期。这并不完美,但差异可能足以保证重建。
CRC基本上是正确的算法。它也会捕获重新排序,但不会加密。
答案 1 :(得分:0)
可能CRC-32就足够了,但为了更加安全,你可以使用SHA-1或该家族的其他更长版本。
重新阅读问题之后编辑:至少在理论上,修改后的源代码可能导致相同的CRC。使用SHA,可能性已经小得多(例如,一旦文件长度发生变化,SHA就会发生变化)。如果您需要这样的背景,有些文章会深入研究这些细节。
答案 2 :(得分:0)
GNU“cons”构建系统为每个目标生成组件文件和构建命令的MD5签名,然后可以决定是否重建目标。我们在前雇主处使用它,再加上构建缓存,它使构建大型源代码树的速度更快,特别是当每个开发人员都在处理他或她自己的小部分时 - 一旦所有代码都由构建了一次某人,没有人必须重建它。
另一方面,我发现构建控制文件的Perl语法过于复杂和混乱。