Java Ant宏定义编译任务

Java Ant宏定义编译任务,java,compiler-construction,ant,macrodef,Java,Compiler Construction,Ant,Macrodef,我正在构建一个编译器(和语言),它通常会被调用,因此: java -jar nc.jar \ -p some/referenced/package.nc \ -p framework.nc \ source1.ns source2.ns sourceN.ns \ -o output/package.nc 我想在我的ANT构建文件中包含一个任务,该任务调用编译器来编译标准库和所有测试用例,但将每个单独的编译器调用指定为任务是痛苦的: <target n

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

java -jar nc.jar \
    -p some/referenced/package.nc \ 
    -p framework.nc \ 
    source1.ns source2.ns sourceN.ns \ 
    -o output/package.nc
我想在我的ANT构建文件中包含一个任务,该任务调用编译器来编译标准库和所有测试用例,但将每个单独的编译器调用指定为
任务是痛苦的:

<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不支持嵌套的“fileset”元素


有没有一种方法可以在不扩展ANT本身的情况下做到这一点?或者,将ant任务添加到我的编译器中是否相当容易?我对最后一个
任务的语法不是特别挑剔。

我过去也遇到过类似的问题,即开箱即用的Ant任务没有完成我希望它们完成的任务。我发现编写自己的Ant任务非常容易

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


您提到您不想扩展Ant本身,但如果您的问题没有得到简单的答案,我想我会提到创建自己的Ant任务非常简单。看看它到底是什么意思?无法接受文件集。您必须以字符串形式传递路径,如../nframework/n/debug。我会自己复制javac任务。@Kevin:你说得对,我只是查看了一下,看起来比我想象的容易多了。比这种
方法更重要的是,如果您发布了“ExtendAnt”作为答案(可能有一个例子说明在task类中需要定义哪些方法),我会接受它。