重置检测源文件更改
有时我必须处理使计算机时钟向前移动的代码。在这种情况下,某些.cpp或者.h文件会将其最新修改日期设置为将来的时间。
稍后,当我的时钟固定下来并且我编译了源代码后,系统将重建项目的大部分内容,因为某些最新的修改日期是在将来。每个后续的重新编译都有相同的问题。
我知道的解决方案是:
a)找到具有将来时间的文件,然后重新保存。此方法并不理想,因为项目非常大,即使Windows高级搜索查找已更改的文件也要花费一些时间。
b)删除整个项目,然后从svn中重新签出。
有谁知道我该如何解决这个问题?
在Visual Studio中也许有一个设置可以让我告诉编译器使用存档位而不是最后修改日期来检测源文件更改吗?
还是有一种可以在这种情况下使用的递归修改日期重置工具?
解决方案
回答
我不使用Windows,但是肯定有诸如awk或者grep之类的东西,我们可以使用它们来找到带有"未来"时间戳记的文件,然后"触摸"它们,以便它们具有正确的时间,甚至是perl脚本。
回答
我不知道这是否适合情况,但是我们如何不将时钟向前移动,而是包装gettime方法(或者我们使用的任何方法),并使其返回我们所需的将来时间?
回答
安装Unix Utils
touch temp find . -newer temp -exec touch {} ; rm temp
确保在调用find时使用完整路径,否则可能会使用Windows的find.exe。这在Windows Shell中未经测试-我们可能需要稍微修改语法。
回答
我建议我们使用一个虚拟机,在该虚拟机上我们可以随心所欲地使用时钟,并且不会影响开发计算机。两个免费的是Microsoft的Virtual PC和Sun的VirtualBox。
回答
如果这是我的问题,我将寻找避免浪费系统时间的方法。在单元测试,虚拟机或者其他东西下隔离代码。
但是,因为我喜欢PowerShell:
Get-ChildItem -r . | ? { $_.LastWriteTime -gt ([DateTime]::Now) } | Set-ItemProperty -Name "LastWriteTime" -Value ([DateTime]::Now)
回答
1)使用不使用时间戳的构建系统来检测修改,例如scons
2)使用ccache可以加速使用时间戳的构建系统(并重新构建所有时间戳)。
无论哪种情况,它都使用md5sum来验证文件已被修改,而不是时间戳。