Browse Source

implement a forking implementation for javah

master
Stefan Bodewig 9 years ago
parent
commit
7ebbdc995c
6 changed files with 111 additions and 4 deletions
  1. +3
    -0
      WHATSNEW
  2. +7
    -3
      manual/Tasks/javah.html
  3. +72
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/javah/ForkingJavah.java
  4. +6
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapterFactory.java
  5. +1
    -1
      src/main/org/apache/tools/ant/taskdefs/optional/javah/SunJavah.java
  6. +22
    -0
      src/tests/antunit/taskdefs/optional/javah-test.xml

+ 3
- 0
WHATSNEW View File

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



+ 7
- 3
manual/Tasks/javah.html View File

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


+ 72
- 0
src/main/org/apache/tools/ant/taskdefs/optional/javah/ForkingJavah.java View File

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

+ 6
- 0
src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapterFactory.java View File

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


+ 1
- 1
src/main/org/apache/tools/ant/taskdefs/optional/javah/SunJavah.java View File

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


+ 22
- 0
src/tests/antunit/taskdefs/optional/javah-test.xml View File

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

Loading…
Cancel
Save