summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-11-18 15:16:26 +0000
committerPaul Phillips <paulp@improving.org>2011-11-18 15:16:26 +0000
commit7c2c8c8adf15e072bf94cfa17ad9b2e1771e3b03 (patch)
treebe050afb479ff50334cf2f13fbbb181b30808855
parent955b852dfd9515c5b9ea1950d047db08140ba007 (diff)
downloadscala-7c2c8c8adf15e072bf94cfa17ad9b2e1771e3b03.tar.gz
scala-7c2c8c8adf15e072bf94cfa17ad9b2e1771e3b03.tar.bz2
scala-7c2c8c8adf15e072bf94cfa17ad9b2e1771e3b03.zip
Enable the use of spaces in paths for the Scala...
Enable the use of spaces in paths for the Scala build on Windows. Revert r25995 which was fixing it only partly and in the wrong place. Properly encode argument files for scalac in scalac ant task. Allow 'compilerarg' elements in scalac ant task (like in ant's built-in javac task) to allow passing extra parameters like plugindir path with proper encoding of spaces and file names, and use it in the Scala build. Fix space handling in get-scala-revision.bat. (Patch by Stefan Zeiger.) Closes SI-3047.
-rw-r--r--build.xml8
-rw-r--r--src/compiler/scala/tools/ant/sabbus/Make.scala2
-rw-r--r--src/compiler/scala/tools/ant/sabbus/ScalacFork.scala17
-rw-r--r--src/compiler/scala/tools/ant/sabbus/Settings.scala14
-rw-r--r--src/compiler/scala/tools/ant/sabbus/TaskArgs.scala19
-rw-r--r--tools/get-scala-revision.bat4
6 files changed, 42 insertions, 22 deletions
diff --git a/build.xml b/build.xml
index accaa92ec0..4f359f8894 100644
--- a/build.xml
+++ b/build.xml
@@ -634,11 +634,13 @@ QUICK BUILD (QUICK)
<scalacfork
destdir="${build-quick.dir}/classes/library"
compilerpathref="locker.classpath"
- params="${scalac.args.quick} -Xpluginsdir ${build-quick.dir}/misc/scala-devel/plugins -Xplugin-require:continuations -P:continuations:enable"
+ params="${scalac.args.quick} -Xplugin-require:continuations -P:continuations:enable"
srcdir="${src.dir}/continuations/library"
jvmargs="${scalacfork.jvmargs}">
<include name="**/*.scala"/>
<compilationpath refid="quick.compilation.path"/>
+ <compilerarg value="-Xpluginsdir"/>
+ <compilerarg file="${build-quick.dir}/misc/scala-devel/plugins"/>
</scalacfork>
<touch file="${build-quick.dir}/plugins.complete" verbose="no"/>
<stopwatch name="quick.plugins.timer" action="total"/>
@@ -1147,11 +1149,13 @@ BOOTSTRAPPING BUILD (STRAP)
<scalacfork
destdir="${build-strap.dir}/classes/library"
compilerpathref="pack.classpath"
- params="${scalac.args.all} -Xpluginsdir ${build-strap.dir}/misc/scala-devel/plugins -Xplugin-require:continuations -P:continuations:enable"
+ params="${scalac.args.all} -Xplugin-require:continuations -P:continuations:enable"
srcdir="${src.dir}/continuations/library"
jvmargs="${scalacfork.jvmargs}">
<include name="**/*.scala"/>
<compilationpath refid="strap.compilation.path"/>
+ <compilerarg value="-Xpluginsdir"/>
+ <compilerarg file="${build-strap.dir}/misc/scala-devel/plugins"/>
</scalacfork>
<touch file="${build-strap.dir}/plugins.complete" verbose="no"/>
<stopwatch name="strap.plugins.timer" action="total"/>
diff --git a/src/compiler/scala/tools/ant/sabbus/Make.scala b/src/compiler/scala/tools/ant/sabbus/Make.scala
index 75cd0105ac..57505420c5 100644
--- a/src/compiler/scala/tools/ant/sabbus/Make.scala
+++ b/src/compiler/scala/tools/ant/sabbus/Make.scala
@@ -21,7 +21,7 @@ class Make extends Task with TaskArgs {
if (!compTarget.isEmpty) settings.target = compTarget.get
if (!compilationPath.isEmpty) settings.classpath = compilationPath.get
if (!sourcePath.isEmpty) settings.sourcepath = sourcePath.get
- if (!params.isEmpty) settings.more = params.get
+ settings.extraParams = extraArgsFlat
Compilers.make(id.get, (compilerPath.get.list.map{ path => new File(path).toURI.toURL }), settings)
}
}
diff --git a/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala b/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala
index 5da531146b..a39de64c5a 100644
--- a/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala
+++ b/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala
@@ -23,14 +23,16 @@ import scala.tools.nsc.util.ScalaClassLoader
* - `failonerror`,
* - `timeout`,
* - `jvmargs`,
- * - `argfile`.
+ * - `argfile`,
+ * - `params`.
*
* It also takes the following parameters as nested elements:
* - `src` (for `srcdir`),
* - `classpath`,
* - `sourcepath`,
* - `bootclasspath`,
- * - `extdirs`.
+ * - `extdirs`,
+ * - `compilerarg`.
*
* @author Gilles Dubochet
*/
@@ -99,7 +101,7 @@ class ScalacFork extends ScalaMatchingTask with ScalacShared with TaskArgs {
compTarget foreach (settings.target = _)
compilationPath foreach (settings.classpath = _)
sourcePath foreach (settings.sourcepath = _)
- params foreach (settings.more = _)
+ settings.extraParams = extraArgsFlat
if (isMSIL)
settings.sourcedir = sourceDir
@@ -132,10 +134,17 @@ class ScalacFork extends ScalaMatchingTask with ScalacShared with TaskArgs {
java setClasspath compilerPath
java setClassname MainClass
+ // Encode scalac/javac args for use in a file to be read back via "@file.txt"
+ def encodeScalacArgsFile(t: Traversable[String]) = t map { s =>
+ if(s.find(c => c <= ' ' || "\"'\\".contains(c)).isDefined)
+ "\"" + s.flatMap(c => (if(c == '"' || c == '\\') "\\" else "") + c ) + "\""
+ else s
+ } mkString "\n"
+
// 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 (tokens mkString " ")
+ tempArgFile writeAll encodeScalacArgsFile(tokens)
val paths = List(Some(tempArgFile.toAbsolute.path), argfile).flatten map (_.toString)
val res = execWithArgFiles(java, paths)
diff --git a/src/compiler/scala/tools/ant/sabbus/Settings.scala b/src/compiler/scala/tools/ant/sabbus/Settings.scala
index 4d4e3cdb08..c62ea172ed 100644
--- a/src/compiler/scala/tools/ant/sabbus/Settings.scala
+++ b/src/compiler/scala/tools/ant/sabbus/Settings.scala
@@ -58,16 +58,14 @@ class Settings {
def optimise = optimiseBf
def optimise_=(b: Boolean) { optimiseBf = b }
- private var moreBf: Option[String] = None
- def more = moreBf.get
- def more_=(s: String): this.type = { moreBf = Some(s); this }
-
- private def q(o: AnyRef) = "\"" + o.toString.replace("""\""", """\\""") + "\""
+ private var extraParamsBf: Seq[String] = Seq()
+ def extraParams = extraParamsBf
+ def extraParams_=(s: Seq[String]): this.type = { extraParamsBf = s; this }
def toArgs: List[String] =
(if (!gBf.isEmpty) "-g:"+g :: Nil else Nil) :::
(if (uncheckedBf) "-unchecked" :: Nil else Nil) :::
- (if (!classpathBf.isEmpty) "-classpath" :: q(classpath) :: Nil else Nil) :::
+ (if (!classpathBf.isEmpty) "-classpath" :: classpath.toString :: Nil else Nil) :::
(if (!sourcepathBf.isEmpty) "-sourcepath" :: sourcepath.toString :: Nil else Nil) :::
(if (!sourcedirBf.isEmpty) "-Xsourcedir" :: sourcedir.toString :: Nil else Nil) :::
(if (!bootclasspathBf.isEmpty) "-bootclasspath" :: bootclasspath.toString :: Nil else Nil) :::
@@ -76,7 +74,7 @@ class Settings {
(if (!encodingBf.isEmpty) "-encoding" :: encoding :: Nil else Nil) :::
(if (!targetBf.isEmpty) "-target:"+target :: Nil else Nil) :::
(if (optimiseBf) "-optimise" :: Nil else Nil) :::
- (if (!moreBf.isEmpty) (more split ' ').toList else Nil)
+ extraParamsBf.toList
override def equals(that: Any): Boolean = that match {
case cs: Settings =>
@@ -91,7 +89,7 @@ class Settings {
this.encodingBf == cs.encodingBf &&
this.targetBf == cs.targetBf &&
this.optimiseBf == cs.optimiseBf &&
- this.moreBf == cs.moreBf
+ this.extraParamsBf == cs.extraParamsBf
case _ => false
}
diff --git a/src/compiler/scala/tools/ant/sabbus/TaskArgs.scala b/src/compiler/scala/tools/ant/sabbus/TaskArgs.scala
index b2487355e4..ca210f7187 100644
--- a/src/compiler/scala/tools/ant/sabbus/TaskArgs.scala
+++ b/src/compiler/scala/tools/ant/sabbus/TaskArgs.scala
@@ -12,6 +12,7 @@ package scala.tools.ant.sabbus
import java.io.File
import org.apache.tools.ant.Task
import org.apache.tools.ant.types.{Path, Reference}
+import org.apache.tools.ant.types.Commandline.Argument
trait CompilationPathProperty {
this: Task =>
@@ -41,10 +42,13 @@ trait TaskArgs extends CompilationPathProperty {
}
def setParams(input: String) {
- params = params match {
- case None => Some(input)
- case Some(ps) => Some(ps + " " + input)
- }
+ extraArgs ++= input.split(' ').map { s => val a = new Argument; a.setValue(s); a }
+ }
+
+ def createCompilerArg(): Argument = {
+ val a = new Argument
+ extraArgs :+= a
+ a
}
def setTarget(input: String) {
@@ -84,11 +88,16 @@ trait TaskArgs extends CompilationPathProperty {
}
protected var id: Option[String] = None
- protected var params: Option[String] = None
+ protected var extraArgs: Seq[Argument] = Seq()
protected var compTarget: Option[String] = None
protected var sourcePath: Option[Path] = None
protected var compilerPath: Option[Path] = None
protected var destinationDir: Option[File] = None
+ def extraArgsFlat: Seq[String] = extraArgs flatMap { a =>
+ val parts = a.getParts
+ if(parts eq null) Seq[String]() else parts.toSeq
+ }
+
def isMSIL = compTarget exists (_ == "msil")
}
diff --git a/tools/get-scala-revision.bat b/tools/get-scala-revision.bat
index c9de414cea..880bcc3f5c 100644
--- a/tools/get-scala-revision.bat
+++ b/tools/get-scala-revision.bat
@@ -14,9 +14,9 @@ if "%OS%" NEQ "Windows_NT" (
set _DIR=
if "%*"=="" (
- for /f %%i in ('cd') do set _DIR=%%i
+ for /f "delims=;" %%i in ('cd') do set "_DIR=%%i"
) else (
- set _DIR=%~1
+ set "_DIR=%~1"
)
cd %_DIR%