summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/ant/ScalaTool.scala
diff options
context:
space:
mode:
authorGilles Dubochet <gilles.dubochet@epfl.ch>2008-04-09 13:16:56 +0000
committerGilles Dubochet <gilles.dubochet@epfl.ch>2008-04-09 13:16:56 +0000
commit07b35f671e36a681583548c6abc209913c07fec5 (patch)
treeaf59598c45e9c7a6cfd24ef10097921ca18670f8 /src/compiler/scala/tools/ant/ScalaTool.scala
parented01acd9713e834142e17b68e4ab05fc2bcd347c (diff)
downloadscala-07b35f671e36a681583548c6abc209913c07fec5.tar.gz
scala-07b35f671e36a681583548c6abc209913c07fec5.tar.bz2
scala-07b35f671e36a681583548c6abc209913c07fec5.zip
Refactored SuperSabbus' targets to be finer gra...
Refactored SuperSabbus' targets to be finer grained and permit better dependency management (with JVM 1.4 and MSIL support in mind). First effort of refactoring the classpath handling: tools are run with the scala library on the classpath, not on the bootclasspath.
Diffstat (limited to 'src/compiler/scala/tools/ant/ScalaTool.scala')
-rw-r--r--src/compiler/scala/tools/ant/ScalaTool.scala243
1 files changed, 67 insertions, 176 deletions
diff --git a/src/compiler/scala/tools/ant/ScalaTool.scala b/src/compiler/scala/tools/ant/ScalaTool.scala
index f53363623c..bfd78ae4d5 100644
--- a/src/compiler/scala/tools/ant/ScalaTool.scala
+++ b/src/compiler/scala/tools/ant/ScalaTool.scala
@@ -10,39 +10,31 @@
package scala.tools.ant
-import scala.collection.immutable.{Map, ListMap}
-
import java.io.{File, InputStream, FileWriter}
import org.apache.tools.ant.BuildException
import org.apache.tools.ant.taskdefs.MatchingTask
-import org.apache.tools.ant.types.Path
-import org.apache.tools.ant.util.FileUtils
+import org.apache.tools.ant.types.{Path, Reference}
/** <p>
* An Ant task that generates a shell or batch script to execute a
- * <a href="http://scala-lang.org/" target="_top">Scala</a> program.
+ * Scala program.
* This task can take the following parameters as attributes:
* </p><ul>
* <li>file (mandatory),</li>
- * <li>name,</li>
* <li>class (mandatory),</li>
* <li>platforms,</li>
- * <li>version,</li>
- * <li>copyright,</li>
- * <li>bootclasspath,</li>
- * <li>extclasspath,</li>
+ * <li>classpath,</li>
* <li>properties,</li>
* <li>javaflags,</li>
* <li>toolflags.</li></ul>
*
* @author Gilles Dubochet
- * @version 1.0
+ * @version 1.1
*/
class ScalaTool extends MatchingTask {
- /** The unique Ant file utilities instance to use in this task. */
- private val fileUtils = FileUtils.newFileUtils()
+ private def emptyPath = new Path(getProject)
/*============================================================================*\
** Ant user-properties **
@@ -60,89 +52,49 @@ class ScalaTool extends MatchingTask {
}
/** The path to the exec script file. ".bat" will be appended for the
- * Windows BAT file, if generated.
- */
+ * Windows BAT file, if generated. */
private var file: Option[File] = None
/** The main class to run. */
private var mainClass: Option[String] = None
- /** The name of this tool. Can only be set when a main class is defined,
- * default this is equal to the file name.
- */
- private var name: Option[String] = None
-
/** Supported platforms for the script. Either "unix" or "windows".
- * Defaults to both.
- */
- private var platforms: List[String] = Nil
-
- /** The optional version number. If set, when "-version" is passed to the
- * script, this value will be printed.
- */
- private var version: String = ""
-
- /** The optional copyright notice, that will be printed in the script. */
- private var copyright: String = "This file is copyrighted by its owner"
-
- /** The optional boot classpath */
- private var bootclasspath: List[String] = Nil
+ * Defaults to both. */
+ private var platforms: List[String] = List("unix", "windows")
/** An (optional) path to all JARs that this script depend on. Paths must be
- * relative to the scala home directory. If not set, all JAR archives in
- * "lib/" are automatically added.
- */
- private var extclasspath: List[String] = Nil
+ * relative to the scala home directory. If not set, all JAR archives and
+ * folders in "lib/" are automatically added. */
+ private var classpath: Option[Path] = None
/** Comma-separated Java system properties to pass to the JRE. Properties
- * are formated as name=value. Properties scala.home, scala.tool.name and
- * scala.tool.version are always set.
- */
- private var properties: List[Pair[String,String]] = Nil
+ * are formated as name=value. Properties scala.home, scala.tool.name and
+ * scala.tool.version are always set. */
+ private var properties: List[(String, String)] = Nil
/** Additional flags passed to the JRE ("java [javaFlags] class"). */
private var javaFlags: String = ""
/** Additional flags passed to the tool ("java class [toolFlags]"). Can only
- * be set when a main class is defined.
- */
+ * be set when a main class is defined. */
private var toolFlags: String = ""
/*============================================================================*\
** Properties setters **
\*============================================================================*/
- /** Sets the file attribute.
- * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>.
- *
- * @param input The value of <code>file</code>.
- */
+ /** Sets the file attribute. */
def setFile(input: File) =
file = Some(input)
- /** Sets the file attribute.
- * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>.
- *
- * @param input The value of <code>file</code>.
- */
- def setName(input: String) =
- name = Some(input)
-
- /** Sets the main class attribute.
- * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>.
- *
- * @param input The value of <code>mainClass</code>.
- */
+ /** Sets the main class attribute. */
def setClass(input: String) =
mainClass = Some(input)
- /** Sets the platforms attribute. Used by Ant.
- *
- * @param input The value for <code>platforms</code>.
- */
+ /** Sets the platforms attribute. */
def setPlatforms(input: String) = {
platforms = List.fromArray(input.split(",")).flatMap { s: String =>
- val st = s.trim()
+ val st = s.trim
if (Platforms.isPermissible(st))
(if (input != "") List(st) else Nil)
else {
@@ -152,102 +104,55 @@ class ScalaTool extends MatchingTask {
}
}
- /** Sets the version attribute.
- * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>.
- *
- * @param input The value of <code>version</code>.
- */
- def setVersion(input: String) =
- version = input
-
- /** Sets the copyright attribute.
- * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>.
- *
- * @param input The value of <code>copyright</code>.
- */
- def setCopyright(input: String) =
- copyright = input
-
- /** Sets the boot classpath attribute.
- * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>.
- *
- * @param input The value of <code>bootclasspath</code>.
- */
- def setBootclasspath(input: String) =
- bootclasspath = bootclasspath ::: List.fromArray(input.split(":"))
-
- /** Sets the extension classpath attribute.
- * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>.
- *
- * @param input The value of <code>extclasspath</code>.
- */
- def setExtclasspath(input: String) =
- extclasspath = extclasspath ::: List.fromArray(input.split(":"))
-
- /** Sets the properties attribute.
- * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>.
- *
- * @param input The value for <code>properties</code>.
- */
+ /** Sets the classpath with which to run the tool. */
+ def setClassPath(input: Path): Unit =
+ if (classpath.isEmpty)
+ classpath = Some(input)
+ else
+ classpath.get.append(input)
+ def createClassPath: Path = {
+ if (classpath.isEmpty) classpath = Some(emptyPath)
+ classpath.get.createPath()
+ }
+ def setClassPathRef(input: Reference): Unit =
+ createClassPath.setRefid(input)
+
+ /** Sets JVM properties that will be set whilst running the tool. */
def setProperties(input: String) = {
properties = List.fromArray(input.split(",")).flatMap { s: String =>
- val st = s.trim(); val stArray = st.split("=", 2)
+ val st = s.trim
+ val stArray = st.split("=", 2)
if (stArray.length == 2) {
if (input != "") List(Pair(stArray(0), stArray(1))) else Nil
- } else error("Property " + st + " does not conform to specification.")
+ }
+ else
+ error("Property " + st + " is not formatted properly.")
}
}
- /** Sets the version attribute.
- * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>.
- *
- * @param input The value of <code>version</code>.
- */
+ /** Sets flags to be passed to the Java interpreter. */
def setJavaflags(input: String) =
- javaFlags = input
+ javaFlags = input.trim
- /** Sets the version attribute.
- * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>.
- *
- * @param input The value of <code>version</code>.
- */
+ /** Sets flags to be passed to the tool. */
def setToolflags(input: String) =
- toolFlags = input
+ toolFlags = input.trim
/*============================================================================*\
** Properties getters **
\*============================================================================*/
- /** Gets the value of the file attribute in a Scala-friendly form.
- * @returns The file as a file. */
- private def getFile: File =
- if (file.isEmpty) error("Member 'file' is empty.")
- else getProject().resolveFile(file.get.toString)
-
- /** Gets the value of the bootclasspath attribute in a Scala-friendly form.
- * @returns The boot class path as a list of files. */
- private def getUnixBootClasspath: String =
- bootclasspath.mkString("", ":", "")
-
- /** Gets the value of the bootclasspath attribute in a Scala-friendly form.
- * @returns The boot class path as a list of files. */
- private def getWinBootClasspath: String =
- bootclasspath.map(_.replace('/', '\\')).
- mkString("", ";", "")
-
/** Gets the value of the classpath attribute in a Scala-friendly form.
* @returns The class path as a list of files. */
- private def getUnixExtClasspath: String =
- extclasspath.mkString("", ":", "")
+ private def getUnixclasspath: String =
+ classpath.getOrElse(emptyPath).list.mkString("", ":", "")
/** Gets the value of the classpath attribute in a Scala-friendly form.
* @returns The class path as a list of files. */
- private def getWinExtClasspath: String =
- extclasspath.map(_.replace('/', '\\')).
+ private def getWinclasspath: String =
+ classpath.getOrElse(emptyPath).list.map(_.replace('/', '\\')).
mkString("", ";", "")
- /** Gets the value of the classpath attribute in a Scala-friendly form.
- * @returns The class path as a list of files. */
private def getProperties: String =
properties.map({
case Pair(name,value) => "-D" + name + "=\"" + value + "\""
@@ -264,9 +169,7 @@ class ScalaTool extends MatchingTask {
private def error(message: String): Nothing =
throw new BuildException(message, getLocation())
- private def readResource(resource: String,
- tokens: Map[String, String]
- ): String = {
+ private def readAndPatchResource(resource: String, tokens: Map[String, String]): String = {
val chars = new Iterator[Char] {
private val stream =
this.getClass().getClassLoader().getResourceAsStream(resource)
@@ -315,47 +218,35 @@ class ScalaTool extends MatchingTask {
private def expandWinVar(vars: Map[String,String]): Map[String,String] =
vars transform { (x, vari) => vari.replaceAll("#([^#]*)#", "%_$1%") }
- private def pipeTemplate(template: String, patches: Map[String,String]) = {
- val resourceRoot = "scala/tools/ant/templates/"
- if (platforms.contains("unix")) {
- val unixPatches = expandUnixVar(patches.
- update("bootclasspath", getUnixBootClasspath).
- update("extclasspath", getUnixExtClasspath))
- val unixTemplateResource = resourceRoot + template + "-unix.tmpl"
- val unixTemplate = readResource(unixTemplateResource, unixPatches)
- writeFile(getFile, unixTemplate)
- }
- if (platforms.contains("windows")) {
- val winPatches = expandWinVar(patches.
- update("bootclasspath", getWinBootClasspath).
- update("extclasspath", getWinExtClasspath))
- val winTemplateResource = resourceRoot + template + "-windows.tmpl"
- val winTemplate = readResource(winTemplateResource, winPatches)
- writeFile(new File(getFile.getAbsolutePath() + ".bat"), winTemplate)
- }
- }
-
/*============================================================================*\
** The big execute method **
\*============================================================================*/
- /** Performs the compilation. */
+ /** Performs the tool creation. */
override def execute() = {
// Tests if all mandatory attributes are set and valid.
if (file.isEmpty) error("Attribute 'file' is not set.")
if (mainClass.isEmpty) error("Main class must be set.")
- if (platforms.isEmpty) platforms = Platforms.values
- if (name.isEmpty) name = Some(file.get.getName)
- val patches = ListMap.empty.
- update("name", name.get).
- update("class", mainClass.get).
- update("version", version).
- update("copyright", copyright).
- update("properties", getProperties).
- update("javaflags", javaFlags).
- update("toolflags", toolFlags)
- pipeTemplate("tool", patches)
+ val resourceRoot = "scala/tools/ant/templates/"
+ val patches = Map (
+ ("class", mainClass.get),
+ ("properties", getProperties),
+ ("javaflags", javaFlags),
+ ("toolflags", toolFlags)
+ )
+ if (platforms.contains("unix")) {
+ val unixPatches = patches + (("classpath", getUnixclasspath))
+ val unixTemplateResource = resourceRoot + "tool-unix.tmpl"
+ val unixTemplate = readAndPatchResource(unixTemplateResource, unixPatches)
+ writeFile(file.get, unixTemplate)
+ }
+ if (platforms.contains("windows")) {
+ val winPatches = patches + (("classpath", getWinclasspath))
+ val winTemplateResource = resourceRoot + "tool-windows.tmpl"
+ val winTemplate = readAndPatchResource(winTemplateResource, winPatches)
+ writeFile(new File(file.get.getAbsolutePath() + ".bat"), winTemplate)
+ }
}
}