2013-04-03 38 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

相關問題