Java Mailing List Archive

http://www.ant-tasks.com/

Home » Ant Users List »

How can I "conditionall chooise" a target implementation?

Cyril Sagan

2008-05-28

Replies: Find Java Web Hosting

Author LoginPost Reply
PROBLEM: I'm trying to develop a general build framework.  In so doing,
      I need some mechanism for to provide a "conditional implementation"
      for a target. We cannot solve this problem using <antcall/>.
      Can anyone suggest an implementation?


Here's a couple ways that I tried, that almost work,... but do not.

All use this simple build.xml:
<?xml version="1.0"?>
<project name="generic_build" default="all">
   <property file="config.properties" />
   <import file="common.xml"/>
</project>


Failing attempt #1: This almost works, but doesn't because <import/>
cannot be embedded inside a target!! arg!

common.xml:
<?xml version="1.0"?>
<project name="generic_build" default="all">
   <target name="use_lib_A" if="use.A">
      <!-- sorry, cannot <import/> in a target! -->
      <import file="lib_A.xml" /> <!-- target "all_impl" defined inside -->
   </target>

   <target name="use_lib_B" if="use.B">
      <!-- sorry, cannot <import/> in a target! -->
      <import file="lib_B.xml" /> <!-- target "all_impl" defined inside -->
   </target>

   <target name="all"
        depends="init, use_lib_A, use_lib_B, all_impl" />
</project>



Failing attempt #2: This would work, if Ant supported property expansion
in the targets's depends attribute.

common.xml:
<?xml version="1.0"?>
<project name="generic_build" default="all">
   <import file="lib_A.xml" />
   <import file="lib_B.xml" />

   <target name="use_lib_A" if="use.A">
      <property name="use.library" value="lib_A" />
   </target>

   <target name="use_lib_B" if="use.B">
      <property name="use.library" value="lib_B" />
   </target>

   <target name="use_lib_B" if="use.B">
      <import file="lib_B.xml" /> <!-- target "all_impl" defined inside -->
   </target>

   <!-- sorry, no property expansion inside attributes! -->
   <target name="all"
        depends="init, use_lib_A, use_lib_B, ${use.library}.all_impl" />
</project>



Failing attempt #3: Almost works, except the depends targets
always excute...

common.xml:
<?xml version="1.0"?>
<project name="generic_build" default="all">
   <import file="lib_A.xml" />
   <import file="lib_B.xml" />

   <!-- sorry, depends called regardless of if/unless -->
   <target name="use_lib_A" if="use.A" depends="implementation_A" />
   <target name="use_lib_A" if="use.B" depends="implementation_B" />

   <target name="all" depends="init, use_lib_A, use_lib_B"
</project>

This gets us closest to what we want, and would suffice if we could
tolerate the <antcall/>:
   <target name="use_lib_A" if="use.A">
      <antcall target="implementation_A" />
   </target>

...but we can't use antcall because it re-reads the *entire* build
file. There's some fairly complicated init (that we don't have
control of) that doesn't tolerate being called multiple times.

I'd appreciate any suggestions from the experts!

Thanks.

--Cyril

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

©2008 ant-tasks.com - Jax Systems, LLC, U.S.A.