## MacroDef

### Description

This defines a new task using a <sequential> nested task as a template. Nested elements <attribute> and <element> are used to specify attributes and elements of the new task. These get substituted into the <sequential> task when the new task is run.

since Ant 1.6

### Parameters

Attribute | Description | Required
name | The name of the new definition | Yes
uri | The uri that this definition should live in. | No
textname | The textname attribute value becomes a macrodef attribute that gets set to the value of the text contents of the macro. since ant 1.6.1 | No

### Parameters specified as nested elements

#### attribute

This is used to specify attributes of the new task. The values of the attributes get substituted into the templated task. The attributes will be required attributes unless a default value has been set.

This attribute is placed in the body of the templated task using a notation similar to the ant property notation - @{attribute name}. (May be remembered as "put the substitution AT this location"). The escape sequence @@{x} is used to allow @{x} to be placed in the text without substitution of x. This corresponds to the $${x} escape sequence for properties.

The case of the attribute is ignored, so @{myAttribute} is treated the same as @{MyAttribute}.

### Parameters

Attribute | Description | Required
name | The name of the new attribute | Yes
default | The default value of the attribute. | No
description | This contains a description of the attribute. since ant 1.6.1 | No

#### element

This is used to specify nested elements of the new task. The contents of the nested elements of the task instance are placed in the templated task at the tag name.

The case of the element name is ignored.

### Parameters

Attribute | Description | Required
name | The name of the new attribute | Yes
optional | If true this nested element is optional. Default is false - i.e the nested element is required in the new task. | No
description | This contains a description informing the user what the contents of the element are expected to be. since ant 1.6.1 | No

### Examples

The following example defined a task called testing and runs it.

>     <macrodef name="testing">
>        <attribute name="v" default="NOT SET"/>
>        <element name="some-tasks" optional="yes"/>
>        <sequential>
>           <echo>v is @{v}</echo>
>           <some-tasks/>
>        </sequential>
>     </macrodef>

>     <testing v="This is v">
>        <some-tasks>
>           <echo>this is a test</echo>
>        </some-tasks>
>     </testing>

The following fragment defines a task called <call-cc> which take the attributes "target", "link" and "target.dir" and the nested element "cc-elements". The body of the task uses the <cc> task from the ant-contrib project.

>     <macrodef name="call-cc">
>        <attribute name="target"/>
>        <attribute name="link"/>
>        <attribute name="target.dir"/>
>        <element name="cc-elements"/>
>        <sequential>
>           <mkdir dir="${obj.dir}/@{target}"/>
>           <mkdir dir="@{target.dir}"/>
>              <cc link="@{link}" objdir="${obj.dir}/@{target}"
>                  outfile="@{target.dir}/@{target}">
>                 <compiler refid="compiler.options"/>
>                 <cc-elements/>
>              </cc>
>           </sequential>
>     </macrodef>

This then can be used as follows:

>     <call-cc target="unittests" link="executable"
>              target.dir="${build.bin.dir}">
>        <cc-elements>
>           <includepath location="${gen.dir}"/>
>           <includepath location="test"/>
>           <fileset dir="test/unittest" includes = "**/*.cpp"/>
>           <fileset dir="${gen.dir}" includes = "*.cpp"/>
>           <linker refid="linker-libs"/>
>        </cc-elements>
>     </call-cc>

The following shows the use of the `textname` attribute.

>     <macrodef name="echotest" textname="text">
>        <sequential>
>           <echo>@{text}</echo>
>        </sequential>
>     </macrodef>
>     <echotest>
>        Hello world
>     </echotest>

Copyright © 2003-2004 Apache Software Foundation. All rights Reserved.