@@ -87,6 +87,10 @@ Other changes: | |||
* a new implementation "forking" has been added to <javah> and is | |||
used as default when running on JDK9. | |||
* support for javac's -h switch has been added with the | |||
nativeheaderdir attribute. | |||
Bugzilla Report 59905 | |||
Changes from Ant 1.9.6 TO Ant 1.9.7 | |||
=================================== | |||
@@ -125,6 +125,15 @@ classpath of the <code><javac></code> task, and does not release them. | |||
The side effect of this is that you will not be able to delete or move | |||
those files later on in the build. The workaround is to fork when | |||
invoking the compiler.</p> | |||
<p>If you are using Java 8 or above and your source contains native | |||
methods or fields annotated with the <code>@Native</code> annotation | |||
you can set the <code>nativeheaderdir</code> attribute in order to | |||
use the <code>-h</code> switch of <code>javac</code> to generate the | |||
native header files. Note that the logic Ant uses to determine which | |||
files to compile does not take native headers into account, i.e. if | |||
the <code>.class</code> is more recent than the | |||
corresponding <code>.java</code> file the file will not get compiled | |||
even if a native header file generated for it would be outdated.</p> | |||
<h3>Parameters</h3> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<tr> | |||
@@ -505,6 +514,14 @@ invoking the compiler.</p> | |||
<em>since Ant 1.9.7</em></td> | |||
<td align="center" valign="top">No</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">nativeheaderdir</td> | |||
<td valign="top"> | |||
Specify where to place generated native header files. Ignored | |||
when running on JDK < 8. | |||
<em>Since Ant 1.9.8</em>. | |||
<td align="center" valign="top">No</td> | |||
</tr> | |||
</table> | |||
<h3>Parameters specified as nested elements</h3> | |||
@@ -33,6 +33,14 @@ whether <a href="http://docs.oracle.com/javase/7/docs/technotes/tools/windows/ja | |||
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>If you are building with Java 8 or above consider | |||
using <a href="javac.html"><code>javac</code></a>'s <code>nativeheaderdir</code> | |||
attribute instead which allows you to compile the classes and | |||
generate the native header files with a single step.</p> | |||
<p><b>Note</b> the <code>javah</code> has been deprecated as of Java 9 | |||
and is scheduled to be removed with Java 10.</p> | |||
<p>It is possible to use different compilers. This can be selected | |||
with the <code>implementation</code> attribute or a nested element. <a | |||
name="implementationvalues">Here are the choices of the attribute</a>:</p> | |||
@@ -53,7 +53,7 @@ attribute. or a nested element. | |||
<a name="compilervalues">Here are the choices</a>:</p> | |||
<ul> | |||
<li>default -the default compiler (kaffe, sun or forking) for the platform. | |||
<li>sun (the standard compiler of the JDK < JDK 9)</li> | |||
<li>sun (the standard compiler of the JDK < JDK 9)</li> | |||
<li>kaffe (the standard compiler of <a href="http://www.kaffe.org" target="_top">Kaffe</a>)</li> | |||
<li>weblogic</li> | |||
<li>forking - the sun compiler forked into a separate process (since | |||
@@ -108,6 +108,7 @@ public class Javac extends MatchingTask { | |||
private Path src; | |||
private File destDir; | |||
private File nativeHeaderDir; | |||
private Path compileClasspath; | |||
private Path modulepath; | |||
private Path upgrademodulepath; | |||
@@ -285,6 +286,26 @@ public class Javac extends MatchingTask { | |||
return destDir; | |||
} | |||
/** | |||
* Set the destination directory into which the generated native | |||
* header files should be placed. | |||
* @param nhDir where to place generated native header files | |||
* @since Ant 1.9.8 | |||
*/ | |||
public void setNativeHeaderDir(final File nhDir) { | |||
this.nativeHeaderDir = nhDir; | |||
} | |||
/** | |||
* Gets the destination directory into which the generated native | |||
* header files should be placed. | |||
* @return where to place generated native header files | |||
* @since Ant 1.9.8 | |||
*/ | |||
public File getNativeHeaderDir() { | |||
return nativeHeaderDir; | |||
} | |||
/** | |||
* Set the sourcepath to be used for this compilation. | |||
* @param sourcepath the source path | |||
@@ -414,6 +414,16 @@ public abstract class DefaultCompilerAdapter | |||
cmd.createArgument().setValue("-upgrademodulepath"); | |||
cmd.createArgument().setPath(ump); | |||
} | |||
if (attributes.getNativeHeaderDir() != null) { | |||
if (assumeJava13() || assumeJava14() || assumeJava15() | |||
|| assumeJava16() || assumeJava17()) { | |||
attributes.log("Support for javac -h has been added in Java8," | |||
+ " ignoring it"); | |||
} else { | |||
cmd.createArgument().setValue("-h"); | |||
cmd.createArgument().setFile(attributes.getNativeHeaderDir()); | |||
} | |||
} | |||
return cmd; | |||
} | |||
@@ -18,10 +18,16 @@ | |||
<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit"> | |||
<import file="../antunit-base.xml" /> | |||
<property name="javac-dir" location="${output}/javac-dir" /> | |||
<property name="build-dir" location="${javac-dir}/build" /> | |||
<target name="setup"> | |||
<property name="javac-dir" location="${output}/javac-dir" /> | |||
<property name="build-dir" location="${javac-dir}/build" /> | |||
<presetdef name="testJavac"> | |||
<javac srcdir="${javac-dir}/src" destdir="${javac-dir}/classes" | |||
includeantruntime="false"/> | |||
</presetdef> | |||
</target> | |||
<target name="test-includeDestClasses"> | |||
<target name="test-includeDestClasses" depends="setup"> | |||
<property name="DATE" value="09/10/1999 4:30 pm" /> | |||
<delete dir="${javac-dir}/src" /> | |||
<mkdir dir="${javac-dir}/src" /> | |||
@@ -54,7 +60,7 @@ | |||
</au:assertFalse> | |||
</target> | |||
<target name="test-updated-property"> | |||
<target name="test-updated-property" depends="setup"> | |||
<delete quiet="yes" dir="${build-dir}" /> | |||
<mkdir dir="${build-dir}" /> | |||
<javac srcdir="javac-dir/good-src" destdir="${build-dir}" updatedProperty="classes-updated" /> | |||
@@ -67,7 +73,7 @@ | |||
</au:assertFalse> | |||
</target> | |||
<target name="test-error-property"> | |||
<target name="test-error-property" depends="setup"> | |||
<delete quiet="yes" dir="${build-dir}" /> | |||
<mkdir dir="${build-dir}" /> | |||
<javac srcdir="javac-dir/good-src" destdir="${build-dir}" failOnError="false" errorProperty="compile-failed" /> | |||
@@ -80,7 +86,7 @@ | |||
</au:assertTrue> | |||
</target> | |||
<target name="setUpForPackageInfoJava"> | |||
<target name="setUpForPackageInfoJava" depends="setup"> | |||
<mkdir dir="${javac-dir}/src/a" /> | |||
<mkdir dir="${build-dir}" /> | |||
<echo file="${javac-dir}/src/a/package-info.java"> | |||
@@ -151,7 +157,7 @@ | |||
<au:assertFileDoesntExist file="${build-dir}/a/package-info.class"/> | |||
</target> | |||
<target name="-create-javac-adapter"> | |||
<target name="-create-javac-adapter" depends="setup"> | |||
<property name="adapter.dir" location="${output}/adapter" /> | |||
<mkdir dir="${input}/org/example" /> | |||
<echo file="${input}/org/example/Adapter.java"> | |||
@@ -198,16 +204,14 @@ public class Adapter implements CompilerAdapter { | |||
<au:assertLogContains text="adapter called" /> | |||
</target> | |||
<target name="testSourceAttributes" xmlns:if="ant:if" xmlns:unless="ant:unless"> | |||
<target name="testSourceAttributes" depends="setup" | |||
xmlns:if="ant:if" xmlns:unless="ant:unless"> | |||
<delete dir="${javac-dir}/src" /> | |||
<mkdir dir="${javac-dir}/src" /> | |||
<mkdir dir="${javac-dir}/classes" /> | |||
<echo file="${javac-dir}/src/A.java"> | |||
public class A { } | |||
</echo> | |||
<presetdef name="testJavac"> | |||
<javac srcdir="${javac-dir}/src" destdir="${javac-dir}/classes" includeantruntime="false"/> | |||
</presetdef> | |||
<au:expectfailure> | |||
<testJavac source="notValid"/> | |||
@@ -235,16 +239,14 @@ public class Adapter implements CompilerAdapter { | |||
</sequential> | |||
</target> | |||
<target name="testTargetAttributes" xmlns:if="ant:if" xmlns:unless="ant:unless"> | |||
<target name="testTargetAttributes" depends="setup" | |||
xmlns:if="ant:if" xmlns:unless="ant:unless"> | |||
<delete dir="${javac-dir}/src" /> | |||
<mkdir dir="${javac-dir}/src" /> | |||
<mkdir dir="${javac-dir}/classes" /> | |||
<echo file="${javac-dir}/src/A.java"> | |||
public class A { } | |||
</echo> | |||
<presetdef name="testJavac"> | |||
<javac srcdir="${javac-dir}/src" destdir="${javac-dir}/classes" includeantruntime="false"/> | |||
</presetdef> | |||
<au:expectfailure> | |||
<testJavac target="notValid"/> | |||
@@ -264,4 +266,31 @@ public class Adapter implements CompilerAdapter { | |||
<mkdir dir="${javac-dir}/classes"/> | |||
</sequential> | |||
</target> | |||
<target name="testJavacWithNativeHeaderGeneration" depends="setup"> | |||
<mkdir dir="${javac-dir}/src/org/example" /> | |||
<mkdir dir="${javac-dir}/classes"/> | |||
<mkdir dir="${javac-dir}/headers"/> | |||
<echo file="${javac-dir}/src/org/example/Foo.java"> | |||
<![CDATA[ | |||
package org.example; | |||
public class Foo { | |||
public Foo() {} | |||
public native String bar(Object baz); | |||
} | |||
]]></echo> | |||
<echo file="${javac-dir}/src/org/example/Bar.java"> | |||
<![CDATA[ | |||
package org.example; | |||
public class Bar { | |||
public Bar() {} | |||
public String xyzzy(Object baz) { | |||
return new Foo().bar(baz); | |||
} | |||
} | |||
]]></echo> | |||
<testJavac nativeheaderdir="${javac-dir}/headers"/> | |||
<au:assertFileExists file="${javac-dir}/headers/org_example_Foo.h"/> | |||
<au:assertFileDoesntExist file="${javac-dir}/headers/org_example_Bar.h"/> | |||
</target> | |||
</project> |