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> | |||
| <p>A target gets executed only once. Even when more targets depend on it (see | |||
| 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> | |||
| <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> | |||
| <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 | |||
| 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 | |||
| @@ -312,6 +316,12 @@ have the name "init".</p> | |||
| target to execute.</td> | |||
| <td align="center" valign="top">No</td> | |||
| </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> | |||
| <h3>Tasks</h3> | |||
| <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 { | |||
| String name = null; | |||
| String depends = ""; | |||
| String cond = null; | |||
| String ifCond = null; | |||
| String unlessCond = null; | |||
| String id = null; | |||
| for (int i = 0; i < attrs.getLength(); i++) { | |||
| @@ -288,7 +289,9 @@ public class ProjectHelper { | |||
| } else if (key.equals("depends")) { | |||
| depends = value; | |||
| } else if (key.equals("if")) { | |||
| cond = value; | |||
| ifCond = value; | |||
| } else if (key.equals("unless")) { | |||
| unlessCond = value; | |||
| } else if (key.equals("id")) { | |||
| id = value; | |||
| } else { | |||
| @@ -302,7 +305,8 @@ public class ProjectHelper { | |||
| target = new Target(); | |||
| target.setName(name); | |||
| target.setCondition(cond); | |||
| target.setIf(ifCond); | |||
| target.setUnless(unlessCond); | |||
| project.addTarget(name, target); | |||
| if (id != null && !id.equals("")) | |||
| @@ -65,7 +65,8 @@ import java.util.*; | |||
| public class Target { | |||
| private String name; | |||
| private String condition = ""; | |||
| private String ifCondition = ""; | |||
| private String unlessCondition = ""; | |||
| private Vector dependencies = new Vector(2); | |||
| private Vector tasks = new Vector(5); | |||
| private Project project; | |||
| @@ -108,8 +109,12 @@ public class Target { | |||
| 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() { | |||
| @@ -117,7 +122,7 @@ public class Target { | |||
| } | |||
| public void execute() throws BuildException { | |||
| if (("".equals(this.condition)) || (project.getProperty(this.condition) != null)) { | |||
| if (testIfCondition() && testUnlessCondition()) { | |||
| Enumeration enum = tasks.elements(); | |||
| while (enum.hasMoreElements()) { | |||
| Task task = (Task) enum.nextElement(); | |||
| @@ -135,8 +140,22 @@ public class Target { | |||
| throw exc; | |||
| } | |||
| } | |||
| } else if (!testIfCondition()) { | |||
| project.log(this, "Skipped because property '" + this.ifCondition + "' not set.", | |||
| Project.MSG_VERBOSE); | |||
| } 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; | |||
| } | |||
| } | |||