@@ -87,6 +87,10 @@ Other changes: | |||||
* a new implementation "forking" has been added to <javah> and is | * a new implementation "forking" has been added to <javah> and is | ||||
used as default when running on JDK9. | 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 | 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 | 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 | those files later on in the build. The workaround is to fork when | ||||
invoking the compiler.</p> | 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> | <h3>Parameters</h3> | ||||
<table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
<tr> | <tr> | ||||
@@ -505,6 +514,14 @@ invoking the compiler.</p> | |||||
<em>since Ant 1.9.7</em></td> | <em>since Ant 1.9.7</em></td> | ||||
<td align="center" valign="top">No</td> | <td align="center" valign="top">No</td> | ||||
</tr> | </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> | </table> | ||||
<h3>Parameters specified as nested elements</h3> | <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> | or <a href="http://java.sun.com/products/jdk/1.1/docs/tooldocs/win32/javah.html">pre-JDK1.2</a> | ||||
systems are used.</p> | 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 | <p>It is possible to use different compilers. This can be selected | ||||
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> | ||||
@@ -53,7 +53,7 @@ attribute. or a nested element. | |||||
<a name="compilervalues">Here are the choices</a>:</p> | <a name="compilervalues">Here are the choices</a>:</p> | ||||
<ul> | <ul> | ||||
<li>default -the default compiler (kaffe, sun or forking) for the platform. | <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>kaffe (the standard compiler of <a href="http://www.kaffe.org" target="_top">Kaffe</a>)</li> | ||||
<li>weblogic</li> | <li>weblogic</li> | ||||
<li>forking - the sun compiler forked into a separate process (since | <li>forking - the sun compiler forked into a separate process (since | ||||
@@ -108,6 +108,7 @@ public class Javac extends MatchingTask { | |||||
private Path src; | private Path src; | ||||
private File destDir; | private File destDir; | ||||
private File nativeHeaderDir; | |||||
private Path compileClasspath; | private Path compileClasspath; | ||||
private Path modulepath; | private Path modulepath; | ||||
private Path upgrademodulepath; | private Path upgrademodulepath; | ||||
@@ -285,6 +286,26 @@ public class Javac extends MatchingTask { | |||||
return destDir; | 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. | * Set the sourcepath to be used for this compilation. | ||||
* @param sourcepath the source path | * @param sourcepath the source path | ||||
@@ -414,6 +414,16 @@ public abstract class DefaultCompilerAdapter | |||||
cmd.createArgument().setValue("-upgrademodulepath"); | cmd.createArgument().setValue("-upgrademodulepath"); | ||||
cmd.createArgument().setPath(ump); | 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; | return cmd; | ||||
} | } | ||||
@@ -18,10 +18,16 @@ | |||||
<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit"> | <project default="antunit" xmlns:au="antlib:org.apache.ant.antunit"> | ||||
<import file="../antunit-base.xml" /> | <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" /> | <property name="DATE" value="09/10/1999 4:30 pm" /> | ||||
<delete dir="${javac-dir}/src" /> | <delete dir="${javac-dir}/src" /> | ||||
<mkdir dir="${javac-dir}/src" /> | <mkdir dir="${javac-dir}/src" /> | ||||
@@ -54,7 +60,7 @@ | |||||
</au:assertFalse> | </au:assertFalse> | ||||
</target> | </target> | ||||
<target name="test-updated-property"> | |||||
<target name="test-updated-property" depends="setup"> | |||||
<delete quiet="yes" dir="${build-dir}" /> | <delete quiet="yes" dir="${build-dir}" /> | ||||
<mkdir dir="${build-dir}" /> | <mkdir dir="${build-dir}" /> | ||||
<javac srcdir="javac-dir/good-src" destdir="${build-dir}" updatedProperty="classes-updated" /> | <javac srcdir="javac-dir/good-src" destdir="${build-dir}" updatedProperty="classes-updated" /> | ||||
@@ -67,7 +73,7 @@ | |||||
</au:assertFalse> | </au:assertFalse> | ||||
</target> | </target> | ||||
<target name="test-error-property"> | |||||
<target name="test-error-property" depends="setup"> | |||||
<delete quiet="yes" dir="${build-dir}" /> | <delete quiet="yes" dir="${build-dir}" /> | ||||
<mkdir dir="${build-dir}" /> | <mkdir dir="${build-dir}" /> | ||||
<javac srcdir="javac-dir/good-src" destdir="${build-dir}" failOnError="false" errorProperty="compile-failed" /> | <javac srcdir="javac-dir/good-src" destdir="${build-dir}" failOnError="false" errorProperty="compile-failed" /> | ||||
@@ -80,7 +86,7 @@ | |||||
</au:assertTrue> | </au:assertTrue> | ||||
</target> | </target> | ||||
<target name="setUpForPackageInfoJava"> | |||||
<target name="setUpForPackageInfoJava" depends="setup"> | |||||
<mkdir dir="${javac-dir}/src/a" /> | <mkdir dir="${javac-dir}/src/a" /> | ||||
<mkdir dir="${build-dir}" /> | <mkdir dir="${build-dir}" /> | ||||
<echo file="${javac-dir}/src/a/package-info.java"> | <echo file="${javac-dir}/src/a/package-info.java"> | ||||
@@ -151,7 +157,7 @@ | |||||
<au:assertFileDoesntExist file="${build-dir}/a/package-info.class"/> | <au:assertFileDoesntExist file="${build-dir}/a/package-info.class"/> | ||||
</target> | </target> | ||||
<target name="-create-javac-adapter"> | |||||
<target name="-create-javac-adapter" depends="setup"> | |||||
<property name="adapter.dir" location="${output}/adapter" /> | <property name="adapter.dir" location="${output}/adapter" /> | ||||
<mkdir dir="${input}/org/example" /> | <mkdir dir="${input}/org/example" /> | ||||
<echo file="${input}/org/example/Adapter.java"> | <echo file="${input}/org/example/Adapter.java"> | ||||
@@ -198,16 +204,14 @@ public class Adapter implements CompilerAdapter { | |||||
<au:assertLogContains text="adapter called" /> | <au:assertLogContains text="adapter called" /> | ||||
</target> | </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" /> | <delete dir="${javac-dir}/src" /> | ||||
<mkdir dir="${javac-dir}/src" /> | <mkdir dir="${javac-dir}/src" /> | ||||
<mkdir dir="${javac-dir}/classes" /> | <mkdir dir="${javac-dir}/classes" /> | ||||
<echo file="${javac-dir}/src/A.java"> | <echo file="${javac-dir}/src/A.java"> | ||||
public class A { } | public class A { } | ||||
</echo> | </echo> | ||||
<presetdef name="testJavac"> | |||||
<javac srcdir="${javac-dir}/src" destdir="${javac-dir}/classes" includeantruntime="false"/> | |||||
</presetdef> | |||||
<au:expectfailure> | <au:expectfailure> | ||||
<testJavac source="notValid"/> | <testJavac source="notValid"/> | ||||
@@ -235,16 +239,14 @@ public class Adapter implements CompilerAdapter { | |||||
</sequential> | </sequential> | ||||
</target> | </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" /> | <delete dir="${javac-dir}/src" /> | ||||
<mkdir dir="${javac-dir}/src" /> | <mkdir dir="${javac-dir}/src" /> | ||||
<mkdir dir="${javac-dir}/classes" /> | <mkdir dir="${javac-dir}/classes" /> | ||||
<echo file="${javac-dir}/src/A.java"> | <echo file="${javac-dir}/src/A.java"> | ||||
public class A { } | public class A { } | ||||
</echo> | </echo> | ||||
<presetdef name="testJavac"> | |||||
<javac srcdir="${javac-dir}/src" destdir="${javac-dir}/classes" includeantruntime="false"/> | |||||
</presetdef> | |||||
<au:expectfailure> | <au:expectfailure> | ||||
<testJavac target="notValid"/> | <testJavac target="notValid"/> | ||||
@@ -264,4 +266,31 @@ public class Adapter implements CompilerAdapter { | |||||
<mkdir dir="${javac-dir}/classes"/> | <mkdir dir="${javac-dir}/classes"/> | ||||
</sequential> | </sequential> | ||||
</target> | </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> | </project> |