Make, ant, msbuild,…我所知道的所有构建工具都比较工件时间戳来决定是否需要重新构建。
Git在签出任何版本时将源文件的时间戳重置为'now',以便告诉构建系统:依赖于这些文件的工件应该重新构建。
然而:$ git checkout old_version # retrieving a.cpp@old_version
$ make # building a.out from a.cpp
$ git checkout new_version # updating a.cpp@new_version
$ git checkout - # resetting a.cpp@old_version
$ make # ...
可以等价于no-op,如果make可以确定a.out
是用old_version构建的。
有办法做到这一点吗?你知道有哪一个构建系统/版本控制系统可以以这种方式合作吗?
完全依赖时间戳实际上是这些构建系统的不足之处。例如,在以下情况下它会失败:
- 你想用一组不同的编译器标志进行重建。
- 源和构建工件驻留在具有非同步时钟的不同文件系统上。
- 时间戳被调整,以优化构建过程(就像在你的情况下),但它是在一种方式,导致不一致的观点的来源(即不是一切,必须重建实际上重建)。
Make, ant, msbuild,…我所知道的所有构建工具都比较工件时间戳来决定是否需要重新构建。
看scons。它与其他构建工具的显著区别之一是使用MD5签名可靠地检测构建更改。这意味着它为每个目标存储源的MD5散列和用于构建该目标的命令行。在重新构建目标之前,它会重新计算MD5哈希值,并知道是否需要重新编译。当然,它比仅仅查看时间戳要慢,但没有提到的问题。但是,scons还为传统的时间戳提供了可选的、可配置的支持。