You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by bo...@apache.org on 2005/02/04 09:08:07 UTC
cvs commit: ant/src/main/org/apache/tools/ant/taskdefs/optional/javah JavahAdapter.java JavahAdapterFactory.java Kaffeh.java SunJavah.java
bodewig 2005/02/04 00:08:07
Modified: . WHATSNEW
docs/manual/OptionalTasks javah.html
src/main/org/apache/tools/ant/taskdefs/optional Javah.java
Native2Ascii.java
Added: src/testcases/org/apache/tools/ant/taskdefs/optional
JavahTest.java
src/etc/testcases/taskdefs/optional/javah build.xml
src/etc/testcases/taskdefs/optional/javah/input/org/example
Foo.java
src/main/org/apache/tools/ant/taskdefs/optional/javah
JavahAdapter.java JavahAdapterFactory.java
Kaffeh.java SunJavah.java
Log:
Make javah a facade task, support kaffeh
Revision Changes Path
1.741 +14 -2 ant/WHATSNEW
Index: WHATSNEW
===================================================================
RCS file: /home/cvs/ant/WHATSNEW,v
retrieving revision 1.740
retrieving revision 1.741
diff -u -r1.740 -r1.741
--- WHATSNEW 3 Feb 2005 19:18:06 -0000 1.740
+++ WHATSNEW 4 Feb 2005 08:08:06 -0000 1.741
@@ -144,7 +144,7 @@
* Added <target> nested elements to <ant> and <antcall> to allow
specification of multiple sub-build targets, which are executed
with a single dependency analysis.
-
+
* Refactored Target invocation into org.apache.tools.ant.Executor
implementations. Bugzilla Reports 21421, 29248.
@@ -203,7 +203,7 @@
* Added length task to get strings' and files' lengths.
-* <native2ascii> now also supports Kaffe's version.
+* <native2ascii> and <javah> now also support Kaffe's versions.
* Recursive token expansion in a filterset can now be disabled by
setting its recurse attribute to false.
@@ -1291,6 +1291,18 @@
clashes of custom tasks
+* <java> and <junit> now support <assertions>, which let you enable
+ and disable Java1.4 assertions on a package or class basis. These
+ only work when fork=true, currently.
+
+* .NET tasks expanded with VB support <vbc> and J#, via <jsharp>,
+ <importtypelib> and <ilasm>. <csc> supports nested <src> types,
+ <defines> for (potentially conditional) definitions, <reference>
+ filesets for references. The executable attribute lets you switch to
+ mono or other implementations -<csc> has been tested with Mono on
+ Linux and OSX.
+
+
Changes from Ant 1.5.3 to Ant 1.5.4
===================================
1.1 ant/src/testcases/org/apache/tools/ant/taskdefs/optional/JavahTest.java
Index: JavahTest.java
===================================================================
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.optional;
import org.apache.tools.ant.BuildFileTest;
public class JavahTest extends BuildFileTest {
private final static String BUILD_XML =
"src/etc/testcases/taskdefs/optional/javah/build.xml";
public JavahTest(String name) {
super(name);
}
public void setUp() {
configureProject(BUILD_XML);
}
public void tearDown() {
executeTarget("tearDown");
}
public void testSimpleCompile() {
executeTarget("simple-compile");
assertTrue(getProject().resolveFile("output/org_example_Foo.h")
.exists());
}
}
1.9 +61 -1 ant/docs/manual/OptionalTasks/javah.html
Index: javah.html
===================================================================
RCS file: /home/cvs/ant/docs/manual/OptionalTasks/javah.html,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- javah.html 17 May 2004 10:35:15 -0000 1.8
+++ javah.html 4 Feb 2005 08:08:07 -0000 1.9
@@ -15,6 +15,16 @@
whether <a href="http://java.sun.com/j2se/1.3/docs/tooldocs/win32/javah.html">JDK1.2</a>
(or later) or <a href="http://java.sun.com/products/jdk/1.1/docs/tooldocs/win32/javah.html">pre-JDK1.2</a>
systems are used.</p>
+
+<p>It is possible to use different compilers. This can be selected
+with the <code>implementation</code> attribute. <a
+name="implementationvalues">Here are the choices</a>:</p>
+<ul>
+ <li>default - the default compiler (kaffeh or sun) for the platform.</li>
+ <li>sun (the standard compiler of the JDK)</li>
+ <li>kaffeh (the native standard compiler of <a href="http://www.kaffe.org" target="_top">Kaffe</a>)</li>
+</ul>
+
<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
<tr>
@@ -74,8 +84,58 @@
<td valign="top"> location of installed extensions.</td>
<td valign="top" align="center">No</td>
</tr>
+ <tr>
+ <td valign="top">implementation</td>
+ <td valign="top">The compiler implementation to use. If this
+ attribute is not set, the default compiler for the current VM
+ will be used. (See the above <a
+ href="#implementationvalues">list</a> of valid compilers.)</td>
+ <td align="center" valign="top">No</td>
+ </tr>
</table>
<p>Either outputFile or destdir must be supplied, but not both. </p>
+
+<h3>Parameters specified as nested elements</h3>
+
+<h4>arg</h4>
+
+<p>You can specify additional command line arguments for the compiler
+with nested <code><arg></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">implementation</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="#implementationvalues">list</a> of valid compilers.)</td>
+ <td align="center">No</td>
+ </tr>
+</table>
+
<h3>Examples</h3>
<pre> <javah destdir="c" class="org.foo.bar.Wibble"/></pre>
<p>makes a JNI header of the named class, using the JDK1.2 JNI model. Assuming
@@ -110,7 +170,7 @@
describe its progress.</p>
<hr>
-<p align="center">Copyright © 2001-2002,2004 The Apache Software Foundation. All rights
+<p align="center">Copyright © 2001-2002,2004-2005 The Apache Software Foundation. All rights
Reserved.</p>
</body>
1.1 ant/src/etc/testcases/taskdefs/optional/javah/build.xml
Index: build.xml
===================================================================
<?xml version="1.0"?>
<!--
Copyright 2005 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project default="no">
<property name="out" location="output"/>
<property name="in" location="input"/>
<target name="no">
<fail>For tests only</fail>
</target>
<target name="setUp">
<mkdir dir="${out}"/>
</target>
<target name="tearDown">
<delete dir="${out}"/>
</target>
<target name="compile" depends="setUp">
<javac srcdir="${in}" destdir="${out}"/>
</target>
<target name="simple-compile" depends="compile">
<javah destdir="${out}">
<class name="org.example.Foo"/>
<classpath>
<pathelement location="${out}"/>
</classpath>
</javah>
</target>
</project>
1.1 ant/src/etc/testcases/taskdefs/optional/javah/input/org/example/Foo.java
Index: Foo.java
===================================================================
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.example;
public class Foo {
public Foo() {}
public native String bar(Object baz);
}
1.34 +152 -163 ant/src/main/org/apache/tools/ant/taskdefs/optional/Javah.java
Index: Javah.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/Javah.java,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- Javah.java 14 Jan 2005 09:45:54 -0000 1.33
+++ Javah.java 4 Feb 2005 08:08:07 -0000 1.34
@@ -18,18 +18,21 @@
package org.apache.tools.ant.taskdefs.optional;
import java.io.File;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
+import java.util.ArrayList;
import java.util.Enumeration;
import java.util.StringTokenizer;
import java.util.Vector;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.optional.javah.JavahAdapter;
+import org.apache.tools.ant.taskdefs.optional.javah.JavahAdapterFactory;
import org.apache.tools.ant.types.Commandline;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
import org.apache.tools.ant.util.JavaEnvUtils;
+import org.apache.tools.ant.util.facade.FacadeTaskHelper;
+import org.apache.tools.ant.util.facade.ImplementationSpecificArgument;
/**
* Generates JNI header files using javah.
@@ -76,6 +79,11 @@
private Path bootclasspath;
//private Path extdirs;
private static String lSep = System.getProperty("line.separator");
+ private FacadeTaskHelper facade = null;
+
+ public Javah() {
+ facade = new FacadeTaskHelper(JavahAdapterFactory.getDefault());
+ }
/**
* the fully-qualified name of the class (or classes, separated by commas).
@@ -101,7 +109,6 @@
public void setName(String name) {
this.name = name;
- log("ClassArgument.name=" + name);
}
public String getName() {
@@ -110,6 +117,28 @@
}
/**
+ * Names of the classes to process.
+ *
+ * @since Ant 1.6.3
+ */
+ public String[] getClasses() {
+ ArrayList al = new ArrayList();
+ if (cls != null) {
+ StringTokenizer tok = new StringTokenizer(cls, ",", false);
+ while (tok.hasMoreTokens()) {
+ al.add(tok.nextToken().trim());
+ }
+ }
+
+ Enumeration e = classes.elements();
+ while (e.hasMoreElements()) {
+ ClassArgument arg = (ClassArgument) e.nextElement();
+ al.add(arg.getName());
+ }
+ return (String[]) al.toArray(new String[0]);
+ }
+
+ /**
* Set the destination directory into which the Java source
* files should be compiled.
*/
@@ -118,6 +147,15 @@
}
/**
+ * The destination directory, if any.
+ *
+ * @since Ant 1.6.3
+ */
+ public File getDestdir() {
+ return destDir;
+ }
+
+ /**
* the classpath to use.
*/
public void setClasspath(Path src) {
@@ -147,6 +185,15 @@
}
/**
+ * The classpath to use.
+ *
+ * @since Ant 1.6.3
+ */
+ public Path getClasspath() {
+ return classpath;
+ }
+
+ /**
* location of bootstrap class files.
*/
public void setBootclasspath(Path src) {
@@ -175,27 +222,14 @@
createBootclasspath().setRefid(r);
}
- ///**
- // * Sets the extension directories that will be used during the
- // * compilation.
- // */
- //public void setExtdirs(Path extdirs) {
- // if (this.extdirs == null) {
- // this.extdirs = extdirs;
- // } else {
- // this.extdirs.append(extdirs);
- // }
- //}
-
- ///**
- // * Maybe creates a nested classpath element.
- // */
- //public Path createExtdirs() {
- // if (extdirs == null) {
- // extdirs = new Path(project);
- // }
- // return extdirs.createPath();
- //}
+ /**
+ * The bootclasspath to use.
+ *
+ * @since Ant 1.6.3
+ */
+ public Path getBootclasspath() {
+ return bootclasspath;
+ }
/**
* Concatenates the resulting header or source files for all
@@ -206,6 +240,15 @@
}
/**
+ * The destination file, if any.
+ *
+ * @since Ant 1.6.3
+ */
+ public File getOutputfile() {
+ return outputFile;
+ }
+
+ /**
* If true, output files should always be written (JDK1.2 only).
*/
public void setForce(boolean force) {
@@ -213,6 +256,15 @@
}
/**
+ * Whether output files should always be written.
+ *
+ * @since Ant 1.6.3
+ */
+ public boolean getForce() {
+ return force;
+ }
+
+ /**
* If true, specifies that old JDK1.0-style header files should be
* generated.
* (otherwise output file contain JNI-style native method function prototypes) (JDK1.2 only)
@@ -222,6 +274,15 @@
}
/**
+ * Whether old JDK1.0-style header files should be generated.
+ *
+ * @since Ant 1.6.3
+ */
+ public boolean getOld() {
+ return old;
+ }
+
+ /**
* If true, generate C declarations from the Java object file (used with old).
*/
public void setStubs(boolean stubs) {
@@ -229,6 +290,15 @@
}
/**
+ * Whether C declarations from the Java object file should be generated.
+ *
+ * @since Ant 1.6.3
+ */
+ public boolean getStubs() {
+ return stubs;
+ }
+
+ /**
* If true, causes Javah to print a message concerning
* the status of the generated files.
*/
@@ -237,6 +307,51 @@
}
/**
+ * Whether verbose output should get generated.
+ *
+ * @since Ant 1.6.3
+ */
+ public boolean getVerbose() {
+ return verbose;
+ }
+
+ /**
+ * Choose the implementation for this particular task.
+ * @param impl the name of the implemenation
+ * @since Ant 1.6.3
+ */
+ public void setImplementation(String impl) {
+ if ("default".equals(impl)) {
+ facade.setImplementation(JavahAdapterFactory.getDefault());
+ } else {
+ facade.setImplementation(impl);
+ }
+ }
+
+ /**
+ * Adds an implementation specific command-line argument.
+ * @return a ImplementationSpecificArgument to be configured
+ *
+ * @since Ant 1.6.3
+ */
+ public ImplementationSpecificArgument createArg() {
+ ImplementationSpecificArgument arg =
+ new ImplementationSpecificArgument();
+ facade.addImplementationArgument(arg);
+ return arg;
+ }
+
+ /**
+ * Returns the (implementation specific) settings given as nested
+ * arg elements.
+ *
+ * @since Ant 1.6.3
+ */
+ public String[] getCurrentArgs() {
+ return facade.getArgs();
+ }
+
+ /**
* Execute the task
*
* @throws BuildException is there is a problem in the task execution.
@@ -271,132 +386,20 @@
classpath = classpath.concatSystemClasspath("ignore");
}
- /* unused.
- TODO: If anyone cannot come up with a reason for this, lets delete it
-
- String compiler = getProject().getProperty("build.compiler");
- if (compiler == null) {
- if (!JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)
- && !JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_2)) {
- compiler = "modern";
- } else {
- compiler = "classic";
- }
- }
- */
- doClassicCompile();
- }
-
- // XXX
- // we need a way to not use the current classpath.
-
- /**
- * Performs a compile using the classic compiler that shipped with
- * JDK 1.1 and 1.2.
- */
-
- private void doClassicCompile() throws BuildException {
- Commandline cmd = setupJavahCommand();
-
- // Use reflection to be able to build on all JDKs
- /*
- // provide the compiler a different message sink - namely our own
- sun.tools.javac.Main compiler =
- new sun.tools.javac.Main(new LogOutputStream(this, Project.MSG_WARN), "javac");
-
- if (!compiler.compile(cmd.getArguments())) {
- throw new BuildException("Compile failed");
- }
- */
-
-
- try {
- Class javahMainClass = null;
- try {
- // first search for the "old" javah class in 1.4.2 tools.jar
- javahMainClass = Class.forName("com.sun.tools.javah.oldjavah.Main");
- } catch (ClassNotFoundException cnfe) {
- // assume older than 1.4.2 tools.jar
- javahMainClass = Class.forName("com.sun.tools.javah.Main");
- }
-
- // now search for the constructor that takes in String[] arguments.
- Class[] strings = new Class[] {String[].class};
- Constructor constructor = javahMainClass.getConstructor(strings);
-
- // construct the javah Main instance
- Object javahMain = constructor.newInstance(new Object[] {cmd.getArguments()});
-
- // find the run method
- Method runMethod = javahMainClass.getMethod("run", new Class[0]);
-
- runMethod.invoke(javahMain, new Object[0]);
- } catch (Exception ex) {
- if (ex instanceof BuildException) {
- throw (BuildException) ex;
- } else {
- throw new BuildException("Error starting javah: " + ex, ex, getLocation());
- }
+ JavahAdapter ad =
+ JavahAdapterFactory.getAdapter(facade.getImplementation(),
+ this);
+ if (!ad.compile(this)) {
+ throw new BuildException("compilation failed");
}
}
/**
- * Does the command line argument processing common to classic and
- * modern.
+ * Logs the compilation parameters, adds the files to compile and logs the
+ * "niceSourceList"
*/
- private Commandline setupJavahCommand() {
- Commandline cmd = new Commandline();
-
- if (destDir != null) {
- cmd.createArgument().setValue("-d");
- cmd.createArgument().setFile(destDir);
- }
-
- if (outputFile != null) {
- cmd.createArgument().setValue("-o");
- cmd.createArgument().setFile(outputFile);
- }
-
- if (classpath != null) {
- cmd.createArgument().setValue("-classpath");
- cmd.createArgument().setPath(classpath);
- }
-
- // JDK1.1 is rather simpler than JDK1.2
- if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) {
- if (verbose) {
- cmd.createArgument().setValue("-v");
- }
- } else {
- if (verbose) {
- cmd.createArgument().setValue("-verbose");
- }
- if (old) {
- cmd.createArgument().setValue("-old");
- }
- if (force) {
- cmd.createArgument().setValue("-force");
- }
- }
-
- if (stubs) {
- if (!old) {
- throw new BuildException("stubs only available in old mode.", getLocation());
- }
- cmd.createArgument().setValue("-stubs");
- }
- Path bcp = new Path(getProject());
- if (bootclasspath != null) {
- bcp.append(bootclasspath);
- }
- bcp = bcp.concatSystemBootClasspath("ignore");
- if (bcp.size() > 0) {
- cmd.createArgument().setValue("-bootclasspath");
- cmd.createArgument().setPath(bcp);
- }
-
+ public void logAndAddFiles(Commandline cmd) {
logAndAddFilesToCompile(cmd);
- return cmd;
}
/**
@@ -404,32 +407,18 @@
* "niceSourceList"
*/
protected void logAndAddFilesToCompile(Commandline cmd) {
- int n = 0;
log("Compilation " + cmd.describeArguments(),
Project.MSG_VERBOSE);
StringBuffer niceClassList = new StringBuffer();
- if (cls != null) {
- StringTokenizer tok = new StringTokenizer(cls, ",", false);
- while (tok.hasMoreTokens()) {
- String aClass = tok.nextToken().trim();
- cmd.createArgument().setValue(aClass);
- niceClassList.append(" " + aClass + lSep);
- n++;
- }
- }
-
- Enumeration e = classes.elements();
- while (e.hasMoreElements()) {
- ClassArgument arg = (ClassArgument) e.nextElement();
- String aClass = arg.getName();
- cmd.createArgument().setValue(aClass);
- niceClassList.append(" " + aClass + lSep);
- n++;
+ String[] c = getClasses();
+ for (int i = 0; i < c.length; i++) {
+ cmd.createArgument().setValue(c[i]);
+ niceClassList.append(" " + c[i] + lSep);
}
StringBuffer prefix = new StringBuffer("Class");
- if (n > 1) {
+ if (c.length > 1) {
prefix.append("es");
}
prefix.append(" to be compiled:");
1.25 +1 -1 ant/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java
Index: Native2Ascii.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- Native2Ascii.java 2 Feb 2005 13:46:08 -0000 1.24
+++ Native2Ascii.java 4 Feb 2005 08:08:07 -0000 1.25
@@ -123,7 +123,7 @@
/**
* Choose the implementation for this particular task.
- * @param compiler the name of the compiler
+ * @param impl the name of the implemenation
* @since Ant 1.6.3
*/
public void setImplementation(String impl) {
1.1 ant/src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapter.java
Index: JavahAdapter.java
===================================================================
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tools.ant.taskdefs.optional.javah;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.optional.Javah;
/**
* Interface for different backend implementations of the Javah task.
*
* @since Ant 1.6.3
*/
public interface JavahAdapter {
/**
* Performs the actual compilation.
*
* @since Ant 1.6.3
*/
boolean compile(Javah javah) throws BuildException;
}
1.1 ant/src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapterFactory.java
Index: JavahAdapterFactory.java
===================================================================
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.optional.javah;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.ProjectComponent;
import org.apache.tools.ant.util.JavaEnvUtils;
/**
* Creates the JavahAdapter based on the user choice and
* potentially the VM vendor.
*
* @since Ant 1.6.3
*/
public class JavahAdapterFactory {
/**
* Determines the default choice of adapter based on the VM
* vendor.
*
* @return the default choice of adapter based on the VM
* vendor
*/
public static String getDefault() {
if (JavaEnvUtils.isKaffe()) {
return Kaffeh.IMPLEMENTATION_NAME;
}
return SunJavah.IMPLEMENTATION_NAME;
}
/**
* Creates the JavahAdapter based on the user choice and
* potentially the VM vendor.
*
* @param choice the user choice (if any).
* @param log a ProjectComponent instance used to access Ant's
* logging system.
* @return The adapter to use.
*/
public static JavahAdapter getAdapter(String choice,
ProjectComponent log)
throws BuildException {
if ((JavaEnvUtils.isKaffe() && choice == null)
|| Kaffeh.IMPLEMENTATION_NAME.equals(choice)) {
return new Kaffeh();
} else if (SunJavah.IMPLEMENTATION_NAME.equals(choice)) {
return new SunJavah();
} else if (choice != null) {
return resolveClassName(choice);
}
// This default has been good enough until Ant 1.6.3, so stick
// with it
return new SunJavah();
}
/**
* Tries to resolve the given classname into a native2ascii adapter.
* Throws a fit if it can't.
*
* @param className The fully qualified classname to be created.
* @throws BuildException This is the fit that is thrown if className
* isn't an instance of JavahAdapter.
*/
private static JavahAdapter resolveClassName(String className)
throws BuildException {
try {
Class c = Class.forName(className);
Object o = c.newInstance();
return (JavahAdapter) o;
} catch (ClassNotFoundException cnfe) {
throw new BuildException("Can't load " + className, cnfe);
} catch (ClassCastException cce) {
throw new BuildException(className
+ " is not a Javah adapter", cce);
} catch (Throwable t) {
// for all other possibilities
throw new BuildException(className + " caused an interesting "
+ "exception.", t);
}
}
}
1.1 ant/src/main/org/apache/tools/ant/taskdefs/optional/javah/Kaffeh.java
Index: Kaffeh.java
===================================================================
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.optional.javah;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.Execute;
import org.apache.tools.ant.taskdefs.optional.Javah;
import org.apache.tools.ant.types.Commandline;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.util.JavaEnvUtils;
/**
* Adapter to the native kaffeh compiler.
*
* @since Ant 1.6.3
*/
public class Kaffeh implements JavahAdapter {
public static final String IMPLEMENTATION_NAME = "kaffeh";
/**
* Performs the actual compilation.
*
* @since Ant 1.6.3
*/
public boolean compile(Javah javah) throws BuildException {
Commandline cmd = setupKaffehCommand(javah);
try {
Execute.runCommand(javah, cmd.getCommandline());
return true;
} catch (BuildException e) {
if (e.getMessage().indexOf("failed with return code") == -1) {
throw e;
}
}
return false;
}
private Commandline setupKaffehCommand(Javah javah) {
Commandline cmd = new Commandline();
cmd.setExecutable(JavaEnvUtils.getJdkExecutable("kaffeh"));
if (javah.getDestdir() != null) {
cmd.createArgument().setValue("-d");
cmd.createArgument().setFile(javah.getDestdir());
}
if (javah.getOutputfile() != null) {
cmd.createArgument().setValue("-o");
cmd.createArgument().setFile(javah.getOutputfile());
}
Path cp = new Path(javah.getProject());
if (javah.getBootclasspath() != null) {
cp.append(javah.getBootclasspath());
}
cp = cp.concatSystemBootClasspath("ignore");
if (javah.getClasspath() != null) {
cp.append(javah.getClasspath());
}
if (cp.size() > 0) {
cmd.createArgument().setValue("-classpath");
cmd.createArgument().setPath(cp);
}
if (!javah.getOld()) {
cmd.createArgument().setValue("-jni");
}
cmd.addArguments(javah.getCurrentArgs());
javah.logAndAddFiles(cmd);
return cmd;
}
}
1.1 ant/src/main/org/apache/tools/ant/taskdefs/optional/javah/SunJavah.java
Index: SunJavah.java
===================================================================
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.optional.javah;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.ExecuteJava;
import org.apache.tools.ant.taskdefs.optional.Javah;
import org.apache.tools.ant.types.Commandline;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.util.JavaEnvUtils;
/**
* Adapter to com.sun.tools.javah.oldjavah.Main or com.sun.tools.javah.Main.
*
* @since Ant 1.6.3
*/
public class SunJavah implements JavahAdapter {
public static final String IMPLEMENTATION_NAME = "sun";
/**
* Performs the actual compilation.
*
* @since Ant 1.6.3
*/
public boolean compile(Javah javah) throws BuildException {
Commandline cmd = setupJavahCommand(javah);
ExecuteJava ej = new ExecuteJava();
try {
try {
// first search for the "old" javah class in 1.4.2 tools.jar
Class.forName("com.sun.tools.javah.oldjavah.Main");
cmd.setExecutable("com.sun.tools.javah.oldjavah.Main");
} catch (ClassNotFoundException cnfe) {
// assume older than 1.4.2 tools.jar
Class.forName("com.sun.tools.javah.Main");
cmd.setExecutable("com.sun.tools.javah.Main");
}
} catch (ClassNotFoundException ex) {
throw new BuildException("Can't load javah", ex,
javah.getLocation());
}
ej.setJavaCommand(cmd);
return ej.fork(javah) == 0;
}
private Commandline setupJavahCommand(Javah javah) {
Commandline cmd = new Commandline();
if (javah.getDestdir() != null) {
cmd.createArgument().setValue("-d");
cmd.createArgument().setFile(javah.getDestdir());
}
if (javah.getOutputfile() != null) {
cmd.createArgument().setValue("-o");
cmd.createArgument().setFile(javah.getOutputfile());
}
if (javah.getClasspath() != null) {
cmd.createArgument().setValue("-classpath");
cmd.createArgument().setPath(javah.getClasspath());
}
// JDK1.1 is rather simpler than JDK1.2
if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) {
if (javah.getVerbose()) {
cmd.createArgument().setValue("-v");
}
} else {
if (javah.getVerbose()) {
cmd.createArgument().setValue("-verbose");
}
if (javah.getOld()) {
cmd.createArgument().setValue("-old");
}
if (javah.getForce()) {
cmd.createArgument().setValue("-force");
}
if (javah.getStubs() && !javah.getOld()) {
throw new BuildException("stubs only available in old mode.",
javah.getLocation());
}
}
if (javah.getStubs()) {
cmd.createArgument().setValue("-stubs");
}
Path bcp = new Path(javah.getProject());
if (javah.getBootclasspath() != null) {
bcp.append(javah.getBootclasspath());
}
bcp = bcp.concatSystemBootClasspath("ignore");
if (bcp.size() > 0) {
cmd.createArgument().setValue("-bootclasspath");
cmd.createArgument().setPath(bcp);
}
cmd.addArguments(javah.getCurrentArgs());
javah.logAndAddFiles(cmd);
return cmd;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org