diff options
author | Paul Phillips <paulp@improving.org> | 2011-11-18 15:16:26 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-11-18 15:16:26 +0000 |
commit | 7c2c8c8adf15e072bf94cfa17ad9b2e1771e3b03 (patch) | |
tree | be050afb479ff50334cf2f13fbbb181b30808855 | |
parent | 955b852dfd9515c5b9ea1950d047db08140ba007 (diff) | |
download | scala-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.xml | 8 | ||||
-rw-r--r-- | src/compiler/scala/tools/ant/sabbus/Make.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/ant/sabbus/ScalacFork.scala | 17 | ||||
-rw-r--r-- | src/compiler/scala/tools/ant/sabbus/Settings.scala | 14 | ||||
-rw-r--r-- | src/compiler/scala/tools/ant/sabbus/TaskArgs.scala | 19 | ||||
-rw-r--r-- | tools/get-scala-revision.bat | 4 |
6 files changed, 42 insertions, 22 deletions
@@ -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% |