bin/isabelle_process
changeset 62475 43e64c770f28
parent 61319 d84b4d39bce1
child 62506 860cd901ab43
equal deleted inserted replaced
62474:af131b9af420 62475:43e64c770f28
     1 #!/usr/bin/env bash
     1 #!/usr/bin/env bash
     2 #
     2 #
     3 # Author: Markus Wenzel, TU Muenchen
     3 # Author: Makarius
     4 #
     4 #
     5 # Isabelle process startup script.
     5 # Isabelle process startup script.
     6 
     6 
     7 if [ -L "$0" ]; then
     7 if [ -L "$0" ]; then
     8   TARGET="$(LC_ALL=C ls -l "$0" | sed 's/.* -> //')"
     8   TARGET="$(LC_ALL=C ls -l "$0" | sed 's/.* -> //')"
    21 ## diagnostics
    21 ## diagnostics
    22 
    22 
    23 function usage()
    23 function usage()
    24 {
    24 {
    25   echo
    25   echo
    26   echo "Usage: $PRG [OPTIONS] [INPUT] [OUTPUT]"
    26   echo "Usage: $PRG [OPTIONS] [HEAP]"
    27   echo
    27   echo
    28   echo "  Options are:"
    28   echo "  Options are:"
    29   echo "    -O           system options from given YXML file"
    29   echo "    -O           system options from given YXML file"
    30   echo "    -P SOCKET    startup process wrapper via TCP socket"
    30   echo "    -P SOCKET    startup process wrapper via TCP socket"
    31   echo "    -S           secure mode -- disallow critical operations"
    31   echo "    -S           secure mode -- disallow critical operations"
    32   echo "    -e MLTEXT    pass MLTEXT to the ML session"
    32   echo "    -e ML_TEXT   pass ML_TEXT to the ML session"
    33   echo "    -m MODE      add print mode for output"
    33   echo "    -m MODE      add print mode for output"
    34   echo "    -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)"
    34   echo "    -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)"
    35   echo "    -q           non-interactive session"
    35   echo "    -q           non-interactive session"
    36   echo "    -r           open heap file read-only"
       
    37   echo "    -w           reset write permissions on OUTPUT"
       
    38   echo
    36   echo
    39   echo "  INPUT (default \"$ISABELLE_LOGIC\") and OUTPUT specify in/out heaps."
    37   echo "  If HEAP is a plain name (default \"$ISABELLE_LOGIC\"), it is searched in \$ISABELLE_PATH;"
    40   echo "  These are either names to be searched in the Isabelle path, or"
    38   echo "  if it contains a slash, it is taken as literal file; if it is RAW_ML_SYSTEM,"
    41   echo "  actual file names (containing at least one /)."
    39   echo "  the initial ML heap is used."
    42   echo "  If INPUT is \"RAW_ML_SYSTEM\", just start the bare bones ML system."
       
    43   echo
    40   echo
    44   exit 1
    41   exit 1
    45 }
    42 }
    46 
    43 
    47 function fail()
    44 function fail()
    56 # options
    53 # options
    57 
    54 
    58 OPTIONS_FILE=""
    55 OPTIONS_FILE=""
    59 PROCESS_SOCKET=""
    56 PROCESS_SOCKET=""
    60 SECURE=""
    57 SECURE=""
    61 MLTEXT=""
    58 ML_TEXT=""
    62 MODES=""
    59 MODES=""
    63 declare -a SYSTEM_OPTIONS=()
    60 declare -a SYSTEM_OPTIONS=()
    64 TERMINATE=""
    61 TERMINATE=""
    65 READONLY=""
       
    66 NOWRITE=""
       
    67 
    62 
    68 while getopts "O:P:Se:m:o:qrw" OPT
    63 while getopts "O:P:Se:m:o:q" OPT
    69 do
    64 do
    70   case "$OPT" in
    65   case "$OPT" in
    71     O)
    66     O)
    72       OPTIONS_FILE="$OPTARG"
    67       OPTIONS_FILE="$OPTARG"
    73       ;;
    68       ;;
    76       ;;
    71       ;;
    77     S)
    72     S)
    78       SECURE=true
    73       SECURE=true
    79       ;;
    74       ;;
    80     e)
    75     e)
    81       MLTEXT="$MLTEXT $OPTARG"
    76       ML_TEXT="$ML_TEXT $OPTARG"
    82       ;;
    77       ;;
    83     m)
    78     m)
    84       if [ -z "$MODES" ]; then
    79       if [ -z "$MODES" ]; then
    85         MODES="\"$OPTARG\""
    80         MODES="\"$OPTARG\""
    86       else
    81       else
    91       SYSTEM_OPTIONS["${#SYSTEM_OPTIONS[@]}"]="$OPTARG"
    86       SYSTEM_OPTIONS["${#SYSTEM_OPTIONS[@]}"]="$OPTARG"
    92       ;;
    87       ;;
    93     q)
    88     q)
    94       TERMINATE=true
    89       TERMINATE=true
    95       ;;
    90       ;;
    96     r)
       
    97       READONLY=true
       
    98       ;;
       
    99     w)
       
   100       NOWRITE=true
       
   101       ;;
       
   102     \?)
    91     \?)
   103       usage
    92       usage
   104       ;;
    93       ;;
   105   esac
    94   esac
   106 done
    95 done
   108 shift $(($OPTIND - 1))
    97 shift $(($OPTIND - 1))
   109 
    98 
   110 
    99 
   111 # args
   100 # args
   112 
   101 
   113 INPUT=""
   102 HEAP=""
   114 OUTPUT=""
       
   115 
   103 
   116 if [ "$#" -ge 1 ]; then
   104 if [ "$#" -ge 1 ]; then
   117   INPUT="$1"
   105   HEAP="$1"
   118   shift
       
   119 fi
       
   120 
       
   121 if [ "$#" -ge 1 ]; then
       
   122   OUTPUT="$1"
       
   123   shift
   106   shift
   124 fi
   107 fi
   125 
   108 
   126 [ "$#" -ne 0 ] && { echo "Bad args: $*"; usage; }
   109 [ "$#" -ne 0 ] && { echo "Bad args: $*"; usage; }
   127 
   110 
   129 ## check ML system
   112 ## check ML system
   130 
   113 
   131 [ -z "$ML_SYSTEM" ] && fail "Missing ML system settings! Unable to run Isabelle."
   114 [ -z "$ML_SYSTEM" ] && fail "Missing ML system settings! Unable to run Isabelle."
   132 
   115 
   133 
   116 
   134 ## input heap file
   117 ## heap file
   135 
   118 
   136 [ -z "$INPUT" ] && INPUT="$ISABELLE_LOGIC"
   119 [ -z "$HEAP" ] && HEAP="$ISABELLE_LOGIC"
   137 
   120 
   138 case "$INPUT" in
   121 case "$HEAP" in
   139   RAW_ML_SYSTEM)
   122   RAW_ML_SYSTEM)
   140     INFILE=""
   123     HEAP_FILE=""
   141     ;;
   124     ;;
   142   */*)
   125   */*)
   143     INFILE="$INPUT"
   126     HEAP_FILE="$HEAP"
   144     [ ! -f "$INFILE" ] && fail "Bad heap file: \"$INFILE\""
   127     [ ! -f "$HEAP_FILE" ] && fail "Bad heap file: \"$HEAP_FILE\""
   145     ;;
   128     ;;
   146   *)
   129   *)
   147     INFILE=""
   130     HEAP_FILE=""
   148     ISA_PATH=""
   131     ISA_PATH=""
   149 
   132 
   150     splitarray ":" "$ISABELLE_PATH"; PATHS=("${SPLITARRAY[@]}")
   133     splitarray ":" "$ISABELLE_PATH"; PATHS=("${SPLITARRAY[@]}")
   151     for DIR in "${PATHS[@]}"
   134     for DIR in "${PATHS[@]}"
   152     do
   135     do
   153       DIR="$DIR/$ML_IDENTIFIER"
   136       DIR="$DIR/$ML_IDENTIFIER"
   154       ISA_PATH="$ISA_PATH  $DIR\n"
   137       ISA_PATH="$ISA_PATH  $DIR\n"
   155       [ -z "$INFILE" -a -f "$DIR/$INPUT" ] && INFILE="$DIR/$INPUT"
   138       [ -z "$HEAP_FILE" -a -f "$DIR/$HEAP" ] && HEAP_FILE="$DIR/$HEAP"
   156     done
   139     done
   157 
   140 
   158     if [ -z "$INFILE" ]; then
   141     if [ -z "$HEAP_FILE" ]; then
   159       echo "Unknown logic \"$INPUT\" -- no heap file found in:" >&2
   142       echo "Unknown logic \"$HEAP\" -- no heap file found in:" >&2
   160       echo -ne "$ISA_PATH" >&2
   143       echo -ne "$ISA_PATH" >&2
   161       exit 2
   144       exit 2
   162     fi
   145     fi
   163     ;;
   146     ;;
   164 esac
   147 esac
   165 
   148 
   166 
       
   167 ## output heap file
       
   168 
       
   169 case "$OUTPUT" in
       
   170   "")
       
   171     if [ -z "$READONLY" -a -w "$INFILE" ]; then
       
   172       perl -e "exit (((stat('$INFILE'))[2] & 0222) != 0 ? 0 : 1);" && OUTFILE="$INFILE"
       
   173     fi
       
   174     ;;
       
   175   */*)
       
   176     OUTFILE="$OUTPUT"
       
   177     ;;
       
   178   *)
       
   179     mkdir -p "$ISABELLE_OUTPUT"
       
   180     chmod $(umask -S) "$ISABELLE_OUTPUT"
       
   181     OUTFILE="$ISABELLE_OUTPUT/$OUTPUT"
       
   182     ;;
       
   183 esac
       
   184 
   149 
   185 
   150 
   186 ## prepare tmp directory
   151 ## prepare tmp directory
   187 
   152 
   188 [ -z "$ISABELLE_TMP_PREFIX" ] && ISABELLE_TMP_PREFIX=/tmp/isabelle
   153 [ -z "$ISABELLE_TMP_PREFIX" ] && ISABELLE_TMP_PREFIX=/tmp/isabelle
   194 
   159 
   195 ## run it!
   160 ## run it!
   196 
   161 
   197 ML_SYSTEM_BASE=$(echo "$ML_SYSTEM" | cut -f1 -d-)
   162 ML_SYSTEM_BASE=$(echo "$ML_SYSTEM" | cut -f1 -d-)
   198 
   163 
   199 [ -n "$MODES" ] && MLTEXT="Unsynchronized.change print_mode (append [$MODES]); $MLTEXT"
   164 [ -n "$MODES" ] && ML_TEXT="Unsynchronized.change print_mode (append [$MODES]); $ML_TEXT"
   200 
   165 
   201 [ -n "$SECURE" ] && MLTEXT="$MLTEXT; Secure.set_secure ();"
   166 [ -n "$SECURE" ] && ML_TEXT="$ML_TEXT; Secure.set_secure ();"
   202 
   167 
   203 if [ -n "$PROCESS_SOCKET" ]; then
   168 if [ -n "$PROCESS_SOCKET" ]; then
   204   MLTEXT="$MLTEXT; Isabelle_Process.init \"$PROCESS_SOCKET\";"
   169   ML_TEXT="$ML_TEXT; Isabelle_Process.init \"$PROCESS_SOCKET\";"
   205 else
   170 else
   206   ISABELLE_PROCESS_OPTIONS="$ISABELLE_TMP/options"
   171   ISABELLE_PROCESS_OPTIONS="$ISABELLE_TMP/options"
   207   if [ -n "$OPTIONS_FILE" ]; then
   172   if [ -n "$OPTIONS_FILE" ]; then
   208     [ "${#SYSTEM_OPTIONS[@]}" -gt 0 ] && \
   173     [ "${#SYSTEM_OPTIONS[@]}" -gt 0 ] && \
   209       fail "Cannot provide options file and options on command-line"
   174       fail "Cannot provide options file and options on command-line"
   211       fail "Failed to move options file \"$OPTIONS_FILE\""
   176       fail "Failed to move options file \"$OPTIONS_FILE\""
   212   else
   177   else
   213     "$ISABELLE_TOOL" options -x "$ISABELLE_PROCESS_OPTIONS" -- "${SYSTEM_OPTIONS[@]}" || \
   178     "$ISABELLE_TOOL" options -x "$ISABELLE_PROCESS_OPTIONS" -- "${SYSTEM_OPTIONS[@]}" || \
   214       fail "Failed to retrieve Isabelle system options"
   179       fail "Failed to retrieve Isabelle system options"
   215   fi
   180   fi
   216   if [ "$INPUT" != RAW_ML_SYSTEM -a "$INPUT" != RAW ]; then
   181   if [ "$HEAP" != RAW_ML_SYSTEM -a "$HEAP" != RAW ]; then
   217     MLTEXT="Exn.capture_exit 2 Options.load_default (); $MLTEXT"
   182     ML_TEXT="Exn.capture_exit 2 Options.load_default (); $ML_TEXT"
   218   fi
   183   fi
   219 fi
   184 fi
   220 
   185 
   221 export INFILE OUTFILE MLTEXT TERMINATE NOWRITE ISABELLE_PID ISABELLE_TMP ISABELLE_PROCESS_OPTIONS
   186 export HEAP_FILE ML_TEXT TERMINATE ISABELLE_PID ISABELLE_TMP ISABELLE_PROCESS_OPTIONS
   222 
   187 
   223 if [ -f "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" ]; then
   188 if [ -f "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" ]; then
   224   "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM"
   189   "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM"
   225 else
   190 else
   226   "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM_BASE"
   191   "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM_BASE"