src/Pure/Tools/main.scala
author wenzelm
Tue, 29 Apr 2014 13:32:13 +0200
changeset 56782 433cf57550fa
parent 56671 06853449cf0a
child 56890 7f120d227ca5
permissions -rw-r--r--
more systematic Isabelle output, like in classic Isabelle/ML (without markup);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50687
a8db4bf70e90 moved files;
wenzelm
parents: 48275
diff changeset
     1
/*  Title:      Pure/Tools/main.scala
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     3
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
     4
Main Isabelle application entry point.
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     5
*/
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     6
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     7
package isabelle
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     8
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
     9
55618
995162143ef4 tuned imports;
wenzelm
parents: 54351
diff changeset
    10
import java.lang.{Class, ClassLoader}
53461
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
    11
import java.io.{File => JFile, BufferedReader, InputStreamReader}
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
    12
import java.nio.file.Files
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
    13
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
    14
import scala.annotation.tailrec
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    15
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    16
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    17
object Main
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    18
{
53461
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
    19
  /** main entry point **/
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
    20
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    21
  def main(args: Array[String])
53449
913df2adc99c build session before start of jedit;
wenzelm
parents: 53445
diff changeset
    22
  {
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    23
    val system_dialog = new System_Dialog
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    24
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    25
    def exit_error(exn: Throwable): Nothing =
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    26
    {
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    27
      GUI.dialog(null, "Isabelle", GUI.scrollable_text(Exn.message(exn)))
56667
65e84b0ef974 more abstract Exn.Interrupt and POSIX return code;
wenzelm
parents: 56661
diff changeset
    28
      system_dialog.return_code(Exn.return_code(exn, 2))
53460
6015a663b889 tuned signature;
wenzelm
parents: 53459
diff changeset
    29
      system_dialog.join_exit
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    30
    }
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    31
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    32
    def build
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    33
    {
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    34
      try {
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    35
        GUI.init_laf()
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    36
        Isabelle_System.init()
53449
913df2adc99c build session before start of jedit;
wenzelm
parents: 53445
diff changeset
    37
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    38
        val mode = Isabelle_System.getenv("JEDIT_BUILD_MODE")
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    39
        if (mode == "none")
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    40
          system_dialog.return_code(0)
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    41
        else {
53519
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    42
          val options = Options.init()
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    43
          val system_mode = mode == "" || mode == "system"
53519
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    44
          val more_dirs = Path.split(Isabelle_System.getenv("JEDIT_SESSION_DIRS")).map((false, _))
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    45
          val session = Isabelle_System.default_logic(
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    46
            Isabelle_System.getenv("JEDIT_LOGIC"),
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    47
            options.string("jedit_logic"))
53519
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    48
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    49
          if (Build.build(options = options, build_heap = true, no_build = true,
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    50
              more_dirs = more_dirs, sessions = List(session)) == 0)
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    51
            system_dialog.return_code(0)
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    52
          else {
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    53
            system_dialog.title("Isabelle build (" + Isabelle_System.getenv("ML_IDENTIFIER") + ")")
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    54
            system_dialog.echo("Build started for Isabelle/" + session + " ...")
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    55
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    56
            val (out, rc) =
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    57
              try {
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    58
                ("",
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    59
                  Build.build(options = options, progress = system_dialog,
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    60
                    build_heap = true, more_dirs = more_dirs,
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    61
                    system_mode = system_mode, sessions = List(session)))
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    62
              }
56671
06853449cf0a explicit Exn.error_message in accordance to Output.error_message in ML;
wenzelm
parents: 56667
diff changeset
    63
              catch {
56782
433cf57550fa more systematic Isabelle output, like in classic Isabelle/ML (without markup);
wenzelm
parents: 56671
diff changeset
    64
                case exn: Throwable =>
433cf57550fa more systematic Isabelle output, like in classic Isabelle/ML (without markup);
wenzelm
parents: 56671
diff changeset
    65
                  (Output.error_text(Exn.message(exn)) + "\n", Exn.return_code(exn, 2))
56671
06853449cf0a explicit Exn.error_message in accordance to Output.error_message in ML;
wenzelm
parents: 56667
diff changeset
    66
              }
53519
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    67
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    68
            system_dialog.echo(out + (if (rc == 0) "OK\n" else "Return code: " + rc + "\n"))
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    69
            system_dialog.return_code(rc)
3c977c570e20 discontinued obsolete command-line tool "isabelle build_dialog";
wenzelm
parents: 53466
diff changeset
    70
          }
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    71
        }
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    72
      }
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    73
      catch { case exn: Throwable => exit_error(exn) }
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    74
    }
53449
913df2adc99c build session before start of jedit;
wenzelm
parents: 53445
diff changeset
    75
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    76
    def start
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    77
    {
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    78
      val do_start =
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    79
      {
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    80
        try {
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    81
          /* settings directory */
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    82
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    83
          val settings_dir = Path.explode("$JEDIT_SETTINGS")
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    84
          Isabelle_System.mkdirs(settings_dir + Path.explode("DockableWindowManager"))
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    85
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    86
          if (!(settings_dir + Path.explode("perspective.xml")).is_file) {
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    87
            File.write(settings_dir + Path.explode("DockableWindowManager/perspective-view0.xml"),
53772
30de372ca56f removed obsolete README;
wenzelm
parents: 53575
diff changeset
    88
              """<DOCKING LEFT="" TOP="" RIGHT="isabelle-documentation" BOTTOM="" LEFT_POS="0" TOP_POS="0" RIGHT_POS="250" BOTTOM_POS="250" />""")
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    89
            File.write(settings_dir + Path.explode("perspective.xml"),
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    90
              """<?xml version="1.0" encoding="UTF-8" ?>
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    91
<!DOCTYPE PERSPECTIVE SYSTEM "perspective.dtd">
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    92
<PERSPECTIVE>
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    93
<VIEW PLAIN="FALSE">
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    94
<GEOMETRY X="0" Y="35" WIDTH="1072" HEIGHT="787" EXT_STATE="0" />
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    95
</VIEW>
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    96
</PERSPECTIVE>""")
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    97
          }
53449
913df2adc99c build session before start of jedit;
wenzelm
parents: 53445
diff changeset
    98
913df2adc99c build session before start of jedit;
wenzelm
parents: 53445
diff changeset
    99
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   100
          /* args */
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   101
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   102
          val jedit_options =
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   103
            Isabelle_System.getenv_strict("JEDIT_OPTIONS").split(" +")
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   104
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   105
          val jedit_settings =
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   106
            Array("-settings=" + Isabelle_System.platform_path(Path.explode("$JEDIT_SETTINGS")))
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   107
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   108
          val more_args =
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   109
            if (args.isEmpty)
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   110
              Array(Isabelle_System.platform_path(Path.explode("$USER_HOME/Scratch.thy")))
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   111
            else args
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   112
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   113
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   114
          /* startup */
53445
811db2b751ed warm start of Isabelle/jEdit from Isabelle/Scala;
wenzelm
parents: 53423
diff changeset
   115
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   116
          update_environment()
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   117
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   118
          System.setProperty("jedit.home",
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   119
            Isabelle_System.platform_path(Path.explode("$JEDIT_HOME/dist")))
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   120
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   121
          System.setProperty("scala.home",
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   122
            Isabelle_System.platform_path(Path.explode("$SCALA_HOME")))
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   123
53912
f6fb8ca4517f initialize class immediately (potentially more robust);
wenzelm
parents: 53772
diff changeset
   124
          val jedit =
f6fb8ca4517f initialize class immediately (potentially more robust);
wenzelm
parents: 53772
diff changeset
   125
            Class.forName("org.gjt.sp.jedit.jEdit", true, ClassLoader.getSystemClassLoader)
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   126
          val jedit_main = jedit.getDeclaredMethod("main", classOf[Array[String]])
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   127
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   128
          () => jedit_main.invoke(null, jedit_options ++ jedit_settings ++ more_args)
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   129
        }
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   130
        catch { case exn: Throwable => exit_error(exn) }
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   131
      }
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   132
      do_start()
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
   133
    }
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
   134
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
   135
    if (Platform.is_windows) {
53459
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   136
      try {
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   137
        GUI.init_laf()
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
   138
53967
bfaae48b0ce0 simplified ISABELLE_HOME on Windows (see also 9c8a1b9c0630, 5a7903ba2dac);
wenzelm
parents: 53966
diff changeset
   139
        val isabelle_home0 = System.getenv("ISABELLE_HOME")
53459
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   140
        val isabelle_home = System.getProperty("isabelle.home")
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
   141
53459
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   142
        if (isabelle_home0 == null || isabelle_home0 == "") {
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   143
          if (isabelle_home == null || isabelle_home == "")
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   144
            error("Unknown Isabelle home directory")
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   145
          if (!(new JFile(isabelle_home)).isDirectory)
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   146
            error("Bad Isabelle home directory: " + quote(isabelle_home))
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
   147
53459
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   148
          val cygwin_root = isabelle_home + "\\contrib\\cygwin"
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   149
          if ((new JFile(cygwin_root)).isDirectory)
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   150
            System.setProperty("cygwin.root", cygwin_root)
53422
ec97451fdf2e recovered cygwin.root from 1c87e79bb838;
wenzelm
parents: 53419
diff changeset
   151
53459
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   152
          val uninitialized_file = new JFile(cygwin_root, "isabelle\\uninitialized")
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   153
          val uninitialized = uninitialized_file.isFile && uninitialized_file.delete
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
   154
53461
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   155
          if (uninitialized) cygwin_init(system_dialog, isabelle_home, cygwin_root)
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
   156
        }
53459
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   157
      }
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   158
      catch { case exn: Throwable => exit_error(exn) }
53462
c531db093680 observe "stopped" after Cygwin init (which is itself uninterruptible);
wenzelm
parents: 53461
diff changeset
   159
c531db093680 observe "stopped" after Cygwin init (which is itself uninterruptible);
wenzelm
parents: 53461
diff changeset
   160
      if (system_dialog.stopped) {
56667
65e84b0ef974 more abstract Exn.Interrupt and POSIX return code;
wenzelm
parents: 56661
diff changeset
   161
        system_dialog.return_code(Exn.Interrupt.return_code)
53462
c531db093680 observe "stopped" after Cygwin init (which is itself uninterruptible);
wenzelm
parents: 53461
diff changeset
   162
        system_dialog.join_exit
c531db093680 observe "stopped" after Cygwin init (which is itself uninterruptible);
wenzelm
parents: 53461
diff changeset
   163
      }
53459
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   164
    }
53445
811db2b751ed warm start of Isabelle/jEdit from Isabelle/Scala;
wenzelm
parents: 53423
diff changeset
   165
53459
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   166
    build
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   167
    val rc = system_dialog.join
33f773731f0c Cygwin_Init based on System_Dialog;
wenzelm
parents: 53457
diff changeset
   168
    if (rc == 0) start else sys.exit(rc)
53445
811db2b751ed warm start of Isabelle/jEdit from Isabelle/Scala;
wenzelm
parents: 53423
diff changeset
   169
  }
53461
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   170
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   171
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   172
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   173
  /** Cygwin init (e.g. after extraction via 7zip) **/
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   174
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   175
  private def cygwin_init(system_dialog: System_Dialog, isabelle_home: String, cygwin_root: String)
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   176
  {
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   177
    system_dialog.title("Isabelle system initialization")
53466
19e7d5044617 tuned message;
wenzelm
parents: 53465
diff changeset
   178
    system_dialog.echo("Initializing Cygwin ...")
53461
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   179
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   180
    def execute(args: String*): Int =
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   181
    {
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   182
      val cwd = new JFile(isabelle_home)
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   183
      val env = Map("CYGWIN" -> "nodosfilewarning")
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   184
      system_dialog.execute(cwd, env, args: _*)
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   185
    }
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   186
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   187
    system_dialog.echo("symlinks ...")
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   188
    val symlinks =
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   189
    {
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   190
      val path = (new JFile(cygwin_root + "\\isabelle\\symlinks")).toPath
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   191
      Files.readAllLines(path, UTF8.charset).toArray.toList.asInstanceOf[List[String]]
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   192
    }
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   193
    @tailrec def recover_symlinks(list: List[String]): Unit =
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   194
    {
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   195
      list match {
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   196
        case Nil | List("") =>
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   197
        case link :: content :: rest =>
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   198
          val path = (new JFile(isabelle_home, link)).toPath
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   199
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   200
          val writer = Files.newBufferedWriter(path, UTF8.charset)
56661
ef623f6f036b avoid octal escape literals -- deprecated in scala-2.11.0;
wenzelm
parents: 55618
diff changeset
   201
          try { writer.write("!<symlink>" + content + "\u0000") }
53461
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   202
          finally { writer.close }
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   203
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   204
          Files.setAttribute(path, "dos:system", true)
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   205
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   206
          recover_symlinks(rest)
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   207
        case _ => error("Unbalanced symlinks list")
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   208
      }
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   209
    }
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   210
    recover_symlinks(symlinks)
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   211
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   212
    system_dialog.echo("rebaseall ...")
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   213
    execute(cygwin_root + "\\bin\\dash.exe", "/isabelle/rebaseall")
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   214
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   215
    system_dialog.echo("postinstall ...")
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   216
    execute(cygwin_root + "\\bin\\bash.exe", "/isabelle/postinstall")
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   217
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   218
    system_dialog.echo("init ...")
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   219
    Isabelle_System.init()
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
   220
  }
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   221
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   222
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   223
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   224
  /** adhoc update of JVM environment variables **/
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   225
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   226
  def update_environment()
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   227
  {
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   228
    val update =
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   229
    {
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   230
      val isabelle_home = Isabelle_System.getenv("ISABELLE_HOME")
54351
5cbe32533cdb more on file-system access;
wenzelm
parents: 53967
diff changeset
   231
      val isabelle_home_user = Isabelle_System.getenv("ISABELLE_HOME_USER")
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   232
      val upd =
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   233
        if (Platform.is_windows)
54351
5cbe32533cdb more on file-system access;
wenzelm
parents: 53967
diff changeset
   234
          List(
5cbe32533cdb more on file-system access;
wenzelm
parents: 53967
diff changeset
   235
            "ISABELLE_HOME" -> Isabelle_System.jvm_path(isabelle_home),
5cbe32533cdb more on file-system access;
wenzelm
parents: 53967
diff changeset
   236
            "ISABELLE_HOME_USER" -> Isabelle_System.jvm_path(isabelle_home_user),
5cbe32533cdb more on file-system access;
wenzelm
parents: 53967
diff changeset
   237
            "INI_DIR" -> "")
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   238
        else
54351
5cbe32533cdb more on file-system access;
wenzelm
parents: 53967
diff changeset
   239
          List(
5cbe32533cdb more on file-system access;
wenzelm
parents: 53967
diff changeset
   240
            "ISABELLE_HOME" -> isabelle_home,
5cbe32533cdb more on file-system access;
wenzelm
parents: 53967
diff changeset
   241
            "ISABELLE_HOME_USER" -> isabelle_home_user)
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   242
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   243
      (env0: Any) => {
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   244
        val env = env0.asInstanceOf[java.util.Map[String, String]]
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   245
        upd.foreach {
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   246
          case (x, "") => env.remove(x)
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   247
          case (x, y) => env.put(x, y)
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   248
        }
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   249
      }
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   250
    }
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   251
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   252
    classOf[java.util.Collections].getDeclaredClasses
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   253
      .find(c => c.getName == "java.util.Collections$UnmodifiableMap") match
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   254
    {
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   255
      case Some(c) =>
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   256
        val m = c.getDeclaredField("m")
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   257
        m.setAccessible(true)
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   258
        update(m.get(System.getenv()))
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   259
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   260
        if (Platform.is_windows) {
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   261
          val ProcessEnvironment = Class.forName("java.lang.ProcessEnvironment")
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   262
          val field = ProcessEnvironment.getDeclaredField("theCaseInsensitiveEnvironment")
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   263
          field.setAccessible(true)
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   264
          update(field.get(null))
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   265
        }
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   266
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   267
      case None =>
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   268
        error("Failed to update JVM environment -- platform incompatibility")
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   269
    }
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   270
  }
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
   271
}
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
   272