Java Mailing List Archive

Apache Ant Archive

» Ant Users List
» Ant Developers List
Building Dependent targets

Building Dependent targets

2007-05-24       - By Matt Benson
Reply:     1     2     3     4     5     6     7     8     9     10     >>  

--- Steve Loughran <stevel@(protected)> 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:
> user-unsubscribe@(protected)
> For additional commands, e-mail:
> user-help@(protected)

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

To unsubscribe, e-mail: user-unsubscribe@(protected)
For additional commands, e-mail: user-help@(protected)

©2008 - Jax Systems, LLC, U.S.A.