@@ -64,6 +64,9 @@ Other changes: | |||
magic. | |||
Bugzilla Report 59860 | |||
* a new implementation "forking" has been added to <javah> and is | |||
used as default when running on JDK9. | |||
Changes from Ant 1.9.6 TO Ant 1.9.7 | |||
=================================== | |||
@@ -37,12 +37,16 @@ systems are used.</p> | |||
with the <code>implementation</code> attribute or a nested element. <a | |||
name="implementationvalues">Here are the choices of the attribute</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>default - the default compiler for the platform.</li> | |||
<li>sun (the standard compiler of the JDK) - default when not | |||
running on Kaffee or gcj/gij or Java9.</li> | |||
<li>kaffeh (the native standard compiler of <a href="http://www.kaffe.org" target="_top">Kaffe</a>)</li> | |||
<li>gcjh (the native standard compiler | |||
of <a href="http://gcc.gnu.org/java/" | |||
target="_top">gcj and gij</a>) <em>since Apache Ant 1.8.2</em></li> | |||
target="_top">gcj and gij</a>) <em>since Apache Ant 1.8.2</em></li> | |||
<li>forking - runs the javah executable via its command line | |||
interface in a separate process. Default wehn running on | |||
Java9. <em>since Ant 1.9.8</em></li> | |||
</ul> | |||
<p><b>Note:</b> if you are using this task to work on multiple files | |||
@@ -0,0 +1,72 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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 java.io.IOException; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.taskdefs.Execute; | |||
import org.apache.tools.ant.taskdefs.LogStreamHandler; | |||
import org.apache.tools.ant.taskdefs.optional.Javah; | |||
import org.apache.tools.ant.types.Commandline; | |||
import org.apache.tools.ant.util.JavaEnvUtils; | |||
/** | |||
* This implementation runs the javah executable in a separate process. | |||
* | |||
* @since Ant 1.9.8 | |||
*/ | |||
public class ForkingJavah implements JavahAdapter { | |||
/** | |||
* the name of this adapter for users to select | |||
*/ | |||
public static final String IMPLEMENTATION_NAME = "forking"; | |||
/** | |||
* Performs the actual compilation. | |||
* @param javah the calling javah task. | |||
* @return true if the compilation was successful. | |||
* @throws BuildException if there is an error. | |||
*/ | |||
public boolean compile(Javah javah) throws BuildException { | |||
Commandline cmd = SunJavah.setupJavahCommand(javah); | |||
Project project = javah.getProject(); | |||
String executable = JavaEnvUtils.getJdkExecutable("javah"); | |||
javah.log("Running " + executable, Project.MSG_VERBOSE); | |||
cmd.setExecutable(executable); | |||
//set up the args | |||
String[] args = cmd.getCommandline(); | |||
try { | |||
Execute exe = new Execute(new LogStreamHandler(javah, | |||
Project.MSG_INFO, | |||
Project.MSG_WARN)); | |||
exe.setAntRun(project); | |||
exe.setWorkingDirectory(project.getBaseDir()); | |||
exe.setCommandline(args); | |||
exe.execute(); | |||
return !exe.isFailure(); | |||
} catch (IOException exception) { | |||
throw new BuildException("Error running " + executable | |||
+ " -maybe it is not on the path", exception); | |||
} | |||
} | |||
} |
@@ -44,6 +44,8 @@ public class JavahAdapterFactory { | |||
return Kaffeh.IMPLEMENTATION_NAME; | |||
} else if (JavaEnvUtils.isGij()) { | |||
return Gcjh.IMPLEMENTATION_NAME; | |||
} else if (JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_9)) { | |||
return ForkingJavah.IMPLEMENTATION_NAME; | |||
} | |||
return SunJavah.IMPLEMENTATION_NAME; | |||
} | |||
@@ -87,6 +89,10 @@ public class JavahAdapterFactory { | |||
} else if ((JavaEnvUtils.isGij() && choice == null) | |||
|| Gcjh.IMPLEMENTATION_NAME.equals(choice)) { | |||
return new Gcjh(); | |||
} else if ((JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_9) | |||
&& choice == null) | |||
|| ForkingJavah.IMPLEMENTATION_NAME.equals(choice)) { | |||
return new ForkingJavah(); | |||
} else if (SunJavah.IMPLEMENTATION_NAME.equals(choice)) { | |||
return new SunJavah(); | |||
} else if (choice != null) { | |||
@@ -69,7 +69,7 @@ public class SunJavah implements JavahAdapter { | |||
return ej.fork(javah) == 0; | |||
} | |||
private Commandline setupJavahCommand(Javah javah) { | |||
static Commandline setupJavahCommand(Javah javah) { | |||
Commandline cmd = new Commandline(); | |||
if (javah.getDestdir() != null) { | |||
@@ -110,4 +110,26 @@ public class Foo { | |||
<javah-fileset/> | |||
<au:assertFileExists file="${output}/org_example_Foo.h"/> | |||
</target> | |||
<target name="testSimpleCompileSun" depends="-setupForRealJavahTests" | |||
if="sunjavah.present"> | |||
<javah-single implementation="sun"/> | |||
<au:assertFileExists file="${output}/org_example_Foo.h"/> | |||
</target> | |||
<target name="testCompileUsingFilesetSun" depends="-setupForRealJavahTests" | |||
if="sunjavah.present"> | |||
<javah-fileset implementation="sun"/> | |||
<au:assertFileExists file="${output}/org_example_Foo.h"/> | |||
</target> | |||
<target name="testSimpleCompileForking" depends="-setupForRealJavahTests"> | |||
<javah-single implementation="forking"/> | |||
<au:assertFileExists file="${output}/org_example_Foo.h"/> | |||
</target> | |||
<target name="testCompileUsingFilesetForking" depends="-setupForRealJavahTests"> | |||
<javah-fileset implementation="forking"/> | |||
<au:assertFileExists file="${output}/org_example_Foo.h"/> | |||
</target> | |||
</project> |