ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Vimil Saju <>
Subject Re: Conditional target problem
Date Tue, 17 Aug 2010 23:26:41 GMT
I know ant is supposed to be follow a declarative style rather than a procedural style. But
what is wrong with writing scripts using the 'if' task in conjunction with the ant-call task?
like the below example
<target name="determine-release-number"<if>  <not>  	<isset property="release.number"/>  </not>  <then>  
<ant-call target="checkout-sources"/>  </then>  </if>  
--- On Tue, 8/17/10, Vimil Saju <> wrote:

From: Vimil Saju <>
Subject: Re: Conditional target problem
To: "Ant Users List" <>
Date: Tuesday, August 17, 2010, 4:20 PM

I know ant is supposed to be declarative language as opposed to a procedural one, but whats
wrong with using the 'if' task provided with ant-contrib along with "ant-call" task? Wont
it make ant-scripts more readable
something like this

--- On Tue, 8/17/10, Niklas Matthies <> wrote:

From: Niklas Matthies <>
Subject: Conditional target problem
Date: Tuesday, August 17, 2010, 3:35 PM

We have something like the following (target bodies omitted):

    <target name="checkout-sources" depends="other stuff">
        <!-- takes several minutes -->

    <target name="determine-release-number"
        depends="checkout-sources" unless="release.number">
        <!-- determines release.number from sources -->

    <target name="target1" depends="determine-release-number">
        <!-- needs release.number -->

    <target name="target2" depends="checkout-sources, target1">
        <!-- needs sources and target1 -->

The problem: "ant -Drelease.number=... target1" causes
checkout-sources (and its dependencies) to be executed although there
is no need for it, as release.number is already defined.

We can't put the unless="release.number" on checkout-sources (and its
dependencies) because it would break target2 when release.number is

We can't make checkout-sources a macro (called both by target2 and by
determine-release-number) because of all its dependencies, and also
because an up-to-date check on it is highly non-trivial, so in the
target2 case it might end up being executed twice. 

We _could_ duplicate the body and the dependencies of checkout-sources
into determine-release-number (and remove the latter's dependency on
checkout-sources), but I'd have to do that for quite a number of the
dependencies as well, as they contribute to the expensiveness of
checkout-sources. The result would be a lot of redundancy, effectively
duplicating a dependency subgraph.

Is there a way to solve the problem, within a single Ant instance,
without creating redundancies?

-- Niklas Matthies

To unsubscribe, e-mail:
For additional commands, e-mail:


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