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