|
- <html>
-
- <head>
- <meta http-equiv="Content-Language" content="en-us"></meta>
- <title>MacroDef Task</title>
- <link rel="stylesheet" type="text/css" href="../stylesheets/antmanual.css">
- <style type="text/css">
- <!--
- .code { background: #EFEFEF; margin-top: }
- -->
- </style>
- </head>
-
- <body>
-
- <h2><a name="macrodef">MacroDef</a></h2>
- <h3>Description</h3>
- <p>
- This defines a new task using a <code><sequential></code>
- nested task as a template. Nested elements <code><attribute></code> and
- <code><element></code> are used to specify attributes and elements of
- the new task. These get substituted into the <code><sequential></code>
- task when the new task is run.
- </p>
- <h3>Note</h3>
- <p>
- You can also use <i>prior defined</i> attributes for default-values in
- other attributes. See the examples.
- </p>
- <p>
- <em>since Ant 1.6</em>
- </p>
- <h3>Parameters</h3>
- <table border="1" cellpadding="2" cellspacing="0">
- <tr>
- <td valign="top"><b>Attribute</b></td>
- <td valign="top"><b>Description</b></td>
- <td align="center" valign="top"><b>Required</b></td>
- </tr>
- <tr>
- <td valign="top">name</td>
- <td valign="top">The name of the new definition</td>
- <td valign="top" align="center">Yes</td>
- </tr>
- <tr>
- <td valign="top">uri</td>
- <td valign="top">
- The uri that this definition should live in.
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- </table>
- <h3>Parameters specified as nested elements</h3>
- <h4>attribute</h4>
- <p>
- 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.
- </p>
- <p>
- 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").
- </p>
- <p>
- The escape sequence @@ is used to escape @. This allows @{x} to be
- placed in the text without substitution of x by using @@{x}.
- This corresponds to the $$ escape sequence for properties.
- </p>
- <p>
- The case of the attribute is ignored, so @{myAttribute} is treated the
- same as @{MyAttribute}.
- </p>
- <h3>Parameters</h3>
- <table border="1" cellpadding="2" cellspacing="0">
- <tr>
- <td valign="top"><b>Attribute</b></td>
- <td valign="top"><b>Description</b></td>
- <td align="center" valign="top"><b>Required</b></td>
- </tr>
- <tr>
- <td valign="top">name</td>
- <td valign="top">The name of the new attribute</td>
- <td valign="top" align="center">Yes</td>
- </tr>
- <tr>
- <td valign="top">default</td>
- <td valign="top">
- The default value of the attribute.
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- <tr>
- <td valign="top">description</td>
- <td valign="top">
- This contains a description of the attribute.
- <em>since ant 1.6.1</em>
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- </table>
- <h4>element</h4>
- <p>
- 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.
- </p>
- <p>
- The case of the element name is ignored.
- </p>
- <h3>Parameters</h3>
- <table border="1" cellpadding="2" cellspacing="0">
- <tr>
- <td valign="top"><b>Attribute</b></td>
- <td valign="top"><b>Description</b></td>
- <td align="center" valign="top"><b>Required</b></td>
- </tr>
- <tr>
- <td valign="top">name</td>
- <td valign="top">The name of the element</td>
- <td valign="top" align="center">Yes</td>
- </tr>
- <tr>
- <td valign="top">optional</td>
- <td valign="top">
- If true this nested element is optional. Default is
- false - i.e the nested element is required in
- the new task.
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- <tr>
- <td valign="top">implicit</td>
- <td valign="top">
- If true this nested element is implicit. This means that
- any nested elements of the macrodef instance will be placed
- in the element indicated by the name of this element.
- There can only be one element if an element is implicit.
- The default value is false. <em>since ant 1.6.2</em>
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- <tr>
- <td valign="top">description</td>
- <td valign="top">
- This contains a description
- informing the user what the contents of the element are expected to be.
- <em>since ant 1.6.1</em>
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- </table>
- <h4>text</h4>
- <p>
- This is used to specify the treatment of text contents of the macrodef.
- If this element is not present, then any nested text in the macro
- will be an error. If the text element is present, then the name
- becomes an attribute that gets set to the nested text of the macro.
- <em>Since ant 1.6.1.</em>
- </p>
- <p>
- The case of the text name is ignored.
- </p>
- <h3>Parameters</h3>
- <table border="1" cellpadding="2" cellspacing="0">
- <tr>
- <td valign="top"><b>Attribute</b></td>
- <td valign="top"><b>Description</b></td>
- <td align="center" valign="top"><b>Required</b></td>
- </tr>
- <tr>
- <td valign="top">name</td>
- <td valign="top">The name of the text attribute</td>
- <td valign="top" align="center">Yes</td>
- </tr>
- <tr>
- <td valign="top">optional</td>
- <td valign="top">
- If true nested text in the macro is optional, default is "false".
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- <tr>
- <td valign="top">trim</td>
- <td valign="top">
- If true, the nested text is trimmed of white space,
- default is "false".
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- <tr>
- <td valign="top">description</td>
- <td valign="top">
- This contains a description
- informing the user what the nested text of the macro is expected
- to be.
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- </table>
-
- <h3>Examples</h3>
- <p>
- The following example defined a task called testing and
- runs it.
- </p>
- <blockquote>
- <pre class=code>
- <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>
- </pre>
- </blockquote>
- <p>
- The following fragment defines a task called <code><call-cc></code> which
- take the attributes "target", "link" and "target.dir" and the
- nested element "cc-elements". The body of the task
- uses the <code><cc></code> task from the
- <a href="http://ant-contrib.sourceforge.net/">ant-contrib</a> project.
- </p>
- <blockquote>
- <pre class="code">
- <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>
- </pre>
- </blockquote>
- <p>
- This then can be used as follows:
- </p>
- <blockquote>
- <pre class="code">
- <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>
- </pre>
- </blockquote>
- <p>
- The following fragment shows <call-cc>, but this time
- using an implicit element and with the link and target.dir arguments
- having default values.
- </p>
- <blockquote>
- <pre class="code">
- <macrodef name="call-cc">
- <attribute name="target"/>
- <attribute name="link" default="executable"/>
- <attribute name="target.dir" default="${build.bin.dir}"/>
- <element name="cc-elements" implicit="yes"/>
- <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>
- </pre>
- </blockquote>
- <p>
- This then can be used as follows, note that <cc-elements>
- is not specified.
- </p>
- <blockquote>
- <pre class="code">
- <call-cc target="unittests"/>
- <includepath location="${gen.dir}"/>
- <includepath location="test"/>
- <fileset dir="test/unittest" includes = "**/*.cpp"/>
- <fileset dir="${gen.dir}" includes = "*.cpp"/>
- <linker refid="linker-libs"/>
- </call-cc>
- </pre>
- </blockquote>
- <p>
- The following shows the use of the <code>text</code> element.
- </p>
- <blockquote>
- <pre class="code">
- <macrodef name="echotest">
- <text name="text"/>
- <sequential>
- <echo>@{text}</echo>
- </sequential>
- </macrodef>
- <echotest>
- Hello world
- </echotest>
- </pre>
- </blockquote>
- <p>
- The following uses a prior defined attribute for setting the
- default value of another. The output would be
- <tt>one=test two=test</tt>. If you change the order of lines
- *1 and *2 the output would be <tt>one=test two=@{one}</tt>,
- because while processing the <i>two</i>-line the value for
- <i>one</i> is not set.
- </p>
- <blockquote>
- <pre class="code">
- <macrodef name="test"/>
- <attribute name="one"/> <b>*1</b>
- <attribute name="two" default="@{one}"/> <b>*2</b>
- <sequential>
- <echo>one=@{one} two=@{two}</echo>
- </sequential>
- </macrodef/>
- <test one="test"/>
- </pre>
- </blockquote>
- <hr>
- <p align="center">Copyright © 2003-2004 The Apache Software
- Foundation. All rights Reserved.</p>
-
- </body>
- </html>
|