#!/bin/sh # # $Id: isabelle-process,v 1.13 2005/07/19 15:21:45 wenzelm Exp $ # Author: Markus Wenzel, TU Muenchen # # Isabelle process startup script. if [ -L "$0" ]; then TARGET="$(LC_ALL=C ls -l "$0" | sed 's/.* -> //')" exec "$(cd "$(dirname "$0")"; cd "$(pwd -P)"; cd "$(dirname "$TARGET")"; pwd)/$(basename "$TARGET")" "$@" fi ## settings PRG="$(basename "$0")" ISABELLE_HOME="$(cd "$(dirname "$0")"; cd "$(pwd -P)"; cd ..; pwd)" . "$ISABELLE_HOME/lib/scripts/getsettings" || exit 2 ## diagnostics usage() { echo echo "Usage: $PRG [OPTIONS] [INPUT] [OUTPUT]" echo echo " Options are:" echo " -C tell ML system to copy output image" echo " -I startup Isar interaction mode" echo " -P startup Proof General interaction mode" echo " -X startup PGIP interaction mode" echo " -c tell ML system to compress output image" echo " -e MLTEXT pass MLTEXT to the ML session" echo " -f pass 'Session.finish();' to the ML session" echo " -m MODE add print mode for output" echo " -q non-interactive session" echo " -r open heap file read-only" echo " -u pass 'use\"ROOT.ML\";' to the ML session" echo " -w reset write permissions on OUTPUT" echo echo " INPUT (default \"$ISABELLE_LOGIC\") and OUTPUT specify in/out heaps." echo " These are either names to be searched in the Isabelle path, or" echo " actual file names (containing at least one /)." echo " If INPUT is \"RAW_ML_SYSTEM\", just start the bare bones ML system." echo exit 1 } fail() { echo "$1" >&2 exit 2 } ## process command line # options COPYDB="" ISAR=false PROOFGENERAL="" COMPRESS="" MLTEXT="" MODES="" TERMINATE="" READONLY="" NOWRITE="" while getopts "XCIPce:fm:qruw" OPT do case "$OPT" in C) COPYDB=true ;; I) ISAR=true ;; P) PROOFGENERAL=true ;; X) PGIP=true ;; c) COMPRESS=true ;; e) MLTEXT="$MLTEXT $OPTARG" ;; f) MLTEXT="$MLTEXT Session.finish();" ;; m) if [ -z "$MODES" ]; then MODES="\"$OPTARG\"" else MODES="\"$OPTARG\", $MODES" fi ;; q) TERMINATE=true ;; r) READONLY=true ;; u) MLTEXT="$MLTEXT use\"ROOT.ML\";" ;; w) NOWRITE=true ;; \?) usage ;; esac done shift $(($OPTIND - 1)) # args INPUT="" OUTPUT="" if [ "$#" -ge 1 ]; then INPUT="$1" shift fi if [ "$#" -ge 1 ]; then OUTPUT="$1" shift fi [ "$#" -ne 0 ] && { echo "Bad args: $*"; usage; } ## check ML system [ -z "$ML_SYSTEM" ] && fail "Missing ML system settings! Unable to run Isabelle." ## input heap file [ -z "$INPUT" ] && INPUT="$ISABELLE_LOGIC" case "$INPUT" in RAW_ML_SYSTEM) INFILE="" ;; */*) INFILE="$INPUT" [ ! -f "$INFILE" ] && fail "Bad heap file: \"$INFILE\"" ;; *) INFILE="" ISA_PATH="" ORIG_IFS="$IFS" IFS=":" for DIR in $ISABELLE_PATH do DIR="$DIR/$ML_IDENTIFIER" ISA_PATH="$ISA_PATH $DIR\n" [ -z "$INFILE" -a -f "$DIR/$INPUT" ] && INFILE="$DIR/$INPUT" done IFS="$ORIG_IFS" if [ -z "$INFILE" ]; then echo "Unknown logic \"$INPUT\" -- no heap file found in:" >&2 echo -ne "$ISA_PATH" >&2 exit 2 fi ;; esac ## output heap file case "$OUTPUT" in "") [ -z "$READONLY" -a -w "$INFILE" ] && OUTFILE="$INFILE" ;; */*) OUTFILE="$OUTPUT" ;; *) mkdir -p "$ISABELLE_OUTPUT" OUTFILE="$ISABELLE_OUTPUT/$OUTPUT" ;; esac ## prepare tmp directory [ -z "$ISABELLE_TMP_PREFIX" ] && ISABELLE_TMP_PREFIX=/tmp/isabelle ISABELLE_PID="$$" ISABELLE_TMP="$ISABELLE_TMP_PREFIX${ISABELLE_PID}" mkdir -p "$ISABELLE_TMP" ## run it! ML_SYSTEM_BASE=$(echo "$ML_SYSTEM" | cut -f1 -d-) [ -n "$MODES" ] && MLTEXT="print_mode := [$MODES]; $MLTEXT" if [ -n "$PGIP" ]; then MLTEXT="$MLTEXT; ProofGeneral.init_pgip $ISAR;" elif [ -n "$PROOFGENERAL" ]; then MLTEXT="$MLTEXT; ProofGeneral.init $ISAR;" elif [ "$ISAR" = true ]; then MLTEXT="$MLTEXT; Isar.main();" fi export INFILE OUTFILE COPYDB COMPRESS MLTEXT TERMINATE NOWRITE \ ISABELLE_PID ISABELLE_TMP if [ -f "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" ]; then "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" else "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM_BASE" fi RC="$?" rmdir "$ISABELLE_TMP" exit "$RC"