ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From peter reilly <peter.rei...@corvil.com>
Subject Re: Tale from the front: macrodef nesting
Date Tue, 28 Oct 2003 16:12:26 GMT
I have had a quick look at this.

It appears that the attributes as local properties
patch

http://issues.apache.org/bugzilla/show_bug.cgi?id=23942

causes macrodef to behave in the way you expect.

A cut-down version shows this.

<project>
  <macrodef name="inner">
    <attribute name="a"/>
    <attribute name="b"/>
    <sequential>            
      <echo> name="a" value="${a}"</echo>
      <echo> name="b" value="${b}"</echo>
    </sequential>
  </macrodef>

  <macrodef name="outer">            
    <attribute name="work"/>
    <attribute name="play"/>

    <element name="precompile" optional="true"/>
    <element name="additional" optional="true"/>
    
    <sequential>
      <precompile/>
      <additional/>
    </sequential>
  </macrodef>
     
  <target name="test.outer">
    <outer work="this is work" play="this is play">
      <precompile>
        <inner a="${work}" b="${play}" />
      </precompile>
    </outer>
  </target>
</project>


Ant 1.6  currently outputs:
test.outer:
     [echo]  name="a" value="${work}"
     [echo]  name="b" value="${play}" 

With the patch
this gets output:

test.outer:
     [echo]  name="a" value="this is work"
     [echo]  name="b" value="this is play" 

Peter

On Sunday 26 October 2003 22:55, Steve Cohen wrote:
> I am now trying to experiment with some of the new features of ant 1.6. 
> Here's a real-world example of the difficulties of trying to replace
> antcalls with macrodefs.
>
> Given the following definitions, notice that I am trying to nest a call to
> the macrodef make.precompiled.web.xml inside a call to the macrodef
> make.se.war.
>
> This is failing because I am trying to use the ATTRIBUTE war.webxml inside
> the ELEMENT precompile which contains a call to the nested macrodef
> make.precompiled.web.xml.
>
> I could easily fix this by substituting the actual value of the war.webxml
> attribute for the ${war.webxml} token.  But then I lose the advantage of
> defining this in a single place.
>
> Or I can create properties in the macrodef and pass them around, but that
> feels wrong too.
>
> Maybe there should be some mechanism for allowing inner macrodefs for
> inheriting attributes from an outer macrodef.  Maybe elements should be
> able to be defined with nested attributes.  Or something.
>
> But this experience with trying to use this feature leads me to the feeling
> that using the same notation for macrodef attributes and ant properties is
> not a good thing.  It will definitely cause confusion.  At a minimum more
> documentation of this is required.
>
>
>     <macrodef name="make.precompiled.web.xml">
>         <attribute name="src.web.xml"/>
>         <attribute name="dest.web.xml"/>
>         <sequential>
>             <ant antfile="${basedir}/se/build-precomp.xml"
>                  target="create.precompiled.web.xml">
>                 <property name="src.web.xml" value="${src.web.xml}"/>
>                 <property name="dest.web.xml" value="${dest.web.xml}"/>
>             </ant>
>         </sequential>
>     </macrodef>
>
>     <macrodef name="make.se.war">
>         <attribute name="work.dir"/>
>         <attribute name="war.webxml"/>
>         <attribute name="war.basedir"/>
>         <attribute name="war.destfile"/>
>
>         <element name="precompile" optional="true"/>
>         <element name="assemble" optional="false"/>
>         <element name="additional" optional="true"/>
>
>         <sequential>
>             <delete dir="${work.dir}"/>
>             <mkdir dir="${work.dir}/temp"/>
>             <mkdir dir="${work.dir}/war"/>
>
>             <precompile/>
>             <assemble/>
>             <replace file="${war.webxml}"
>                      token="#build#"              
> value="${project.version}.${project.maintenance.build}.${project.fix.build}
>"/> <war destfile="${war.destfile}"
>                  webxml="${war.webxml}"
>                  basedir="${war.basedir}">
>                 <additional/>
>             </war>
>         </sequential>
>     </macrodef>
>
>
>        <target name="make.admin.war"
>                depends="make.precompilation"
>            <make.se.war
>                work.dir="${dir.admin.ear}"
>                war.webxml="${dir.build.precomp.webxml}/${admin.web.xml}"
>                war.basedir="${dir.admin.ear}/temp"
>                war.destfile="${dir.admin.ear}/war/${admin.war}">
>                <precompile>
>                    <make.precompiled.web.xml
>                        src.web.xml="${dir.src.web.xmls}/${admin.web.xml}"
>                        dest.web.xml="${war.webxml}"
>                    />
>                </precompile>
>                <assemble>
>                    <copy todir="${war.basedir}">
>                        <fileset dir="${dir.build.war.precomp}"/>
>                    </copy>
>                </assemble>
>            </make.se.war>
>        </target>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Mime
View raw message