PR: 4119 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269868 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -191,8 +191,11 @@ files/directories from the CLASSPATH it passes to the compiler.</p> | |||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| <td valign="top">fork</td> | <td valign="top">fork</td> | ||||
| <td valign="top">whether to execute Javac using the JDK compiler externally; | |||||
| defaults to <code>no</code>.</td> | |||||
| <td valign="top">whether to execute Javac using the JDK compiler | |||||
| externally; defaults to <code>no</code>. You can also give a | |||||
| complete path to the javac executable to use instead of | |||||
| <code>yes</code>, which would run the compiler of the Java | |||||
| vesrion that is currently running Ant.</td> | |||||
| <td align="center" valign="top">No</td> | <td align="center" valign="top">No</td> | ||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| @@ -251,6 +254,26 @@ href="../using.html#path">path-like structures</a> and can also be set via neste | |||||
| directory, and stores | directory, and stores | ||||
| the <code>.class</code> files in the <code>${build}</code> directory. | the <code>.class</code> files in the <code>${build}</code> directory. | ||||
| The classpath used contains <code>xyz.jar</code>, and debug information is on.</p> | The classpath used contains <code>xyz.jar</code>, and debug information is on.</p> | ||||
| <pre> <javac srcdir="${src}" | |||||
| destdir="${build}" | |||||
| fork="true" | |||||
| /></pre> | |||||
| <p>compiles all <code>.java</code> files under the <code>${src}</code> | |||||
| directory, and stores the <code>.class</code> files in the | |||||
| <code>${build}</code> directory. This will fork off the javac | |||||
| compiler using the default javac executable.</p> | |||||
| <pre> <javac srcdir="${src}" | |||||
| destdir="${build}" | |||||
| fork="java$$javac.exe" | |||||
| /></pre> | |||||
| <p>compiles all <code>.java</code> files under the <code>${src}</code> | |||||
| directory, and stores the <code>.class</code> files in the | |||||
| <code>${build}</code> directory. This will fork off the javac | |||||
| compiler using the executable named <code>java$javac.exe</code>. Note | |||||
| that the <code>$</code> sign needs to be escaped by a second one.</p> | |||||
| <pre> <javac srcdir="${src}" | <pre> <javac srcdir="${src}" | ||||
| destdir="${build}" | destdir="${build}" | ||||
| includes="mypackage/p1/**,mypackage/p2/**" | includes="mypackage/p1/**,mypackage/p2/**" | ||||
| @@ -63,6 +63,7 @@ import org.apache.tools.ant.util.GlobPatternMapper; | |||||
| import org.apache.tools.ant.util.SourceFileScanner; | import org.apache.tools.ant.util.SourceFileScanner; | ||||
| import org.apache.tools.ant.taskdefs.compilers.CompilerAdapter; | import org.apache.tools.ant.taskdefs.compilers.CompilerAdapter; | ||||
| import org.apache.tools.ant.taskdefs.compilers.CompilerAdapterFactory; | import org.apache.tools.ant.taskdefs.compilers.CompilerAdapterFactory; | ||||
| import org.apache.tools.ant.taskdefs.condition.Os; | |||||
| import java.io.File; | import java.io.File; | ||||
| @@ -118,7 +119,8 @@ public class Javac extends MatchingTask { | |||||
| private Path extdirs; | private Path extdirs; | ||||
| private boolean includeAntRuntime = true; | private boolean includeAntRuntime = true; | ||||
| private boolean includeJavaRuntime = false; | private boolean includeJavaRuntime = false; | ||||
| private boolean fork = false; | |||||
| private String fork = "false"; | |||||
| private String forkedExecutable = null; | |||||
| private boolean nowarn = false; | private boolean nowarn = false; | ||||
| private String memoryInitialSize; | private String memoryInitialSize; | ||||
| private String memoryMaximumSize; | private String memoryMaximumSize; | ||||
| @@ -452,20 +454,40 @@ public class Javac extends MatchingTask { | |||||
| /** | /** | ||||
| * Sets whether to fork the javac compiler. | * Sets whether to fork the javac compiler. | ||||
| */ | |||||
| public void setFork(boolean fork) | |||||
| { | |||||
| this.fork = fork; | |||||
| * | |||||
| * @param f "true|false|on|off|yes|no" or the name of the javac | |||||
| * executable. | |||||
| */ | |||||
| public void setFork(String f) { | |||||
| if (f.equalsIgnoreCase("on") | |||||
| || f.equalsIgnoreCase("true") | |||||
| || f.equalsIgnoreCase("yes")) { | |||||
| fork = "true"; | |||||
| forkedExecutable = getSystemJavac(); | |||||
| } else if (f.equalsIgnoreCase("off") | |||||
| || f.equalsIgnoreCase("false") | |||||
| || f.equalsIgnoreCase("no")) { | |||||
| fork = "false"; | |||||
| } else { | |||||
| fork = "true"; | |||||
| forkedExecutable = f; | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| * Is this a forked invocation of JDK's javac? | * Is this a forked invocation of JDK's javac? | ||||
| */ | */ | ||||
| public boolean isForkedJavac() { | public boolean isForkedJavac() { | ||||
| return fork || | |||||
| return !"false".equals(fork) || | |||||
| "extJavac".equals(project.getProperty("build.compiler")); | "extJavac".equals(project.getProperty("build.compiler")); | ||||
| } | } | ||||
| /** | |||||
| * The name of the javac executable to use in fork-mode. | |||||
| */ | |||||
| public String getJavacExecutable() { | |||||
| return forkedExecutable; | |||||
| } | |||||
| /** | /** | ||||
| * Sets whether the -nowarn option should be used. | * Sets whether the -nowarn option should be used. | ||||
| @@ -519,7 +541,7 @@ public class Javac extends MatchingTask { | |||||
| String compiler = project.getProperty("build.compiler"); | String compiler = project.getProperty("build.compiler"); | ||||
| if (fork) { | |||||
| if (!"false".equals(fork)) { | |||||
| if (compiler != null) { | if (compiler != null) { | ||||
| if (isJdkCompiler(compiler)) { | if (isJdkCompiler(compiler)) { | ||||
| log("Since fork is true, ignoring build.compiler setting.", | log("Since fork is true, ignoring build.compiler setting.", | ||||
| @@ -611,4 +633,24 @@ public class Javac extends MatchingTask { | |||||
| "javac1.4".equals(compiler); | "javac1.4".equals(compiler); | ||||
| } | } | ||||
| protected String getSystemJavac() { | |||||
| // This is the most common extension case - exe for windows and OS/2, | |||||
| // nothing for *nix. | |||||
| String extension = Os.isFamily("dos") ? ".exe" : ""; | |||||
| // Look for java in the java.home/../bin directory. Unfortunately | |||||
| // on Windows java.home doesn't always refer to the correct location, | |||||
| // so we need to fall back to assuming java is somewhere on the | |||||
| // PATH. | |||||
| java.io.File jExecutable = | |||||
| new java.io.File(System.getProperty("java.home") + | |||||
| "/../bin/javac" + extension ); | |||||
| if (jExecutable.exists() && !Os.isFamily("netware")) { | |||||
| return jExecutable.getAbsolutePath(); | |||||
| } else { | |||||
| return "javac"; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -56,7 +56,6 @@ package org.apache.tools.ant.taskdefs.compilers; | |||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.taskdefs.condition.Os; | |||||
| import org.apache.tools.ant.types.Commandline; | import org.apache.tools.ant.types.Commandline; | ||||
| /** | /** | ||||
| @@ -73,7 +72,7 @@ public class JavacExternal extends DefaultCompilerAdapter { | |||||
| attributes.log("Using external javac compiler", Project.MSG_VERBOSE); | attributes.log("Using external javac compiler", Project.MSG_VERBOSE); | ||||
| Commandline cmd = new Commandline(); | Commandline cmd = new Commandline(); | ||||
| cmd.setExecutable(getJavacExecutableName()); | |||||
| cmd.setExecutable(getJavac().getJavacExecutable()); | |||||
| setupModernJavacCommandlineSwitches(cmd); | setupModernJavacCommandlineSwitches(cmd); | ||||
| int firstFileName = cmd.size(); | int firstFileName = cmd.size(); | ||||
| logAndAddFilesToCompile(cmd); | logAndAddFilesToCompile(cmd); | ||||
| @@ -81,25 +80,5 @@ public class JavacExternal extends DefaultCompilerAdapter { | |||||
| return executeExternalCompile(cmd.getCommandline(), firstFileName) == 0; | return executeExternalCompile(cmd.getCommandline(), firstFileName) == 0; | ||||
| } | } | ||||
| private String getJavacExecutableName() { | |||||
| // This is the most common extension case - exe for windows and OS/2, | |||||
| // nothing for *nix. | |||||
| String extension = Os.isFamily("dos") ? ".exe" : ""; | |||||
| // Look for java in the java.home/../bin directory. Unfortunately | |||||
| // on Windows java.home doesn't always refer to the correct location, | |||||
| // so we need to fall back to assuming java is somewhere on the | |||||
| // PATH. | |||||
| java.io.File jExecutable = | |||||
| new java.io.File(System.getProperty("java.home") + | |||||
| "/../bin/javac" + extension ); | |||||
| if (jExecutable.exists() && !Os.isFamily("netware")) { | |||||
| return jExecutable.getAbsolutePath(); | |||||
| } else { | |||||
| return "javac"; | |||||
| } | |||||
| } | |||||
| } | } | ||||