Then I add <reference> fileset support into vbc, jsharp and csc, including inside the dependency checking. resources still need dependency checking, and testing. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274222 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -449,5 +449,15 @@ public class CSharp extends DotnetCompile { | |||||
| return "cs"; | return "cs"; | ||||
| } | } | ||||
| /** | |||||
| * from a resource, get the resource param string | |||||
| * @param resource | |||||
| * @return a string containing the resource param, or a null string | |||||
| * to conditionally exclude a resource. | |||||
| */ | |||||
| protected String createResourceParameter(DotnetResource resource) { | |||||
| return resource.getCSharpStyleParameter(); | |||||
| } | |||||
| } | } | ||||
| @@ -76,9 +76,10 @@ public class DotnetBaseMatchingTask extends MatchingTask { | |||||
| */ | */ | ||||
| protected File outputFile; | protected File outputFile; | ||||
| /** | /** | ||||
| * sets of file to compile | |||||
| * filesets of file to compile | |||||
| */ | */ | ||||
| protected Vector filesets = new Vector(); | protected Vector filesets = new Vector(); | ||||
| /** | /** | ||||
| * source directory upon which the search pattern is applied | * source directory upon which the search pattern is applied | ||||
| */ | */ | ||||
| @@ -193,7 +194,7 @@ public class DotnetBaseMatchingTask extends MatchingTask { | |||||
| * finish off the command by adding all dependent files, execute | * finish off the command by adding all dependent files, execute | ||||
| * @param command | * @param command | ||||
| */ | */ | ||||
| protected void addFilesAndExecute(NetCommand command) { | |||||
| protected void addFilesAndExecute(NetCommand command, boolean ignoreTimestamps) { | |||||
| long outputTimestamp = getOutputFileTimestamp(); | long outputTimestamp = getOutputFileTimestamp(); | ||||
| Hashtable filesToBuild =new Hashtable(); | Hashtable filesToBuild =new Hashtable(); | ||||
| int filesOutOfDate = buildFileList(command,filesToBuild, outputTimestamp); | int filesOutOfDate = buildFileList(command,filesToBuild, outputTimestamp); | ||||
| @@ -201,6 +202,7 @@ public class DotnetBaseMatchingTask extends MatchingTask { | |||||
| //add the files to the command | //add the files to the command | ||||
| addFilesToCommand(filesToBuild, command); | addFilesToCommand(filesToBuild, command); | ||||
| //now run the command of exe + settings + files | //now run the command of exe + settings + files | ||||
| if (filesOutOfDate > 0) { | if (filesOutOfDate > 0) { | ||||
| command.runCommand(); | command.runCommand(); | ||||
| @@ -210,4 +212,5 @@ public class DotnetBaseMatchingTask extends MatchingTask { | |||||
| } | } | ||||
| } | } | ||||
| @@ -152,6 +152,10 @@ public abstract class DotnetCompile | |||||
| */ | */ | ||||
| protected Vector definitionList = new Vector(); | protected Vector definitionList = new Vector(); | ||||
| /** | |||||
| * our resources | |||||
| */ | |||||
| protected Vector resources = new Vector(); | |||||
| /** | /** | ||||
| * Fix .NET reference inclusion. .NET is really dumb in how it handles | * Fix .NET reference inclusion. .NET is really dumb in how it handles | ||||
| @@ -167,7 +171,7 @@ public abstract class DotnetCompile | |||||
| * need to reference mscorlib.dll, cos it is always there | * need to reference mscorlib.dll, cos it is always there | ||||
| */ | */ | ||||
| protected static final String [] DEFAULT_REFERENCE_LIST_DOTNET_10 = | |||||
| protected static final String[] DEFAULT_REFERENCE_LIST_DOTNET_10 = | |||||
| {"Accessibility.dll", | {"Accessibility.dll", | ||||
| "cscompmgd.dll", | "cscompmgd.dll", | ||||
| "CustomMarshalers.dll", | "CustomMarshalers.dll", | ||||
| @@ -192,6 +196,8 @@ public abstract class DotnetCompile | |||||
| "System.Windows.Forms.dll", | "System.Windows.Forms.dll", | ||||
| "System.XML.dll"}; | "System.XML.dll"}; | ||||
| protected static final String REFERENCE_OPTION= "/reference:"; | |||||
| /** | /** | ||||
| * debug flag. Controls generation of debug information. | * debug flag. Controls generation of debug information. | ||||
| */ | */ | ||||
| @@ -230,6 +236,10 @@ public abstract class DotnetCompile | |||||
| * list of extra modules to refer to | * list of extra modules to refer to | ||||
| */ | */ | ||||
| protected String additionalModules; | protected String additionalModules; | ||||
| /** | |||||
| * filesets of references | |||||
| */ | |||||
| protected Vector referenceFilesets =new Vector(); | |||||
| /** | /** | ||||
| @@ -278,7 +288,7 @@ public abstract class DotnetCompile | |||||
| protected String getReferencesParameter() { | protected String getReferencesParameter() { | ||||
| //bail on no references | //bail on no references | ||||
| if (notEmpty(references)) { | if (notEmpty(references)) { | ||||
| return "/reference:" + references; | |||||
| return REFERENCE_OPTION + references; | |||||
| } else { | } else { | ||||
| return null; | return null; | ||||
| } | } | ||||
| @@ -298,6 +308,15 @@ public abstract class DotnetCompile | |||||
| referenceFiles.append(path); | referenceFiles.append(path); | ||||
| } | } | ||||
| /** | |||||
| * add a new reference fileset to the compilation | |||||
| * @param reference | |||||
| */ | |||||
| public void addReference(FileSet reference) { | |||||
| referenceFilesets.add(reference); | |||||
| } | |||||
| /** | /** | ||||
| * turn the path list into a list of files and a /references argument | * turn the path list into a list of files and a /references argument | ||||
| @@ -319,7 +338,7 @@ public abstract class DotnetCompile | |||||
| return null; | return null; | ||||
| } | } | ||||
| StringBuffer s = new StringBuffer("/reference:"); | |||||
| StringBuffer s = new StringBuffer(REFERENCE_OPTION); | |||||
| s.append(refpath); | s.append(refpath); | ||||
| return new String(s); | return new String(s); | ||||
| } | } | ||||
| @@ -681,7 +700,7 @@ public abstract class DotnetCompile | |||||
| * add a define to the list of definitions | * add a define to the list of definitions | ||||
| * @param define | * @param define | ||||
| */ | */ | ||||
| public void addDefine(Define define) { | |||||
| public void addDefine(DotnetDefine define) { | |||||
| definitionList.addElement(define); | definitionList.addElement(define); | ||||
| } | } | ||||
| @@ -695,7 +714,7 @@ public abstract class DotnetCompile | |||||
| Enumeration defEnum=definitionList.elements(); | Enumeration defEnum=definitionList.elements(); | ||||
| while (defEnum.hasMoreElements()) { | while (defEnum.hasMoreElements()) { | ||||
| //loop through all definitions | //loop through all definitions | ||||
| Define define = (Define) defEnum.nextElement(); | |||||
| DotnetDefine define = (DotnetDefine) defEnum.nextElement(); | |||||
| if(define.isSet(this)) { | if(define.isSet(this)) { | ||||
| //add those that are set, and a delimiter | //add those that are set, and a delimiter | ||||
| defines.append(define.getValue(this)); | defines.append(define.getValue(this)); | ||||
| @@ -767,6 +786,14 @@ public abstract class DotnetCompile | |||||
| return failOnError; | return failOnError; | ||||
| } | } | ||||
| /** | |||||
| * link or embed a resource | |||||
| * @param resource | |||||
| */ | |||||
| public void addResource(DotnetResource resource) { | |||||
| resources.add(resource); | |||||
| } | |||||
| /** | /** | ||||
| * test for a string containing something useful | * test for a string containing something useful | ||||
| * | * | ||||
| @@ -810,6 +837,7 @@ public abstract class DotnetCompile | |||||
| return "**/*." + getFileExtension(); | return "**/*." + getFileExtension(); | ||||
| } | } | ||||
| /** | /** | ||||
| * do the work by building the command line and then calling it | * do the work by building the command line and then calling it | ||||
| * | * | ||||
| @@ -821,8 +849,13 @@ public abstract class DotnetCompile | |||||
| NetCommand command = createNetCommand(); | NetCommand command = createNetCommand(); | ||||
| //fill in args | //fill in args | ||||
| fillInSharedParameters(command); | fillInSharedParameters(command); | ||||
| addResources(command); | |||||
| addCompilerSpecificOptions(command); | addCompilerSpecificOptions(command); | ||||
| addFilesAndExecute(command); | |||||
| int referencesOutOfDate=addReferenceFilesets(command, | |||||
| getOutputFileTimestamp()); | |||||
| //if the refs are out of date, force a build. | |||||
| boolean forceBuild= referencesOutOfDate > 0; | |||||
| addFilesAndExecute(command, forceBuild); | |||||
| } | } | ||||
| @@ -869,6 +902,66 @@ public abstract class DotnetCompile | |||||
| command.addArgument(getWin32ResParameter()); | command.addArgument(getWin32ResParameter()); | ||||
| } | } | ||||
| /** | |||||
| * for every resource declared, we get the (language specific) | |||||
| * resource setting | |||||
| */ | |||||
| protected void addResources(NetCommand command) { | |||||
| Enumeration e=resources.elements(); | |||||
| while (e.hasMoreElements()) { | |||||
| DotnetResource resource = (DotnetResource) e.nextElement(); | |||||
| command.addArgument(createResourceParameter(resource)); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * from a resource, get the | |||||
| * @param resource | |||||
| * @return a string containing the resource param, or a null string | |||||
| * to conditionally exclude a resource. | |||||
| */ | |||||
| protected abstract String createResourceParameter(DotnetResource resource); | |||||
| /** | |||||
| * run through the list of reference files and add them to the command | |||||
| * @param outputTimestamp timestamp to compare against | |||||
| * @return number of files out of date | |||||
| */ | |||||
| protected int addReferenceFilesets(NetCommand command, long outputTimestamp) { | |||||
| int filesOutOfDate = 0; | |||||
| Hashtable filesToBuild=new Hashtable(); | |||||
| for (int i = 0; i < referenceFilesets.size(); i++) { | |||||
| FileSet fs = (FileSet) referenceFilesets.elementAt(i); | |||||
| filesOutOfDate += command.scanOneFileset( | |||||
| fs.getDirectoryScanner(getProject()), | |||||
| filesToBuild, | |||||
| outputTimestamp); | |||||
| } | |||||
| //bail out early if there were no files | |||||
| if(filesToBuild.size()==0) { | |||||
| return 0; | |||||
| } | |||||
| StringBuffer referenceList= new StringBuffer(REFERENCE_OPTION); | |||||
| //now scan the hashtable and add the files | |||||
| Enumeration files = filesToBuild.elements(); | |||||
| while (files.hasMoreElements()) { | |||||
| File file = (File) files.nextElement(); | |||||
| if(isFileManagedBinary(file)) { | |||||
| referenceList.append(file.toString()); | |||||
| referenceList.append(getReferenceDelimiter()); | |||||
| } else { | |||||
| log("ignoring "+file+" as it is not a managed executable", | |||||
| Project.MSG_VERBOSE); | |||||
| } | |||||
| } | |||||
| //add it all to an argument | |||||
| command.addArgument(referenceList.toString()); | |||||
| return filesOutOfDate; | |||||
| } | |||||
| /** | /** | ||||
| * create our helper command | * create our helper command | ||||
| * @return a command prefilled with the exe name and task name | * @return a command prefilled with the exe name and task name | ||||
| @@ -892,6 +985,19 @@ public abstract class DotnetCompile | |||||
| return ";"; | return ";"; | ||||
| } | } | ||||
| /** | |||||
| * test for a file being managed or not | |||||
| * @return true if we think this is a managed executable, and thus OK | |||||
| * for linking | |||||
| * @todo look at the PE header of the exe and see if it is managed or not. | |||||
| */ | |||||
| protected static boolean isFileManagedBinary(File file) { | |||||
| String filename= file.toString().toLowerCase(); | |||||
| return filename.endsWith(".exe") || filename.endsWith(".dll") | |||||
| || filename.endsWith(".netmodule"); | |||||
| } | |||||
| /** | /** | ||||
| * Target types to build. | * Target types to build. | ||||
| * valid build types are exe|library|module|winexe | * valid build types are exe|library|module|winexe | ||||
| @@ -907,69 +1013,6 @@ public abstract class DotnetCompile | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * definitions can be conditional. What .NET conditions can not be | |||||
| * is in any state other than defined and undefined; you cannot give | |||||
| * a definition a value. | |||||
| */ | |||||
| public static class Define { | |||||
| private String name; | |||||
| private String condition; | |||||
| public String getCondition() { | |||||
| return condition; | |||||
| } | |||||
| /** | |||||
| * the name of a property which must be defined for | |||||
| * the definition to be set. Optional. | |||||
| * @param condition | |||||
| */ | |||||
| public void setCondition(String condition) { | |||||
| this.condition = condition; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| /** | |||||
| * the name of the definition. Required. | |||||
| * @param name | |||||
| */ | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| /** | |||||
| * get the value of this definition. Will be null if a condition | |||||
| * was declared and not met | |||||
| * @param owner owning task | |||||
| * @return | |||||
| * @throws BuildException | |||||
| */ | |||||
| public String getValue(Task owner) throws BuildException { | |||||
| if(name==null) { | |||||
| throw new BuildException("No name provided for the define element", | |||||
| owner.getLocation()); | |||||
| } | |||||
| if(!isSet(owner)) { | |||||
| return null; | |||||
| } | |||||
| return name; | |||||
| } | |||||
| /** | |||||
| * test for a define being set | |||||
| * @param owner | |||||
| * @return true if there was no condition, or it is met | |||||
| */ | |||||
| public boolean isSet(Task owner) { | |||||
| return condition==null | |||||
| || owner.getProject().getProperty(condition) != null; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,135 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2003 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: | |||||
| * | |||||
| * 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. | |||||
| * | |||||
| * 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. | |||||
| * | |||||
| * 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 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.Project; | |||||
| /** | |||||
| * definitions can be conditional. What .NET conditions can not be | |||||
| * is in any state other than defined and undefined; you cannot give | |||||
| * a definition a value. | |||||
| */ | |||||
| public class DotnetDefine { | |||||
| private String name; | |||||
| private String ifCond; | |||||
| private String unlessCond; | |||||
| /** | |||||
| * the name of a property which must be defined for | |||||
| * the definition to be set. Optional. | |||||
| * @param condition | |||||
| */ | |||||
| public void setIf(String condition) { | |||||
| this.ifCond = condition; | |||||
| } | |||||
| /** | |||||
| * the name of a property which must be undefined for | |||||
| * the definition to be set. Optional. | |||||
| * @param condition | |||||
| */ | |||||
| public void setUnless(String condition) { | |||||
| this.unlessCond = condition; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| /** | |||||
| * the name of the definition. Required. | |||||
| * @param name | |||||
| */ | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| /** | |||||
| * get the value of this definition. Will be null if a condition | |||||
| * was declared and not met | |||||
| * @param owner owning task | |||||
| * @return | |||||
| * @throws BuildException | |||||
| */ | |||||
| public String getValue(Task owner) throws BuildException { | |||||
| if(name==null) { | |||||
| throw new BuildException("No name provided for the define element", | |||||
| owner.getLocation()); | |||||
| } | |||||
| if(!isSet(owner)) { | |||||
| return null; | |||||
| } | |||||
| return name; | |||||
| } | |||||
| /** | |||||
| * logic taken from patternset | |||||
| * @param owner | |||||
| * @return true if the condition is valid | |||||
| */ | |||||
| public boolean isSet(Task owner) { | |||||
| Project p=owner.getProject(); | |||||
| if (ifCond != null && p.getProperty(ifCond) == null) { | |||||
| return false; | |||||
| } else if (unlessCond != null && p.getProperty(unlessCond) != null) { | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,181 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2003 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: | |||||
| * | |||||
| * 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. | |||||
| * | |||||
| * 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. | |||||
| * | |||||
| * 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 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import java.io.File; | |||||
| /** | |||||
| * class used by DotnetCompile to name resources, could be upgraded to a datatype | |||||
| * in the distant future. | |||||
| * a resource maps to /res:file,name | |||||
| */ | |||||
| public class DotnetResource { | |||||
| /** | |||||
| * name of resource | |||||
| */ | |||||
| private File file; | |||||
| /** | |||||
| * embed (default) or link the resource | |||||
| */ | |||||
| private boolean embed = true; | |||||
| /** | |||||
| * this is used in VBC and JSC | |||||
| */ | |||||
| private Boolean isPublic = null; | |||||
| /** | |||||
| * name of the object | |||||
| */ | |||||
| private String name = null; | |||||
| public boolean isEmbed() { | |||||
| return embed; | |||||
| } | |||||
| /** | |||||
| * embed the resource in the assembly (default, true) or just link to it. | |||||
| * @param embed | |||||
| */ | |||||
| public void setEmbed(boolean embed) { | |||||
| this.embed = embed; | |||||
| } | |||||
| public File getFile() { | |||||
| return file; | |||||
| } | |||||
| /** | |||||
| * name the resource | |||||
| * @param file | |||||
| */ | |||||
| public void setFile(File file) { | |||||
| this.file = file; | |||||
| } | |||||
| public Boolean getPublic() { | |||||
| return isPublic; | |||||
| } | |||||
| /** | |||||
| * VB and J# only: is a resource public or not? | |||||
| * @param aPublic | |||||
| */ | |||||
| public void setPublic(Boolean aPublic) { | |||||
| isPublic = aPublic; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| /** | |||||
| * should the resource have a name? | |||||
| * @param name | |||||
| */ | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| /** | |||||
| * build the C# style parameter (which has no public/private option) | |||||
| * @return | |||||
| */ | |||||
| public String getCSharpStyleParameter() { | |||||
| StringBuffer buffer = new StringBuffer(); | |||||
| buffer.append(isEmbed() ? "/resource" : "/linkresource"); | |||||
| buffer.append(':'); | |||||
| buffer.append(getFile().toString()); | |||||
| if (getName() != null) { | |||||
| buffer.append(','); | |||||
| buffer.append(getName()); | |||||
| } | |||||
| if (getPublic() != null) { | |||||
| throw new BuildException("This compiler does not support the " | |||||
| + "public/private option."); | |||||
| } | |||||
| return buffer.toString(); | |||||
| } | |||||
| /** | |||||
| * get the style of param used by VB and javascript | |||||
| * @return | |||||
| */ | |||||
| public String getVbStyleParameter() { | |||||
| StringBuffer buffer = new StringBuffer(); | |||||
| buffer.append(isEmbed() ? "/resource" : "/linkresource"); | |||||
| buffer.append(':'); | |||||
| buffer.append(getFile().toString()); | |||||
| if (getName() != null) { | |||||
| buffer.append(','); | |||||
| buffer.append(getName()); | |||||
| if (getPublic() != null) { | |||||
| buffer.append(','); | |||||
| buffer.append(getPublic().booleanValue() | |||||
| ? "public" : "private"); | |||||
| } | |||||
| } else if (getPublic() != null) { | |||||
| throw new BuildException("You cannot have a public or private " | |||||
| + "option without naming the resource"); | |||||
| } | |||||
| return buffer.toString(); | |||||
| } | |||||
| } | |||||
| @@ -61,10 +61,13 @@ package org.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import java.io.File; | import java.io.File; | ||||
| import java.util.Vector; | |||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.DirectoryScanner; | import org.apache.tools.ant.DirectoryScanner; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.types.EnumeratedAttribute; | import org.apache.tools.ant.types.EnumeratedAttribute; | ||||
| import org.apache.tools.ant.types.FileSet; | |||||
| import org.apache.tools.ant.taskdefs.MatchingTask; | import org.apache.tools.ant.taskdefs.MatchingTask; | ||||
| /** | /** | ||||
| @@ -86,8 +89,9 @@ import org.apache.tools.ant.taskdefs.MatchingTask; | |||||
| * </b> and <b>excludes="broken.il"</b> can be used to control the files pulled | * </b> and <b>excludes="broken.il"</b> can be used to control the files pulled | ||||
| * in. You can also use nested <src> filesets to refer to source. | * in. You can also use nested <src> filesets to refer to source. | ||||
| * | * | ||||
| *@author Steve Loughran steve_l@iseran.com | |||||
| *@version 0.6 | |||||
| * @author Steve Loughran steve_l@iseran.com | |||||
| * @version 0.6 | |||||
| * @ant.task name="ilasm" category="dotnet" | |||||
| */ | */ | ||||
| public class Ilasm | public class Ilasm | ||||
| @@ -158,6 +162,10 @@ public class Ilasm | |||||
| * any extra command options? | * any extra command options? | ||||
| */ | */ | ||||
| protected String extraOptions; | protected String extraOptions; | ||||
| /** | |||||
| * filesets of references | |||||
| */ | |||||
| protected Vector referenceFilesets =new Vector(); | |||||
| /** | /** | ||||
| @@ -471,7 +479,7 @@ public class Ilasm | |||||
| NetCommand command = buildIlasmCommand(); | NetCommand command = buildIlasmCommand(); | ||||
| addFilesAndExecute(command); | |||||
| addFilesAndExecute(command, false); | |||||
| } | } | ||||
| // end execute | // end execute | ||||
| @@ -502,6 +510,25 @@ public class Ilasm | |||||
| return command; | return command; | ||||
| } | } | ||||
| /** | |||||
| * add a new reference fileset to the compilation | |||||
| * @param reference | |||||
| */ | |||||
| public void addReference(FileSet reference) { | |||||
| referenceFilesets.add(reference); | |||||
| } | |||||
| /** | |||||
| * test for a file being managed or not | |||||
| * @return true if we think this is a managed executable, and thus OK | |||||
| * for linking | |||||
| * @todo look at the PE header of the exe and see if it is managed or not. | |||||
| */ | |||||
| protected static boolean isFileManagedBinary(File file) { | |||||
| String filename= file.toString().toLowerCase(); | |||||
| return filename.endsWith(".exe") || filename.endsWith(".dll") | |||||
| || filename.endsWith(".netmodule"); | |||||
| } | |||||
| /** | /** | ||||
| @@ -0,0 +1,171 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2003 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: | |||||
| * | |||||
| * 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. | |||||
| * | |||||
| * 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. | |||||
| * | |||||
| * 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 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/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| /** | |||||
| * Compile J# source down to a managed .NET application. | |||||
| * J# is not Java. But it is the language closest to Java in the .NET framework. | |||||
| * This task compiles jsharp source (assumes a .jsl extension, incidentally), and | |||||
| * generates a .NET managed exe or dll. | |||||
| * See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vjsharp/html/vjoriMicrosoftVisualJ.asp | |||||
| * for vjc command options in glory detail. | |||||
| * @author Steve Loughran | |||||
| * @since ant1.6 | |||||
| * @ant.task name="jsharp" category="dotnet" | |||||
| */ | |||||
| public class JSharp extends DotnetCompile { | |||||
| /** | |||||
| * hex base address | |||||
| */ | |||||
| String baseAddress; | |||||
| /** /x option to disable J++ and J# lang extensions | |||||
| * | |||||
| */ | |||||
| boolean pureJava = true; | |||||
| /** | |||||
| * whether to make package scoped stuff public or assembly scoped | |||||
| */ | |||||
| boolean secureScoping = false; | |||||
| public void setBaseAddress(String baseAddress) { | |||||
| this.baseAddress = baseAddress; | |||||
| } | |||||
| /** | |||||
| * do we want pure java (default, true) or corrupted J#? | |||||
| * @param pureJava | |||||
| */ | |||||
| public void setPureJava(boolean pureJava) { | |||||
| this.pureJava = pureJava; | |||||
| } | |||||
| /** | |||||
| * Make package scoped code visible to the current assembly only (default: false) | |||||
| * .NET does not have package scoping. Instead it has assembly, private and public. | |||||
| * By default, package content is public to all. | |||||
| * @param secureScoping | |||||
| */ | |||||
| public void setSecureScoping(boolean secureScoping) { | |||||
| this.secureScoping = secureScoping; | |||||
| } | |||||
| /** | |||||
| * Get the delimiter that the compiler uses between references. | |||||
| * For example, c# will return ";"; VB.NET will return "," | |||||
| * @return The string delimiter for the reference string. | |||||
| */ | |||||
| public String getReferenceDelimiter() { | |||||
| return ";"; | |||||
| } | |||||
| /** | |||||
| * Get the name of the compiler executable. | |||||
| * @return The name of the compiler executable. | |||||
| */ | |||||
| public String getCompilerExeName() { | |||||
| return "vjc"; | |||||
| } | |||||
| /** | |||||
| * Get the extension of filenames to compile. | |||||
| * @return The string extension of files to compile. | |||||
| */ | |||||
| public String getFileExtension() { | |||||
| return ".jsl"; | |||||
| } | |||||
| /** | |||||
| * add jvc specific commands | |||||
| * @param command | |||||
| */ | |||||
| protected void addCompilerSpecificOptions(NetCommand command) { | |||||
| if (pureJava) { | |||||
| command.addArgument("/x"); | |||||
| } | |||||
| if (secureScoping) { | |||||
| command.addArgument("/securescoping"); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * from a resource, get the resource param | |||||
| * @param resource | |||||
| * @return a string containing the resource param, or a null string | |||||
| * to conditionally exclude a resource. | |||||
| */ | |||||
| protected String createResourceParameter(DotnetResource resource) { | |||||
| return resource.getCSharpStyleParameter(); | |||||
| } | |||||
| /** | |||||
| * validation code | |||||
| * @throws org.apache.tools.ant.BuildException if validation failed | |||||
| */ | |||||
| protected void validate() | |||||
| throws BuildException { | |||||
| super.validate(); | |||||
| if (getDestFile() == null) { | |||||
| throw new BuildException("DestFile was not specified"); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -281,14 +281,13 @@ public class NetCommand { | |||||
| for (int i = 0; i < dependencies.length; i++) { | for (int i = 0; i < dependencies.length; i++) { | ||||
| File targetFile = new File(base, dependencies[i]); | File targetFile = new File(base, dependencies[i]); | ||||
| if (filesToBuild.get(targetFile) == null) { | if (filesToBuild.get(targetFile) == null) { | ||||
| owner.log(targetFile.toString(), Project.MSG_VERBOSE); | |||||
| filesToBuild.put(targetFile, targetFile); | filesToBuild.put(targetFile, targetFile); | ||||
| if (targetFile.lastModified() > outputTimestamp) { | if (targetFile.lastModified() > outputTimestamp) { | ||||
| filesOutOfDate++; | filesOutOfDate++; | ||||
| owner.log("Source file " + targetFile.toString() + " is out of date", | |||||
| owner.log(targetFile.toString() + " is out of date", | |||||
| Project.MSG_VERBOSE); | Project.MSG_VERBOSE); | ||||
| } else { | } else { | ||||
| owner.log("Source file " + targetFile.toString() + " is up to date", | |||||
| owner.log(targetFile.toString(), | |||||
| Project.MSG_VERBOSE); | Project.MSG_VERBOSE); | ||||
| } | } | ||||
| } | } | ||||
| @@ -68,6 +68,7 @@ import org.apache.tools.ant.BuildException; | |||||
| * | * | ||||
| * @author Brian Felder bfelder@providence.org | * @author Brian Felder bfelder@providence.org | ||||
| * @author Steve Loughran | * @author Steve Loughran | ||||
| * @ant.task name="vbc" category="dotnet" | |||||
| */ | */ | ||||
| public class VisualBasicCompile extends DotnetCompile { | public class VisualBasicCompile extends DotnetCompile { | ||||
| @@ -338,6 +339,16 @@ public class VisualBasicCompile extends DotnetCompile { | |||||
| return "vb"; | return "vb"; | ||||
| } | } | ||||
| /** | |||||
| * from a resource, get the resource param | |||||
| * @param resource | |||||
| * @return a string containing the resource param, or a null string | |||||
| * to conditionally exclude a resource. | |||||
| */ | |||||
| protected String createResourceParameter(DotnetResource resource) { | |||||
| return resource.getVbStyleParameter(); | |||||
| } | |||||
| /** | /** | ||||
| * Get the name of the compiler executable. | * Get the name of the compiler executable. | ||||
| * @return The name of the compiler executable. | * @return The name of the compiler executable. | ||||