diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/ant/sabbus/ScalacFork.scala | 122 | ||||
-rw-r--r-- | src/compiler/scala/tools/ant/sabbus/TaskArgs.scala | 2 |
2 files changed, 69 insertions, 55 deletions
diff --git a/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala b/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala index 77cc11fe6b..20e410543e 100644 --- a/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala +++ b/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala @@ -8,15 +8,19 @@ // $Id$ -package scala.tools.ant.sabbus +package scala.tools.ant +package sabbus import java.io.File import java.io.FileWriter import org.apache.tools.ant.Project import org.apache.tools.ant.taskdefs.{MatchingTask, Java} import org.apache.tools.ant.util.{GlobPatternMapper, SourceFileScanner} +import scala.tools.nsc.io class ScalacFork extends MatchingTask with TaskArgs { + val MainClass = "scala.tools.nsc.Main" + def setSrcdir(input: File) { sourceDir = Some(input) } @@ -43,67 +47,75 @@ class ScalacFork extends MatchingTask with TaskArgs { private var jvmArgs: Option[String] = None private var argfile: Option[File] = None + private def createMapper() = { + val mapper = new GlobPatternMapper() + val extension = if (isMSIL) "*.msil" else "*.class" + mapper setTo extension + mapper setFrom "*.scala" + + mapper + } + override def execute() { - if (compilerPath.isEmpty) error("Mandatory attribute 'compilerpath' is not set.") - if (sourceDir.isEmpty) error("Mandatory attribute 'srcdir' is not set.") - if (destinationDir.isEmpty) error("Mandatory attribute 'destdir' is not set.") + def plural(x: Int) = if (x > 1) "s" else "" + + val compilerPath = this.compilerPath getOrElse error("Mandatory attribute 'compilerpath' is not set.") + val sourceDir = this.sourceDir getOrElse error("Mandatory attribute 'srcdir' is not set.") + val destinationDir = this.destinationDir getOrElse error("Mandatory attribute 'destdir' is not set.") val settings = new Settings - settings.d = destinationDir.get - if (!compTarget.isEmpty) settings.target = compTarget.get - if (!compilationPath.isEmpty) settings.classpath = compilationPath.get - if (!sourcePath.isEmpty) settings.sourcepath = sourcePath.get - if (compTarget.isDefined && compTarget.get == "msil") settings.sourcedir = sourceDir.get - if (!params.isEmpty) settings.more = params.get + settings.d = destinationDir - // not yet used: compilerPath, sourcedir (used in mapper), failonerror, timeout + compTarget foreach (settings.target = _) + compilationPath foreach (settings.classpath = _) + sourcePath foreach (settings.sourcepath = _) + params foreach (settings.more = _) + + if (isMSIL) + settings.sourcedir = sourceDir + + val mapper = createMapper() - val mapper = new GlobPatternMapper() - if (compTarget.isDefined && compTarget.get == "msil") - mapper.setTo("*.msil") - else - mapper.setTo("*.class") - mapper.setFrom("*.scala") val includedFiles: Array[File] = new SourceFileScanner(this).restrict( - getDirectoryScanner(sourceDir.get).getIncludedFiles, - sourceDir.get, - destinationDir.get, + getDirectoryScanner(sourceDir).getIncludedFiles, + sourceDir, + destinationDir, mapper - ) map (new File(sourceDir.get, _)) - if (includedFiles.size > 0 || argfile.isDefined) { - if (includedFiles.size > 0) - log("Compiling "+ includedFiles.size +" file"+ - (if (includedFiles.size > 1) "s" else "") +" to "+ destinationDir.get) - if (argfile.isDefined) - log("Using argument file: @"+ argfile.get) - - val java = new Java(this) // set this as owner - java.setFork(true) - // using 'setLine' creates multiple arguments out of a space-separated string - if (!jvmArgs.isEmpty) java.createJvmarg().setLine(jvmArgs.get) - java.setClasspath(compilerPath.get) - java.setClassname("scala.tools.nsc.Main") - if (!timeout.isEmpty) java.setTimeout(timeout.get) - - //dump the arguments to a file and do "java @file" - val tempArgFile = File.createTempFile("scalacfork","") - val outf = new FileWriter(tempArgFile) - for (arg <- settings.toArgs) - { outf.write(arg) ; outf.write(" ") } - for (file <- includedFiles) - { outf.write(file.getPath) ; outf.write(" ") } - outf.close - - java.createArg().setValue("@"+ tempArgFile.getAbsolutePath) - if (argfile.isDefined) - java.createArg().setValue("@"+ argfile.get) - - log(java.getCommandLine.getCommandline.mkString("", " ", ""), Project.MSG_VERBOSE) - val res = java.executeJava() - if (failOnError && res != 0) - error("Compilation failed because of an internal compiler error;"+ - " see the error output for details.") - } + ) map (x => new File(sourceDir, x)) + + /** Nothing to do. */ + if (includedFiles.isEmpty && argfile.isEmpty) + return + + if (includedFiles.nonEmpty) + log("Compiling %d file%s to %s".format(includedFiles.size, plural(includedFiles.size), destinationDir)) + + argfile foreach (x => log("Using argfile file: @" + x)) + + val java = new Java(this) // set this as owner + java setFork true + // using 'setLine' creates multiple arguments out of a space-separated string + jvmArgs foreach (java.createJvmarg() setLine _) + timeout foreach (java setTimeout _) + + java setClasspath compilerPath + java setClassname MainClass + + // dump the arguments to a file and do "java @file" + val tempArgFile = io.File.makeTemp("scalacfork") + val tokens = settings.toArgs ++ (includedFiles map (_.getPath)) + tempArgFile writeAll List(tokens mkString " ") + + val paths = List(Some(tempArgFile.toAbsolute.path), argfile).flatten map (_.toString) + paths foreach (p => java.createArg() setValue ("@"+ p)) + + val debugString = paths map (x => " (@ = '%s')".format(io.File(x).slurp())) mkString "" + log(java.getCommandLine.getCommandline.mkString("", " ", debugString), Project.MSG_VERBOSE) + + val res = java.executeJava() + if (failOnError && res != 0) + error("Compilation failed because of an internal compiler error;"+ + " see the error output for details.") } } diff --git a/src/compiler/scala/tools/ant/sabbus/TaskArgs.scala b/src/compiler/scala/tools/ant/sabbus/TaskArgs.scala index 72f091cecc..6526f67254 100644 --- a/src/compiler/scala/tools/ant/sabbus/TaskArgs.scala +++ b/src/compiler/scala/tools/ant/sabbus/TaskArgs.scala @@ -84,4 +84,6 @@ trait TaskArgs { this: Task => protected var sourcePath: Option[Path] = None protected var compilerPath: Option[Path] = None protected var destinationDir: Option[File] = None + + def isMSIL = compTarget exists (_ == "msil") } |