src/Pure/Admin/component_bash_process.scala
author wenzelm
Fri, 31 May 2024 20:46:51 +0200
changeset 80218 875968a3b2f9
parent 80050 7d8a24c5559d
child 80224 db92e0b6a11a
permissions -rw-r--r--
suport Isabelle_System.bash via SSH.System;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80002
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Admin/component_bash_process.scala
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
     3
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
     4
Build bash_process component from C source.
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
     5
*/
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
     6
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
     7
package isabelle
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
     8
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
     9
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    10
object Component_Bash_Process {
80218
875968a3b2f9 suport Isabelle_System.bash via SSH.System;
wenzelm
parents: 80050
diff changeset
    11
  /* resources */
875968a3b2f9 suport Isabelle_System.bash via SSH.System;
wenzelm
parents: 80050
diff changeset
    12
875968a3b2f9 suport Isabelle_System.bash via SSH.System;
wenzelm
parents: 80050
diff changeset
    13
  def home: Path = Path.explode("$ISABELLE_BASH_PROCESS_HOME")
875968a3b2f9 suport Isabelle_System.bash via SSH.System;
wenzelm
parents: 80050
diff changeset
    14
875968a3b2f9 suport Isabelle_System.bash via SSH.System;
wenzelm
parents: 80050
diff changeset
    15
  def remote_program(directory: Components.Directory): Path = {
875968a3b2f9 suport Isabelle_System.bash via SSH.System;
wenzelm
parents: 80050
diff changeset
    16
    val platform = directory.ssh.isabelle_platform.ISABELLE_PLATFORM(apple = true)
875968a3b2f9 suport Isabelle_System.bash via SSH.System;
wenzelm
parents: 80050
diff changeset
    17
    directory.path + Path.basic(platform) + Path.basic("bash_process")
875968a3b2f9 suport Isabelle_System.bash via SSH.System;
wenzelm
parents: 80050
diff changeset
    18
  }
875968a3b2f9 suport Isabelle_System.bash via SSH.System;
wenzelm
parents: 80050
diff changeset
    19
875968a3b2f9 suport Isabelle_System.bash via SSH.System;
wenzelm
parents: 80050
diff changeset
    20
80002
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    21
  /* build bash_process */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    22
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    23
  def build_bash_process(
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    24
    progress: Progress = new Progress,
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    25
    target_dir: Path = Path.current,
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    26
  ): Unit = {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    27
    Isabelle_System.require_command("cc")
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    28
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    29
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    30
    /* component */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    31
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    32
    val component_date = Date.Format.alt_date(Date.now())
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    33
    val component_name = "bash_process-" + component_date
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    34
    val component_dir =
80050
7d8a24c5559d tuned signature;
wenzelm
parents: 80049
diff changeset
    35
      Components.Directory(target_dir + Path.basic(component_name))
7d8a24c5559d tuned signature;
wenzelm
parents: 80049
diff changeset
    36
        .create(progress = progress)
7d8a24c5559d tuned signature;
wenzelm
parents: 80049
diff changeset
    37
        .write_platforms()
80048
a213dd3c0b29 tuned signature;
wenzelm
parents: 80002
diff changeset
    38
80002
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    39
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    40
    /* platform */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    41
80049
wenzelm
parents: 80048
diff changeset
    42
    val platform_name = Isabelle_Platform.self.ISABELLE_PLATFORM(apple = true)
80002
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    43
    val platform_dir =
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    44
      Isabelle_System.make_directory(component_dir.path + Path.basic(platform_name))
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    45
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    46
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    47
    /* source */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    48
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    49
    val source_file = Path.explode("bash_process.c")
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    50
    File.write(component_dir.path + source_file,
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    51
"""/*  Author:     Makarius
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    52
    License:    Isabelle BSD-3
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    53
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    54
Bash process with separate process group id.
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    55
*/
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    56
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    57
#include <signal.h>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    58
#include <stdio.h>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    59
#include <stdlib.h>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    60
#include <string.h>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    61
#include <sys/resource.h>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    62
#include <sys/time.h>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    63
#include <sys/types.h>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    64
#include <sys/wait.h>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    65
#include <time.h>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    66
#include <unistd.h>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    67
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    68
static void fail(const char *msg)
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    69
{
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    70
  fprintf(stderr, "%s\n", msg);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    71
  fflush(stderr);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    72
  exit(2);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    73
}
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    74
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    75
static time_t now()
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    76
{
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    77
  struct timeval tv;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    78
  if (gettimeofday(&tv, NULL) == 0) {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    79
    return tv.tv_sec * 1000 + tv.tv_usec / 1000;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    80
  }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    81
  else {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    82
    return time(NULL) * 1000;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    83
  }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    84
}
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    85
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    86
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    87
int main(int argc, char *argv[])
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    88
{
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    89
  /* args */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    90
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    91
  if (argc < 2) {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    92
    fprintf(stderr, "Bad arguments: missing TIMING_FILE\n");
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    93
    fflush(stderr);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    94
    exit(1);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    95
  }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    96
  char *timing_name = argv[1];
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    97
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    98
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
    99
  /* potential fork */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   100
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   101
  time_t time_start = now();
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   102
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   103
  if (strlen(timing_name) > 0 || setsid() == -1) {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   104
    pid_t pid = fork();
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   105
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   106
    if (pid == -1) fail("Cannot set session id (failed to fork)");
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   107
    else if (pid != 0) {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   108
      int status;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   109
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   110
      // ingore SIGINT
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   111
      struct sigaction sa;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   112
      memset(&sa, 0, sizeof(sa));
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   113
      sa.sa_handler = SIG_IGN;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   114
      sigaction(SIGINT, &sa, 0);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   115
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   116
      if (waitpid(pid, &status, 0) == -1) {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   117
        fail("Cannot join forked process");
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   118
      }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   119
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   120
      /* report timing */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   121
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   122
      if (strlen(timing_name) > 0) {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   123
        long long timing_elapsed = now() - time_start;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   124
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   125
        struct rusage ru;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   126
        getrusage(RUSAGE_CHILDREN, &ru);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   127
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   128
        long long timing_cpu =
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   129
          ru.ru_utime.tv_sec * 1000 + ru.ru_utime.tv_usec / 1000 +
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   130
          ru.ru_stime.tv_sec * 1000 + ru.ru_stime.tv_usec / 1000;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   131
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   132
        FILE *timing_file = fopen(timing_name, "w");
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   133
        if (timing_file == NULL) fail("Cannot open timing file");
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   134
        fprintf(timing_file, "%lld %lld", timing_elapsed, timing_cpu);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   135
        fclose(timing_file);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   136
      }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   137
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   138
      if (WIFEXITED(status)) {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   139
        exit(WEXITSTATUS(status));
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   140
      }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   141
      else if (WIFSIGNALED(status)) {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   142
        exit(128 + WTERMSIG(status));
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   143
      }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   144
      else {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   145
        fail("Unknown status of forked process");
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   146
      }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   147
    }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   148
    else if (setsid() == -1) fail("Cannot set session id (after fork)");
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   149
  }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   150
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   151
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   152
  /* report pid */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   153
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   154
  fprintf(stdout, "%d\n", getpid());
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   155
  fflush(stdout);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   156
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   157
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   158
  /* shift command line */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   159
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   160
  int i;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   161
  for (i = 2; i < argc; i++) {
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   162
    argv[i - 2] = argv[i];
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   163
  }
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   164
  argv[argc - 2] = NULL;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   165
  argv[argc - 1] = NULL;
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   166
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   167
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   168
  /* exec */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   169
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   170
  execvp("bash", argv);
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   171
  fail("Cannot exec process");
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   172
}
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   173
""")
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   174
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   175
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   176
    /* build */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   177
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   178
    progress.echo("Building bash_process for " + platform_name + " ...")
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   179
    progress.bash("cc ../bash_process.c -o bash_process", cwd = platform_dir.file).check
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   180
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   181
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   182
    /* settings */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   183
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   184
    component_dir.write_settings("""
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   185
ISABELLE_BASH_PROCESS_HOME="$COMPONENT"
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   186
ISABELLE_BASH_PROCESS="$ISABELLE_BASH_PROCESS_HOME/${ISABELLE_APPLE_PLATFORM64:-$ISABELLE_PLATFORM64}/bash_process"
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   187
""")
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   188
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   189
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   190
    /* README */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   191
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   192
    File.write(component_dir.README,
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   193
"""The bash_process executable has been built like this:
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   194
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   195
  cc -Wall bash_process.c -o bash_process
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   196
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   197
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   198
        Makarius
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   199
        """ + Date.Format.date(Date.now()) + "\n")
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   200
}
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   201
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   202
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   203
  /* Isabelle tool wrapper */
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   204
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   205
  val isabelle_tool =
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   206
    Isabelle_Tool("component_bash_process", "build bash_process component from C source",
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   207
      Scala_Project.here,
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   208
      { args =>
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   209
        var target_dir = Path.current
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   210
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   211
        val getopts = Getopts("""
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   212
Usage: isabelle component_bash_process [OPTIONS]
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   213
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   214
  Options are:
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   215
    -D DIR       target directory (default ".")
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   216
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   217
  Build prover component from official download.
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   218
""",
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   219
          "D:" -> (arg => target_dir = Path.explode(arg)))
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   220
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   221
        val more_args = getopts(args)
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   222
        if (more_args.nonEmpty) getopts.usage()
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   223
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   224
        val progress = new Console_Progress()
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   225
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   226
        build_bash_process(progress = progress, target_dir = target_dir)
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   227
      })
ee449ca91c3b build bash_process in Isabelle/Scala, with etc/platforms.prop to preserve all platform directories (e.g. for SSH upload);
wenzelm
parents:
diff changeset
   228
}