src/Pure/Tools/build.ML
author wenzelm
Wed, 09 Jun 2021 10:52:37 +0200
changeset 73841 95484bd7e1ec
parent 73840 a5200fa7cb4c
child 74822 a1fa82431576
permissions -rw-r--r--
proper profiling within command execution: messages require PIDE id;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50686
d703e3aafa8c moved files;
wenzelm
parents: 50683
diff changeset
     1
(*  Title:      Pure/Tools/build.ML
48418
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
     3
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
     4
Build Isabelle sessions.
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
     5
*)
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
     6
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
     7
signature BUILD =
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
     8
sig
73822
1192c68ebe1c suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
wenzelm
parents: 73821
diff changeset
     9
  type hook = string -> (theory * Document_Output.segment list) list -> unit
1192c68ebe1c suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
wenzelm
parents: 73821
diff changeset
    10
  val add_hook: hook -> unit
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    11
end;
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    12
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    13
structure Build: BUILD =
48418
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
    14
struct
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
    15
52052
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    16
(* session timing *)
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    17
72019
940195fbb282 clarified messages;
wenzelm
parents: 72012
diff changeset
    18
fun session_timing f x =
52052
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    19
  let
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    20
    val start = Timing.start ();
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    21
    val y = f x;
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    22
    val timing = Timing.result start;
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    23
62925
f1bdf10f95d8 tuned signature;
wenzelm
parents: 62884
diff changeset
    24
    val threads = string_of_int (Multithreading.max_threads ());
72019
940195fbb282 clarified messages;
wenzelm
parents: 72012
diff changeset
    25
    val props = [("threads", threads)] @ Markup.timing_properties timing;
940195fbb282 clarified messages;
wenzelm
parents: 72012
diff changeset
    26
    val _ = Output.protocol_message (Markup.session_timing :: props) [];
52052
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    27
  in y end;
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    28
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    29
65307
c1ba192b4f96 more explicit build_session args;
wenzelm
parents: 65306
diff changeset
    30
(* build theories *)
50683
34b109c5324c inline ML statistics into build log;
wenzelm
parents: 50280
diff changeset
    31
73822
1192c68ebe1c suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
wenzelm
parents: 73821
diff changeset
    32
type hook = string -> (theory * Document_Output.segment list) list -> unit;
1192c68ebe1c suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
wenzelm
parents: 73821
diff changeset
    33
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    34
local
73822
1192c68ebe1c suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
wenzelm
parents: 73821
diff changeset
    35
  val hooks = Synchronized.var "Build.hooks" ([]: hook list);
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    36
in
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    37
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    38
fun add_hook hook = Synchronized.change hooks (cons hook);
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    39
73822
1192c68ebe1c suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
wenzelm
parents: 73821
diff changeset
    40
fun apply_hooks qualifier loaded_theories =
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    41
  Synchronized.value hooks
73822
1192c68ebe1c suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
wenzelm
parents: 73821
diff changeset
    42
  |> List.app (fn hook => hook qualifier loaded_theories);
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    43
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    44
end;
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    45
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    46
72638
2a7fc87495e0 refer to command_timings/last_timing via resources;
wenzelm
parents: 72637
diff changeset
    47
fun build_theories qualifier (options, thys) =
59366
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    48
  let
73841
95484bd7e1ec proper profiling within command execution: messages require PIDE id;
wenzelm
parents: 73840
diff changeset
    49
    val _ = ML_Profiling.check_mode (Options.string options "profiling");
59366
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    50
    val condition = space_explode "," (Options.string options "condition");
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    51
    val conds = filter_out (can getenv_strict) condition;
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    52
    val loaded_theories =
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    53
      if null conds then
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    54
        (Options.set_default options;
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    55
          Isabelle_Process.init_options ();
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    56
          Future.fork I;
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    57
          (Thy_Info.use_theories options qualifier
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    58
          |> Unsynchronized.setmp print_mode
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    59
              (space_explode "," (Options.string options "print_mode") @ print_mode_value ())) thys)
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    60
      else
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    61
       (Output.physical_stderr ("Skipping theories " ^ commas_quote (map #1 thys) ^
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73559
diff changeset
    62
          " (undefined " ^ commas conds ^ ")\n"); [])
73822
1192c68ebe1c suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
wenzelm
parents: 73821
diff changeset
    63
  in apply_hooks qualifier loaded_theories end;
59366
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    64
65307
c1ba192b4f96 more explicit build_session args;
wenzelm
parents: 65306
diff changeset
    65
c1ba192b4f96 more explicit build_session args;
wenzelm
parents: 65306
diff changeset
    66
(* build session *)
c1ba192b4f96 more explicit build_session args;
wenzelm
parents: 65306
diff changeset
    67
c1ba192b4f96 more explicit build_session args;
wenzelm
parents: 65306
diff changeset
    68
val _ =
73225
3ab0cedaccad clarified modules: allow early definition of protocol commands;
wenzelm
parents: 72640
diff changeset
    69
  Protocol_Command.define "build_session"
72637
fd68c9c1b90b more uniform Resources.init_session via YXML;
wenzelm
parents: 72624
diff changeset
    70
    (fn [resources_yxml, args_yxml] =>
70991
f9f7c34b7dd4 more scalable protocol_message: use XML.body directly (Output.output hook is not required);
wenzelm
parents: 70907
diff changeset
    71
        let
72637
fd68c9c1b90b more uniform Resources.init_session via YXML;
wenzelm
parents: 72624
diff changeset
    72
          val _ = Resources.init_session_yxml resources_yxml;
72640
fffad9ad660e simplified/clarified persistent session information;
wenzelm
parents: 72638
diff changeset
    73
          val (session_name, theories) =
72103
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    74
            YXML.parse_body args_yxml |>
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    75
              let
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    76
                open XML.Decode;
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    77
                val position = Position.of_properties o properties;
72640
fffad9ad660e simplified/clarified persistent session information;
wenzelm
parents: 72638
diff changeset
    78
              in pair string (list (pair Options.decode (list (pair string position)))) end;
fffad9ad660e simplified/clarified persistent session information;
wenzelm
parents: 72638
diff changeset
    79
fffad9ad660e simplified/clarified persistent session information;
wenzelm
parents: 72638
diff changeset
    80
          val _ = Session.init session_name;
72103
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    81
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    82
          fun build () =
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    83
            let
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    84
              val res1 =
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    85
                theories |>
72638
2a7fc87495e0 refer to command_timings/last_timing via resources;
wenzelm
parents: 72637
diff changeset
    86
                  (List.app (build_theories session_name)
72103
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    87
                    |> session_timing
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    88
                    |> Exn.capture);
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    89
              val res2 = Exn.capture Session.finish ();
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    90
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    91
              val _ = Resources.finish_session_base ();
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    92
              val _ = Par_Exn.release_all [res1, res2];
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    93
              val _ =
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    94
                if session_name = Context.PureN
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    95
                then Theory.install_pure (Thy_Info.get_theory Context.PureN) else ();
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    96
            in () end;
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    97
71880
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
    98
          fun exec e =
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
    99
            if can Theory.get_pure () then
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
   100
              Isabelle_Thread.fork
71884
2bf0283fc975 proper stack_limit;
wenzelm
parents: 71880
diff changeset
   101
                {name = "build_session", stack_limit = Isabelle_Thread.stack_limit (),
2bf0283fc975 proper stack_limit;
wenzelm
parents: 71880
diff changeset
   102
                  interrupts = false} e
71880
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
   103
              |> ignore
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
   104
            else e ();
71667
4d2de35214c5 proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
wenzelm
parents: 71656
diff changeset
   105
        in
71880
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
   106
          exec (fn () =>
72103
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
   107
            (Future.interruptible_task (fn () => (build (); (0, []))) () handle exn =>
71880
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
   108
              ((1, Runtime.exn_message_list exn) handle _ (*sic!*) => (2, ["CRASHED"])))
71879
fe7ee970c425 clarified build_session protocol;
wenzelm
parents: 71878
diff changeset
   109
          |> let open XML.Encode in pair int (list string) end
73559
22b5ecb53dd9 more uniform use of Byte_Message;
wenzelm
parents: 73225
diff changeset
   110
          |> single
71880
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
   111
          |> Output.protocol_message Markup.build_session_finished)
71667
4d2de35214c5 proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
wenzelm
parents: 71656
diff changeset
   112
        end
70991
f9f7c34b7dd4 more scalable protocol_message: use XML.body directly (Output.output hook is not required);
wenzelm
parents: 70907
diff changeset
   113
      | _ => raise Match);
59366
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
   114
48418
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
   115
end;