bin/isabelle-process
author wenzelm
Thu, 05 Dec 2013 17:52:12 +0100
changeset 56012 cfb21e03fe2a
parent 53193 fc458f304f93
permissions -rwxr-xr-x
removed obsolete RC tags;
     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"