src/Pure/ML/ml_system.ML
author wenzelm
Fri, 26 Apr 2024 13:25:44 +0200
changeset 80150 96f60533ec1d
parent 77692 3e746e684f4b
permissions -rw-r--r--
update Windows test machines;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62508
d0b68218ea55 discontinued RAW session: bootstrap directly from isabelle_process RAW_ML_SYSTEM;
wenzelm
parents: 62468
diff changeset
     1
(*  Title:      Pure/ML/ml_system.ML
43948
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
     3
48416
5787e1c911d0 more ML_System operations;
wenzelm
parents: 43948
diff changeset
     4
ML system and platform operations.
43948
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
     5
*)
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
     6
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
     7
signature ML_SYSTEM =
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
     8
sig
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
     9
  val name: string
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
    10
  val platform: string
73586
76d0b6597c91 support for conditional ML text;
wenzelm
parents: 73263
diff changeset
    11
  val platform_is_linux: bool
76d0b6597c91 support for conditional ML text;
wenzelm
parents: 73263
diff changeset
    12
  val platform_is_macos: bool
60962
faa452d8e265 basic setup for native Windows (RAW session without image);
wenzelm
parents: 48416
diff changeset
    13
  val platform_is_windows: bool
73586
76d0b6597c91 support for conditional ML text;
wenzelm
parents: 73263
diff changeset
    14
  val platform_is_unix: bool
77692
3e746e684f4b clarified operations for ML object sizes;
wenzelm
parents: 74776
diff changeset
    15
  val platform_is_arm: bool
69701
b5ecabcfb780 more operations;
wenzelm
parents: 62508
diff changeset
    16
  val platform_is_64: bool
77692
3e746e684f4b clarified operations for ML object sizes;
wenzelm
parents: 74776
diff changeset
    17
  val platform_obj_size: int
62468
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    18
  val platform_path: string -> string
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    19
  val standard_path: string -> string
43948
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
    20
end;
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
    21
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
    22
structure ML_System: ML_SYSTEM =
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
    23
struct
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
    24
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
    25
val SOME name = OS.Process.getEnv "ML_SYSTEM";
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
    26
val SOME platform = OS.Process.getEnv "ML_PLATFORM";
73586
76d0b6597c91 support for conditional ML text;
wenzelm
parents: 73263
diff changeset
    27
76d0b6597c91 support for conditional ML text;
wenzelm
parents: 73263
diff changeset
    28
val platform_is_linux = String.isSuffix "linux" platform;
76d0b6597c91 support for conditional ML text;
wenzelm
parents: 73263
diff changeset
    29
val platform_is_macos = String.isSuffix "darwin" platform;
60962
faa452d8e265 basic setup for native Windows (RAW session without image);
wenzelm
parents: 48416
diff changeset
    30
val platform_is_windows = String.isSuffix "windows" platform;
73586
76d0b6597c91 support for conditional ML text;
wenzelm
parents: 73263
diff changeset
    31
val platform_is_unix = platform_is_linux orelse platform_is_macos;
77692
3e746e684f4b clarified operations for ML object sizes;
wenzelm
parents: 74776
diff changeset
    32
val platform_is_arm = String.isPrefix "arm64_32-" platform orelse String.isPrefix "arm64-" platform;
74776
251bf0f2d5bb proper detection of ARM platform variants;
wenzelm
parents: 73586
diff changeset
    33
val platform_is_64 = String.isPrefix "x86_64-" platform orelse String.isPrefix "arm64-" platform;
77692
3e746e684f4b clarified operations for ML object sizes;
wenzelm
parents: 74776
diff changeset
    34
3e746e684f4b clarified operations for ML object sizes;
wenzelm
parents: 74776
diff changeset
    35
val platform_obj_size = if platform_is_64 then 8 else 4;
43948
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
    36
62468
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    37
val platform_path =
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    38
  if platform_is_windows then
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    39
    fn path =>
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    40
      if String.isPrefix "/" path andalso not (String.isPrefix "//" path) then
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    41
        (case String.tokens (fn c => c = #"/") path of
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    42
          "cygdrive" :: drive :: arcs =>
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    43
            let
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    44
              val vol =
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    45
                (case Char.fromString drive of
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    46
                  NONE => drive ^ ":"
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    47
                | SOME d => String.str (Char.toUpper d) ^ ":");
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    48
            in String.concatWith "\\" (vol :: arcs) end
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    49
        | arcs =>
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    50
            (case OS.Process.getEnv "CYGWIN_ROOT" of
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    51
              SOME root => OS.Path.concat (root, String.concatWith "\\" arcs)
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    52
            | NONE => raise Fail "Unknown environment variable CYGWIN_ROOT"))
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    53
      else String.translate (fn #"/" => "\\" | c => String.str c) path
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    54
  else fn path => path;
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    55
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    56
val standard_path =
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    57
  if platform_is_windows then
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    58
    fn path =>
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    59
      let
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    60
        val {vol, arcs, isAbs} = OS.Path.fromString path;
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    61
        val path' = String.translate (fn #"\\" => "/" | c => String.str c) path;
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    62
      in
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    63
        if isAbs then
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    64
          (case String.explode vol of
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    65
            [d, #":"] =>
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    66
              String.concatWith "/" ("/cygdrive" :: String.str (Char.toLower d) :: arcs)
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    67
          | _ => path')
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    68
        else path'
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    69
      end
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    70
  else fn path => path;
d97e13e5ea5b clarified modules;
wenzelm
parents: 62467
diff changeset
    71
43948
8f5add916a99 explicit structure ML_System;
wenzelm
parents:
diff changeset
    72
end;