如何将复杂的元素作为参数合并到ant的macrodef中?

时间:2019-04-09 00:42:42

标签: ant

如何将在外部位置定义的多个复杂元素传递给macrodef,并合并这些元素的多个版本,以便将它们全部包含在内?

这个SO问题是我尝试过的一个版本,但显然无法解决:Apache Ant 1.8 macro invocation nesting

我也使用PreSetDef进行了尝试,并得到了相同的结果。

在这里,我使用的是将include元素传递给cc编译任务的示例。

如果我定义一个宏来编译一些代码,例如:

<macrodef name="do-compile">
    <element name="moreincludes" optional="true"/>
    <sequential>
        <cc>
            <includepath location="libs"/>
            <moreincludes/>
        </cc>
    </sequential>
</macrodef>

我可以使用诸如以下的复杂参数来执行它:

<do-compile>
    <moreincludes>
        <includepath location="other-libs"/>
        <include-complex>
            <just-an-example/>
        </include-complex>
    <moreincludes>
</do-compile>

最终结果应该像这样:

<cc>
    <includepath location="libs"/>
    <includepath location="other-libs"/>
    <include-complex>
        <just-an-example/>
    </include-complex>
</cc>

我的问题是我希望能够将这些复杂的参数定义为多个位置的部分值,并在最终调用宏时将它们全部合并在一起。有时,在某些构建条件下,将添加某些版本,有时则不会。

例如,我可能想在一个地方或某种条件下使用它:

<some-predefined-includes>
    <includepath location="libs"/>
</some-predefined-includes>

并在另一个地方或在其他条件下将其保存:

<even-more-predefined-includes>
    <includepath location="other-libs"/>
    <include-complex>
        <just-an-example/>
    </include-complex>
</even-more-predefined-includes>

然后像这样调用宏:

<do-compile>
    <moreincludes>
        <some-predefined-includes/>
        <even-more-predefined-includes/>
    </moreincludes>
</do-compile>

我看不到一种实现此目的的方法,它基本上只是代码重用,因此我不必多次定义指令集。 Macrodef似乎不支持嵌套的宏,并且属性只是字符串,而不是复杂的元素,因此我不明白我需要做什么来处理这种情况。如何将复杂的元素传递给macrodef并合并多个选项,以便包括所有这些选项?

0 个答案:

没有答案