bin/isabelle_process
changeset 56439 95e2656b3b23
parent 52056 fc458f304f93
child 56628 a2df9de46060
equal deleted inserted replaced
56438:7f6b2634d853 56439:95e2656b3b23
       
     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 "    -I           startup Isar interaction mode"
       
    30   echo "    -P           startup Proof General interaction mode"
       
    31   echo "    -S           secure mode -- disallow critical operations"
       
    32   echo "    -T ADDR      startup process wrapper, with socket address"
       
    33   echo "    -W IN:OUT    startup process wrapper, with input/output fifos"
       
    34   echo "    -e MLTEXT    pass MLTEXT to the ML session"
       
    35   echo "    -m MODE      add print mode for output"
       
    36   echo "    -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)"
       
    37   echo "    -q           non-interactive session"
       
    38   echo "    -r           open heap file read-only"
       
    39   echo "    -w           reset write permissions on OUTPUT"
       
    40   echo
       
    41   echo "  INPUT (default \"$ISABELLE_LOGIC\") and OUTPUT specify in/out heaps."
       
    42   echo "  These are either names to be searched in the Isabelle path, or"
       
    43   echo "  actual file names (containing at least one /)."
       
    44   echo "  If INPUT is \"RAW_ML_SYSTEM\", just start the bare bones ML system."
       
    45   echo
       
    46   exit 1
       
    47 }
       
    48 
       
    49 function fail()
       
    50 {
       
    51   echo "$1" >&2
       
    52   exit 2
       
    53 }
       
    54 
       
    55 
       
    56 ## process command line
       
    57 
       
    58 # options
       
    59 
       
    60 ISAR=""
       
    61 PROOFGENERAL=""
       
    62 SECURE=""
       
    63 WRAPPER_SOCKET=""
       
    64 WRAPPER_FIFOS=""
       
    65 MLTEXT=""
       
    66 MODES=""
       
    67 declare -a SYSTEM_OPTIONS=()
       
    68 TERMINATE=""
       
    69 READONLY=""
       
    70 NOWRITE=""
       
    71 
       
    72 while getopts "IPST:W:e:m:o:qrw" OPT
       
    73 do
       
    74   case "$OPT" in
       
    75     I)
       
    76       ISAR=true
       
    77       ;;
       
    78     P)
       
    79       PROOFGENERAL=true
       
    80       ;;
       
    81     S)
       
    82       SECURE=true
       
    83       ;;
       
    84     T)
       
    85       WRAPPER_SOCKET="$OPTARG"
       
    86       ;;
       
    87     W)
       
    88       WRAPPER_FIFOS="$OPTARG"
       
    89       ;;
       
    90     e)
       
    91       MLTEXT="$MLTEXT $OPTARG"
       
    92       ;;
       
    93     m)
       
    94       if [ -z "$MODES" ]; then
       
    95         MODES="\"$OPTARG\""
       
    96       else
       
    97         MODES="\"$OPTARG\", $MODES"
       
    98       fi
       
    99       ;;
       
   100     o)
       
   101       SYSTEM_OPTIONS["${#SYSTEM_OPTIONS[@]}"]="$OPTARG"
       
   102       ;;
       
   103     q)
       
   104       TERMINATE=true
       
   105       ;;
       
   106     r)
       
   107       READONLY=true
       
   108       ;;
       
   109     w)
       
   110       NOWRITE=true
       
   111       ;;
       
   112     \?)
       
   113       usage
       
   114       ;;
       
   115   esac
       
   116 done
       
   117 
       
   118 shift $(($OPTIND - 1))
       
   119 
       
   120 
       
   121 # args
       
   122 
       
   123 INPUT=""
       
   124 OUTPUT=""
       
   125 
       
   126 if [ "$#" -ge 1 ]; then
       
   127   INPUT="$1"
       
   128   shift
       
   129 fi
       
   130 
       
   131 if [ "$#" -ge 1 ]; then
       
   132   OUTPUT="$1"
       
   133   shift
       
   134 fi
       
   135 
       
   136 [ "$#" -ne 0 ] && { echo "Bad args: $*"; usage; }
       
   137 
       
   138 
       
   139 ## check ML system
       
   140 
       
   141 [ -z "$ML_SYSTEM" ] && fail "Missing ML system settings! Unable to run Isabelle."
       
   142 
       
   143 
       
   144 ## input heap file
       
   145 
       
   146 [ -z "$INPUT" ] && INPUT="$ISABELLE_LOGIC"
       
   147 
       
   148 case "$INPUT" in
       
   149   RAW_ML_SYSTEM)
       
   150     INFILE=""
       
   151     ;;
       
   152   */*)
       
   153     INFILE="$INPUT"
       
   154     [ ! -f "$INFILE" ] && fail "Bad heap file: \"$INFILE\""
       
   155     ;;
       
   156   *)
       
   157     INFILE=""
       
   158     ISA_PATH=""
       
   159 
       
   160     splitarray ":" "$ISABELLE_PATH"; PATHS=("${SPLITARRAY[@]}")
       
   161     for DIR in "${PATHS[@]}"
       
   162     do
       
   163       DIR="$DIR/$ML_IDENTIFIER"
       
   164       ISA_PATH="$ISA_PATH  $DIR\n"
       
   165       [ -z "$INFILE" -a -f "$DIR/$INPUT" ] && INFILE="$DIR/$INPUT"
       
   166     done
       
   167 
       
   168     if [ -z "$INFILE" ]; then
       
   169       echo "Unknown logic \"$INPUT\" -- no heap file found in:" >&2
       
   170       echo -ne "$ISA_PATH" >&2
       
   171       exit 2
       
   172     fi
       
   173     ;;
       
   174 esac
       
   175 
       
   176 
       
   177 ## output heap file
       
   178 
       
   179 case "$OUTPUT" in
       
   180   "")
       
   181     if [ -z "$READONLY" -a -w "$INFILE" ]; then
       
   182       perl -e "exit (((stat('$INFILE'))[2] & 0222) != 0 ? 0 : 1);" && OUTFILE="$INFILE"
       
   183     fi
       
   184     ;;
       
   185   */*)
       
   186     OUTFILE="$OUTPUT"
       
   187     ;;
       
   188   *)
       
   189     mkdir -p "$ISABELLE_OUTPUT"
       
   190     OUTFILE="$ISABELLE_OUTPUT/$OUTPUT"
       
   191     ;;
       
   192 esac
       
   193 
       
   194 
       
   195 ## prepare tmp directory
       
   196 
       
   197 [ -z "$ISABELLE_TMP_PREFIX" ] && ISABELLE_TMP_PREFIX=/tmp/isabelle
       
   198 ISABELLE_PID="$$"
       
   199 ISABELLE_TMP="$ISABELLE_TMP_PREFIX$ISABELLE_PID"
       
   200 mkdir -p "$ISABELLE_TMP"
       
   201 
       
   202 
       
   203 ## run it!
       
   204 
       
   205 ML_SYSTEM_BASE=$(echo "$ML_SYSTEM" | cut -f1 -d-)
       
   206 
       
   207 [ -n "$MODES" ] && MLTEXT="Unsynchronized.change print_mode (append [$MODES]); $MLTEXT"
       
   208 
       
   209 [ -n "$SECURE" ] && MLTEXT="$MLTEXT; Secure.set_secure ();"
       
   210 
       
   211 NICE="nice"
       
   212 
       
   213 if [ -n "$WRAPPER_SOCKET" ]; then
       
   214   MLTEXT="$MLTEXT; Isabelle_Process.init_socket \"$WRAPPER_SOCKET\";"
       
   215 elif [ -n "$WRAPPER_FIFOS" ]; then
       
   216   splitarray ":" "$WRAPPER_FIFOS"; FIFOS=("${SPLITARRAY[@]}")
       
   217   [ "${#FIFOS[@]}" -eq 2 ] || fail "Expected IN:OUT fifo specification"
       
   218   [ -p "${FIFOS[0]}" ] || fail "Bad input fifo: ${FIFOS[0]}"
       
   219   [ -p "${FIFOS[1]}" ] || fail "Bad output fifo: ${FIFOS[1]}"
       
   220   MLTEXT="$MLTEXT; Isabelle_Process.init_fifos \"${FIFOS[0]}\" \"${FIFOS[1]}\";"
       
   221 else
       
   222   ISABELLE_PROCESS_OPTIONS="$ISABELLE_TMP/options"
       
   223   "$ISABELLE_TOOL" options -x "$ISABELLE_PROCESS_OPTIONS" -- "${SYSTEM_OPTIONS[@]}" || \
       
   224     fail "Failed to retrieve Isabelle system options"
       
   225   if [ "$INPUT" != RAW_ML_SYSTEM -a "$INPUT" != RAW ]; then
       
   226     MLTEXT="Options.load_default () handle _ => exit 2; $MLTEXT"
       
   227   fi
       
   228   if [ -n "$PROOFGENERAL" ]; then
       
   229     MLTEXT="$MLTEXT; ProofGeneral.init ();"
       
   230   elif [ -n "$ISAR" ]; then
       
   231     MLTEXT="$MLTEXT; Isar.main ();"
       
   232   else
       
   233     NICE=""
       
   234   fi
       
   235 fi
       
   236 
       
   237 export INFILE OUTFILE MLTEXT TERMINATE NOWRITE ISABELLE_PID ISABELLE_TMP ISABELLE_PROCESS_OPTIONS
       
   238 
       
   239 if [ -f "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" ]; then
       
   240   $NICE "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM"
       
   241 else
       
   242   $NICE "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM_BASE"
       
   243 fi
       
   244 RC="$?"
       
   245 
       
   246 [ -n "$ISABELLE_PROCESS_OPTIONS" ] && rm -f "$ISABELLE_PROCESS_OPTIONS"
       
   247 rmdir "$ISABELLE_TMP"
       
   248 
       
   249 exit "$RC"