On Sep 26, 2010, at 8:23 AM, Marina wrote: > Hello! > In essence, I would like to know how to define a global property > conditionally, and then have it available to all build files via <import>. >
What I do is supply a -Dtarget=Debug or Release via the commandline which causes a build.properties file to be built with useful things like build.number, build.time, build.date, build.machine, build.type and so on. <target name="init" depends="set_flags,announce,env.. "> <property file="build.number"/> <delete file="build.properties"/> <propertyfile comment="Build Information" file="build.properties"> <entry key="build.number" value="${build.number}"/> <entry key="build.version" value="${version}"/> <entry key="temp.dir" value="${temp.dir.path}"/> <entry key="build.host" value="${env.COMPUTERNAME}"/> <entry key="build.user" value="${user.name}"/>... All my subservient build files just import this file <property file="${root.dir}/metadata/build.properties"/> - oh and debug builds copy it into the dist directory too.. That way I have a chance to know on a test machine where/when/who built the failing jar! root.dir |____metadata | |__ build.number | |__ build.properties |____Source jar1 | |__ build.xml |____Source jar2 | |__ build.xml Cheers Graham > Now the details: > I have a build.common.xml file with all global properties and paths > defined. I import it into my main build and component build files via > <import>, and this makes everything that is defined in the common file > available to all other build files. > build.common.xml: > <property name="build.classes" value="${build}/classes"/> > ... > <path id="compile.classpath"> > <pathelement location="${build}/classes"/> > <path refid="jdk.classpath"/> > <fileset dir="${lib}"> > <include name="**/*.jar"/> > </fileset> > ... > > > Then, I have a main build.xml that calls a few component build.xml via > <ant file=...> call. > If I <import> the build.common.xml into all my build files - I have > all properties and paths available to all builds. > > It all works great, but now I want to have the build.classes property > set conditionally, based on the build mode (dev vs. release). Ideally, > I would like something similar to the C #ifdef macros: > > build.common.xml: > if > mode='dev' > then > <property name="build.classes" > value="${build}/dev/classes"/> else > <property name="build.classes" > value="${build}/release/classes"/> > > I can do the <if> logic if I define this property in the main build, > for example, as part of some <init> task. But, it means that the > property is not global anymore, and, which is more important, I cannot > define my paths in the build.common.xml based on the value of this > property. At least I could not figure out yet a way to do it... > > So, I was pondering over a few options: > 1. define all properties like that and paths in the main build.xml and > pass them as parameters to all component builds - very involved and > inflexible... > 2. define a target <init> in the build.common.xml that defines all > those properties and paths - and make all builds call it (or depend on > it) - again, very involved in terms of refactoring my existing builds, and > inflexible. > 3. any other way??? > > If only I could just define that one global property conditionally! I > feel like I'm missing some basic core concept here.... > > Any pointers? > > Thanks! > Marina