在ant中使用fileset应用于mapper

时间:2013-04-03 20:44:36

标签: ant

这感觉它应该是一个常见的问题,但我还没有找到重复的答案。

我有一堆目标文件,如果其中任何一个已经更改,则需要将它们都传递给链接器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

1 个答案:

答案 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>