0

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

我有一堆目标文件,如果它们中的任何一个发生了变化,它们都需要传递给链接器 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,但我希望我可以通过指定一个附加的或类似的东西来只用apply 任务来做到这一点。fileset

4

1 回答 1

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>
于 2013-04-04T01:59:04.283 回答