| Building Dependent targets | Building Dependent targets 2007-05-24 - By Matt Benson
--- 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 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 attribute:
<target name="init" unless="init.complete"> ... <property name="init.complete" value="any value" /> </target>
- 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:
ant -Dant.executor.class=org.apache.tools.ant.helper.SingleCheckExecutor 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).
HTH, Matt
> > --------------------------------------------------------------------- > 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. http://autos.yahoo.com/green_center/
--------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscribe@(protected) For additional commands, e-mail: user-help@(protected)
|
|
 |