Browse Source

Make name of the javac executable configurable in fork mode.

PR: 4119


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269868 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 23 years ago
parent
commit
30b11d18c9
3 changed files with 75 additions and 31 deletions
  1. +25
    -2
      docs/manual/CoreTasks/javac.html
  2. +49
    -7
      src/main/org/apache/tools/ant/taskdefs/Javac.java
  3. +1
    -22
      src/main/org/apache/tools/ant/taskdefs/compilers/JavacExternal.java

+ 25
- 2
docs/manual/CoreTasks/javac.html View File

@@ -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> &lt;javac srcdir=&quot;${src}&quot;
destdir=&quot;${build}&quot;
fork=&quot;true&quot;
/&gt;</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> &lt;javac srcdir=&quot;${src}&quot;
destdir=&quot;${build}&quot;
fork=&quot;java$$javac.exe&quot;
/&gt;</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> &lt;javac srcdir=&quot;${src}&quot; <pre> &lt;javac srcdir=&quot;${src}&quot;
destdir=&quot;${build}&quot; destdir=&quot;${build}&quot;
includes=&quot;mypackage/p1/**,mypackage/p2/**&quot; includes=&quot;mypackage/p1/**,mypackage/p2/**&quot;


+ 49
- 7
src/main/org/apache/tools/ant/taskdefs/Javac.java View File

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

+ 1
- 22
src/main/org/apache/tools/ant/taskdefs/compilers/JavacExternal.java View File

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



Loading…
Cancel
Save