2013-04-03 64 views
0

这种感觉应该是一个常见问题,但我还没有找到重复的答案。在ant中使用fileset适用于mapper

我有一堆对象文件,如果它们中的任何一个已经改变,它们都需要传递给链接器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> 

的问题是,只有更改被传递给链接,对象文件,我需要通过所有目标文件(基本上是之前的文件集的输出该映射器已被应用)。如果我在apply任务上设置了force属性,但链接器工作正常,但我只希望在目标文件已更新时重建它。

我知道我可以使用Uptodate task,但我希望我可以通过指定一个额外的fileset或类似的东西,只用apply task

回答

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> 
+0

谢谢。你的第一个代码片段会导致'link.exe'在每个版本上运行(我相信你在讨论'uptodate'时暗示了这一点)。正如我的问题所暗示的,我已经使用'uptodate'任务实现了一个解决方案,但是如果可能的话,我宁愿使用'apply'。由于'apply'同时支持'uptodate'检查(通过'mapper')和'filesets',我会认为它可以在没有明确的'uptodate'任务的情况下完成? – Mightymuke 2013-04-04 02:14:04