wenzelm@10555: #!/usr/bin/env bash wenzelm@2292: # wenzelm@2308: # $Id$ wenzelm@9786: # Author: Markus Wenzel, TU Muenchen wenzelm@9786: # License: GPL (GNU GENERAL PUBLIC LICENSE) wenzelm@2308: # wenzelm@2292: # Basic Isabelle startup script. wenzelm@2292: wenzelm@2292: wenzelm@2292: ## settings wenzelm@2292: wenzelm@10511: PRG="$(basename "$0")" wenzelm@2704: wenzelm@10511: ISABELLE_HOME="$(dirname "$0")/.." wenzelm@9786: . "$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@10104: echo " -C tell ML system to copy output image" wenzelm@5815: echo " -I startup Isar interaction mode" wenzelm@9982: echo " -P startup Proof General interaction mode" wenzelm@8359: echo " -c tell ML system to compress output image" wenzelm@2343: echo " -e MLTEXT pass MLTEXT to the ML session" wenzelm@10905: echo " -f pass 'Session.finish();' 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@7887: echo " These are either names to be searched in the Isabelle path, or" wenzelm@7887: echo " actual 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@10104: COPYDB="" wenzelm@9972: ISAR=false wenzelm@9972: PROOFGENERAL="" wenzelm@8359: COMPRESS="" wenzelm@2292: MLTEXT="" wenzelm@2704: MODES="" wenzelm@2292: TERMINATE="" wenzelm@2292: READONLY="" wenzelm@3502: NOWRITE="" wenzelm@2292: wenzelm@10905: while getopts "CIPce:fm:qruw" OPT wenzelm@2292: do wenzelm@2292: case "$OPT" in wenzelm@10104: C) wenzelm@10104: COPYDB=true wenzelm@10104: ;; wenzelm@5815: I) wenzelm@9972: ISAR=true wenzelm@9972: ;; wenzelm@9972: P) wenzelm@9972: PROOFGENERAL=true wenzelm@5815: ;; wenzelm@8359: c) wenzelm@8359: COMPRESS=true wenzelm@8359: ;; wenzelm@2292: e) wenzelm@2292: MLTEXT="$MLTEXT $OPTARG" wenzelm@2292: ;; wenzelm@10905: f) wenzelm@10905: MLTEXT="$MLTEXT Session.finish();" wenzelm@10905: ;; wenzelm@2704: m) wenzelm@2704: if [ -z "$MODES" ]; then wenzelm@2704: MODES="\"$OPTARG\"" wenzelm@2704: else wenzelm@10585: 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@9786: if [ "$#" -ge 1 ]; then wenzelm@2292: INPUT="$1" wenzelm@2292: shift wenzelm@2292: fi wenzelm@2292: wenzelm@9786: if [ "$#" -ge 1 ]; then wenzelm@2292: OUTPUT="$1" wenzelm@2292: shift wenzelm@2292: fi wenzelm@2292: wenzelm@9786: [ "$#" -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@9786: INFILE="" wenzelm@2308: ISA_PATH="" wenzelm@9786: wenzelm@9786: ORIG_IFS="$IFS" wenzelm@9786: IFS=":" wenzelm@9786: for DIR in $ISABELLE_PATH wenzelm@2292: do wenzelm@9786: DIR="$DIR/$ML_IDENTIFIER" wenzelm@9786: ISA_PATH="$ISA_PATH $DIR\n" wenzelm@9786: [ -z "$INFILE" -a -f "$DIR/$INPUT" ] && INFILE="$DIR/$INPUT" wenzelm@2292: done wenzelm@9786: IFS="$ORIG_IFS" wenzelm@9786: wenzelm@2308: if [ -z "$INFILE" ]; then wenzelm@2343: echo "Unknown logic \"$INPUT\" -- no heap file found in:" >&2 wenzelm@9786: echo -ne "$ISA_PATH" >&2 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@9786: ML_SYSTEM_BASE=$(echo "$ML_SYSTEM" | cut -f1 -d-) wenzelm@2292: wenzelm@2704: [ -n "$MODES" ] && MLTEXT="print_mode := [$MODES]; $MLTEXT" wenzelm@2704: wenzelm@9972: if [ -n "$PROOFGENERAL" ]; then wenzelm@9972: MLTEXT="$MLTEXT; ProofGeneral.init $ISAR;" wenzelm@9972: elif [ "$ISAR" = true ]; then wenzelm@9972: MLTEXT="$MLTEXT; Isar.main();" wenzelm@9972: fi wenzelm@9972: wenzelm@10104: export INFILE OUTFILE COPYDB COMPRESS MLTEXT TERMINATE NOWRITE ISABELLE_TMP wenzelm@4333: wenzelm@9786: if [ -f "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" ]; then wenzelm@9786: "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" wenzelm@4333: else wenzelm@9786: "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM_BASE" wenzelm@4333: fi wenzelm@9786: RC="$?" wenzelm@4333: wenzelm@4333: #Do not even think of 'rm -r'!! wenzelm@9786: rmdir "$ISABELLE_TMP" wenzelm@4355: wenzelm@9786: exit "$RC"