构建系统可以识别版本控制吗?

时间:2016-10-05 06:16:52

标签: git makefile version-control msbuild build-system

Make,ant,msbuild,...我所知道的比较artefact timestamps 的所有构建工具,以决定是否需要重建。

当签出任何版本以便告诉构建系统时,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 # ...
如果只有make可以确定a.out是用old_version构建的,那么

可以等同于no-op。

有没有办法实现这个目标?你知道任何可以这种方式合作的构建系统/版本控制系统吗?

1 个答案:

答案 0 :(得分:1)

完全依赖时间戳实际上是这些构建系统的缺陷。例如,在以下情况下失败:

  1. 您希望使用一组不同的编译器标志进行重建。
  2. 源和构建工件驻留在具有去同步时钟的不同文件系统上。
  3. 调整时间戳以优化构建过程(就像在你的情况下一样)但是它以一种导致源的视图不一致的方式完成(即不是所有必须重建的东西都是实际重建的)。
  4.   

    Make,ant,msbuild,...我所知道的比较artefact的所有构建工具   时间戳决定是否需要重建。

    看看scons。与其他构建工具的显着区别之一是使用MD5签名可靠地检测构建更改。这意味着它为每个目标存储MD5哈希值和用于构建该目标的命令行。在重建目标之前,它会重新计算MD5哈希值并知道是否需要重新编译。当然,它比仅仅查看时间戳更慢但没有提到的问题。但是,scons还提供可选的,可配置的传统时间戳支持