Browse Source

Add compiler attribute and nested <compilerarg> element to <rmic>.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272440 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 23 years ago
parent
commit
e79b77b82b
10 changed files with 293 additions and 50 deletions
  1. +6
    -0
      WHATSNEW
  2. +20
    -20
      docs/ant15_todo.html
  3. +54
    -2
      docs/manual/CoreTasks/rmic.html
  4. +63
    -2
      src/main/org/apache/tools/ant/taskdefs/Rmic.java
  5. +2
    -0
      src/main/org/apache/tools/ant/taskdefs/rmic/DefaultRmicAdapter.java
  6. +0
    -20
      src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapterFactory.java
  7. +141
    -0
      src/testcases/org/apache/tools/ant/taskdefs/RmicTest.java
  8. +1
    -0
      src/testcases/org/apache/tools/ant/util/facade/FacadeTaskHelperTest.java
  9. +1
    -0
      src/testcases/org/apache/tools/ant/util/facade/ImplementationSpecificArgumentTest.java
  10. +5
    -6
      xdocs/ant15_todo.xml

+ 6
- 0
WHATSNEW View File

@@ -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
===========================================


+ 20
- 20
docs/ant15_todo.html View File

@@ -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">
&nbsp;
</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">
&nbsp;
</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>


+ 54
- 2
docs/manual/CoreTasks/rmic.html View File

@@ -30,8 +30,9 @@ supports all attributes of <code>&lt;fileset&gt;</code>
(<code>dir</code> becomes <code>base</code>) as well as the nested
<code>&lt;include&gt;</code>, <code>&lt;exclude&gt;</code> and
<code>&lt;patternset&gt;</code> elements.</p>
<p>It is possible to use different compilers. This can be selected with the
&quot;build.rmic&quot; property. There are three choices:</p>
<p>It is possible to use different compilers. This can be selected
with the &quot;build.rmic&quot; 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>&lt;compilerarg&gt;</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> &lt;rmic classname=&quot;com.xyz.FooBar&quot; base=&quot;${build}/classes&quot;/&gt;</pre>
<p>runs the rmic compiler for the class <code>com.xyz.FooBar</code>. The


+ 63
- 2
src/main/org/apache/tools/ant/taskdefs/Rmic.java View File

@@ -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);
}
}

}


+ 2
- 0
src/main/org/apache/tools/ant/taskdefs/rmic/DefaultRmicAdapter.java View File

@@ -246,6 +246,8 @@ public abstract class DefaultRmicAdapter implements RmicAdapter {
cmd.createArgument().setValue("-g");
}

cmd.addArguments(attributes.getCurrentCompilerArgs());

logAndAddFilesToCompile(cmd);
return cmd;
}


+ 0
- 20
src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapterFactory.java View File

@@ -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")) {


+ 141
- 0
src/testcases/org/apache/tools/ant/taskdefs/RmicTest.java View File

@@ -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);
}

}

+ 1
- 0
src/testcases/org/apache/tools/ant/util/facade/FacadeTaskHelperTest.java View File

@@ -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 {



+ 1
- 0
src/testcases/org/apache/tools/ant/util/facade/ImplementationSpecificArgumentTest.java View File

@@ -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 {



+ 5
- 6
xdocs/ant15_todo.xml View File

@@ -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


Loading…
Cancel
Save