src/Pure/System/mingw.scala
author wenzelm
Sat, 10 Oct 2020 21:04:49 +0200
changeset 72424 10c07d224035
parent 72421 9a8bc089890d
child 72425 d0937d55eb90
permissions -rw-r--r--
tuned signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72421
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/System/mingw.scala
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
     3
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
     4
Support for MSYS2/MinGW64 on Windows.
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
     5
*/
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
     6
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
     7
package isabelle
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
     8
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
     9
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    10
object MinGW
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    11
{
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    12
  def environment: List[(String, String)] =
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    13
    List("PATH" -> "/usr/bin:/bin:/mingw64/bin", "CONFIG_SITE" -> "/mingw64/etc/config.site")
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    14
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    15
  def environment_prefix: String =
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    16
    (for ((a, b) <- environment) yield Bash.string(a) + "=" + Bash.string(b))
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    17
      .mkString("/usr/bin/env ", " ", " ")
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    18
72424
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    19
  val none: MinGW = new MinGW(None)
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    20
  def root(path: Path) = new MinGW(Some(path))
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    21
}
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    22
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    23
class MinGW private(val root: Option[Path])
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    24
{
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    25
  override def toString: String =
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    26
    root match {
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    27
      case None => "MinGW.none"
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    28
      case Some(msys_root) => "MinGW.root(" + msys_root.toString + ")"
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    29
    }
72421
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    30
72424
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    31
  def bash_command(command: String): String =
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    32
    root match {
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    33
      case None => command
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    34
      case Some(msys_root) =>
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    35
        File.bash_path(msys_root + Path.explode("usr/bin/bash")) +
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    36
          " -c " + Bash.string(MinGW.environment_prefix + command)
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    37
    }
72421
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    38
72424
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    39
  def get_root: Path =
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    40
    if (!Platform.is_windows) error("Windows platform required")
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    41
    else if (root.isEmpty) error("Windows platform needs specification of msys root directory")
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    42
    else root.get
72421
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    43
72424
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    44
  def check
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    45
  {
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    46
    if (Platform.is_windows) {
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    47
      get_root
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    48
      val result = Isabelle_System.bash(bash_command("uname -s")).check
10c07d224035 tuned signature;
wenzelm
parents: 72421
diff changeset
    49
      if (!result.out.startsWith("MSYS")) error("Bad msys installation " + get_root)
72421
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    50
    }
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    51
  }
9a8bc089890d support for MSYS2/MinGW64 on Windows;
wenzelm
parents:
diff changeset
    52
}