wenzelm@3203: #!/bin/bash wenzelm@2292: # wenzelm@2308: # $Id$ wenzelm@2308: # wenzelm@2292: # Basic Isabelle startup script. wenzelm@2292: wenzelm@2292: wenzelm@2292: ## settings wenzelm@2292: wenzelm@2704: PRG=$(basename $0) wenzelm@2704: wenzelm@2735: ISABELLE_HOME=$(dirname $0)/.. wenzelm@2735: . $ISABELLE_HOME/lib/scripts/getsettings || \ wenzelm@2936: { echo "$PRG probably not called from its original place!"; exit 2; } wenzelm@2292: wenzelm@2292: wenzelm@2292: ## diagnostics wenzelm@2292: wenzelm@2292: function usage() wenzelm@2292: { wenzelm@2292: echo wenzelm@2292: echo "Usage: $PRG [OPTIONS] [INPUT] [OUTPUT]" wenzelm@2292: echo wenzelm@2292: echo " Options are:" wenzelm@2343: echo " -e MLTEXT pass MLTEXT to the ML session" wenzelm@2704: echo " -m MODE add print mode for output" wenzelm@2292: echo " -q non-interactive session" wenzelm@2292: echo " -r open heap file read-only" wenzelm@4516: echo " -u pass 'use\"ROOT.ML\";' to the ML session" wenzelm@3502: echo " -w reset write permissions on OUTPUT" wenzelm@2292: echo wenzelm@3184: echo " INPUT (default \"$ISABELLE_LOGIC\") and OUTPUT specify in/out heaps." wenzelm@2292: echo " These are either names to be searched in the Isabelle path, or actual" wenzelm@4539: echo " file names (containing at least one /)." wenzelm@2768: echo " If INPUT is \"RAW_ML_SYSTEM\", just start the bare bones ML system." wenzelm@2292: echo wenzelm@2292: exit 1 wenzelm@2292: } wenzelm@2292: wenzelm@2292: function fail() wenzelm@2292: { wenzelm@2343: echo "$1" >&2 wenzelm@2292: exit 2 wenzelm@2292: } wenzelm@2292: wenzelm@2292: wenzelm@2292: ## process command line wenzelm@2292: wenzelm@2292: # options wenzelm@2292: wenzelm@2292: MLTEXT="" wenzelm@2704: MODES="" wenzelm@2292: TERMINATE="" wenzelm@2292: READONLY="" wenzelm@3502: NOWRITE="" wenzelm@2292: wenzelm@4516: while getopts "e:m:qruw" OPT wenzelm@2292: do wenzelm@2292: case "$OPT" in wenzelm@2292: e) wenzelm@2292: MLTEXT="$MLTEXT $OPTARG" wenzelm@2292: ;; wenzelm@2704: m) wenzelm@2704: if [ -z "$MODES" ]; then wenzelm@2704: MODES="\"$OPTARG\"" wenzelm@2704: else wenzelm@2711: MODES="\"$OPTARG\", $MODES" wenzelm@2704: fi wenzelm@2704: ;; wenzelm@2292: q) wenzelm@2292: TERMINATE=true wenzelm@2292: ;; wenzelm@2292: r) wenzelm@2292: READONLY=true wenzelm@2292: ;; wenzelm@4516: u) wenzelm@4516: MLTEXT="$MLTEXT use\"ROOT.ML\";" wenzelm@4516: ;; wenzelm@3502: w) wenzelm@3502: NOWRITE=true wenzelm@3502: ;; wenzelm@2292: \?) wenzelm@2292: usage wenzelm@2292: ;; wenzelm@2292: esac wenzelm@2292: done wenzelm@2292: wenzelm@2292: shift $(($OPTIND - 1)) wenzelm@2292: wenzelm@2292: wenzelm@2292: # args wenzelm@2292: wenzelm@2292: INPUT="" wenzelm@2292: OUTPUT="" wenzelm@2292: wenzelm@2292: if [ $# -ge 1 ]; then wenzelm@2292: INPUT="$1" wenzelm@2292: shift wenzelm@2292: fi wenzelm@2292: wenzelm@2292: if [ $# -ge 1 ]; then wenzelm@2292: OUTPUT="$1" wenzelm@2292: shift wenzelm@2292: fi wenzelm@2292: wenzelm@2936: [ $# -ne 0 ] && { echo "Bad args: $*"; usage; } wenzelm@2292: wenzelm@2292: wenzelm@2292: ## check ML system wenzelm@2292: wenzelm@2308: [ -z "$ML_SYSTEM" ] && fail "Missing ML system settings! Unable to run Isabelle." wenzelm@2292: wenzelm@2292: wenzelm@2292: ## input heap file wenzelm@2292: wenzelm@3184: [ -z "$INPUT" ] && INPUT="$ISABELLE_LOGIC" wenzelm@2292: wenzelm@2292: case "$INPUT" in wenzelm@2768: RAW_ML_SYSTEM) wenzelm@2292: INFILE="" wenzelm@2292: ;; wenzelm@2292: */*) wenzelm@2292: INFILE="$INPUT" wenzelm@2343: [ ! -f "$INFILE" ] && fail "Bad heap file: \"$INFILE\"" wenzelm@2292: ;; wenzelm@2292: *) wenzelm@2308: ISA_PATH="" wenzelm@2292: INFILE="" wenzelm@2292: for DIR in $(echo $ISABELLE_PATH | tr : " ") wenzelm@2292: do wenzelm@2968: ISA_PATH="$ISA_PATH $DIR" wenzelm@2968: [ -z "$INFILE" -a -f $DIR/$INPUT ] && INFILE=$DIR/$INPUT wenzelm@2292: done wenzelm@2308: if [ -z "$INFILE" ]; then wenzelm@2343: echo "Unknown logic \"$INPUT\" -- no heap file found in:" >&2 wenzelm@2308: for DIR in $ISA_PATH wenzelm@2308: do wenzelm@2343: echo " $DIR" >&2 wenzelm@2308: done wenzelm@2308: exit 2 wenzelm@2308: fi wenzelm@2292: ;; wenzelm@2292: esac wenzelm@2292: wenzelm@2292: wenzelm@2292: ## output heap file wenzelm@2292: wenzelm@2292: case "$OUTPUT" in wenzelm@2292: "") wenzelm@2292: [ -z "$READONLY" -a -w "$INFILE" ] && OUTFILE="$INFILE" wenzelm@2292: ;; wenzelm@2292: */*) wenzelm@2292: OUTFILE="$OUTPUT" wenzelm@2292: ;; wenzelm@2292: *) wenzelm@3118: mkdir -p "$ISABELLE_OUTPUT" wenzelm@3118: OUTFILE="$ISABELLE_OUTPUT/$OUTPUT" wenzelm@2292: ;; wenzelm@2292: esac wenzelm@2292: wenzelm@2292: wenzelm@4333: ## prepare tmp directory wenzelm@4333: wenzelm@4333: [ -z "$ISABELLE_TMP_PREFIX" ] && ISABELLE_TMP_PREFIX=/tmp/isabelle wenzelm@4333: wenzelm@4333: ISABELLE_TMP="$ISABELLE_TMP_PREFIX$$" wenzelm@4333: mkdir -p "$ISABELLE_TMP" wenzelm@4333: wenzelm@4333: wenzelm@2292: ## run it! wenzelm@2292: wenzelm@2292: ML_SYSTEM_BASE=$(echo $ML_SYSTEM | cut -f1 -d-) wenzelm@2292: wenzelm@2704: [ -n "$MODES" ] && MLTEXT="print_mode := [$MODES]; $MLTEXT" wenzelm@2704: wenzelm@4333: export INFILE OUTFILE MLTEXT TERMINATE NOWRITE ISABELLE_TMP wenzelm@4333: wenzelm@4333: if [ -f $ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM ]; then wenzelm@4333: $ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM wenzelm@4333: else wenzelm@4333: $ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM_BASE wenzelm@4333: fi wenzelm@4355: RC=$? wenzelm@4333: wenzelm@4333: #Do not even think of 'rm -r'!! wenzelm@4333: rmdir $ISABELLE_TMP wenzelm@4355: wenzelm@4355: exit $RC