clarified signature of ML_Process vs. Isabelle_Process: proper support for "isabelle build -P -b";
--- a/src/Pure/ML/ml_process.scala Tue Mar 31 14:40:56 2020 +0200
+++ b/src/Pure/ML/ml_process.scala Tue Mar 31 22:27:02 2020 +0200
@@ -16,9 +16,11 @@
sessions_structure: Sessions.Structure,
store: Sessions.Store,
logic: String = "",
+ raw_ml_system: Boolean = false,
+ use_prelude: List[String] = Nil,
+ eval_main: String = "",
args: List[String] = Nil,
modes: List[String] = Nil,
- raw_ml_system: Boolean = false,
cwd: JFile = null,
env: Map[String, String] = Isabelle_System.settings(),
redirect: Boolean = false,
@@ -100,9 +102,11 @@
// process
val eval_process =
- if (heaps.isEmpty)
- List("PolyML.print_depth " + ML_Syntax.print_int(options.int("ML_print_depth")))
- else List("Isabelle_Process.init ()")
+ proper_string(eval_main).getOrElse(
+ if (heaps.isEmpty) {
+ "PolyML.print_depth " + ML_Syntax.print_int(options.int("ML_print_depth"))
+ }
+ else "Isabelle_Process.init ()")
// ISABELLE_TMP
val isabelle_tmp = Isabelle_System.tmp_dir("process")
@@ -123,8 +127,8 @@
// bash
val bash_args =
ml_runtime_options :::
- (eval_init ::: eval_modes ::: eval_options ::: eval_session_base ::: eval_process)
- .flatMap(eval => List("--eval", eval)) ::: args
+ (eval_init ::: eval_modes ::: eval_options ::: eval_session_base).flatMap(List("--eval", _)) :::
+ use_prelude.flatMap(List("--use", _)) ::: List("--eval", eval_process) ::: args
Bash.process(
"exec " + options.string("ML_process_policy") + """ "$ML_HOME/poly" -q """ +
--- a/src/Pure/System/isabelle_process.scala Tue Mar 31 14:40:56 2020 +0200
+++ b/src/Pure/System/isabelle_process.scala Tue Mar 31 22:27:02 2020 +0200
@@ -18,7 +18,9 @@
sessions_structure: Sessions.Structure,
store: Sessions.Store,
logic: String = "",
- args: List[String] = Nil,
+ raw_ml_system: Boolean = false,
+ use_prelude: List[String] = Nil,
+ eval_main: String = "",
modes: List[String] = Nil,
cwd: JFile = null,
env: Map[String, String] = Isabelle_System.settings()): Isabelle_Process =
@@ -30,7 +32,9 @@
options.string.update("system_channel_address", channel.address).
string.update("system_channel_password", channel.password)
ML_Process(channel_options, sessions_structure, store,
- logic = logic, args = args, modes = modes, cwd = cwd, env = env)
+ logic = logic, raw_ml_system = raw_ml_system,
+ use_prelude = use_prelude, eval_main = eval_main,
+ modes = modes, cwd = cwd, env = env)
}
catch { case exn @ ERROR(_) => channel.shutdown(); throw exn }
process.stdin.close
--- a/src/Pure/Tools/build.scala Tue Mar 31 14:40:56 2020 +0200
+++ b/src/Pure/Tools/build.scala Tue Mar 31 22:27:02 2020 +0200
@@ -242,23 +242,29 @@
val is_pure = Sessions.is_pure(name)
+ val use_prelude = if (is_pure) Thy_Header.ml_roots.map(_._1) else Nil
+
val eval_store =
- if (!do_store) Nil
- else {
+ if (do_store) {
(if (info.theories.nonEmpty) List("ML_Heap.share_common_data ()") else Nil) :::
List("ML_Heap.save_child " +
ML_Syntax.print_string_bytes(File.platform_path(store.output_heap(name))))
}
+ else Nil
if (pide && !is_pure) {
- val resources = new Resources(sessions_structure, deps(parent))
+ val resources = new Resources(sessions_structure, deps(name))
val session = new Session(options, resources)
val handler = new Handler(progress, session, name)
session.init_protocol_handler(handler)
+ val eval_main = Command_Line.ML_tool("Isabelle_Process.init ()" :: eval_store)
+
val process =
Isabelle_Process(session, options, sessions_structure, store,
- logic = parent, cwd = info.dir.file, env = env).await_startup
+ logic = parent, raw_ml_system = is_pure,
+ use_prelude = use_prelude, eval_main = eval_main,
+ cwd = info.dir.file, env = env).await_startup
session.protocol_command("build_session", args_yxml)
@@ -275,22 +281,15 @@
val args_file = Isabelle_System.tmp_file("build")
File.write(args_file, args_yxml)
- val eval_build = "Build.build " + ML_Syntax.print_string_bytes(File.standard_path(args_file))
- val eval = Command_Line.ML_tool(eval_build :: eval_store)
+ val eval_build =
+ "Build.build " + ML_Syntax.print_string_bytes(File.standard_path(args_file))
+ val eval_main = Command_Line.ML_tool(eval_build :: eval_store)
val process =
- if (is_pure) {
- ML_Process(options, deps.sessions_structure, store, raw_ml_system = true,
- args =
- (for ((root, _) <- Thy_Header.ml_roots) yield List("--use", root)).flatten :::
- List("--eval", eval),
- cwd = info.dir.file, env = env, cleanup = () => args_file.delete)
- }
- else {
- ML_Process(options, deps.sessions_structure, store, logic = parent,
- args = List("--eval", eval),
- cwd = info.dir.file, env = env, cleanup = () => args_file.delete)
- }
+ ML_Process(options, deps.sessions_structure, store,
+ logic = parent, raw_ml_system = is_pure,
+ use_prelude = use_prelude, eval_main = eval_main,
+ cwd = info.dir.file, env = env, cleanup = () => args_file.delete)
process.result(
progress_stdout =