ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Peter Reilly <peter.kitt.rei...@gmail.com>
Subject Re: Better alternative than using foreach, for and if/then/else?
Date Wed, 05 May 2010 13:46:14 GMT
You need to use ant 1.8 and the <local> task.
<local> declares that a property is local to the current scope,
as defined by the enclosing <target> or <seqential>

see: http://ant.apache.org/manual/CoreTasks/local.html

  <for list="${kernel.currver.variants}" param="kernel.variant"
delimiter=" " trim="true">
      <sequential>
        <local name="dir.kernel.build"/>
        <local name="dir.module.build"/>
        <if>
          <equals arg1="@{kernel.variant}" arg2='""' />
         <then>
            <property name="dir.kernel.build"
location="/lib/modules/${kernel.version}/build" />
            <property name="dir.module.build"
location="${dir.build}/output/${kernel.version}" />
          </then>
          <else>
            <property name="dir.kernel.build"
location="/lib/modules/${kernel.version}@{kernel.variant}/build" />
            <property name="dir.module.build"
location="${dir.build}/output/${kernel.version}@{kernel.variant}" />
          </else>

...


Peter

On Wed, May 5, 2010 at 2:24 PM, Bailey, Darragh <dbailey@hp.com> wrote:
>
> Have recently just started using Ant, with the goal to using it as the default build
tool across an entire project. While most of the project will be java based, there are a few
parts that won't be and I'm trying to make ant work as effectively as possible for these sections.
>
> One of them just happens to be a kernel module. While there will be a makefile called
by the Ant target in the end, I'm trying to set Ant up as the entry point so that developers
moving between different parts of the project will get the same interface and the same targets
to be called. It also simplifies the work around a continuous build tool, in that it doesn't
have to run differently for the different components.
>
>
> For the kernel module build, I'm trying to allow for more than 1 kernel version and different
kernel variants. In most cases the kernel version will be 2.6.18-194.el5 (RHEL5 Update 5 kernel)
and the variant will be the default. However at times developers will want to build against
multiple kernel versions and/or variants when developing/debugging issues.
>
> Examples:
> Default Properties
> kernel.versions = 2.6.18-194.el5
> kernel.variants = ""
>
> Additionally "kernel.${kernel.version}.variants = xxx" can be used to specify the variants
for a particular version, rather than using the default set. I use "" to represent the default
variant simply because that is the method that works best when building kmod-* rpm packages
as I'm using a spec template similar to what fedora uses.
>
> Properties set by a Developer
> kernel.versions = 2.6.18-194.el5 2.6.33-k.org
> kernel.variants = ""
> kernel.2.6.18-194.el5.variants = xen
>
>
>
> Coming from a make background I was previously used to expanding targets dynamically
based on values set in properties in the makefile in order to reference multiple kernel versions
and variants and then using pattern based rules to build the necessary target. Right now I've
got something partially working in Ant using the foreach/for tasks from ant-contrib, but I'm
not sure that this is the best way to accomplish this. I'm also using if/the/else to work
around the use of "" which Ant doesn't really like when it comes to specifying an empty value
for a property.
>
> I know I have a bug in the xml below, in that the for loop I attempt to change properties
which by default Ant won't overwrite after setting them initially. Like I mentioned before
I'm very much used to make and I've yet to fully get to grips with Ant.
>
>
> Any suggestions on other Ant tasks that could simplify this would be very welcome:
>
>
>  <target name="compile" if="isLinux"
>          description="Compile the source against all requested kernel versions and
variants">
>    <!-- determine the default kernel version, only set if not already set -->
>    <exec executable="uname" outputproperty="kernel.versions">
>      <arg value="-r" />
>    </exec>
>    <foreach target="compile-module" list="${kernel.versions}" delimiter=" " param="kernel.version"
/>
>  </target>
>
>
>  <!-- default compile task, restrict to running on linux also try to avoid rebuilding
if
>      it has already been compiled and the sources have not be modified.
>
>      TODO:
>        Handle if different kernel version or variants used
>        Handle building for multiple variants
>        Handle building for multiple kernel versions
>
>        Compile the source against the specified kernel version and variant
>  -->
>  <target name="compile-module" depends="init" if="isLinux" >
>
>
>    <!-- Will set the variants to the default value only if not already set (i.e.
doesn't override) -->
>    <property name="kernel.${kernel.version}.variants" value="${kernel.variants}"
/>
>    <propertycopy property="kernel.currver.variants" override="true" from="kernel.${kernel.version}.variants"
/>
>
>    <for list="${kernel.currver.variants}" param="kernel.variant" delimiter=" " trim="true">
>      <sequential>
>        <if>
>          <equals arg1="@{kernel.variant}" arg2='""' />
>          <then>
>            <property name="dir.kernel.build" location="/lib/modules/${kernel.version}/build"
/>
>            <property name="dir.module.build" location="${dir.build}/output/${kernel.version}"
/>
>          </then>
>          <else>
>            <property name="dir.kernel.build" location="/lib/modules/${kernel.version}@{kernel.variant}/build"
/>
>            <property name="dir.module.build" location="${dir.build}/output/${kernel.version}@{kernel.variant}"
/>
>          </else>
>        </if>
>        <!--<property name="kernel.arch" />-->
>        <echoproperties prefix="name."/>
>        <echoproperties prefix="dir."/>
>        <echoproperties prefix="kernel."/>
>        <echo message="kernel.variant='@{kernel.variant}'" />
>        <!-- Copy the src to a directory under the build directory, excluding hidden
files -->
>        <copy todir="${dir.module.build}">
>          <fileset dir="${dir.src}">
>            <exclude name="**/.*" />
>          </fileset>
>        </copy>
>
>        <!-- execute the require make command, specifying the kernel directory
to use -->
>        <exec executable="make">
>          <arg value="-C" />
>          <arg value="${dir.kernel.build}" />
>          <arg value="M=${dir.module.build}" />
>          <arg value="modules" />
>        </exec>
>      </sequential>
>    </for>
>  </target>
>
>
>
> --
> Regards,
> Darragh Bailey
>
> Systems Software Engineer
> Hewlett Packard Galway Ltd.
>
> Postal Address:    Hewlett Packard Galway Limited, Ballybrit Business Park, Galway
> Registered Office: Hewlett Packard Galway Limited, 63-74 Sir John Rogerson's Quay Dublin
2
> Registered Number: 361933
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@ant.apache.org
> For additional commands, e-mail: user-help@ant.apache.org
>
>

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


Mime
View raw message