ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matt Benson <>
Subject Re: Building Dependent targets
Date Thu, 24 May 2007 16:16:27 GMT

--- Steve Loughran <> wrote:

> query wrote:
> > Earlier I was using some other build tool to build
> my project. Here if a target is built and if the
> same target is used to build some other target, it
> compares the timestamp and will not build the
> dependent targets again.
> Ant doesnt compare the timestamps on targets, but it
> looks at the 
> timestamp of artifacts consumed and created by
> tasks. e.g  <javac> does 
> work only if there is java source to compile, but
> the <javac> task is 
> called on every build.

Note that this behavior can only be expected on a
per-task basis.  Some tasks, especially optional or
third-party tasks, may not perform any or the expected
dependency analysis.

> > As I started working on ANT, I found it very
> useful and intersting. 
> But in ANT, while building each target, it will try
> to build all the 
> dependent targets that many times as it occurs in
> different targets.
> As a result it is increasing project\'s build
> time.Is there any task to 
> ensure that the dependent targets once built will
> not&nbsp; be built 
> again ????
> Every target in a build file should run once. if the
> same targets run 
> again and again in a single build, your are using
> <ant> when you dont 
> need to. Every task in a target should do its own
> dependency rules, 
> though some <javadoc> dont. You can use <uptodate>
> to determine if 
> targets need skipping

The other case in which you would re-run targets is if
you have several targets, all of which depend on some
initializing or similar target, e.g.:

target name="foo" depends="init"
target name="bar" depends="init"

'ant foo bar' will run init, foo, init, bar .  There
are a few workarounds here:

 - The old standard IMHO was to set a property in the
init target and name this property in init's unless

<target name="init" unless="init.complete">
  <property name="init.complete" value="any value" />

 - Another approach is to make another target that
calls both the other targets:

target name="foobar" depends="foo,bar"

'ant foobar' will then execute init, foo, bar. 
Obviously this could get messy depending on how many
"first-class" targets you may have.

 - More recently Ant was augmented with the notion of
a Project Executor.  An implementation is provided
OOTB that will "pretend" there is a target described
like target "foobar" above.  It is called the single
check executor and you can invoke it thus:

foo bar

The Executor will run targets init, foo, bar by virtue
of its having used a single dependency check to
generate the call graph for all called targets.

Finally, If you are using the <ant> and/or <antcall>
tasks (which I personally discourage, but there you
are) you can call multiple targets by specifying
nested <target> elements in these tasks.  This will
make your <ant>/<antcall> invocation (1) use a
SingleCheckExecutor (unless, in theory, some top-level
custom executor was configured otherwise for
subprojects) and (2) use less time and resources
because you're only running one subproject instead of
n (where n = number of targets called).


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

Looking for earth-friendly autos? 
Browse Top Cars by "Green Rating" at Yahoo! Autos' Green Center.

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

View raw message