ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Cyril Sagan <cyril.sa...@gmail.com>
Subject "scoping" for macro definitions?
Date Thu, 26 Sep 2013 22:15:49 GMT
Is there a way to override a macro defined from a library I cannot
control, my goal is to provide a local implementation, but not have to
change all the callers.

I'm stuck on Ant 1.7.0, and cannot update.

How could I "fake out" a scoping mechanism to accomplish something like:
<super.macroImplementation/> or <project[@name].macroImplemenation/>

I tried using <presetdef/> to "override" the macro, but I can't figure
out how to invoke the original macro of the same name.  I could
redefine the macro from the library in my local ant script, but I
don't want to open a possibility that my local implementation could
get out of sync with the one from the provided library.

Another way to express what I need is the macro equivalent of target
overriding, which is accomplished with the code snip below, but I need
it for <macrodef/>!

common.xml:
    <project name="common_library">
        <target name="stuff">
            <!-- run stuff from common library -->
        </target>
    </project>

build.xml:
    <project name="myBuild">
        <import file="common.xml" />
        <target name="stuff" depends="mystuff_first, common_library.stuff"
/>

        <!-- henceforth target="stuff" is *my* implementation -->
    </project>


But what if its a macro (or scriptdef)?  In principle here's what I was
hoping could
work, but it doesn't, so that's why I'm asking:

common.xml:
    <project name="common_library">
        <macrodef name="routine">
            <attribute name="arg1" />
            <attribute name="arg2" />
            <sequential>
                <!-- macro definition from common library -->
            </sequential>
        </target>
    </project>

build.xml:
    <project name="myBuild">
        <import file="common.xml" />
        <presetdef name="routine">
            <local_routine/>
        </presetdef>

        <macrodef name="local_routine">
            <attribute name="arg1" />
            <attribute name="arg2" />
            <sequential>
                <!-- add some logic here... -->
                <common_library.routine arg1="@{arg1} arg2="@{arg2}" />
            </sequential>
        </macrodef>

        <!-- henceforth <routine/> is *my* implementation -->
    </project>

Any ideas would be much appreciated.  Thanks.

--Cyril

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message