| @@ -81,6 +81,9 @@ Other changes: | |||||
| magic. | magic. | ||||
| Bugzilla Report 59860 | 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 | 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 | with the <code>implementation</code> attribute or a nested element. <a | ||||
| name="implementationvalues">Here are the choices of the attribute</a>:</p> | name="implementationvalues">Here are the choices of the attribute</a>:</p> | ||||
| <ul> | <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>kaffeh (the native standard compiler of <a href="http://www.kaffe.org" target="_top">Kaffe</a>)</li> | ||||
| <li>gcjh (the native standard compiler | <li>gcjh (the native standard compiler | ||||
| of <a href="http://gcc.gnu.org/java/" | 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> | </ul> | ||||
| <p><b>Note:</b> if you are using this task to work on multiple files | <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; | return Kaffeh.IMPLEMENTATION_NAME; | ||||
| } else if (JavaEnvUtils.isGij()) { | } else if (JavaEnvUtils.isGij()) { | ||||
| return Gcjh.IMPLEMENTATION_NAME; | return Gcjh.IMPLEMENTATION_NAME; | ||||
| } else if (JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_9)) { | |||||
| return ForkingJavah.IMPLEMENTATION_NAME; | |||||
| } | } | ||||
| return SunJavah.IMPLEMENTATION_NAME; | return SunJavah.IMPLEMENTATION_NAME; | ||||
| } | } | ||||
| @@ -87,6 +89,10 @@ public class JavahAdapterFactory { | |||||
| } else if ((JavaEnvUtils.isGij() && choice == null) | } else if ((JavaEnvUtils.isGij() && choice == null) | ||||
| || Gcjh.IMPLEMENTATION_NAME.equals(choice)) { | || Gcjh.IMPLEMENTATION_NAME.equals(choice)) { | ||||
| return new Gcjh(); | 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)) { | } else if (SunJavah.IMPLEMENTATION_NAME.equals(choice)) { | ||||
| return new SunJavah(); | return new SunJavah(); | ||||
| } else if (choice != null) { | } else if (choice != null) { | ||||
| @@ -69,7 +69,7 @@ public class SunJavah implements JavahAdapter { | |||||
| return ej.fork(javah) == 0; | return ej.fork(javah) == 0; | ||||
| } | } | ||||
| private Commandline setupJavahCommand(Javah javah) { | |||||
| static Commandline setupJavahCommand(Javah javah) { | |||||
| Commandline cmd = new Commandline(); | Commandline cmd = new Commandline(); | ||||
| if (javah.getDestdir() != null) { | if (javah.getDestdir() != null) { | ||||
| @@ -62,4 +62,74 @@ public class Adapter implements JavahAdapter { | |||||
| </javah> | </javah> | ||||
| <au:assertLogContains text="adapter called" /> | <au:assertLogContains text="adapter called" /> | ||||
| </target> | </target> | ||||
| <target name="-setupForRealJavahTests"> | |||||
| <condition property="sunjavah.present"> | |||||
| <or> | |||||
| <available classname="com.sun.tools.javah.oldjavah.Main"/> | |||||
| <available classname="com.sun.tools.javah.Main"/> | |||||
| </or> | |||||
| </condition> | |||||
| <mkdir dir="${input}/org/example"/> | |||||
| <mkdir dir="${output}/org/example"/> | |||||
| <echo file="${input}/org/example/Foo.java"> | |||||
| <![CDATA[ | |||||
| package org.example; | |||||
| public class Foo { | |||||
| public Foo() {} | |||||
| public native String bar(Object baz); | |||||
| } | |||||
| ]]></echo> | |||||
| <javac srcdir="${input}" destdir="${output}"/> | |||||
| <presetdef name="javah-single"> | |||||
| <javah destdir="${output}"> | |||||
| <class name="org.example.Foo"/> | |||||
| <classpath> | |||||
| <pathelement location="${output}"/> | |||||
| </classpath> | |||||
| </javah> | |||||
| </presetdef> | |||||
| <presetdef name="javah-fileset"> | |||||
| <javah destdir="${output}"> | |||||
| <fileset dir="${output}"> | |||||
| <include name="**/*.class"/> | |||||
| </fileset> | |||||
| <classpath> | |||||
| <pathelement location="${output}"/> | |||||
| </classpath> | |||||
| </javah> | |||||
| </presetdef> | |||||
| </target> | |||||
| <target name="testSimpleCompile" depends="-setupForRealJavahTests"> | |||||
| <javah-single/> | |||||
| <au:assertFileExists file="${output}/org_example_Foo.h"/> | |||||
| </target> | |||||
| <target name="testCompileUsingFileset" depends="-setupForRealJavahTests"> | |||||
| <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> | </project> | ||||