git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267763 13f79535-47bb-0310-9956-ffa450edef68master
@@ -274,16 +274,20 @@ might think that first target C, then B and then A is executed. Wrong! C depends | |||||
on B, and B depends on A, so first A is executed, then B, then C, and finally D.</p> | on B, and B depends on A, so first A is executed, then B, then C, and finally D.</p> | ||||
<p>A target gets executed only once. Even when more targets depend on it (see | <p>A target gets executed only once. Even when more targets depend on it (see | ||||
the previous example).</p> | the previous example).</p> | ||||
<p>A target has also the ability to perform its execution if a property has been | |||||
set. This allows, for example, better control on the building process depending | |||||
on the state of the system (java version, OS, command line properties, etc...). | |||||
To make target <i>sense</i> this property you should add the <i>if</i> attribute | |||||
with the name of the property that the target should react to, for example</p> | |||||
<p>A target has also the ability to perform its execution if (or | |||||
unless) a property has been set. This allows, for example, better | |||||
control on the building process depending on the state of the system | |||||
(java version, OS, command line properties, etc...). To make target | |||||
<i>sense</i> this property you should add the <i>if</i> (or | |||||
<i>unless</i>) attribute with the name of the property that the target | |||||
should react to, for example</p> | |||||
<blockquote> | <blockquote> | ||||
<pre><target name="build-module-A" if="module-A-present"/></pre> | <pre><target name="build-module-A" if="module-A-present"/></pre> | ||||
<pre><target name="build-own-fake-module-A" unless="module-A-present"/></pre> | |||||
</blockquote> | </blockquote> | ||||
<p>If no <i>if</i> attribute is present, the target will always be executed.</p> | |||||
<p>It is a good practice to place your <a href="#property">property</a> and <a | |||||
<p>If no <i>if</i> and no <i>unless</i> attribute is present, the target will | |||||
always be executed.</p> | |||||
<p>It is a good practice to place your <a | |||||
href="#tstamp">tstamp</a> tasks in a so called initialization target, on which | href="#tstamp">tstamp</a> tasks in a so called initialization target, on which | ||||
all other targets depend. Make sure that that target is always the first one in | all other targets depend. Make sure that that target is always the first one in | ||||
the depends list of the other targets. In this manual, most initialization targets | the depends list of the other targets. In this manual, most initialization targets | ||||
@@ -312,6 +316,12 @@ have the name "init".</p> | |||||
target to execute.</td> | target to execute.</td> | ||||
<td align="center" valign="top">No</td> | <td align="center" valign="top">No</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<td valign="top">unless</td> | |||||
<td valign="top">the name of the property that must not be set in order | |||||
for this target to execute.</td> | |||||
<td align="center" valign="top">No</td> | |||||
</tr> | |||||
</table> | </table> | ||||
<h3>Tasks</h3> | <h3>Tasks</h3> | ||||
<p>A task is a piece of code that can be executed.</p> | <p>A task is a piece of code that can be executed.</p> | ||||
@@ -276,7 +276,8 @@ public class ProjectHelper { | |||||
public void init(String tag, AttributeList attrs) throws SAXParseException { | public void init(String tag, AttributeList attrs) throws SAXParseException { | ||||
String name = null; | String name = null; | ||||
String depends = ""; | String depends = ""; | ||||
String cond = null; | |||||
String ifCond = null; | |||||
String unlessCond = null; | |||||
String id = null; | String id = null; | ||||
for (int i = 0; i < attrs.getLength(); i++) { | for (int i = 0; i < attrs.getLength(); i++) { | ||||
@@ -288,7 +289,9 @@ public class ProjectHelper { | |||||
} else if (key.equals("depends")) { | } else if (key.equals("depends")) { | ||||
depends = value; | depends = value; | ||||
} else if (key.equals("if")) { | } else if (key.equals("if")) { | ||||
cond = value; | |||||
ifCond = value; | |||||
} else if (key.equals("unless")) { | |||||
unlessCond = value; | |||||
} else if (key.equals("id")) { | } else if (key.equals("id")) { | ||||
id = value; | id = value; | ||||
} else { | } else { | ||||
@@ -302,7 +305,8 @@ public class ProjectHelper { | |||||
target = new Target(); | target = new Target(); | ||||
target.setName(name); | target.setName(name); | ||||
target.setCondition(cond); | |||||
target.setIf(ifCond); | |||||
target.setUnless(unlessCond); | |||||
project.addTarget(name, target); | project.addTarget(name, target); | ||||
if (id != null && !id.equals("")) | if (id != null && !id.equals("")) | ||||
@@ -65,7 +65,8 @@ import java.util.*; | |||||
public class Target { | public class Target { | ||||
private String name; | private String name; | ||||
private String condition = ""; | |||||
private String ifCondition = ""; | |||||
private String unlessCondition = ""; | |||||
private Vector dependencies = new Vector(2); | private Vector dependencies = new Vector(2); | ||||
private Vector tasks = new Vector(5); | private Vector tasks = new Vector(5); | ||||
private Project project; | private Project project; | ||||
@@ -108,8 +109,12 @@ public class Target { | |||||
return dependencies.elements(); | return dependencies.elements(); | ||||
} | } | ||||
public void setCondition(String property) { | |||||
this.condition = (property == null) ? "" : property; | |||||
public void setIf(String property) { | |||||
this.ifCondition = (property == null) ? "" : property; | |||||
} | |||||
public void setUnless(String property) { | |||||
this.unlessCondition = (property == null) ? "" : property; | |||||
} | } | ||||
public String toString() { | public String toString() { | ||||
@@ -117,7 +122,7 @@ public class Target { | |||||
} | } | ||||
public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
if (("".equals(this.condition)) || (project.getProperty(this.condition) != null)) { | |||||
if (testIfCondition() && testUnlessCondition()) { | |||||
Enumeration enum = tasks.elements(); | Enumeration enum = tasks.elements(); | ||||
while (enum.hasMoreElements()) { | while (enum.hasMoreElements()) { | ||||
Task task = (Task) enum.nextElement(); | Task task = (Task) enum.nextElement(); | ||||
@@ -135,8 +140,22 @@ public class Target { | |||||
throw exc; | throw exc; | ||||
} | } | ||||
} | } | ||||
} else if (!testIfCondition()) { | |||||
project.log(this, "Skipped because property '" + this.ifCondition + "' not set.", | |||||
Project.MSG_VERBOSE); | |||||
} else { | } else { | ||||
project.log(this, "Skipped because property '" + this.condition + "' not set.", Project.MSG_VERBOSE); | |||||
project.log(this, "Skipped because property '" + this.unlessCondition + "' set.", | |||||
Project.MSG_VERBOSE); | |||||
} | } | ||||
} | } | ||||
private boolean testIfCondition() { | |||||
return "".equals(ifCondition) | |||||
|| project.getProperty(ifCondition) != null; | |||||
} | |||||
private boolean testUnlessCondition() { | |||||
return "".equals(unlessCondition) | |||||
|| project.getProperty(unlessCondition) == null; | |||||
} | |||||
} | } |