bin/isabelle_process
author Walther Neuper <wneuper@ist.tugraz.at>
Tue, 07 Feb 2017 08:57:42 +0100
changeset 59316 3a60188d9cc3
parent 59180 85ec71012df8
permissions -rwxr-xr-x
separate structure Model : MODEL
     1 #!/usr/bin/env bash
     2 #
     3 # Author: Markus Wenzel, TU Muenchen
     4 #
     5 # Isabelle process startup script.
     6 
     7 if [ -L "$0" ]; then
     8   TARGET="$(LC_ALL=C ls -l "$0" | sed 's/.* -> //')"
     9   exec "$(cd "$(dirname "$0")"; cd "$(pwd -P)"; cd "$(dirname "$TARGET")"; pwd)/$(basename "$TARGET")" "$@"
    10 fi
    11 
    12 
    13 ## settings
    14 
    15 PRG="$(basename "$0")"
    16 
    17 ISABELLE_HOME="$(cd "$(dirname "$0")"; cd "$(pwd -P)"; cd ..; pwd)"
    18 source "$ISABELLE_HOME/lib/scripts/getsettings" || exit 2
    19 
    20 
    21 ## diagnostics
    22 
    23 function usage()
    24 {
    25   echo
    26   echo "Usage: $PRG [OPTIONS] [INPUT] [OUTPUT]"
    27   echo
    28   echo "  Options are:"
    29   echo "    -O           system options from given YXML file"
    30   echo "    -P SOCKET    startup process wrapper via TCP socket"
    31   echo "    -S           secure mode -- disallow critical operations"
    32   echo "    -e MLTEXT    pass MLTEXT to the ML session"
    33   echo "    -m MODE      add print mode for output"
    34   echo "    -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)"
    35   echo "    -q           non-interactive session"
    36   echo "    -r           open heap file read-only"
    37   echo "    -w           reset write permissions on OUTPUT"
    38   echo
    39   echo "  INPUT (default \"$ISABELLE_LOGIC\") and OUTPUT specify in/out heaps."
    40   echo "  These are either names to be searched in the Isabelle path, or"
    41   echo "  actual file names (containing at least one /)."
    42   echo "  If INPUT is \"RAW_ML_SYSTEM\", just start the bare bones ML system."
    43   echo
    44   exit 1
    45 }
    46 
    47 function fail()
    48 {
    49   echo "$1" >&2
    50   exit 2
    51 }
    52 
    53 
    54 ## process command line
    55 
    56 # options
    57 
    58 OPTIONS_FILE=""
    59 PROCESS_SOCKET=""
    60 SECURE=""
    61 MLTEXT=""
    62 MODES=""
    63 declare -a SYSTEM_OPTIONS=()
    64 TERMINATE=""
    65 READONLY=""
    66 NOWRITE=""
    67 
    68 while getopts "O:P:Se:m:o:qrw" OPT
    69 do
    70   case "$OPT" in
    71     O)
    72       OPTIONS_FILE="$OPTARG"
    73       ;;
    74     P)
    75       PROCESS_SOCKET="$OPTARG"
    76       ;;
    77     S)
    78       SECURE=true
    79       ;;
    80     e)
    81       MLTEXT="$MLTEXT $OPTARG"
    82       ;;
    83     m)
    84       if [ -z "$MODES" ]; then
    85         MODES="\"$OPTARG\""
    86       else
    87         MODES="\"$OPTARG\", $MODES"
    88       fi
    89       ;;
    90     o)
    91       SYSTEM_OPTIONS["${#SYSTEM_OPTIONS[@]}"]="$OPTARG"
    92       ;;
    93     q)
    94       TERMINATE=true
    95       ;;
    96     r)
    97       READONLY=true
    98       ;;
    99     w)
   100       NOWRITE=true
   101       ;;
   102     \?)
   103       usage
   104       ;;
   105   esac
   106 done
   107 
   108 shift $(($OPTIND - 1))
   109 
   110 
   111 # args
   112 
   113 INPUT=""
   114 OUTPUT=""
   115 
   116 if [ "$#" -ge 1 ]; then
   117   INPUT="$1"
   118   shift
   119 fi
   120 
   121 if [ "$#" -ge 1 ]; then
   122   OUTPUT="$1"
   123   shift
   124 fi
   125 
   126 [ "$#" -ne 0 ] && { echo "Bad args: $*"; usage; }
   127 
   128 
   129 ## check ML system
   130 
   131 [ -z "$ML_SYSTEM" ] && fail "Missing ML system settings! Unable to run Isabelle."
   132 
   133 
   134 ## input heap file
   135 
   136 [ -z "$INPUT" ] && INPUT="$ISABELLE_LOGIC"
   137 
   138 case "$INPUT" in
   139   RAW_ML_SYSTEM)
   140     INFILE=""
   141     ;;
   142   */*)
   143     INFILE="$INPUT"
   144     [ ! -f "$INFILE" ] && fail "Bad heap file: \"$INFILE\""
   145     ;;
   146   *)
   147     INFILE=""
   148     ISA_PATH=""
   149 
   150     splitarray ":" "$ISABELLE_PATH"; PATHS=("${SPLITARRAY[@]}")
   151     for DIR in "${PATHS[@]}"
   152     do
   153       DIR="$DIR/$ML_IDENTIFIER"
   154       ISA_PATH="$ISA_PATH  $DIR\n"
   155       [ -z "$INFILE" -a -f "$DIR/$INPUT" ] && INFILE="$DIR/$INPUT"
   156     done
   157 
   158     if [ -z "$INFILE" ]; then
   159       echo "Unknown logic \"$INPUT\" -- no heap file found in:" >&2
   160       echo -ne "$ISA_PATH" >&2
   161       exit 2
   162     fi
   163     ;;
   164 esac
   165 
   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     OUTFILE="$ISABELLE_OUTPUT/$OUTPUT"
   181     ;;
   182 esac
   183 
   184 
   185 ## prepare tmp directory
   186 
   187 [ -z "$ISABELLE_TMP_PREFIX" ] && ISABELLE_TMP_PREFIX=/tmp/isabelle
   188 ISABELLE_PID="$$"
   189 ISABELLE_TMP="$ISABELLE_TMP_PREFIX$ISABELLE_PID"
   190 mkdir -p "$ISABELLE_TMP"
   191 
   192 
   193 ## run it!
   194 
   195 ML_SYSTEM_BASE=$(echo "$ML_SYSTEM" | cut -f1 -d-)
   196 
   197 [ -n "$MODES" ] && MLTEXT="Unsynchronized.change print_mode (append [$MODES]); $MLTEXT"
   198 
   199 [ -n "$SECURE" ] && MLTEXT="$MLTEXT; Secure.set_secure ();"
   200 
   201 if [ -n "$PROCESS_SOCKET" ]; then
   202   MLTEXT="$MLTEXT; Isabelle_Process.init \"$PROCESS_SOCKET\";"
   203 else
   204   ISABELLE_PROCESS_OPTIONS="$ISABELLE_TMP/options"
   205   if [ -n "$OPTIONS_FILE" ]; then
   206     [ "${#SYSTEM_OPTIONS[@]}" -gt 0 ] && \
   207       fail "Cannot provide options file and options on command-line"
   208     mv "$OPTIONS_FILE" "$ISABELLE_PROCESS_OPTIONS" ||
   209       fail "Failed to move options file \"$OPTIONS_FILE\""
   210   else
   211     "$ISABELLE_TOOL" options -x "$ISABELLE_PROCESS_OPTIONS" -- "${SYSTEM_OPTIONS[@]}" || \
   212       fail "Failed to retrieve Isabelle system options"
   213   fi
   214   if [ "$INPUT" != RAW_ML_SYSTEM -a "$INPUT" != RAW ]; then
   215     MLTEXT="Exn.capture_exit 2 Options.load_default (); $MLTEXT"
   216   fi
   217 fi
   218 
   219 export INFILE OUTFILE MLTEXT TERMINATE NOWRITE ISABELLE_PID ISABELLE_TMP ISABELLE_PROCESS_OPTIONS
   220 
   221 if [ -f "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" ]; then
   222   "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM"
   223 else
   224   "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM_BASE"
   225 fi
   226 RC="$?"
   227 
   228 [ -n "$ISABELLE_PROCESS_OPTIONS" ] && rm -f "$ISABELLE_PROCESS_OPTIONS"
   229 rmdir "$ISABELLE_TMP"
   230 
   231 exit "$RC"