Apache Ant 1.6 以降
これは、<sequential> ネストされたタスクをテンプレートとして使用して新しいタスクを定義します。ネストされた要素<attribute>と<element>は、新しいタスクの属性と要素を指定するために使用されます。これらは、新しいタスクが実行されるときに<sequential>タスクに置換されます。
他の属性のデフォルト値には、事前に定義された属性を使用することもできます。例を参照してください。
| 属性 | 説明 | 必須 |
|---|---|---|
| name | 新しい定義の名前。 | はい |
| uri | この定義が存在するURI。 | いいえ |
| description | macrodefの説明(ドキュメント目的のみ)。 | いいえ |
| backtrace | これは、マクロの実行中にエラーが検出された場合のエラーのトレースバックを制御します。これがtrueに設定されている場合、エラーのトレースバックが表示され、 falseの場合は表示されません。Ant 1.7以降。 |
いいえ。デフォルトはtrue |
これは、新しいタスクの属性を指定するために使用されます。属性の値は、テンプレート化されたタスクに置換されます。デフォルト値が設定されていない限り、属性は必須属性になります。
この属性は、Antプロパティ表記と同様の表記法—@{attribute name}—を使用して、テンプレート化されたタスクの本文に配置されます。(「置換をこの場所に配置する」と覚えることができます)。
エスケープシーケンス@@は@をエスケープするために使用されます。これにより、@@{x}を使用することで、xの置換なしにテキストに@{x}を配置できます。これは、プロパティの$$エスケープシーケンスに対応します。
属性の大文字と小文字は無視されるため、@{myAttribute}は@{MyAttribute}と同じように扱われます。
| 属性 | 説明 | 必須 |
|---|---|---|
| name | 新しい属性の名前 | はい |
| default | 属性のデフォルト値。 | いいえ |
| description | 属性の説明が含まれています。Ant 1.6.1以降 | いいえ |
| doubleexpanding | 属性内のプロパティ参照を2回展開するか1回だけ展開するかを制御します。詳細はFAQを参照してください。Ant 1.8.3以降 | いいえ。デフォルトはtrue |
これは、新しいタスクのネストされた要素を指定するために使用されます。タスクインスタンスのネストされた要素の内容は、タグ名でテンプレート化されたタスクに配置されます。
elementの名前の大文字と小文字は無視されます。
| 属性 | 説明 | 必須 |
|---|---|---|
| name | 要素の名前。 | はい |
| optional | これがtrueの場合、このネストされた要素はオプションです。 |
いいえ。デフォルトはfalse—ネストされた要素は新しいタスクで必須です。 |
| implicit | これがtrueの場合、このネストされた要素は暗黙的です。これは、 macrodefインスタンスのネストされた要素がすべて、この要素の名前で示された要素に配置されることを意味します。要素が暗黙的な場合、要素は1つだけ存在できます。Ant 1.6.2以降 |
いいえ。デフォルトはfalse |
| description | 要素の内容がどのように想定されているかをユーザーに知らせる説明が含まれています。Ant 1.6.1以降 | いいえ |
これは、マクロ呼び出しのテキストコンテンツの処理を指定するために使用されます。この要素が存在しない場合、マクロ呼び出し内のネストされたテキストはエラーになります。text要素が存在する場合、名前は属性になり、マクロ呼び出しのネストされたテキストが設定されます。Ant 1.6.1以降。
textの名前の大文字と小文字は無視されます。
| 属性 | 説明 | 必須 |
|---|---|---|
| name | テキスト属性の名前。 | はい |
| optional | これがtrueの場合、マクロ内のネストされたテキストはオプションです。 |
いいえ。デフォルトはfalse |
| trim | これがtrueの場合、ネストされたテキストから空白がトリミングされます。 |
いいえ。デフォルトはfalse |
| description | マクロのネストされたテキストがどのように想定されているかをユーザーに知らせる説明が含まれています。 | いいえ |
次の例では、testingというタスクを定義し、実行します。
<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>
次の断片は、target、link、target.dir属性とcc-elementsネストされた要素を受け取る<call-cc>というタスクを定義します。タスクの本文は、ant-contribプロジェクトの<cc>タスクを使用しています。
<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>
これは、次のように使用できます。
<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>
次の断片は<call-cc>を示していますが、今回は暗黙的な要素を使用し、linkとtarget.dir引数にデフォルト値を設定しています。
<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>
これは、次のように使用できます。<cc-elements>は指定されていません。
<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>
次は、text要素の使用を示しています。
<macrodef name="echotest">
<text name="text"/>
<sequential>
<echo>@{text}</echo>
</sequential>
</macrodef>
<echotest>
Hello world
</echotest>
次は、別の属性のデフォルト値を設定するために、事前に定義された属性を使用しています。出力はone=test two=testになります。行*1と*2の順序を変更すると、出力はone=test two=@{one}になります。これは、two行を処理している間、oneの値が設定されていないためです。
<macrodef name="test">
<attribute name="one"/> *1
<attribute name="two" default="@{one}"/> *2
<sequential>
<echo>one=@{one} two=@{two}</echo>
</sequential>
</macrodef>
<test one="test"/>