src/Pure/ML/ml_process.scala
changeset 83536 45f5af2eec9c
parent 83534 6ed617560333
child 83537 7f14cf99db0d
equal deleted inserted replaced
83535:c2d0eadf32e6 83536:45f5af2eec9c
     6 
     6 
     7 package isabelle
     7 package isabelle
     8 
     8 
     9 
     9 
    10 import java.util.{Map => JMap, HashMap}
    10 import java.util.{Map => JMap, HashMap}
       
    11 
       
    12 import scala.collection.mutable
    11 
    13 
    12 
    14 
    13 object ML_Process {
    15 object ML_Process {
    14   /* process */
    16   /* process */
    15 
    17 
   130 
   132 
   131   /* Isabelle tool wrapper */
   133   /* Isabelle tool wrapper */
   132 
   134 
   133   def tool_body(args: List[String], internal: Boolean = false): Process_Result = {
   135   def tool_body(args: List[String], internal: Boolean = false): Process_Result = {
   134     var cwd = Path.current
   136     var cwd = Path.current
   135     var dirs: List[Path] = Nil
   137     val dirs = new mutable.ListBuffer[Path]
   136     var eval_args: List[String] = Nil
   138     val eval_args = new mutable.ListBuffer[String]
   137     var logic = Isabelle_System.default_logic()
   139     var logic = Isabelle_System.default_logic()
   138     var modes: List[String] = Nil
   140     var modes: List[String] = Nil
   139     var options = Options.init()
   141     var options = Options.init()
   140     var redirect = false
   142     var redirect = false
   141 
   143 
   153     -r           redirect stderr to stdout
   155     -r           redirect stderr to stdout
   154 
   156 
   155   Run the raw ML process without Isabelle/Scala context.
   157   Run the raw ML process without Isabelle/Scala context.
   156 """,
   158 """,
   157       "C:" -> (arg => cwd = Path.explode(arg)),
   159       "C:" -> (arg => cwd = Path.explode(arg)),
   158       "d:" -> (arg => dirs = dirs ::: List(Path.explode(arg))),
   160       "d:" -> (arg => dirs += Path.explode(arg)),
   159       "e:" -> (arg => eval_args = eval_args ::: List("--eval", arg)),
   161       "e:" -> (arg => eval_args ++= List("--eval", arg)),
   160       "f:" -> (arg => eval_args = eval_args ::: List("--use", File.platform_path(arg))),
   162       "f:" -> (arg => eval_args ++= List("--use", File.platform_path(arg))),
   161       "l:" -> (arg => logic = arg),
   163       "l:" -> (arg => logic = arg),
   162       "m:" -> (arg => modes = arg :: modes),
   164       "m:" -> (arg => modes = arg :: modes),
   163       "o:" -> (arg => options = options + arg),
   165       "o:" -> (arg => options = options + arg),
   164       "r" -> (_ => redirect = true))
   166       "r" -> (_ => redirect = true))
   165 
   167 
   166     val more_args = getopts(args, internal = internal)
   168     val more_args = getopts(args, internal = internal)
   167     if (more_args.nonEmpty) getopts.usage(internal = internal)
   169     if (more_args.nonEmpty) getopts.usage(internal = internal)
   168 
   170 
   169     val store = Store(options)
   171     val store = Store(options)
   170     val session_background = Sessions.background(options, logic, dirs = dirs).check_errors
   172     val session_background = Sessions.background(options, logic, dirs = dirs.toList).check_errors
   171     val session_heaps = store.session_heaps(session_background, logic = logic)
   173     val session_heaps = store.session_heaps(session_background, logic = logic)
   172 
   174 
   173     val process =
   175     val process =
   174       ML_Process(options, session_background, session_heaps,
   176       ML_Process(options, session_background, session_heaps,
   175         args = eval_args, modes = modes, cwd = cwd, redirect = redirect)
   177         args = eval_args.toList, modes = modes, cwd = cwd, redirect = redirect)
   176     if (internal) process.result()
   178     if (internal) process.result()
   177     else {
   179     else {
   178       process.result(
   180       process.result(
   179         progress_stdout = Output.writeln(_, stdout = true),
   181         progress_stdout = Output.writeln(_, stdout = true),
   180         progress_stderr = Output.writeln(_))
   182         progress_stderr = Output.writeln(_))