git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272440 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -299,6 +299,12 @@ Other changes: | |||
| * An alias of <xslt> has been added to refer to the <style> task. | |||
| * The compiler implementation for <rmic> can now be chosen on a task by | |||
| task basis. The new "compiler" attribute of <rmic> can be used to override | |||
| the value of the build.rmic property, if set. | |||
| * <rmic> has a new nested element, <compilerarg>, which allows you | |||
| to specify additional args for the specific compiler you're using. | |||
| Changes from Ant 1.4 to Ant 1.4.1 | |||
| =========================================== | |||
| @@ -360,26 +360,6 @@ | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"> | |||
| Stefan, others welcome | |||
| </font> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td bgcolor="#a0ddf0" colspan="" rowspan="" | |||
| valign="top" align="left"> | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"> | |||
| compiler attribute for rmic | |||
| </font> | |||
| </td> | |||
| <td bgcolor="#a0ddf0" colspan="" rowspan="" | |||
| valign="top" align="left"> | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"> | |||
| | |||
| </font> | |||
| </td> | |||
| <td bgcolor="#a0ddf0" colspan="" rowspan="" | |||
| valign="top" align="left"> | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"> | |||
| Stefan, others welcome | |||
| </font> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| @@ -475,6 +455,26 @@ | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"> | |||
| Steve, in a really long meeting | |||
| </font> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td bgcolor="#a0ddf0" colspan="" rowspan="" | |||
| valign="top" align="left"> | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"> | |||
| compiler attribute for rmic | |||
| </font> | |||
| </td> | |||
| <td bgcolor="#a0ddf0" colspan="" rowspan="" | |||
| valign="top" align="left"> | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"> | |||
| | |||
| </font> | |||
| </td> | |||
| <td bgcolor="#a0ddf0" colspan="" rowspan="" | |||
| valign="top" align="left"> | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"> | |||
| Stefan | |||
| </font> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| @@ -30,8 +30,9 @@ supports all attributes of <code><fileset></code> | |||
| (<code>dir</code> becomes <code>base</code>) as well as the nested | |||
| <code><include></code>, <code><exclude></code> and | |||
| <code><patternset></code> elements.</p> | |||
| <p>It is possible to use different compilers. This can be selected with the | |||
| "build.rmic" property. There are three choices:</p> | |||
| <p>It is possible to use different compilers. This can be selected | |||
| with the "build.rmic" property or the <code>compiler</code> | |||
| attribute. <a name="compilervalues">There are three choices</a>:</p> | |||
| <ul> | |||
| <li>sun (the standard compiler of the JDK)</li> | |||
| <li>kaffe (the standard compiler of <a href="http://www.kaffe.org" target="_top">Kaffe</a>)</li> | |||
| @@ -165,12 +166,63 @@ please consult miniRMI's documentation to learn how to use it.</p> | |||
| <td valign="top">location of installed extensions.</td> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">compiler</td> | |||
| <td valign="top">The compiler implementation to use. | |||
| If this attribute is not set, the value of the | |||
| <code>build.rmic</code> property, if set, will be used. | |||
| Otherwise, the default compiler for the current VM will be used. | |||
| (See the above <a href="#compilervalues">list</a> of valid | |||
| compilers.)</td> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| </table> | |||
| <h3>Parameters specified as nested elements</h3> | |||
| <h4>classpath and extdirs</h4> | |||
| <p><code>Rmic</code>'s <i>classpath</i> and <i>extdirs</i> attributes are <a | |||
| href="../using.html#path">PATH like structure</a> and can also be set via a nested | |||
| <i>classpath</i> and <i>extdirs</i> elements.</p> | |||
| <h4>compilerarg</h4> | |||
| <p>You can specify additional command line arguments for the compiler | |||
| with nested <code><compilerarg></code> elements. These elements | |||
| are specified like <a href="../using.html#arg">Command-line | |||
| Arguments</a> but have an additional attribute that can be used to | |||
| enable arguments only if a given compiler implementation will be | |||
| used.</p> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td width="12%" valign="top"><b>Attribute</b></td> | |||
| <td width="78%" valign="top"><b>Description</b></td> | |||
| <td width="10%" valign="top"><b>Required</b></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">value</td> | |||
| <td align="center" rowspan="4">See | |||
| <a href="../using.html#arg">Command-line Arguments</a>.</td> | |||
| <td align="center" rowspan="4">Exactly one of these.</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">line</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">file</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">path</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">compiler</td> | |||
| <td>Only pass the specified argument if the chosen | |||
| compiler implementation matches the value of this attribute. | |||
| Legal values are the | |||
| same as those in the above <a href="#compilervalues">list</a> of valid | |||
| compilers.)</td> | |||
| <td align="center">No</td> | |||
| </tr> | |||
| </table> | |||
| <h3>Examples</h3> | |||
| <pre> <rmic classname="com.xyz.FooBar" base="${build}/classes"/></pre> | |||
| <p>runs the rmic compiler for the class <code>com.xyz.FooBar</code>. The | |||
| @@ -66,6 +66,7 @@ import org.apache.tools.ant.types.Reference; | |||
| import org.apache.tools.ant.util.FileNameMapper; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| import org.apache.tools.ant.util.SourceFileScanner; | |||
| import org.apache.tools.ant.util.facade.FacadeTaskHelper; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| @@ -134,6 +135,17 @@ public class Rmic extends MatchingTask { | |||
| private FileUtils fileUtils = FileUtils.newFileUtils(); | |||
| private FacadeTaskHelper facade; | |||
| public Rmic() { | |||
| try { | |||
| Class.forName("kaffe.rmi.rmic.RMIC"); | |||
| facade = new FacadeTaskHelper("kaffe"); | |||
| } catch (ClassNotFoundException cnfe) { | |||
| facade = new FacadeTaskHelper("sun"); | |||
| } | |||
| } | |||
| /** Sets the base directory to output generated class. */ | |||
| public void setBase(File base) { | |||
| this.baseDir = base; | |||
| @@ -363,6 +375,42 @@ public class Rmic extends MatchingTask { | |||
| return compileList; | |||
| } | |||
| /** | |||
| * @since Ant 1.5 | |||
| */ | |||
| public void setCompiler(String compiler) { | |||
| facade.setImplementation(compiler); | |||
| } | |||
| /** | |||
| * @since Ant 1.5 | |||
| */ | |||
| public String getCompiler() { | |||
| facade.setMagicValue(getProject().getProperty("build.rmic")); | |||
| return facade.getImplementation(); | |||
| } | |||
| /** | |||
| * Adds an implementation specific command line argument. | |||
| * @since Ant 1.5 | |||
| */ | |||
| public ImplementationSpecificArgument createCompilerArg() { | |||
| ImplementationSpecificArgument arg = | |||
| new ImplementationSpecificArgument(); | |||
| facade.addImplementationArgument(arg); | |||
| return arg; | |||
| } | |||
| /** | |||
| * Get the additional implementation specific command line arguments. | |||
| * @return array of command line arguments, guaranteed to be non-null. | |||
| * @since Ant 1.5 | |||
| */ | |||
| public String[] getCurrentCompilerArgs() { | |||
| getCompiler(); | |||
| return facade.getArgs(); | |||
| } | |||
| public void execute() throws BuildException { | |||
| if (baseDir == null) { | |||
| throw new BuildException("base attribute must be set!", location); | |||
| @@ -375,8 +423,7 @@ public class Rmic extends MatchingTask { | |||
| log("Verify has been turned on.", Project.MSG_INFO); | |||
| } | |||
| String compiler = project.getProperty("build.rmic"); | |||
| RmicAdapter adapter = RmicAdapterFactory.getRmic(compiler, this); | |||
| RmicAdapter adapter = RmicAdapterFactory.getRmic(getCompiler(), this); | |||
| // now we need to populate the compiler adapter | |||
| adapter.setRmic(this); | |||
| @@ -573,5 +620,19 @@ public class Rmic extends MatchingTask { | |||
| public ClassLoader getLoader() { | |||
| return loader; | |||
| } | |||
| /** | |||
| * Adds an "compiler" attribute to Commandline$Attribute used to | |||
| * filter command line attributes based on the current | |||
| * implementation. | |||
| */ | |||
| public class ImplementationSpecificArgument extends | |||
| org.apache.tools.ant.util.facade.ImplementationSpecificArgument { | |||
| public void setCompiler(String impl) { | |||
| super.setImplementation(impl); | |||
| } | |||
| } | |||
| } | |||
| @@ -246,6 +246,8 @@ public abstract class DefaultRmicAdapter implements RmicAdapter { | |||
| cmd.createArgument().setValue("-g"); | |||
| } | |||
| cmd.addArguments(attributes.getCurrentCompilerArgs()); | |||
| logAndAddFilesToCompile(cmd); | |||
| return cmd; | |||
| } | |||
| @@ -90,26 +90,6 @@ public class RmicAdapterFactory { | |||
| */ | |||
| public static RmicAdapter getRmic(String rmicType, Task task) | |||
| throws BuildException { | |||
| if (rmicType == null) { | |||
| /* | |||
| * When not specified rmicType, search SUN's rmic and | |||
| * Kaffe's rmic. | |||
| */ | |||
| try { | |||
| Class.forName("sun.rmi.rmic.Main"); | |||
| rmicType = "sun"; | |||
| } catch (ClassNotFoundException cnfe) { | |||
| try { | |||
| Class.forName("kaffe.rmi.rmic.RMIC"); | |||
| Class.forName("kaffe.tools.compiler.Compiler"); | |||
| rmicType = "kaffe"; | |||
| } catch (ClassNotFoundException cnfk) { | |||
| throw new BuildException("Couldn\'t guess rmic " | |||
| + "implementation"); | |||
| } | |||
| } | |||
| } | |||
| if (rmicType.equalsIgnoreCase("sun")) { | |||
| return new SunRmic(); | |||
| } else if (rmicType.equalsIgnoreCase("kaffe")) { | |||
| @@ -0,0 +1,141 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 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: | |||
| * | |||
| * 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; | |||
| import org.apache.tools.ant.Project; | |||
| import junit.framework.TestCase; | |||
| /** | |||
| * Testcase for <rmic>. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| * @since Ant 1.5 | |||
| */ | |||
| public class RmicTest extends TestCase { | |||
| private Project project; | |||
| private Rmic rmic; | |||
| public RmicTest(String name) { | |||
| super(name); | |||
| } | |||
| public void setUp() { | |||
| project = new Project(); | |||
| project.init(); | |||
| rmic = new Rmic(); | |||
| rmic.setProject(project); | |||
| } | |||
| /** | |||
| * Test nested compiler args. | |||
| */ | |||
| public void testCompilerArg() { | |||
| String[] args = rmic.getCurrentCompilerArgs(); | |||
| assertNotNull(args); | |||
| assertEquals("no args", 0, args.length); | |||
| Rmic.ImplementationSpecificArgument arg = rmic.createCompilerArg(); | |||
| String ford = "Ford"; | |||
| String prefect = "Prefect"; | |||
| String testArg = ford + " " + prefect; | |||
| arg.setValue(testArg); | |||
| args = rmic.getCurrentCompilerArgs(); | |||
| assertEquals("unconditional single arg", 1, args.length); | |||
| assertEquals(testArg, args[0]); | |||
| arg.setCompiler("weblogic"); | |||
| args = rmic.getCurrentCompilerArgs(); | |||
| assertNotNull(args); | |||
| assertEquals("implementation is weblogic but build.rmic is null", | |||
| 0, args.length); | |||
| project.setProperty("build.rmic", "sun"); | |||
| args = rmic.getCurrentCompilerArgs(); | |||
| assertNotNull(args); | |||
| assertEquals("implementation is weblogic but build.rmic is sun", | |||
| 0, args.length); | |||
| project.setProperty("build.rmic", "weblogic"); | |||
| args = rmic.getCurrentCompilerArgs(); | |||
| assertEquals("both are weblogic", 1, args.length); | |||
| assertEquals(testArg, args[0]); | |||
| } | |||
| /** | |||
| * Test compiler attribute. | |||
| */ | |||
| public void testCompilerAttribute() { | |||
| // check defaults | |||
| String compiler = rmic.getCompiler(); | |||
| assertNotNull(compiler); | |||
| assertTrue("default value", | |||
| "sun".equals(compiler) || "kaffe".equals(compiler)); | |||
| project.setNewProperty("build.rmic", "weblogic"); | |||
| compiler = rmic.getCompiler(); | |||
| assertNotNull(compiler); | |||
| assertEquals("weblogic", compiler); | |||
| // check attribute overrides build.compiler | |||
| rmic.setCompiler("kaffe"); | |||
| compiler = rmic.getCompiler(); | |||
| assertNotNull(compiler); | |||
| assertEquals("kaffe", compiler); | |||
| } | |||
| } | |||
| @@ -58,6 +58,7 @@ import junit.framework.TestCase; | |||
| /** | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @since Ant 1.5 | |||
| */ | |||
| public class FacadeTaskHelperTest extends TestCase { | |||
| @@ -58,6 +58,7 @@ import junit.framework.TestCase; | |||
| /** | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @since Ant 1.5 | |||
| */ | |||
| public class ImplementationSpecificArgumentTest extends TestCase { | |||
| @@ -95,12 +95,6 @@ | |||
| <td>Stefan, others welcome</td> | |||
| </tr> | |||
| <tr> | |||
| <td>compiler attribute for rmic</td> | |||
| <td></td> | |||
| <td>Stefan, others welcome</td> | |||
| </tr> | |||
| <tr> | |||
| <td>JUnit's System.err/.out handling</td> | |||
| <td>Currently this is coupled to SummaryResultFormatter - | |||
| @@ -139,6 +133,11 @@ | |||
| import (for Axis interop testing)</td> | |||
| <td>Steve, in a really long meeting</td> | |||
| </tr> | |||
| <tr> | |||
| <td>compiler attribute for rmic</td> | |||
| <td></td> | |||
| <td>Stefan</td> | |||
| </tr> | |||
| <tr> | |||
| <td>PGP signing task if possible</td> | |||
| <td>Not done, but deemed impossible - at least in the 1.5 | |||