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