如何避免重新编译未更改的代码?

时间:2018-07-05 05:02:21

标签: visual-c++ msbuild

我的工作场所使用SVN,我在本地使用Git。我的工作流程涉及从SVN更新,提交到“ svn_only” Git分支,然后在此基础上重新建立我当前的主题分支。

所有这些都是说,即使内容实际上并未更改,我的源文件上的“已修改”时间戳也会相当频繁地更改。由于程序决定需要构建实际上已构建了最新的对象和库文件的内容,因此这可能会导致很长的编译时间。

我编写了一个脚本,该脚本遍历我的项目,并将每个.lib,.exe,.lastbuildstate,.ilk,.pdb,.o和.tlog文件上的“修改后”时间戳更新为我启动了脚本。但是,这对它决定需要构建的内容没有任何影响。

我已经读过https://docs.microsoft.com/en-us/visualstudio/msbuild/incremental-builds,其中指出

  

如果某项的输出文件比其输入文件的年龄相同或较新,则该文件被认为是最新的。

     

如果所有输出项目都是最新的,则MSBuild会跳过目标。目标的这种增量构建可以显着提高构建速度。如果只有一些文件是最新的,则MSBuild将执行目标,但会跳过最新的项目,从而使所有项目都是最新的。

所以...应该这样做,不是吗?我想念什么?是否需要是“已创建”时间戳和“已修改”时间戳?

e:这是我目前的尝试。它没有理想的效果,但是我不知道为什么:

#!/bin/sh

if [ -z $1 ];then
  echo "Usage: $0 <commit hash> [<to commit hash (else head)>]"
  exit 1
fi

commit1=$1
commit2=$2

timestamp=`date --date yesterday +%Y%m%d%H%M.%S` #201807051536.54

git diff $commit1 $commit2 --name-only |  xargs --verbose -d '\n' touch -t$timestamp

这确实确实将目标文件修改为昨天的时间戳,但这仅部分影响MSVC是否决定需要重建它们。

如果所有内容都是最新的(最近生成的),则如果我touch将其时间戳设置为昨天的源文件,MSVC不会对其进行编译。凉。如果我只是touch来将时间戳设置为当前时间,它会编译。因此,源文件的时间戳显然是一个因素,但它并不是唯一的因素。

0 个答案:

没有答案