@@ -116,6 +116,7 @@ public class Javac extends MatchingTask {
private Path extdirs;
private static String lSep = System.getProperty("line.separator");
protected boolean failOnError = true;
protected File[] compileList = new File[0];
/**
@@ -229,6 +230,20 @@ public class Javac extends MatchingTask {
return extdirs.createPath();
}
/**
* Throw a BuildException if compilation fails
*/
public void setFailonerror(boolean fail) {
failOnError = fail;
}
/**
* Proceed if compilation fails
*/
public void setProceed(boolean proceed) {
failOnError = !proceed;
}
/**
* Set the deprecation flag.
*/
@@ -330,18 +345,29 @@ public class Javac extends MatchingTask {
+ (compileList.length == 1 ? "" : "s")
+ (destDir != null ? " to " + destDir : ""));
boolean compileSucceeded = false;
if (compiler.equalsIgnoreCase("classic")) {
doClassicCompile();
compileSucceeded = doClassicCompile();
} else if (compiler.equalsIgnoreCase("modern")) {
doModernCompile();
compileSucceeded = doModernCompile();
} else if (compiler.equalsIgnoreCase("jikes")) {
doJikesCompile();
compileSucceeded = doJikesCompile();
} else if (compiler.equalsIgnoreCase("jvc")) {
doJvcCompile();
compileSucceeded = doJvcCompile();
} else {
String msg = "Don't know how to use compiler " + compiler;
throw new BuildException(msg, location);
}
if (!compileSucceeded) {
if (failOnError) {
throw new BuildException(FAIL_MSG, location);
}
else {
log(FAIL_MSG, Project.MSG_ERR);
}
}
}
}
@@ -456,9 +482,10 @@ public class Javac extends MatchingTask {
/**
* Peforms a compile using the classic compiler that shipped with
* JDK 1.1 and 1.2.
*
* @return true if the compile succeeded
*/
private void doClassicCompile() throws BuildException {
private boolean doClassicCompile() throws BuildException {
log("Using classic compiler", Project.MSG_VERBOSE);
Commandline cmd = setupJavacCommand();
@@ -483,9 +510,7 @@ public class Javac extends MatchingTask {
// Call the compile() method
Method compile = c.getMethod("compile", new Class [] { String[].class });
Boolean ok = (Boolean)compile.invoke(compiler, new Object[] {cmd.getArguments()});
if (!ok.booleanValue()) {
throw new BuildException(FAIL_MSG, location);
}
return ok.booleanValue();
}
catch (ClassNotFoundException ex) {
throw new BuildException("Cannot use classic compiler, as it is not available"+
@@ -503,15 +528,15 @@ public class Javac extends MatchingTask {
/**
* Performs a compile using the newer compiler that ships with JDK 1.3
*
* @return true if the compile succeeded
*/
private void doModernCompile() throws BuildException {
private boolean doModernCompile() throws BuildException {
try {
Class.forName("com.sun.tools.javac.Main");
} catch (ClassNotFoundException cnfe) {
log("Modern compiler is not available - using classic compiler", Project.MSG_WARN);
doClassicCompile();
return;
return doClassicCompile();
}
log("Using modern compiler", Project.MSG_VERBOSE);
@@ -532,9 +557,7 @@ public class Javac extends MatchingTask {
new Class [] {(new String [] {}).getClass ()});
int result = ((Integer) compile.invoke
(compiler, new Object[] {cmd.getArguments()})) .intValue ();
if (result != MODERN_COMPILER_SUCCESS) {
throw new BuildException(FAIL_MSG, location);
}
return (result == MODERN_COMPILER_SUCCESS);
} catch (Exception ex) {
if (ex instanceof BuildException) {
throw (BuildException) ex;
@@ -653,9 +676,10 @@ public class Javac extends MatchingTask {
* It has been successfully tested with jikes >1.10
*
* @author skanthak@muehlheim.de
*
* @return true if the compile succeeded
*/
private void doJikesCompile() throws BuildException {
private boolean doJikesCompile() throws BuildException {
log("Using jikes compiler", Project.MSG_VERBOSE);
Path classpath = new Path(project);
@@ -762,9 +786,7 @@ public class Javac extends MatchingTask {
int firstFileName = cmd.size();
logAndAddFilesToCompile(cmd);
if (executeJikesCompile(cmd.getCommandline(), firstFileName) != 0) {
throw new BuildException(FAIL_MSG, location);
}
return executeExternalCompile(cmd.getCommandline(), firstFileName) == 0;
}
/**
@@ -772,7 +794,7 @@ public class Javac extends MatchingTask {
* @param args - arguments to pass to process on command line
* @param firstFileName - index of the first source file in args
*/
protected int executeJikes Compile(String[] args, int firstFileName) {
protected int executeExternal Compile(String[] args, int firstFileName) {
String[] commandArray = null;
File tmpFile = null;
@@ -856,7 +878,11 @@ public class Javac extends MatchingTask {
}
}
private void doJvcCompile() throws BuildException {
/*
*
* @return true if the compile succeeded
*/
private boolean doJvcCompile() throws BuildException {
log("Using jvc compiler", Project.MSG_VERBOSE);
Path classpath = new Path(project);
@@ -906,9 +932,7 @@ public class Javac extends MatchingTask {
int firstFileName = cmd.size();
logAndAddFilesToCompile(cmd);
if (executeJikesCompile(cmd.getCommandline(), firstFileName) != 0) {
throw new BuildException(FAIL_MSG, location);
}
return executeExternalCompile(cmd.getCommandline(), firstFileName) == 0;
}
}