I've been asked to explain what I meant with "Macrodef - hopefully this is going to remove a bunch of <antcall> "abuses" present in Ant 1.5 build files."
Let me pick an example from Ant's own build file. Starting with Ant 1.6 optional.jar has been split into a bunch of smaller jars, one per external library required by the classes in it. I.e we now have ant-trax.jar for the classes that require TraX and ant-xalan1.jar for those that need Xalan-J 1.x and so on.
In Ant's build file this lead to
<jar destfile="${build.lib}/${optional.jars.prefix}-trax.jar"
basedir="${build.classes}"
manifest="${manifest.tmp}">
<selector refid="needs.trax"/>
</jar>
<jar destfile="${build.lib}/${optional.jars.prefix}-xalan1.jar"
basedir="${build.classes}"
manifest="${manifest.tmp}">
<selector refid="needs.xalan1"/>
</jar>
...
and a lot more of them. 25 <jar> tasks that were identical in structure.
The Ant 1.5 way of avoiding duplication like this would have been
<antcall target="optional-jar">
<param name="dep" value="trax"/>
<antcall/>
<antcall target="optional-jar">
<param name="dep" value="xalan1"/>
<antcall/>
...
<target name="optional-jar">
<jar destfile="${build.lib}/${optional.jars.prefix}-${dep}.jar"
basedir="${build.classes}"
manifest="${manifest.tmp}">
<selector refid="needs.${dep}"/>
</jar>
</target>
leading to 25 <antcall>s in a row. This isn't more readable than the original version using separate jar tasks and in fact is a lot slower as <antcall> is a computational heavy operation in Ant. That's why we went back to the separate <jar>s after a few weeks.
And now the Ant 1.6 way:
<macrodef name="optional-jar">
<attribute name="dep"/>
<sequential>
<jar destfile="${build.lib}/${optional.jars.prefix}-${dep}.jar"
basedir="${build.classes}"
manifest="${manifest.tmp}">
<selector refid="needs.${dep}"/>
</jar>
</sequential>
</macrodef>
<optional-jar dep="trax"/>
<optional-jar dep="xalan1"/>
...
We have now defined a macro and use that macro repeatedly within the same build file execution. And on top of it, it's even more readable than the <antcall> approach.
Most if not all uses of <antcall> I've seen in build files can be replaced by <macrodef> (or by understanding <target>'s depends attribute). I'm not really sure that there is any use-case for <antcall> anymore.
blog comments powered by Disquspath: /en/Apache/Ant | # | Writebacks