updated file scala/tools/nsc/MainScript.scala to run it in the DOS console
added executables bin/scalascript* to the Scala distribution git-svn-id: http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk@7449 5e8d7ff9-d8ef-0310-90f0-a4852d11357a
This commit is contained in:
parent
c45b05998f
commit
55b21add90
28
build.xml
28
build.xml
|
@ -57,6 +57,7 @@ PROPERTIES
|
||||||
<property name="scalac.exec.name" value="scalac"/>
|
<property name="scalac.exec.name" value="scalac"/>
|
||||||
<property name="scaladoc.exec.name" value="scaladoc"/>
|
<property name="scaladoc.exec.name" value="scaladoc"/>
|
||||||
<property name="scalaint.exec.name" value="scalaint"/>
|
<property name="scalaint.exec.name" value="scalaint"/>
|
||||||
|
<property name="scalascript.exec.name" value="scalascript"/>
|
||||||
|
|
||||||
<!-- ===========================================================================
|
<!-- ===========================================================================
|
||||||
INITIALISATION
|
INITIALISATION
|
||||||
|
@ -338,6 +339,12 @@ BUILD LOCAL REFERENCE (LOCKER) LAYER
|
||||||
class="scala.tools.nsc.MainInterpreter"
|
class="scala.tools.nsc.MainInterpreter"
|
||||||
version="${version.number}"
|
version="${version.number}"
|
||||||
copyright="${copyright.string}"/>
|
copyright="${copyright.string}"/>
|
||||||
|
<lockertool
|
||||||
|
file="${locker.dir}/bin/${scalascript.exec.name}"
|
||||||
|
name="Scala scripting tool"
|
||||||
|
class="scala.tools.nsc.MainScript"
|
||||||
|
version="${version.number}"
|
||||||
|
copyright="${copyright.string}"/>
|
||||||
<chmod perm="ugo+rx"
|
<chmod perm="ugo+rx"
|
||||||
file="${locker.dir}/bin/${scalac.exec.name}"/>
|
file="${locker.dir}/bin/${scalac.exec.name}"/>
|
||||||
<chmod perm="ugo+rx"
|
<chmod perm="ugo+rx"
|
||||||
|
@ -346,7 +353,9 @@ BUILD LOCAL REFERENCE (LOCKER) LAYER
|
||||||
file="${locker.dir}/bin/${scaladoc.exec.name}"/>
|
file="${locker.dir}/bin/${scaladoc.exec.name}"/>
|
||||||
<chmod perm="ugo+rx"
|
<chmod perm="ugo+rx"
|
||||||
file="${locker.dir}/bin/${scalaint.exec.name}"/>
|
file="${locker.dir}/bin/${scalaint.exec.name}"/>
|
||||||
<!-- Mark LOCKER as being completely built -->
|
<chmod perm="ugo+rx"
|
||||||
|
file="${locker.dir}/bin/${scalascript.exec.name}"/>
|
||||||
|
<!-- Mark LOCKER as being completely built -->
|
||||||
<touch file="${locker.dir}/complete" verbose="no"/>
|
<touch file="${locker.dir}/complete" verbose="no"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
@ -450,6 +459,12 @@ BUILD QUICK-TEST LAYER
|
||||||
class="scala.tools.nsc.MainInterpreter"
|
class="scala.tools.nsc.MainInterpreter"
|
||||||
version="${version.number}"
|
version="${version.number}"
|
||||||
copyright="${copyright.string}"/>
|
copyright="${copyright.string}"/>
|
||||||
|
<quicktool
|
||||||
|
file="${quick.dir}/bin/${scalascript.exec.name}"
|
||||||
|
name="Scala scripting tool"
|
||||||
|
class="scala.tools.nsc.MainScript"
|
||||||
|
version="${version.number}"
|
||||||
|
copyright="${copyright.string}"/>
|
||||||
<chmod perm="ugo+rx"
|
<chmod perm="ugo+rx"
|
||||||
file="${quick.dir}/bin/${scalac.exec.name}"/>
|
file="${quick.dir}/bin/${scalac.exec.name}"/>
|
||||||
<chmod perm="ugo+rx"
|
<chmod perm="ugo+rx"
|
||||||
|
@ -458,6 +473,8 @@ BUILD QUICK-TEST LAYER
|
||||||
file="${quick.dir}/bin/${scaladoc.exec.name}"/>
|
file="${quick.dir}/bin/${scaladoc.exec.name}"/>
|
||||||
<chmod perm="ugo+rx"
|
<chmod perm="ugo+rx"
|
||||||
file="${quick.dir}/bin/${scalaint.exec.name}"/>
|
file="${quick.dir}/bin/${scalaint.exec.name}"/>
|
||||||
|
<chmod perm="ugo+rx"
|
||||||
|
file="${quick.dir}/bin/${scalascript.exec.name}"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="test.quick" depends="build">
|
<target name="test.quick" depends="build">
|
||||||
|
@ -564,6 +581,12 @@ TEST
|
||||||
class="scala.tools.nsc.MainInterpreter"
|
class="scala.tools.nsc.MainInterpreter"
|
||||||
version="${version.number}"
|
version="${version.number}"
|
||||||
copyright="${copyright.string}"/>
|
copyright="${copyright.string}"/>
|
||||||
|
<straptool
|
||||||
|
file="${strap.dir}/bin/${scalascript.exec.name}"
|
||||||
|
name="Scala scripting tool"
|
||||||
|
class="scala.tools.nsc.MainScript"
|
||||||
|
version="${version.number}"
|
||||||
|
copyright="${copyright.string}"/>
|
||||||
<chmod perm="ugo+rx"
|
<chmod perm="ugo+rx"
|
||||||
file="${strap.dir}/bin/${scalac.exec.name}"/>
|
file="${strap.dir}/bin/${scalac.exec.name}"/>
|
||||||
<chmod perm="ugo+rx"
|
<chmod perm="ugo+rx"
|
||||||
|
@ -572,6 +595,8 @@ TEST
|
||||||
file="${strap.dir}/bin/${scaladoc.exec.name}"/>
|
file="${strap.dir}/bin/${scaladoc.exec.name}"/>
|
||||||
<chmod perm="ugo+rx"
|
<chmod perm="ugo+rx"
|
||||||
file="${strap.dir}/bin/${scalaint.exec.name}"/>
|
file="${strap.dir}/bin/${scalaint.exec.name}"/>
|
||||||
|
<chmod perm="ugo+rx"
|
||||||
|
file="${strap.dir}/bin/${scalascript.exec.name}"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Compares quick and test level -->
|
<!-- Compares quick and test level -->
|
||||||
|
@ -722,6 +747,7 @@ GENERATES A DISTRIBUTION
|
||||||
<chmod perm="ugo+rx" file="${dist.current.dir}/bin/${scala.exec.name}"/>
|
<chmod perm="ugo+rx" file="${dist.current.dir}/bin/${scala.exec.name}"/>
|
||||||
<chmod perm="ugo+rx" file="${dist.current.dir}/bin/${scaladoc.exec.name}"/>
|
<chmod perm="ugo+rx" file="${dist.current.dir}/bin/${scaladoc.exec.name}"/>
|
||||||
<chmod perm="ugo+rx" file="${dist.current.dir}/bin/${scalaint.exec.name}"/>
|
<chmod perm="ugo+rx" file="${dist.current.dir}/bin/${scalaint.exec.name}"/>
|
||||||
|
<chmod perm="ugo+rx" file="${dist.current.dir}/bin/${scalascript.exec.name}"/>
|
||||||
<!-- Copy the API, examples and man -->
|
<!-- Copy the API, examples and man -->
|
||||||
<copy todir="${dist.current.dir}/doc/scala">
|
<copy todir="${dist.current.dir}/doc/scala">
|
||||||
<fileset dir="${docs.dir}" includes="README,LICENSE"/>
|
<fileset dir="${docs.dir}" includes="README,LICENSE"/>
|
||||||
|
|
|
@ -1,14 +1,32 @@
|
||||||
|
/* NSC -- new Scala compiler
|
||||||
|
* Copyright 2005-2006 LAMP/EPFL
|
||||||
|
* @author Martin Odersky
|
||||||
|
*/
|
||||||
|
// $Id: $
|
||||||
|
|
||||||
package scala.tools.nsc
|
package scala.tools.nsc
|
||||||
|
|
||||||
import java.io.{BufferedReader,FileReader}
|
import java.io.{BufferedReader,FileReader}
|
||||||
|
|
||||||
/** A main routine to support putting Scala code into scripts. An example
|
/** A main routine to support putting Scala code into scripts.
|
||||||
* script would look like this:
|
*
|
||||||
|
* An shell script example on Unix would look like this:
|
||||||
*
|
*
|
||||||
* #!/bin/sh
|
* #!/bin/sh
|
||||||
* scalascript $0 "$@"
|
* exec scalascript "$0" "$@"
|
||||||
* !#
|
* !#
|
||||||
* Console.println("Hello, world!")
|
* Console.println("Hello, world!")
|
||||||
|
* argv.toList foreach Console.println
|
||||||
*
|
*
|
||||||
|
* A batch file example on Windows XP would look like this:
|
||||||
|
*
|
||||||
|
* ::#!
|
||||||
|
* @echo off
|
||||||
|
* call scalascript %0 %*
|
||||||
|
* goto :eof
|
||||||
|
* ::!#
|
||||||
|
* Console.println("Hello, world!")
|
||||||
|
* argv.toList foreach Console.println
|
||||||
*
|
*
|
||||||
* TODO: It would be better if error output went to stderr instead
|
* TODO: It would be better if error output went to stderr instead
|
||||||
* of stdout....
|
* of stdout....
|
||||||
|
@ -18,6 +36,9 @@ object MainScript {
|
||||||
* part if there is one. The header part starts with "#!"
|
* part if there is one. The header part starts with "#!"
|
||||||
* and ends with a line that begins with "!#".
|
* and ends with a line that begins with "!#".
|
||||||
*/
|
*/
|
||||||
|
val startRegexp = "^(::)?#!.*"
|
||||||
|
val endRegexp = "^(::)?!#.*"
|
||||||
|
|
||||||
def readFileSkippingHeader(filename: String): String = {
|
def readFileSkippingHeader(filename: String): String = {
|
||||||
val file =
|
val file =
|
||||||
new BufferedReader(
|
new BufferedReader(
|
||||||
|
@ -26,36 +47,36 @@ object MainScript {
|
||||||
|
|
||||||
// skip the header, if there is one
|
// skip the header, if there is one
|
||||||
val firstLine = file.readLine
|
val firstLine = file.readLine
|
||||||
if(firstLine == null)
|
if (firstLine == null)
|
||||||
return ""
|
return ""
|
||||||
else if(firstLine.startsWith("#!")) {
|
else if (firstLine.matches(startRegexp)) {
|
||||||
// skip until !# is seen
|
// skip until !# is seen
|
||||||
def lp:Unit = {
|
def lp: Unit = {
|
||||||
val line = file.readLine
|
val line = file.readLine
|
||||||
if(line == null)
|
if (line == null)
|
||||||
()
|
()
|
||||||
else if(!line.startsWith("!#"))
|
else if (!line.matches(endRegexp))
|
||||||
lp
|
lp
|
||||||
}
|
}
|
||||||
lp
|
lp
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
contents.append(firstLine)
|
contents.append(firstLine)
|
||||||
|
|
||||||
// now read the rest of the file
|
// now read the rest of the file
|
||||||
def lp: Unit = {
|
def lp: Unit = {
|
||||||
val line = file.readLine
|
val line = file.readLine
|
||||||
if(line == null)
|
if (line == null)
|
||||||
return ()
|
return ()
|
||||||
contents.append(line)
|
contents.append(line)
|
||||||
contents.append("\n")
|
contents.append("\n")
|
||||||
lp
|
lp
|
||||||
}
|
}
|
||||||
lp
|
lp
|
||||||
|
|
||||||
contents.toString
|
contents.toString
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Print a usage message and then exit. */
|
/** Print a usage message and then exit. */
|
||||||
def usageExit: Nothing = {
|
def usageExit: Nothing = {
|
||||||
Console.println(
|
Console.println(
|
||||||
|
@ -77,21 +98,21 @@ object MainScript {
|
||||||
def parseArgs(args: List[String])
|
def parseArgs(args: List[String])
|
||||||
:Tuple3[List[String], String, List[String]] =
|
:Tuple3[List[String], String, List[String]] =
|
||||||
{
|
{
|
||||||
if(args.length == 0)
|
if (args.length == 0)
|
||||||
usageExit
|
usageExit
|
||||||
|
|
||||||
if(args(0).startsWith("-")) {
|
if (args(0).startsWith("-")) {
|
||||||
// the line includes compiler arguments
|
// the line includes compiler arguments
|
||||||
val hyphenIndex = args.indexOf("-")
|
val hyphenIndex = args.indexOf("-")
|
||||||
if(hyphenIndex < 0)
|
if (hyphenIndex < 0)
|
||||||
usageExit
|
usageExit
|
||||||
if(hyphenIndex == (args.length - 1))
|
if (hyphenIndex == (args.length - 1))
|
||||||
usageExit
|
usageExit
|
||||||
|
|
||||||
Tuple3(
|
Tuple3(
|
||||||
args.subseq(0, hyphenIndex).toList,
|
args.subseq(0, hyphenIndex).toList,
|
||||||
args(hyphenIndex+1),
|
args(hyphenIndex + 1),
|
||||||
args.subseq(hyphenIndex+2, args.length - hyphenIndex - 2).toList)
|
args.subseq(hyphenIndex + 2, args.length - hyphenIndex - 2).toList)
|
||||||
} else {
|
} else {
|
||||||
Tuple3(
|
Tuple3(
|
||||||
Nil,
|
Nil,
|
||||||
|
@ -99,40 +120,41 @@ object MainScript {
|
||||||
args.subseq(1, args.length-1).toList)
|
args.subseq(1, args.length-1).toList)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def main(args: Array[String]): Unit = {
|
def main(args: Array[String]): Unit = {
|
||||||
val parsedArgs = parseArgs(args.toList)
|
val parsedArgs = parseArgs(args.toList)
|
||||||
val compilerArgs = parsedArgs._1
|
val compilerArgs = parsedArgs._1
|
||||||
val scriptFile = parsedArgs._2
|
val scriptFile = parsedArgs._2
|
||||||
val scriptArgs = parsedArgs._3.toArray
|
val scriptArgs = parsedArgs._3.toArray
|
||||||
|
|
||||||
val command =
|
val command =
|
||||||
new CompilerCommand(
|
new CompilerCommand(
|
||||||
compilerArgs,
|
compilerArgs,
|
||||||
Console.println,
|
Console.println,
|
||||||
false)
|
false)
|
||||||
|
|
||||||
if (!command.ok || command.settings.help.value) {
|
if (!command.ok || command.settings.help.value) {
|
||||||
// either the command line is wrong, or the user
|
// either the command line is wrong, or the user
|
||||||
// explicitly requested a help listing
|
// explicitly requested a help listing
|
||||||
if(!command.ok)
|
if (!command.ok)
|
||||||
Console.println
|
Console.println
|
||||||
usageExit
|
usageExit
|
||||||
}
|
}
|
||||||
|
|
||||||
val scriptContents = readFileSkippingHeader(scriptFile)
|
val scriptContents = readFileSkippingHeader(scriptFile)
|
||||||
val toRun =
|
val toRun =
|
||||||
"package scala.scripting\n" +
|
"package scala.scripting\n" +
|
||||||
"object Main {\n" +
|
"object Main {\n" +
|
||||||
" def main(argv: Array[String]): Unit = {\n" +
|
" def main(argv: Array[String]): Unit = {\n" +
|
||||||
scriptContents +
|
scriptContents +
|
||||||
"\n} }\n"
|
"\n} }\n"
|
||||||
|
|
||||||
val interpreter = new Interpreter(command.settings)
|
val interpreter = new Interpreter(command.settings)
|
||||||
interpreter.beQuiet
|
interpreter.beQuiet
|
||||||
if(!interpreter.compileString(toRun))
|
if (!interpreter.compileString(toRun))
|
||||||
return () // compilation error
|
return () // compilation error
|
||||||
interpreter.bind("argv", "Array[String]", scriptArgs)
|
interpreter.bind("argv", "Array[String]", scriptArgs)
|
||||||
interpreter.interpret("scala.scripting.Main.main(argv)")
|
interpreter.interpret("scala.scripting.Main.main(argv)")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue