【问题标题】:Ant macrodef compilation taskAnt macrodef 编译任务
【发布时间】:2011-01-26 17:51:41
【问题描述】:

我正在构建一个编译器(和语言),通常会这样调用它:

java -jar nc.jar \
    -p some/referenced/package.nc \ 
    -p framework.nc \ 
    source1.ns source2.ns sourceN.ns \ 
    -o output/package.nc

我想在我的 ANT 构建文件中包含一个任务,该任务调用编译器来编译标准库和所有测试用例,但是将每个单独的编译器调用指定为 <java> 任务是很痛苦的:

<target name="framework" depends="compiler" description="Build the n framework">
    <!-- More compile steps -->
    <java jar="nc.jar" fork="true">
        <arg value="-p"/>
        <arg path="../nframework/build/n.core.nc"/>
        <arg path="../nframework/n/debug/DebugPrint.ns"/>
        <arg path="../nframework/n/debug/Trace.ns"/>
        <arg value="-o"/>
        <arg path="../nframework/build/n.debug.nc"/>
    </java>
    <!-- More compile steps -->
</target>

我想创建某种可以将其简化为类似的 ANT 任务:

<target name="framework" depends="compiler" description="Build the n framework">
    <!-- More compile steps -->
    <nc output="../nframework/build/n.debug.nc">
        <link-package path="../nframework/build/n.core.nc"/>
        <src>
            <fileset dir="../nframework/n/debug" includes="**/*.ns"/>
        </src>
    </nc>
    <!-- More compile steps -->
</target>

为此,我尝试了macrodef:

<macrodef name="nc">
    <attribute name="output"/>
    <element name="link-package"/>
    <element name="src"/>
    <sequential>
        <java jar="nc.jar" fork="true">
            <arg value="-p"/>
            <!-- This doesn't do what I want -->
            <link-package/>
            <!-- Neither does this -->
            <src/>
            <arg value="-o"/>
            <arg path="@{output}"/>
        </java>
    </sequential>
</macrodef>

我在上面尝试了几种变体,但每个错误都出现了类似的错误: /home/jwarner/code/nlang/nc/build.xml:55:java 不支持嵌套的“文件集”元素。

有没有办法在不扩展 ANT 本身的情况下做到这一点?或者,将 ant 任务添加到我的编译器是否相当容易?我对最终的&lt;nc&gt; 任务的语法并不十分挑剔。

【问题讨论】:

  • 您提到您不想扩展 Ant 本身,但如果您的问题没有得到简单的答案,我想我会提到创建您自己的 Ant 任务非常容易。看看ant.apache.org/manual/develop.html#writingowntask
  • 它的意思是否与它所说的完全一致? 不能获取文件集。您必须将路径作为字符串传递,例如 ../nframework/n/debug。我会自己复制 javac 任务。
  • @Kevin:你说得对——我只是调查了一下,这似乎比我想象的要容易得多。比这种&lt;macrodef&gt; 方法更重要的是,如果您发布“扩展 Ant”作为答案(也许有一个需要在任务类中定义哪些方法的示例),我会接受它。

标签: java compiler-construction ant macrodef


【解决方案1】:

过去我也遇到过类似的问题,即开箱即用的 Ant 任务并没有完全按照我的意愿去做。我发现编写自己的 Ant 任务非常容易。

文档简明扼要,但很好地解释了您需要做什么。

http://ant.apache.org/manual/develop.html#writingowntask

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2015-07-17
    • 2010-11-07
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多