这感觉它应该是一个常见的问题,但我还没有找到重复的答案。
我有一堆目标文件,如果其中任何一个已经更改,则需要将它们都传递给链接器exec。我有一个apply
任务如下:
<target name="linker">
<apply executable="link.exe" parallel="true">
<arg value="-o" />
<targetfile />
<srcfile/>
<fileset dir="obj" includes="*.o"/>
<globmapper from="*.o" to="myapp.exe" />
</apply>
</target>
问题是只有已更改的目标文件被传递给链接器,我需要传递所有目标文件(基本上是应用映射器之前文件集的输出)。如果我在force
任务上设置apply
属性,链接器工作正常,但我只希望它在目标文件更新时重建。
我知道我可以使用Uptodate task,但我希望通过指定额外的fileset
或类似内容,我只能使用apply task。
答案 0 :(得分:1)
您的问题不是<fileset>
任务,而是<mapper>
。与大多数构建系统一样,Ant通过不处理未更改的文件来尝试节省时间。 映射器将源(具有*.o
后缀的文件)映射到目标(myapp.exe
文件)。它正在做你想要的。
您可能想要做的是使用<arg/>
子实体来指定输出文件名:
<apply executable="link.exe">
<arg value="/out"/>
<arg value="myapp.exe"/>
<fileset dir="obj">
<include name="**/*.o"/>
</fileset>
</apply>
您可以使用<uptodate>
查看您的*.o
个文件是否比myapp.exe
文件更新,但如果您使用的是映射器,则会限制*.o
}文件只有那些比myapp.exe
更新的文件。
<uptodate property="needs.linking"
targetfile="myapp.exe">
<srcfiles dir="obj">
<include name="**/*.o"/>
</srcfiles>
</uptodate>
<target name="linker"
if="needs.linking">
<apply executable="link.exe">
...
</target>