The dependency ordering addition is pluggeable... you just provide a
resolver implementation. I created only one such implementation for my own
custom format, but a GUMP resolver format would be easy to write. It's just
the matter of parsing the GUMP descriptor, and creating instances that
implements DependencyNode (or provide a DependencyNodeAdapter if it doesn't)
that my DependencyResolver class knows how to sort. Probably Jenny could be
used to load the GUMP project instances, and a dependency adapter
implemented for it.
Note how buildpath returns a double array. This is to allow building in
parallel projects when possible: Consider the usual diamond A, B & C depends
on A, D depends on B & C, my resolver gives you:
{ {A}, {B,C}, {D} } which tells you can run B and C in parallel. Any project
within an inner array can be build in parallel provided their dependencies
(earlier stuff in the outer array) have been build before.
I already submitted SubAnt.java (the older version).
I now have these other classes I'd submit provided enough interest (the last
two are not of interest to anyone but me):
BuildPath.java
BuildPathResolver.java
DependencyCycleException.java
DependencyNode.java
DependencyNodeAdapter.java
DependencyNodeImpl.java
DependencyResolver.java
DependencyResolverTest.java
TahoeBuildPathResolver.java (private impl of BuildPathResolver)
TahoeProject.java (private impl of DependencyNode)
The build path resolver is specified and configured in a usual Ant way:
<buildpath ident="buildpath"
resolverClassname="com.lgc.buildmagic.TahoeBuildPathResolver">
<param name="destdir" value="${destdir}" />
<param name="dependencies" value="${dependencies}" />
</buildpath>
And the class loaded must implement the BuildPathResolver interface defined
below:
package com.lgc.buildmagic;
import java.io.File;
import org.apache.tools.ant.types.Parameterizable;
/**
* Helper class allowing a <code>BuildPath</code> to be dynamically
* inferred instead of being statically defined.
* <p>
* Provides the famous <em>extra level of indirection</em> which is the
* solution to all computing problems ;-)
*
* @author <a href="mailto:[EMAIL PROTECTED]">Dominique Devienne</a>
* @version Nov 2002 - Copyright (c) 2002, Landmark Graphics Corp.
*
* @see BuildPath
* @see SubAnt
*/
public interface BuildPathResolver
extends Parameterizable {
/**
* Gets the sorted array of all the build directories or build files
* that need to be build.
*
* @return a non-<code>null</code> but possibly empty array of build
* files and/or build directories. All returned files being
* directories instead of file will be appended with the anfile
* name defined by the <subant> task
* (which defaults to build.xml)
*/
File[][] getBuildPath();
} // END class BuildPathResolver
-----Original Message-----
From: Nicola Ken Barozzi [mailto:[EMAIL PROTECTED]
Sent: Friday, March 14, 2003 8:56 AM
To: Ant Developers List
Subject: Re: subant
Dominique Devienne wrote, On 14/03/2003 15.50:
> I actually signed off <lsync>, not <subant>, technically, but in practice
I
> give both. Anything I submit to BugZilla is good for the taking, and I'll
> refrain to include my usual/automatic copyright notice in the future.
Yees! lsync is koooool :-)
> Sorry to hear you suppressed passing down the current target name... That
> one of the feature of that task I won't live without. But that's OK, I'll
> keep using my own task then (actually I would anyhow for the dependency
> ordering I have).
Centipede does it using the Gump project descriptor. Could it be a wise
thing to stick to one version of the two only, or does it make sense to
have this anyway? (just asking)
--
Nicola Ken Barozzi [EMAIL PROTECTED]
- verba volant, scripta manent -
(discussions get forgotten, just code remains)