the other targets. Submitted by: Marcel Schutte <marcel@schutte.com> git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267983 13f79535-47bb-0310-9956-ffa450edef68master
@@ -35,7 +35,7 @@ behavior has been dropped. | |||||
Other changes: | Other changes: | ||||
-------------- | -------------- | ||||
* New tasks: antstructure, cab, execon, fail, ftp, genkey, junit, sql, javacc, jjtree, starteam. | |||||
* New tasks: antstructure, cab, execon, fail, ftp, genkey, jlink, junit, sql, javacc, jjtree, starteam. | |||||
* New tasks mparse pending documentation. | * New tasks mparse pending documentation. | ||||
@@ -131,7 +131,7 @@ | |||||
<!-- =================================================================== --> | <!-- =================================================================== --> | ||||
<!-- Creates the binary structure --> | <!-- Creates the binary structure --> | ||||
<!-- =================================================================== --> | <!-- =================================================================== --> | ||||
<target name="main" depends="jar"> | |||||
<target name="main" depends="jar" description="Creates the binary structure"> | |||||
<mkdir dir="${bin.dir}"/> | <mkdir dir="${bin.dir}"/> | ||||
<copydir src="${src.bin.dir}" dest="${bin.dir}"/> | <copydir src="${src.bin.dir}" dest="${bin.dir}"/> | ||||
<chmod perm="+x"> | <chmod perm="+x"> | ||||
@@ -146,7 +146,7 @@ | |||||
<!-- =================================================================== --> | <!-- =================================================================== --> | ||||
<!-- Creates the API documentation --> | <!-- Creates the API documentation --> | ||||
<!-- =================================================================== --> | <!-- =================================================================== --> | ||||
<target name="javadocs" depends="prepare"> | |||||
<target name="javadocs" depends="prepare" description="Creates the API documentation"> | |||||
<mkdir dir="${build.javadocs}"/> | <mkdir dir="${build.javadocs}"/> | ||||
<javadoc packagenames="${packages}" | <javadoc packagenames="${packages}" | ||||
sourcepath="${basedir}/${src.dir}" | sourcepath="${basedir}/${src.dir}" | ||||
@@ -162,7 +162,7 @@ | |||||
<!-- =================================================================== --> | <!-- =================================================================== --> | ||||
<!-- Creates the distribution --> | <!-- Creates the distribution --> | ||||
<!-- =================================================================== --> | <!-- =================================================================== --> | ||||
<target name="dist" depends="main,jar,javadocs"> | |||||
<target name="dist" depends="main,jar,javadocs" description="Creates the distribution"> | |||||
<mkdir dir="${ant.dist.dir}"/> | <mkdir dir="${ant.dist.dir}"/> | ||||
<mkdir dir="${ant.dist.dir}/bin"/> | <mkdir dir="${ant.dist.dir}/bin"/> | ||||
<mkdir dir="${ant.dist.dir}/lib"/> | <mkdir dir="${ant.dist.dir}/lib"/> | ||||
@@ -207,7 +207,7 @@ | |||||
<!-- =================================================================== --> | <!-- =================================================================== --> | ||||
<!-- Installs the ant.jar library and binary files into ant.home --> | <!-- Installs the ant.jar library and binary files into ant.home --> | ||||
<!-- =================================================================== --> | <!-- =================================================================== --> | ||||
<target name="bootstrap" depends="main"> | |||||
<target name="bootstrap" depends="main" description="Installs the ant.jar library and binary files into ant.home"> | |||||
<echo message="copying bootstrapped files into bin and lib"/> | <echo message="copying bootstrapped files into bin and lib"/> | ||||
<copydir src="${lib.dir}" dest="lib"/> | <copydir src="${lib.dir}" dest="lib"/> | ||||
<copydir src="${bin.dir}" dest="bin"/> | <copydir src="${bin.dir}" dest="bin"/> | ||||
@@ -174,21 +174,23 @@ buildfile (see the <a href="#property">property task</a>). | |||||
This can be done with the <i>-D<property>=<value></i> | This can be done with the <i>-D<property>=<value></i> | ||||
option, where <i><property></i> is the name of the property and <i><value></i> | option, where <i><property></i> is the name of the property and <i><value></i> | ||||
the value.</p> | the value.</p> | ||||
<p>To more options are <i>-quiet</i> which instructs Ant to print less | |||||
<p>Two more options are <i>-quiet</i> which instructs Ant to print less | |||||
information on the console when running. The option <i>-verbose</i> on the other | information on the console when running. The option <i>-verbose</i> on the other | ||||
hand makes Ant print more information on the console.</p> | hand makes Ant print more information on the console.</p> | ||||
<p>It is also possible to specify the target that should be executed. Default | |||||
the target that is mentioned in the <i>default</i> attribute of the project is | |||||
used. This can be overridden by adding the target name to the end of the | |||||
commandline.</p> | |||||
<p>It is also possible to specify one or more targets that should be executed. When omitted the target that is mentioned in the <i>default</i> attribute of the project is | |||||
used.</p> | |||||
<p>The <i>-projecthelp</i> option gives a list of this projects targets. First those with a description and then those without one.</p> | |||||
<p>Commandline option summary:</p> | <p>Commandline option summary:</p> | ||||
<pre>ant [options] [target] | |||||
<pre>ant [options] [target [target2 [target3] ...]] | |||||
Options: | Options: | ||||
-help print this message | -help print this message | ||||
-projecthelp print project help information | |||||
-version print the version information and exit | -version print the version information and exit | ||||
-quiet be extra quiet | -quiet be extra quiet | ||||
-verbose be extra verbose | -verbose be extra verbose | ||||
-emacs produce logging information without adornments | |||||
-logfile <file> use given file for log | -logfile <file> use given file for log | ||||
-logger <classname> the class which is to perform logging | |||||
-listener <classname> add an instance of class as a project listener | -listener <classname> add an instance of class as a project listener | ||||
-buildfile <file> use given buildfile | -buildfile <file> use given buildfile | ||||
-D<property>=<value> use value for given property</pre> | -D<property>=<value> use value for given property</pre> | ||||
@@ -302,6 +304,7 @@ href="#tstamp">tstamp</a> tasks in a so called initialization target, on which | |||||
all other targets depend. Make sure that target is always the first one in | all other targets depend. Make sure 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 | ||||
have the name "init".</p> | have the name "init".</p> | ||||
<p>The optional <i>description</i> attribute can be used to provide a one line description of this target that is printed by the <i>-projecthelp</i> commandline option.</p> | |||||
<p>A target has the following attributes:</p> | <p>A target has the following attributes:</p> | ||||
<table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
<tr> | <tr> | ||||
@@ -332,6 +335,11 @@ have the name "init".</p> | |||||
for this target to execute.</td> | for this target to execute.</td> | ||||
<td align="center" valign="top">No</td> | <td align="center" valign="top">No</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<td valign="top">description</td> | |||||
<td valign="top">a short description of this targets function.</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> | ||||
@@ -95,7 +95,7 @@ public class Main { | |||||
/** | /** | ||||
* The Ant logger class. There may be only one logger. It will have the | * The Ant logger class. There may be only one logger. It will have the | ||||
* right to use the 'out' PrintStream. The class must implements the BuildLogger | |||||
* right to use the 'out' PrintStream. The class must implements the BuildLogger | |||||
* interface | * interface | ||||
*/ | */ | ||||
private String loggerClassname = null; | private String loggerClassname = null; | ||||
@@ -114,7 +114,7 @@ public class Main { | |||||
* Indicates we should only parse and display the project help information | * Indicates we should only parse and display the project help information | ||||
*/ | */ | ||||
private boolean projectHelp = false; | private boolean projectHelp = false; | ||||
/** | /** | ||||
* Command line entry point. This method kicks off the building | * Command line entry point. This method kicks off the building | ||||
* of a project object and executes a build using either a given | * of a project object and executes a build using either a given | ||||
@@ -276,7 +276,7 @@ public class Main { | |||||
try { | try { | ||||
addBuildListeners(project); | addBuildListeners(project); | ||||
project.fireBuildStarted(); | project.fireBuildStarted(); | ||||
project.init(); | project.init(); | ||||
// set user-define properties | // set user-define properties | ||||
@@ -355,12 +355,12 @@ public class Main { | |||||
logger = (BuildLogger)(Class.forName(loggerClassname).newInstance()); | logger = (BuildLogger)(Class.forName(loggerClassname).newInstance()); | ||||
} | } | ||||
catch (ClassCastException e) { | catch (ClassCastException e) { | ||||
System.err.println("The specified logger class " + loggerClassname + | |||||
System.err.println("The specified logger class " + loggerClassname + | |||||
" does not implement the BuildLogger interface"); | " does not implement the BuildLogger interface"); | ||||
throw new RuntimeException(); | throw new RuntimeException(); | ||||
} | } | ||||
catch (Exception e) { | catch (Exception e) { | ||||
System.err.println("Unable to instantiate specified logger class " + | |||||
System.err.println("Unable to instantiate specified logger class " + | |||||
loggerClassname + " : " + e.getClass().getName()); | loggerClassname + " : " + e.getClass().getName()); | ||||
throw new RuntimeException(); | throw new RuntimeException(); | ||||
} | } | ||||
@@ -368,12 +368,12 @@ public class Main { | |||||
else { | else { | ||||
logger = new DefaultLogger(); | logger = new DefaultLogger(); | ||||
} | } | ||||
logger.setMessageOutputLevel(msgOutputLevel); | logger.setMessageOutputLevel(msgOutputLevel); | ||||
logger.setOutputPrintStream(out); | logger.setOutputPrintStream(out); | ||||
logger.setErrorPrintStream(err); | logger.setErrorPrintStream(err); | ||||
logger.setEmacsMode(emacsMode); | logger.setEmacsMode(emacsMode); | ||||
return logger; | return logger; | ||||
} | } | ||||
@@ -383,7 +383,7 @@ public class Main { | |||||
private static void printUsage() { | private static void printUsage() { | ||||
String lSep = System.getProperty("line.separator"); | String lSep = System.getProperty("line.separator"); | ||||
StringBuffer msg = new StringBuffer(); | StringBuffer msg = new StringBuffer(); | ||||
msg.append("ant [options] [target]" + lSep); | |||||
msg.append("ant [options] [target [target2 [target3] ...]]" + lSep); | |||||
msg.append("Options: " + lSep); | msg.append("Options: " + lSep); | ||||
msg.append(" -help print this message" + lSep); | msg.append(" -help print this message" + lSep); | ||||
msg.append(" -projecthelp print project help information" + lSep); | msg.append(" -projecthelp print project help information" + lSep); | ||||
@@ -422,49 +422,78 @@ public class Main { | |||||
System.err.println("Could not load the version information."); | System.err.println("Could not load the version information."); | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Print out a list of all targets in the current buildfile | * Print out a list of all targets in the current buildfile | ||||
*/ | */ | ||||
private static void printTargets(Project project) { | private static void printTargets(Project project) { | ||||
// find the target with the longest name and | |||||
// filter out the targets with no description | |||||
// find the target with the longest name | |||||
int maxLength = 0; | int maxLength = 0; | ||||
Enumeration ptargets = project.getTargets().elements(); | Enumeration ptargets = project.getTargets().elements(); | ||||
String targetName; | String targetName; | ||||
String targetDescription; | String targetDescription; | ||||
Target currentTarget; | Target currentTarget; | ||||
Vector names = new Vector(); | |||||
Vector descriptions = new Vector(); | |||||
// split the targets in top-level and sub-targets depending | |||||
// on the presence of a description | |||||
Vector topNames = new Vector(); | |||||
Vector topDescriptions = new Vector(); | |||||
Vector subNames = new Vector(); | |||||
while (ptargets.hasMoreElements()) { | while (ptargets.hasMoreElements()) { | ||||
currentTarget = (Target)ptargets.nextElement(); | currentTarget = (Target)ptargets.nextElement(); | ||||
targetName = currentTarget.getName(); | targetName = currentTarget.getName(); | ||||
targetDescription = currentTarget.getDescription(); | targetDescription = currentTarget.getDescription(); | ||||
// maintain a sorted list of targets | |||||
if (targetDescription == null) { | if (targetDescription == null) { | ||||
targetDescription = ""; | |||||
} | |||||
names.addElement(targetName); | |||||
descriptions.addElement(targetDescription); | |||||
int pos = findTargetPosition(subNames, targetName); | |||||
subNames.insertElementAt(targetName, pos); | |||||
} else { | |||||
int pos = findTargetPosition(topNames, targetName); | |||||
topNames.insertElementAt(targetName, pos); | |||||
topDescriptions.insertElementAt(targetDescription, pos); | |||||
if (targetName.length() > maxLength) { | if (targetName.length() > maxLength) { | ||||
maxLength = targetName.length(); | maxLength = targetName.length(); | ||||
} | } | ||||
} | } | ||||
} | |||||
printTargets(topNames, topDescriptions, "Main targets:", maxLength); | |||||
printTargets(subNames, null, "Subtargets:", 0); | |||||
} | |||||
/** | |||||
* Search for the insert position to keep names a sorted list of Strings | |||||
*/ | |||||
private static int findTargetPosition(Vector names, String name) { | |||||
int res = names.size(); | |||||
for (int i=0; i<names.size() && res == names.size(); i++) { | |||||
if (name.compareTo((String)names.elementAt(i)) < 0) { | |||||
res = i; | |||||
} | |||||
} | |||||
return res; | |||||
} | |||||
/** | |||||
* Output a formatted list of target names with an optional description | |||||
*/ | |||||
private static void printTargets(Vector names, Vector descriptions, String heading, int maxlen) { | |||||
// now, start printing the targets and their descriptions | // now, start printing the targets and their descriptions | ||||
String lSep = System.getProperty("line.separator"); | String lSep = System.getProperty("line.separator"); | ||||
// got a bit annoyed that I couldn't find a pad function | // got a bit annoyed that I couldn't find a pad function | ||||
String spaces = " "; | String spaces = " "; | ||||
while (spaces.length()<maxLength) { | |||||
while (spaces.length()<maxlen) { | |||||
spaces += spaces; | spaces += spaces; | ||||
} | } | ||||
StringBuffer msg = new StringBuffer(); | StringBuffer msg = new StringBuffer(); | ||||
msg.append("Targets: " + lSep); | |||||
msg.append(heading + lSep + lSep); | |||||
for (int i=0; i<names.size(); i++) { | for (int i=0; i<names.size(); i++) { | ||||
msg.append(" -"+names.elementAt(i)); | |||||
msg.append(spaces.substring(0, maxLength - ((String)names.elementAt(i)).length() + 2)); | |||||
msg.append(descriptions.elementAt(i)+lSep); | |||||
msg.append(" "); | |||||
msg.append(names.elementAt(i)); | |||||
if (descriptions != null) { | |||||
msg.append(spaces.substring(0, maxlen - ((String)names.elementAt(i)).length() + 2)); | |||||
msg.append(descriptions.elementAt(i)); | |||||
} | |||||
msg.append(lSep); | |||||
} | } | ||||
System.out.println(msg.toString()); | System.out.println(msg.toString()); | ||||
} | } | ||||