| author | wenzelm | 
| Sat, 10 Mar 2018 13:37:22 +0100 | |
| changeset 67809 | a5fa8d854e5e | 
| parent 67493 | c4e9e0c50487 | 
| child 68088 | 0763d4eb3ebc | 
| permissions | -rw-r--r-- | 
| 50686 | 1 | (* Title: Pure/Tools/build.ML | 
| 48418 | 2 | Author: Makarius | 
| 3 | ||
| 4 | Build Isabelle sessions. | |
| 5 | *) | |
| 6 | ||
| 7 | signature BUILD = | |
| 8 | sig | |
| 48731 
a45ba78abcc1
more casual exit back to ML toplevel, to accomodate commit in SML/NJ which continues at the saved point;
 wenzelm parents: 
48681diff
changeset | 9 | val build: string -> unit | 
| 48418 | 10 | end; | 
| 11 | ||
| 12 | structure Build: BUILD = | |
| 13 | struct | |
| 14 | ||
| 51662 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 15 | (* command timings *) | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 16 | |
| 56615 | 17 | type timings = ((string * Time.time) Inttab.table) Symtab.table; (*file -> offset -> name, time*) | 
| 51662 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 18 | |
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 19 | val empty_timings: timings = Symtab.empty; | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 20 | |
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 21 | fun update_timings props = | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 22 | (case Markup.parse_command_timing_properties props of | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 23 |     SOME ({file, offset, name}, time) =>
 | 
| 51666 
b97aeb018900
add command timings (like document command status);
 wenzelm parents: 
51662diff
changeset | 24 | Symtab.map_default (file, Inttab.empty) | 
| 62826 | 25 | (Inttab.map_default (offset, (name, time)) (fn (_, t) => (name, t + time))) | 
| 51662 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 26 | | NONE => I); | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 27 | |
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 28 | fun approximative_id name pos = | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 29 | (case (Position.file_of pos, Position.offset_of pos) of | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 30 | (SOME file, SOME offset) => | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 31 |       if name = "" then NONE else SOME {file = file, offset = offset, name = name}
 | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 32 | | _ => NONE); | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 33 | |
| 65058 
3e9f382fb67e
absent timing information means zero, according to 0070053570c4, f235646b1b73;
 wenzelm parents: 
64599diff
changeset | 34 | fun get_timings timings tr = | 
| 51662 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 35 | (case approximative_id (Toplevel.name_of tr) (Toplevel.pos_of tr) of | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 36 |     SOME {file, offset, name} =>
 | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 37 | (case Symtab.lookup timings file of | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 38 | SOME offsets => | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 39 | (case Inttab.lookup offsets offset of | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 40 | SOME (name', time) => if name = name' then SOME time else NONE | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 41 | | NONE => NONE) | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 42 | | NONE => NONE) | 
| 65058 
3e9f382fb67e
absent timing information means zero, according to 0070053570c4, f235646b1b73;
 wenzelm parents: 
64599diff
changeset | 43 | | NONE => NONE) | 
| 
3e9f382fb67e
absent timing information means zero, according to 0070053570c4, f235646b1b73;
 wenzelm parents: 
64599diff
changeset | 44 | |> the_default Time.zeroTime; | 
| 51662 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 45 | |
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 46 | |
| 52052 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 47 | (* session timing *) | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 48 | |
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 49 | fun session_timing name verbose f x = | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 50 | let | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 51 | val start = Timing.start (); | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 52 | val y = f x; | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 53 | val timing = Timing.result start; | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 54 | |
| 62925 | 55 | val threads = string_of_int (Multithreading.max_threads ()); | 
| 52052 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 56 | val factor = Time.toReal (#cpu timing) / Time.toReal (#elapsed timing) | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 57 | |> Real.fmt (StringCvt.FIX (SOME 2)); | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 58 | |
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 59 | val timing_props = | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 60 |       [("threads", threads)] @ Markup.timing_properties timing @ [("factor", factor)];
 | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 61 |     val _ = writeln ("\fTiming = " ^ YXML.string_of_body (XML.Encode.properties timing_props));
 | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 62 | val _ = | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 63 | if verbose then | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 64 |         Output.physical_stderr ("Timing " ^ name ^ " (" ^
 | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 65 | threads ^ " threads, " ^ Timing.message timing ^ ", factor " ^ factor ^ ")\n") | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 66 | else (); | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 67 | in y end; | 
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 68 | |
| 
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
 wenzelm parents: 
52041diff
changeset | 69 | |
| 50683 | 70 | (* protocol messages *) | 
| 71 | ||
| 51662 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 72 | fun inline_message a args = | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 73 |   writeln ("\f" ^ a ^ " = " ^ YXML.string_of_body (XML.Encode.properties args));
 | 
| 50683 | 74 | |
| 75 | fun protocol_message props output = | |
| 51216 | 76 | (case props of | 
| 77 | function :: args => | |
| 51662 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 78 | if function = Markup.ML_statistics orelse function = Markup.task_statistics then | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 79 | inline_message (#2 function) args | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 80 | else if function = Markup.command_timing then | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 81 | let | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 82 | val name = the_default "" (Properties.get args Markup.nameN); | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 83 | val pos = Position.of_properties args; | 
| 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 84 |           val {elapsed, ...} = Markup.parse_timing_properties args;
 | 
| 62793 
f235646b1b73
less bulky timing information, e.g. HOL 56913 ~> 672;
 wenzelm parents: 
62715diff
changeset | 85 | val is_significant = | 
| 
f235646b1b73
less bulky timing information, e.g. HOL 56913 ~> 672;
 wenzelm parents: 
62715diff
changeset | 86 | Timing.is_relevant_time elapsed andalso | 
| 62826 | 87 | elapsed >= Options.default_seconds "command_timing_threshold"; | 
| 51662 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 88 | in | 
| 62793 
f235646b1b73
less bulky timing information, e.g. HOL 56913 ~> 672;
 wenzelm parents: 
62715diff
changeset | 89 | if is_significant then | 
| 59149 
0070053570c4
suppress irrelevant timing messages (the majority);
 wenzelm parents: 
59058diff
changeset | 90 | (case approximative_id name pos of | 
| 
0070053570c4
suppress irrelevant timing messages (the majority);
 wenzelm parents: 
59058diff
changeset | 91 | SOME id => inline_message (#2 function) (Markup.command_timing_properties id elapsed) | 
| 
0070053570c4
suppress irrelevant timing messages (the majority);
 wenzelm parents: 
59058diff
changeset | 92 | | NONE => ()) | 
| 
0070053570c4
suppress irrelevant timing messages (the majority);
 wenzelm parents: 
59058diff
changeset | 93 | else () | 
| 51662 
3391a493f39a
just one timing protocol function, with 3 implementations: TTY/PG, PIDE/document, build;
 wenzelm parents: 
51661diff
changeset | 94 | end | 
| 66873 
9953ae603a23
provide theory timing information, similar to command timing but always considered relevant;
 wenzelm parents: 
66712diff
changeset | 95 | else if function = Markup.theory_timing then | 
| 
9953ae603a23
provide theory timing information, similar to command timing but always considered relevant;
 wenzelm parents: 
66712diff
changeset | 96 | inline_message (#2 function) args | 
| 51216 | 97 | else | 
| 98 | (case Markup.dest_loading_theory props of | |
| 99 |           SOME name => writeln ("\floading_theory = " ^ name)
 | |
| 51661 | 100 | | NONE => raise Output.Protocol_Message props) | 
| 101 | | [] => raise Output.Protocol_Message props); | |
| 51045 
630c0895d9d1
more efficient inlined properties, especially relevant for voluminous tasks trace;
 wenzelm parents: 
50982diff
changeset | 102 | |
| 50683 | 103 | |
| 65307 | 104 | (* build theories *) | 
| 50683 | 105 | |
| 67297 
86a099f896fc
formal check of @{cite} bibtex entries -- only in batch-mode session builds;
 wenzelm parents: 
67219diff
changeset | 106 | fun build_theories symbols bibtex_entries last_timing qualifier master_dir (options, thys) = | 
| 59366 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 107 | let | 
| 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 108 | val condition = space_explode "," (Options.string options "condition"); | 
| 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 109 | val conds = filter_out (can getenv_strict) condition; | 
| 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 110 | in | 
| 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 111 | if null conds then | 
| 63827 
b24d0e53dd03
option "checkpoint" helps to fine-tune global heap space management;
 wenzelm parents: 
62930diff
changeset | 112 | (if Options.bool options "checkpoint" then ML_Heap.share_common_data () else (); | 
| 
b24d0e53dd03
option "checkpoint" helps to fine-tune global heap space management;
 wenzelm parents: 
62930diff
changeset | 113 | Options.set_default options; | 
| 62714 | 114 | Isabelle_Process.init_options (); | 
| 64599 
80ef54198f44
dummy fork to produce ML_statistics even in sequential mode (e.g. for heap size);
 wenzelm parents: 
64308diff
changeset | 115 | Future.fork I; | 
| 59366 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 116 |         (Thy_Info.use_theories {
 | 
| 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 117 | document = Present.document_enabled (Options.string options "document"), | 
| 61381 | 118 | symbols = symbols, | 
| 67297 
86a099f896fc
formal check of @{cite} bibtex entries -- only in batch-mode session builds;
 wenzelm parents: 
67219diff
changeset | 119 | bibtex_entries = bibtex_entries, | 
| 59366 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 120 | last_timing = last_timing, | 
| 65445 
e9e7f5f5794c
more qualifier treatment, but in the end it is still ignored;
 wenzelm parents: 
65443diff
changeset | 121 | qualifier = qualifier, | 
| 59366 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 122 | master_dir = master_dir} | 
| 64308 | 123 | |> | 
| 124 | (case Options.string options "profiling" of | |
| 125 | "" => I | |
| 126 | | "time" => profile_time | |
| 127 | | "allocations" => profile_allocations | |
| 128 |           | bad => error ("Bad profiling option: " ^ quote bad))
 | |
| 59366 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 129 | |> Unsynchronized.setmp print_mode | 
| 62714 | 130 | (space_explode "," (Options.string options "print_mode") @ print_mode_value ())) thys) | 
| 59366 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 131 | else | 
| 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 132 |       Output.physical_stderr ("Skipping theories " ^ commas_quote (map #1 thys) ^
 | 
| 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 133 | " (undefined " ^ commas conds ^ ")\n") | 
| 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 134 | end; | 
| 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 135 | |
| 65307 | 136 | |
| 137 | (* build session *) | |
| 138 | ||
| 139 | datatype args = Args of | |
| 140 |  {symbol_codes: (string * int) list,
 | |
| 141 | command_timings: Properties.T list, | |
| 142 | do_output: bool, | |
| 143 | verbose: bool, | |
| 144 | browser_info: Path.T, | |
| 145 | document_files: (Path.T * Path.T) list, | |
| 146 | graph_file: Path.T, | |
| 147 | parent_name: string, | |
| 148 | chapter: string, | |
| 149 | name: string, | |
| 150 | master_dir: Path.T, | |
| 65431 
4a3e6cda3b94
provide session base for "isabelle build" and "isabelle console" ML process;
 wenzelm parents: 
65318diff
changeset | 151 | theories: (Options.T * (string * Position.T) list) list, | 
| 67493 
c4e9e0c50487
treat sessions as entities with defining position;
 wenzelm parents: 
67471diff
changeset | 152 | sessions: (string * Properties.T) list, | 
| 67471 | 153 | doc_names: string list, | 
| 65457 | 154 | global_theories: (string * string) list, | 
| 66712 | 155 | loaded_theories: string list, | 
| 67297 
86a099f896fc
formal check of @{cite} bibtex entries -- only in batch-mode session builds;
 wenzelm parents: 
67219diff
changeset | 156 | known_theories: (string * string) list, | 
| 
86a099f896fc
formal check of @{cite} bibtex entries -- only in batch-mode session builds;
 wenzelm parents: 
67219diff
changeset | 157 | bibtex_entries: string list}; | 
| 65307 | 158 | |
| 159 | fun decode_args yxml = | |
| 62630 | 160 | let | 
| 65307 | 161 | open XML.Decode; | 
| 65517 | 162 | val position = Position.of_properties o properties; | 
| 62630 | 163 | val (symbol_codes, (command_timings, (do_output, (verbose, (browser_info, | 
| 65431 
4a3e6cda3b94
provide session base for "isabelle build" and "isabelle console" ML process;
 wenzelm parents: 
65318diff
changeset | 164 | (document_files, (graph_file, (parent_name, (chapter, (name, (master_dir, | 
| 67471 | 165 | (theories, (sessions, (doc_names, (global_theories, (loaded_theories, | 
| 166 | (known_theories, bibtex_entries))))))))))))))))) = | |
| 65307 | 167 | pair (list (pair string int)) (pair (list properties) (pair bool (pair bool (pair string | 
| 168 | (pair (list (pair string string)) (pair string (pair string (pair string (pair string | |
| 65431 
4a3e6cda3b94
provide session base for "isabelle build" and "isabelle console" ML process;
 wenzelm parents: 
65318diff
changeset | 169 | (pair string | 
| 65517 | 170 | (pair (((list (pair Options.decode (list (pair string position)))))) | 
| 67493 
c4e9e0c50487
treat sessions as entities with defining position;
 wenzelm parents: 
67471diff
changeset | 171 | (pair (list (pair string properties)) (pair (list string) | 
| 
c4e9e0c50487
treat sessions as entities with defining position;
 wenzelm parents: 
67471diff
changeset | 172 | (pair (list (pair string string)) (pair (list string) | 
| 
c4e9e0c50487
treat sessions as entities with defining position;
 wenzelm parents: 
67471diff
changeset | 173 | (pair (list (pair string string)) (list string))))))))))))))))) | 
| 65307 | 174 | (YXML.parse_body yxml); | 
| 175 | in | |
| 176 |     Args {symbol_codes = symbol_codes, command_timings = command_timings, do_output = do_output,
 | |
| 177 | verbose = verbose, browser_info = Path.explode browser_info, | |
| 178 | document_files = map (apply2 Path.explode) document_files, | |
| 179 | graph_file = Path.explode graph_file, parent_name = parent_name, chapter = chapter, | |
| 67219 | 180 | name = name, master_dir = Path.explode master_dir, theories = theories, sessions = sessions, | 
| 67471 | 181 | doc_names = doc_names, global_theories = global_theories, loaded_theories = loaded_theories, | 
| 67297 
86a099f896fc
formal check of @{cite} bibtex entries -- only in batch-mode session builds;
 wenzelm parents: 
67219diff
changeset | 182 | known_theories = known_theories, bibtex_entries = bibtex_entries} | 
| 65307 | 183 | end; | 
| 48418 | 184 | |
| 65307 | 185 | fun build_session (Args {symbol_codes, command_timings, do_output, verbose, browser_info,
 | 
| 67219 | 186 | document_files, graph_file, parent_name, chapter, name, master_dir, theories, sessions, | 
| 67471 | 187 | doc_names, global_theories, loaded_theories, known_theories, bibtex_entries}) = | 
| 65307 | 188 | let | 
| 62630 | 189 | val symbols = HTML.make_symbols symbol_codes; | 
| 51941 
ead4248aef3b
full default options for Isabelle_Process and Build;
 wenzelm parents: 
51666diff
changeset | 190 | |
| 65441 | 191 | val _ = | 
| 65478 
7c40477e0a87
clarified init_session_base / finish_session_base: retain some information for plain "isabelle process", without rechecking dependencies as in "isabelle console";
 wenzelm parents: 
65457diff
changeset | 192 | Resources.init_session_base | 
| 67219 | 193 |         {sessions = sessions,
 | 
| 67493 
c4e9e0c50487
treat sessions as entities with defining position;
 wenzelm parents: 
67471diff
changeset | 194 | docs = doc_names, | 
| 67219 | 195 | global_theories = global_theories, | 
| 65441 | 196 | loaded_theories = loaded_theories, | 
| 197 | known_theories = known_theories}; | |
| 65431 
4a3e6cda3b94
provide session base for "isabelle build" and "isabelle console" ML process;
 wenzelm parents: 
65318diff
changeset | 198 | |
| 62630 | 199 | val _ = | 
| 200 | Session.init | |
| 201 | symbols | |
| 202 | do_output | |
| 203 | (Options.default_bool "browser_info") | |
| 65307 | 204 | browser_info | 
| 62630 | 205 | (Options.default_string "document") | 
| 206 | (Options.default_string "document_output") | |
| 207 | (Present.document_variants (Options.default_string "document_variants")) | |
| 65307 | 208 | document_files | 
| 209 | graph_file | |
| 210 | parent_name | |
| 211 | (chapter, name) | |
| 62630 | 212 | verbose; | 
| 49911 
262c36fd5f26
collective errors from use_thys and Session.finish/Goal.finish_futures -- avoid uninformative interrupts stemming from failure of goal forks that are not registered in the theory (e.g. unnamed theorems);
 wenzelm parents: 
49242diff
changeset | 213 | |
| 65058 
3e9f382fb67e
absent timing information means zero, according to 0070053570c4, f235646b1b73;
 wenzelm parents: 
64599diff
changeset | 214 | val last_timing = get_timings (fold update_timings command_timings empty_timings); | 
| 51218 
6425a0d3b7ac
support for build passing timings from Scala to ML;
 wenzelm parents: 
51217diff
changeset | 215 | |
| 62630 | 216 | val res1 = | 
| 217 | theories |> | |
| 67297 
86a099f896fc
formal check of @{cite} bibtex entries -- only in batch-mode session builds;
 wenzelm parents: 
67219diff
changeset | 218 | (List.app (build_theories symbols bibtex_entries last_timing name master_dir) | 
| 62630 | 219 | |> session_timing name verbose | 
| 220 | |> Exn.capture); | |
| 221 | val res2 = Exn.capture Session.finish (); | |
| 65431 
4a3e6cda3b94
provide session base for "isabelle build" and "isabelle console" ML process;
 wenzelm parents: 
65318diff
changeset | 222 | |
| 65478 
7c40477e0a87
clarified init_session_base / finish_session_base: retain some information for plain "isabelle process", without rechecking dependencies as in "isabelle console";
 wenzelm parents: 
65457diff
changeset | 223 | val _ = Resources.finish_session_base (); | 
| 62630 | 224 | val _ = Par_Exn.release_all [res1, res2]; | 
| 65307 | 225 | in () end; | 
| 48673 
b2b09970c571
let with_timing report overall number of threads;
 wenzelm parents: 
48672diff
changeset | 226 | |
| 65307 | 227 | (*command-line tool*) | 
| 228 | fun build args_file = | |
| 229 | let | |
| 230 | val _ = SHA1.test_samples (); | |
| 231 | val _ = Options.load_default (); | |
| 232 | val _ = Isabelle_Process.init_options (); | |
| 65936 | 233 | val args = decode_args (File.read (Path.explode args_file)); | 
| 66048 
d244a895da50
avoid markup, for the sake of Build_Log.Log_File.parse_props;
 wenzelm parents: 
65948diff
changeset | 234 |     fun error_message msg = writeln ("\ferror_message = " ^ encode_lines (YXML.content_of msg));
 | 
| 65307 | 235 | val _ = | 
| 236 | Unsynchronized.setmp Private_Output.protocol_message_fn protocol_message | |
| 65934 | 237 | build_session args | 
| 65948 | 238 | handle exn => (List.app error_message (Runtime.exn_message_list exn); Exn.reraise exn); | 
| 62630 | 239 | val _ = Options.reset_default (); | 
| 240 | in () end; | |
| 48418 | 241 | |
| 65307 | 242 | (*PIDE version*) | 
| 243 | val _ = | |
| 244 | Isabelle_Process.protocol_command "build_session" | |
| 65313 | 245 | (fn [args_yxml] => | 
| 65307 | 246 | let | 
| 65313 | 247 | val args = decode_args args_yxml; | 
| 65307 | 248 | val result = (build_session args; "") handle exn => | 
| 249 | (Runtime.exn_message exn handle _ (*sic!*) => | |
| 250 | "Exception raised, but failed to print details!"); | |
| 65313 | 251 | in Output.protocol_message Markup.build_session_finished [result] end | _ => raise Match); | 
| 59366 
e94df7f6b608
clarified build_theories: proper protocol handler;
 wenzelm parents: 
59364diff
changeset | 252 | |
| 48418 | 253 | end; |