【问题标题】:Using fileset in ant apply with a mapper在 ant apply 中使用文件集和映射器
【发布时间】:2013-04-04 09:59:04
【问题描述】:

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

我有一堆目标文件,如果它们中的任何一个发生了变化,它们都需要传递给链接器执行程序。我有一个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

【问题讨论】:

    标签: ant


    【解决方案1】:

    您的问题不是&lt;fileset&gt; 任务,而是&lt;mapper&gt;。与大多数构建系统一样,Ant 试图通过不处理未更改的文件来节省时间。 映射器 将源(带有*.o 后缀的文件)映射到目标(myapp.exe 文件)。它正在做你想做的事。

    您可能想要做的是使用&lt;arg/&gt; 子实体来指定输出文件名:

    <apply executable="link.exe">
        <arg value="/out"/>
        <arg value="myapp.exe"/>
        <fileset dir="obj">
           <include name="**/*.o"/>
        </fileset>
    </apply>
    

    您可以使用&lt;uptodate&gt; 来查看您的任何*.o 文件是否比myapp.exe 文件新,但如果您使用映射器,您将*.o 文件限制为仅比@ 更新的文件987654331@.

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

    【讨论】:

    • 谢谢。你的第一个 sn-p 将导致 link.exe 在每个构建上运行(我相信你在讨论 uptodate 时提到过)。正如我的问题所暗示的那样,我已经使用uptodate 任务实现了一个解决方案,但如果可能的话,我更愿意使用apply。由于apply 支持uptodate 检查(通过mapper)以及filesets,我原以为它可以在没有明确的uptodate 任务的情况下完成?
    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多