Antのmacrodef使い方メモ

よく忘れるのでメモ。

#基本
```xml:
<?xml version="1.0" encoding="Shift_JIS"?>
<project basedir="." default="execute">
  <target name="execute">
    <my-macro />
  </target>
  
  <macrodef name="my-macro">
    <sequential>
      <echo message="Hello macrodef!!" />
    </sequential>
  </macrodef>
</project>
```

```text:実行結果
execute:
     [echo] Hello macrodef!!
```

#属性を定義する
```xml:
<?xml version="1.0" encoding="Shift_JIS"?>
<project basedir="." default="execute">
  <target name="execute">
    <my-macro hoge="属性" />
  </target>
  
  <macrodef name="my-macro">
    <attribute name="hoge" />
    <sequential>
      <echo message="hoge = @{hoge}" />
    </sequential>
  </macrodef>
</project>
```

```text:
execute:
     [echo] hoge = 属性
```

後述の「デフォルト値」を定義しないかぎり、属性は必須になる。

##属性のデフォルト値を定義する
```xml:
<?xml version="1.0" encoding="Shift_JIS"?>
<project basedir="." default="execute">
  <target name="execute">
    <my-macro />
  </target>
  
  <macrodef name="my-macro">
    <attribute name="hoge" default="デフォルト値" />
    <sequential>
      <echo message="hoge = @{hoge}" />
    </sequential>
  </macrodef>
</project>
```

```text:実行結果
execute:
     [echo] hoge = デフォルト値
```

#内部要素を定義する
```xml:
<?xml version="1.0" encoding="Shift_JIS"?>
<project basedir="." default="execute">
  <target name="execute">
    <my-macro>
      <hoge>
        <echo message="内部要素" />
      </hoge>
    </my-macro>
  </target>
  
  <macrodef name="my-macro">
    <element name="hoge" />
    <sequential>
      <hoge />
    </sequential>
  </macrodef>
</project>
```

```text:実行結果
execute:
     [echo] 内部要素
```

内部要素は、デフォルトは必須。

##内部要素を任意入力にする
```xml:
<?xml version="1.0" encoding="Shift_JIS"?>
<project basedir="." default="execute">
  <target name="execute">
    <my-macro />
  </target>
  
  <macrodef name="my-macro">
    <element name="hoge" optional="true" />
    <sequential>
      <hoge />
    </sequential>
  </macrodef>
</project>
```

```text:実行結果
execute:
```

#内部テキストを定義する
```xml:
<?xml version="1.0" encoding="Shift_JIS"?>
<project basedir="." default="execute">
  <target name="execute">
    <my-macro>
      HOGEE
    </my-macro>
  </target>
  
  <macrodef name="my-macro">
    <text name="hoge" />
    <sequential>
      <echo message="@{hoge}" />
    </sequential>
  </macrodef>
</project>
```

```text:実行結果
execute:
     [echo]
     [echo]       HOGEE
     [echo]
```

##内部テキストを任意入力にする
```xml:
<?xml version="1.0" encoding="Shift_JIS"?>
<project basedir="." default="execute">
  <target name="execute">
    <my-macro />
  </target>
  
  <macrodef name="my-macro">
    <text name="hoge" optional="true" />
    <sequential>
      <echo message="@{hoge}" />
    </sequential>
  </macrodef>
</project>
```

```text:実行結果
execute:
     [echo]
```

##内部テキストの前後をトリムする
```xml:
<?xml version="1.0" encoding="Shift_JIS"?>
<project basedir="." default="execute">
  <target name="execute">
    <my-macro>
      HOGEE
    </my-macro>
  </target>
  
  <macrodef name="my-macro">
    <text name="hoge" trim="true" />
    <sequential>
      <echo message="@{hoge}" />
    </sequential>
  </macrodef>
</project>
```

```text:実行結果
execute:
     [echo] HOGEE
```



#参考
- [Ant マクロ(macrodef)を使う - kaishitaeiichiの日記](http://d.hatena.ne.jp/kaishitaeiichi/20121018/1350575178)
- [MacroDef Task](http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/CoreTasks/macrodef.html)