@@ -1,66 +1,64 @@
/*
* The Apache Software License, Version 1.1
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved.
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* build notes
* -The reference CD to listen to while editing this file is
* nap: Underworld - Everything, Everything
* -variable naming policy from Fowler's refactoring book.
* -tested against the PDC pre-beta of csc.exe; future versions will
* inevitably change things
*/
/* build notes
-The reference CD to listen to while editing this file is
nap: Underworld - Everything, Everything
-variable naming policy from Fowler's refactoring book.
-tested against the PDC pre-beta of csc.exe; future versions will
inevitably change things
*/
// ====================================================================
// place in the optional ant tasks package
// but in its own dotnet group
@@ -79,134 +77,187 @@ import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.MatchingTask;
/**
Task to assemble .net 'Intermediate Language' files.
The task will only work on win2K until other platforms support csc.exe or
an equivalent. ilasm.exe must be on the execute path too.
<p>
* Task to assemble .net 'Intermediate Language' files. The task will only work
* on win2K until other platforms support csc.exe or an equivalent. ilasm.exe
* must be on the execute path too. <p>
*
* <p>
*
* All parameters are optional: <il/> should suffice to produce a debug
* build of all *.il files. The option set is roughly compatible with the
* CSharp class; even though the command line options are only vaguely
* equivalent. [The low level commands take things like /OUT=file, csc wants
* /out:file ... /verbose is used some places; /quiet here in ildasm... etc.]
* It would be nice if someone made all the command line tools consistent (and
* not as brittle as the java cmdline tools) <p>
*
* The task is a directory based task, so attributes like <b>includes="*.il"
* </b> and <b>excludes="broken.il"</b> can be used to control the files pulled
* in. Each file is built on its own, producing an appropriately named output
* file unless manually specified with <b>outfile</b>
*
*@author Steve Loughran steve_l@iseran.com
*@version 0.5
*/
<p>
All parameters are optional: <il/> should suffice to produce a debug
build of all *.il files.
The option set is roughly compatible with the CSharp class;
even though the command line options are only vaguely
equivalent. [The low level commands take things like /OUT=file,
csc wants /out:file ... /verbose is used some places; /quiet here in
ildasm... etc.] It would be nice if someone made all the command line
tools consistent (and not as brittle as the java cmdline tools)
public class Ilasm
extends MatchingTask {
/**
* Name of the executable. The .exe suffix is deliberately not included in
* anticipation of the unix version
*/
protected final static String exe_name = "ilasm";
<p>
/**
* what is the file extension we search on?
*/
protected final static String file_ext = "il";
The task is a directory based task, so attributes like <b>includes="*.il"</b> and
<b>excludes="broken.il"</b> can be used to control the files pulled in.
Each file is built on its own, producing an appropriately named output file unless
manually specified with <b>outfile</b>
/**
* and now derive the search pattern from the extension
*/
protected final static String file_pattern = "**/*." + file_ext;
/**
* title of task for external presentation
*/
protected final static String exe_title = "ilasm";
@author Steve Loughran steve_l@iseran.com
@version 0.2
*/
/**
* source directory upon which the search pattern is applied
*/
private File srcDir;
/**
* type of target. Should be one of exe|library|module|winexe|(null)
* default is exe; the actual value (if not null) is fed to the command
* line. <br>
* See /target
*/
protected String targetType;
/**
* verbose flag
*/
protected boolean verbose;
public class Ilasm
extends MatchingTask {
/**
* listing flag
*/
protected boolean listing;
/** constructor inits everything and set up the search pattern
/**
* output file. If not supplied this is derived from the source file
*/
public Ilasm() {
Clear();
setIncludes(file_pattern);
}
protected File outputFile;
/**
* Name of the executable. The .exe suffix is deliberately not included
* in anticipation of the unix version
/**
* resource file (.res format) to include in the app.
*/
protected final static String exe_name = "ilasm" ;
protected File resourceFile ;
/** what is the file extension we search on?
/**
* flag to control action on execution trouble
*/
protected final static String file_ext = "il" ;
protected boolean failOnError ;
/** and now derive the search pattern from the extension
/**
* debug flag. Controls generation of debug information.
*/
protected final static String file_pattern = "**/*." + file_ext ;
protected boolean debug ;
/** title of task for external presentation
/**
* file containing private key
*/
protected final static String exe_title = "ilasm";
/** reset all contents.
private File keyfile;
/**
* any extra command options?
*/
public void Clear() {
_targetType = null;
_srcDir = null;
_listing = false;
_verbose = false;
_debug = true;
_outputFile = null;
_failOnError = true;
_resourceFile = null;
_extraOptions = null;
}
protected String extraOptions;
/** source directory upon which the search pattern is applied
/**
* constructor inits everything and set up the search pattern
*/
private File _srcDir;
public Ilasm() {
Clear();
setIncludes(file_pattern);
}
/**
* Set the source dir to find the files to be compiled
* @param srcDirName The new SrcDir value
* reset all contents.
*/
public void setSrcDir(File srcDirName) {
_srcDir = srcDirName;
public void Clear() {
targetType = null;
srcDir = null;
listing = false;
verbose = false;
debug = true;
outputFile = null;
failOnError = true;
resourceFile = null;
extraOptions = null;
}
/** type of target. Should be one of exe|library|module|winexe|(null)
default is exe; the actual value (if not null) is fed to the command line.
<br>See /target
/**
* Set the source dir to find the files to be compiled
*
*@param srcDirName The new SrcDir value
*/
protected String _targetType;
public void setSrcDir(File srcDirName) {
srcDir = srcDirName;
}
/** define the target
* @param targetType one of exe|library|
* @exception BuildException if target is not one of exe|library|module|winexe
/**
* define the target
*
*@param targetType one of exe|library|
*@exception BuildException if target is not one of
* exe|library|module|winexe
*/
public void setTargetType(String targetType)
throws BuildException {
throws BuildException {
targetType = targetType.toLowerCase();
if (targetType.equals("exe") || targetType.equals("library")) {
_ targetType = targetType;
targetType = targetType;
} else {
throw new BuildException("targetType " + targetType + " is not a valid type");
}
}
/**
* accessor method for target type
* @return the current target option
* accessor method for target type
*
*@return the current target option
*/
public String getTargetType() {
return _ targetType;
return targetType;
}
/** g
* get the target type or null for no argument needed
/**
* g get the target type or null for no argument needed
*
* @return The TargetTypeParameter value
*@return The TargetTypeParameter value
*/
protected String getTargetTypeParameter() {
if (!notEmpty(_ targetType)) {
if (!notEmpty(targetType)) {
return null;
}
if (_ targetType.equals("exe")) {
if (targetType.equals("exe")) {
return "/exe";
} else if (_ targetType.equals("library")) {
} else if (targetType.equals("library")) {
return "/dll";
} else {
return null;
@@ -217,219 +268,237 @@ public class Ilasm
/**
* Sets the Owner attribute
*
* @param s The new Owner value
*@param s The new Owner value
*/
public void setOwner(String s) {
log("This option is not supported by ILASM as of Beta-2, and will be ignored", Project.MSG_WARN);
}
/** test for a string containing something useful
* @param string to test
* @return true if the argument is not null or empty
/**
* test for a string containing something useful
*
*@param s any string
*@return true if the argument is not null or empty
*/
protected boolean notEmpty(String s) {
return s != null && s.length() != 0;
}
/** verbose flag
*/
protected boolean _verbose;
/**
* enable/disable verbose ILASM output
* @param b flag set to true for verbose on
* enable/disable verbose ILASM output
*
*@param b flag set to true for verbose on
*/
public void setVerbose(boolean b) {
_ verbose = b;
verbose = b;
}
/**
* turn the verbose flag into a parameter for ILASM
* @return null or the appropriate command line string
* turn the verbose flag into a parameter for ILASM
*
*@return null or the appropriate command line string
*/
protected String getVerboseParameter() {
return _ verbose?null:"/quiet";
return verbose ? null : "/quiet";
}
/** listing flag
*/
protected boolean _listing;
/**
* enable/disable listing
* @param b flag set to true for listing on
* enable/disable listing
*
*@param b flag set to true for listing on
*/
public void setListing(boolean b) {
_ listing = b;
listing = b;
}
/**
* turn the listing flag into a parameter for ILASM
* @return the appropriate string from the state of the listing flag
* turn the listing flag into a parameter for ILASM
*
*@return the appropriate string from the state of the listing flag
*/
protected String getListingParameter() {
return _ listing?"/listing":"/nolisting";
return listing ? "/listing" : "/nolisting";
}
/**
* output file. If not supplied this is derived from the
* source file
*/
protected File _outputFile;
/**
* Set the definitions
* @param list of definitions split by ; or , or even :
* Set the output file
*
*@param params The new outputFile value
*/
public void setOutputFile(File params) {
_ outputFile = params;
outputFile = params;
}
/**
* get the output file
* @return the argument string or null for no argument
* get the output file
*
*@return the argument string or null for no argument
*/
protected String getOutputFileParameter() {
if (_ outputFile == null || _ outputFile.length() == 0) {
if (outputFile == null || outputFile.length() == 0) {
return null;
}
File f = _ outputFile;
File f = outputFile;
return "/output=" + f.toString();
}
/** resource file (.res format) to include in the app.
*/
protected File _resourceFile;
/**
* Set the resource file
* @param fileName path to the file. Can be relative, absolute, whatever.
* Set the resource file
*
*@param fileName path to the file. Can be relative, absolute, whatever.
*/
public void setResourceFile(File fileName) {
_ resourceFile = fileName;
resourceFile = fileName;
}
/**
* Gets the resourceFileParameter attribute of the Ilasm task
*
*@return The resourceFileParameter value
*/
protected String getResourceFileParameter() {
if (_resourceFile != null) {
return "/resource=" + _resourceFile.toString();
if (resourceFile != null) {
return "/resource=" + resourceFile.toString();
} else {
return null;
}
}
/** flag to control action on execution trouble
*/
protected boolean _failOnError;
/**set fail on error flag
/**
* set fail on error flag
*
*@param b The new failOnError value
*/
public void setFailOnError(boolean b) {
_failOnError = b;
failOnError = b;
}
/** query fail on error flag
/**
* query fail on error flag
*
*@return The failFailOnError value
*/
public boolean getFailFailOnError() {
return _failOnError;
return failOnError;
}
/** debug flag. Controls generation of debug information.
*/
protected boolean _debug;
/** set the debug flag on or off
* @param f on/off flag
/**
* set the debug flag on or off
*
*@param f on/off flag
*/
public void setDebug(boolean f) {
_ debug = f;
debug = f;
}
/** query the debug flag
* @return true if debug is turned on
/**
* query the debug flag
*
*@return true if debug is turned on
*/
public boolean getDebug() {
return _debug;
return debug;
}
/** get the argument or null for no argument needed
/**
* get the argument or null for no argument needed
*
*@return The debugParameter value
*/
protected String getDebugParameter() {
return _debug?"/debug":null;
return debug ? "/debug" : null;
}
/** file containing private key
*/
private File _keyfile;
/**
* Sets the keyfile attribute of the Ilasm object
*
*@param keyfile The new keyfile value
*/
public void setKeyfile(File keyfile) {
this._keyfile = keyfile;
this.keyfile = keyfile;
}
/** get the argument or null for no argument needed
/**
* get the argument or null for no argument needed
*
*@return The keyfileParameter value
*/
protected String getKeyfileParameter() {
if (_keyfile != null) {
return "/keyfile:" + _keyfile.toString();
if (keyfile != null) {
return "/keyfile:" + keyfile.toString();
} else {
return null;
}
}
/** any extra command options?
*/
protected String _extraOptions;
/**
* Sets the ExtraOptions attribute
*
* @param extraOptions The new ExtraOptions value
*@param extraOptions The new ExtraOptions value
*/
public void setExtraOptions(String extraOptions) {
this._ extraOptions = extraOptions;
this.extraOptions = extraOptions;
}
/**
* Gets the ExtraOptions attribute
*
* @return The ExtraOptions value
*@return The ExtraOptions value
*/
public String getExtraOptions() {
return this._ extraOptions;
return this.extraOptions;
}
/**
* get any extra options or null for no argument needed
*
* @return The ExtraOptions Parameter to CSC
*@return The ExtraOptions Parameter to CSC
*/
protected String getExtraOptionsParameter() {
if (_ extraOptions != null && _ extraOptions.length() != 0) {
return _ extraOptions;
if (extraOptions != null && extraOptions.length() != 0) {
return extraOptions;
} else {
return null;
}
}
/** This is the execution entry point. Build a list of files and
* call ilasm on each of them.
* @throws BuildException if the assembly failed and FailOnError is true
/**
* This is the execution entry point. Build a list of files and call ilasm
* on each of them.
*
*@throws BuildException if the assembly failed and FailOnError is true
*/
public void execute()
throws BuildException {
if (_ srcDir == null) {
_ srcDir = project.resolveFile(".");
throws BuildException {
if (srcDir == null) {
srcDir = project.resolveFile(".");
}
//get dependencies list.
DirectoryScanner scanner = super.getDirectoryScanner(_ srcDir);
DirectoryScanner scanner = super.getDirectoryScanner(srcDir);
String[] dependencies = scanner.getIncludedFiles();
log("assembling " + dependencies.length + " file" + ((dependencies.length == 1)?"":"s"));
log("assembling " + dependencies.length + " file" + ((dependencies.length == 1) ? "" : "s"));
String baseDir = scanner.getBasedir().toString();
//add to the command
for (int i = 0; i < dependencies.length; i++) {
@@ -438,16 +507,18 @@ public class Ilasm
executeOneFile(targetFile);
}
} // end execute
}
// end execute
/**
* do the work for one file by building the command line then calling it
* @param targetFile name of the the file to assemble
* @throws BuildException if the assembly failed and FailOnError is true
* do the work for one file by building the command line then calling it
*
*@param targetFile name of the the file to assemble
*@throws BuildException if the assembly failed and FailOnError is true
*/
public void executeOneFile(String targetFile)
throws BuildException {
throws BuildException {
NetCommand command = new NetCommand(this, exe_title, exe_name);
command.setFailOnError(getFailFailOnError());
//DEBUG helper
@@ -462,14 +533,15 @@ public class Ilasm
command.addArgument(getKeyfileParameter());
command.addArgument(getExtraOptionsParameter());
/* space for more argumentativeness
command.addArgument();
command.addArgument();
*/
/*
* space for more argumentativeness
* command.addArgument();
* command.addArgument();
*/
command.addArgument(targetFile);
//now run the command of exe + settings + file
command.runCommand();
} // end executeOneFile
} //class
}
// end executeOneFile
}