我有一个我正在构建的编译器(和语言),通常这样调用:
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 任务添加到我的编译器是否相当容易?我对最终<nc>
任务的语法并不十分挑剔。