src/Pure/Tools/build.ML
author wenzelm
Sun, 07 Feb 2021 12:30:52 +0100
changeset 73225 3ab0cedaccad
parent 72640 fffad9ad660e
child 73559 22b5ecb53dd9
permissions -rw-r--r--
clarified modules: allow early definition of protocol commands;
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
72103
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
     7
structure Build: sig end =
48418
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
     8
struct
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
     9
52052
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    10
(* session timing *)
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    11
72019
940195fbb282 clarified messages;
wenzelm
parents: 72012
diff changeset
    12
fun session_timing f x =
52052
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    13
  let
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    14
    val start = Timing.start ();
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    15
    val y = f x;
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    16
    val timing = Timing.result start;
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    17
62925
f1bdf10f95d8 tuned signature;
wenzelm
parents: 62884
diff changeset
    18
    val threads = string_of_int (Multithreading.max_threads ());
72019
940195fbb282 clarified messages;
wenzelm
parents: 72012
diff changeset
    19
    val props = [("threads", threads)] @ Markup.timing_properties timing;
940195fbb282 clarified messages;
wenzelm
parents: 72012
diff changeset
    20
    val _ = Output.protocol_message (Markup.session_timing :: props) [];
52052
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    21
  in y end;
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    22
892061142ba6 discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents: 52041
diff changeset
    23
65307
c1ba192b4f96 more explicit build_session args;
wenzelm
parents: 65306
diff changeset
    24
(* build theories *)
50683
34b109c5324c inline ML statistics into build log;
wenzelm
parents: 50280
diff changeset
    25
72638
2a7fc87495e0 refer to command_timings/last_timing via resources;
wenzelm
parents: 72637
diff changeset
    26
fun build_theories qualifier (options, thys) =
59366
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    27
  let
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    28
    val condition = space_explode "," (Options.string options "condition");
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    29
    val conds = filter_out (can getenv_strict) condition;
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    30
  in
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    31
    if null conds then
69755
2fc85ce1f557 discontinued obsolete option "checkpoint";
wenzelm
parents: 68511
diff changeset
    32
      (Options.set_default options;
62714
63888e5f668b clarified use of options;
wenzelm
parents: 62713
diff changeset
    33
        Isabelle_Process.init_options ();
64599
80ef54198f44 dummy fork to produce ML_statistics even in sequential mode (e.g. for heap size);
wenzelm
parents: 64308
diff changeset
    34
        Future.fork I;
72638
2a7fc87495e0 refer to command_timings/last_timing via resources;
wenzelm
parents: 72637
diff changeset
    35
        (Thy_Info.use_theories options qualifier
64308
b00508facb4f added system option "profiling";
wenzelm
parents: 63827
diff changeset
    36
        |>
b00508facb4f added system option "profiling";
wenzelm
parents: 63827
diff changeset
    37
          (case Options.string options "profiling" of
b00508facb4f added system option "profiling";
wenzelm
parents: 63827
diff changeset
    38
            "" => I
b00508facb4f added system option "profiling";
wenzelm
parents: 63827
diff changeset
    39
          | "time" => profile_time
b00508facb4f added system option "profiling";
wenzelm
parents: 63827
diff changeset
    40
          | "allocations" => profile_allocations
b00508facb4f added system option "profiling";
wenzelm
parents: 63827
diff changeset
    41
          | bad => error ("Bad profiling option: " ^ quote bad))
59366
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    42
        |> Unsynchronized.setmp print_mode
62714
63888e5f668b clarified use of options;
wenzelm
parents: 62713
diff changeset
    43
            (space_explode "," (Options.string options "print_mode") @ print_mode_value ())) thys)
59366
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    44
    else
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    45
      Output.physical_stderr ("Skipping theories " ^ commas_quote (map #1 thys) ^
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    46
        " (undefined " ^ commas conds ^ ")\n")
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    47
  end;
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    48
65307
c1ba192b4f96 more explicit build_session args;
wenzelm
parents: 65306
diff changeset
    49
c1ba192b4f96 more explicit build_session args;
wenzelm
parents: 65306
diff changeset
    50
(* build session *)
c1ba192b4f96 more explicit build_session args;
wenzelm
parents: 65306
diff changeset
    51
c1ba192b4f96 more explicit build_session args;
wenzelm
parents: 65306
diff changeset
    52
val _ =
73225
3ab0cedaccad clarified modules: allow early definition of protocol commands;
wenzelm
parents: 72640
diff changeset
    53
  Protocol_Command.define "build_session"
72637
fd68c9c1b90b more uniform Resources.init_session via YXML;
wenzelm
parents: 72624
diff changeset
    54
    (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
    55
        let
72637
fd68c9c1b90b more uniform Resources.init_session via YXML;
wenzelm
parents: 72624
diff changeset
    56
          val _ = Resources.init_session_yxml resources_yxml;
72640
fffad9ad660e simplified/clarified persistent session information;
wenzelm
parents: 72638
diff changeset
    57
          val (session_name, theories) =
72103
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    58
            YXML.parse_body args_yxml |>
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    59
              let
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    60
                open XML.Decode;
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    61
                val position = Position.of_properties o properties;
72640
fffad9ad660e simplified/clarified persistent session information;
wenzelm
parents: 72638
diff changeset
    62
              in pair string (list (pair Options.decode (list (pair string position)))) end;
fffad9ad660e simplified/clarified persistent session information;
wenzelm
parents: 72638
diff changeset
    63
fffad9ad660e simplified/clarified persistent session information;
wenzelm
parents: 72638
diff changeset
    64
          val _ = Session.init session_name;
72103
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    65
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    66
          fun build () =
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    67
            let
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    68
              val res1 =
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    69
                theories |>
72638
2a7fc87495e0 refer to command_timings/last_timing via resources;
wenzelm
parents: 72637
diff changeset
    70
                  (List.app (build_theories session_name)
72103
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    71
                    |> session_timing
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    72
                    |> Exn.capture);
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    73
              val res2 = Exn.capture Session.finish ();
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    74
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    75
              val _ = Resources.finish_session_base ();
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    76
              val _ = Par_Exn.release_all [res1, res2];
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    77
              val _ =
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    78
                if session_name = Context.PureN
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    79
                then Theory.install_pure (Thy_Info.get_theory Context.PureN) else ();
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    80
            in () end;
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    81
71880
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
    82
          fun exec e =
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
    83
            if can Theory.get_pure () then
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
    84
              Isabelle_Thread.fork
71884
2bf0283fc975 proper stack_limit;
wenzelm
parents: 71880
diff changeset
    85
                {name = "build_session", stack_limit = Isabelle_Thread.stack_limit (),
2bf0283fc975 proper stack_limit;
wenzelm
parents: 71880
diff changeset
    86
                  interrupts = false} e
71880
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
    87
              |> ignore
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
    88
            else e ();
71667
4d2de35214c5 proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
wenzelm
parents: 71656
diff changeset
    89
        in
71880
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
    90
          exec (fn () =>
72103
7b318273a4aa discontinued old batch-build functionality;
wenzelm
parents: 72019
diff changeset
    91
            (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
    92
              ((1, Runtime.exn_message_list exn) handle _ (*sic!*) => (2, ["CRASHED"])))
71879
fe7ee970c425 clarified build_session protocol;
wenzelm
parents: 71878
diff changeset
    93
          |> let open XML.Encode in pair int (list string) end
71880
0ca353521753 asynchronous build_session: notably for Scala.fulfill protocol commands during run;
wenzelm
parents: 71879
diff changeset
    94
          |> 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
    95
        end
70991
f9f7c34b7dd4 more scalable protocol_message: use XML.body directly (Output.output hook is not required);
wenzelm
parents: 70907
diff changeset
    96
      | _ => raise Match);
59366
e94df7f6b608 clarified build_theories: proper protocol handler;
wenzelm
parents: 59364
diff changeset
    97
48418
1a634f9614fb some actual build function on ML side;
wenzelm
parents:
diff changeset
    98
end;