如何在MSBuild中指定额外的依赖文件?

时间:2014-09-10 23:56:38

标签: msbuild

在经典的MAKE文件中,很容易列出主文件,然后列出规则中的所有相关文件(例如包含文件)。

我认为MSBuild在目标中有一些属性,但似乎没有!给定输入文件列表以及从输入文件到输出文件名的转换,它为每个输入文件运行一次Target,如果输入文件不比输出文件新,则跳过它。

那么如何保留这种行为,而且如果任何相关文件也更新,那么不要跳过?依赖文件是从早期版本中注明的,我知道如何将文本文件读入Item数组。但是每个输入都有一个不同的依赖文件列表,我看不到如何告诉Target什么时候可以跳过。

我看到CL(C和C ++编译器)的逻辑根本没有在MSBuild脚本中处理! CL的“任务”(包装对cl.exe的调用)进行确定,并且不会调用cl.exe。但是Target永远不会跳过并为每个输入文件提供CL。

我想知道在MSBuild中直接执行此操作是否有用,而无需在.NET中编写代码来完成实际工作。

1 个答案:

答案 0 :(得分:2)

让我在MSBuild中解决有关CL目标的问题,因为它的实现方式非常特殊。此外,有些东西告诉我你正在做类似的事情,可能使用gcc或其他C / C ++编译器,你可以使用命令gcc -M获取依赖项列表。

对于C ++编译,C ++链接,C ++资源编译器以及更多的东西,MSBuild使用自动机制在构建时建立所有依赖项。这称为文件跟踪器,在线没有详细描述,但您可以在MSBuild book中获得大量详细信息。

File Tracker监视cl.exe,rc.exe和link.exe正在对文件系统执行的操作,并创建他们读取的文件列表 - 这将是当前编译或链接文件的依赖项。然后,它会将此列表保存在 obj 文件夹中的.tlog文件中。下次调用构建时,CL任务(或链接任务)读取其.tlog文件并比较所有依赖项的文件的时间戳,检查是否必须再次执行编译器(或链接器)。这些检查都在CL / RC / LINK任务中完成。换句话说,如果你看到正在执行CL任务,如果并不总是意味着将启动cl.exe。

现在,为了让你前进,几乎没有替代方法:

  1. 创建多个目标 - 每个主要输入文件一个目标。每个目标将采用单个主输入文件并构建它。对于目标的Inputs参数,您可以将依赖项列表附加到主文件,并将获得增量构建。明显的缺点是你必须维持很多目标。
  2. 使用FileTracker在C#中实现自定义任务。但是我不确定这是微软支持的东西,因为我看不到除了微软以外的任何人都使用它。
  3. 在C#中实现一个自定义任务,该任务将读取您的依赖项列表,然后有条件地执行该操作或根据文件的时间戳跳过该操作。