21 ## diagnostics |
21 ## diagnostics |
22 |
22 |
23 function usage() |
23 function usage() |
24 { |
24 { |
25 echo |
25 echo |
26 echo "Usage: $PRG [OPTIONS] [INPUT] [OUTPUT]" |
26 echo "Usage: $PRG [OPTIONS] [HEAP]" |
27 echo |
27 echo |
28 echo " Options are:" |
28 echo " Options are:" |
29 echo " -O system options from given YXML file" |
29 echo " -O system options from given YXML file" |
30 echo " -P SOCKET startup process wrapper via TCP socket" |
30 echo " -P SOCKET startup process wrapper via TCP socket" |
31 echo " -S secure mode -- disallow critical operations" |
31 echo " -S secure mode -- disallow critical operations" |
32 echo " -e MLTEXT pass MLTEXT to the ML session" |
32 echo " -e ML_TEXT pass ML_TEXT to the ML session" |
33 echo " -m MODE add print mode for output" |
33 echo " -m MODE add print mode for output" |
34 echo " -o OPTION override Isabelle system OPTION (via NAME=VAL or NAME)" |
34 echo " -o OPTION override Isabelle system OPTION (via NAME=VAL or NAME)" |
35 echo " -q non-interactive session" |
35 echo " -q non-interactive session" |
36 echo " -r open heap file read-only" |
|
37 echo " -w reset write permissions on OUTPUT" |
|
38 echo |
36 echo |
39 echo " INPUT (default \"$ISABELLE_LOGIC\") and OUTPUT specify in/out heaps." |
37 echo " If HEAP is a plain name (default \"$ISABELLE_LOGIC\"), it is searched in \$ISABELLE_PATH;" |
40 echo " These are either names to be searched in the Isabelle path, or" |
38 echo " if it contains a slash, it is taken as literal file; if it is RAW_ML_SYSTEM," |
41 echo " actual file names (containing at least one /)." |
39 echo " the initial ML heap is used." |
42 echo " If INPUT is \"RAW_ML_SYSTEM\", just start the bare bones ML system." |
|
43 echo |
40 echo |
44 exit 1 |
41 exit 1 |
45 } |
42 } |
46 |
43 |
47 function fail() |
44 function fail() |
129 ## check ML system |
112 ## check ML system |
130 |
113 |
131 [ -z "$ML_SYSTEM" ] && fail "Missing ML system settings! Unable to run Isabelle." |
114 [ -z "$ML_SYSTEM" ] && fail "Missing ML system settings! Unable to run Isabelle." |
132 |
115 |
133 |
116 |
134 ## input heap file |
117 ## heap file |
135 |
118 |
136 [ -z "$INPUT" ] && INPUT="$ISABELLE_LOGIC" |
119 [ -z "$HEAP" ] && HEAP="$ISABELLE_LOGIC" |
137 |
120 |
138 case "$INPUT" in |
121 case "$HEAP" in |
139 RAW_ML_SYSTEM) |
122 RAW_ML_SYSTEM) |
140 INFILE="" |
123 HEAP_FILE="" |
141 ;; |
124 ;; |
142 */*) |
125 */*) |
143 INFILE="$INPUT" |
126 HEAP_FILE="$HEAP" |
144 [ ! -f "$INFILE" ] && fail "Bad heap file: \"$INFILE\"" |
127 [ ! -f "$HEAP_FILE" ] && fail "Bad heap file: \"$HEAP_FILE\"" |
145 ;; |
128 ;; |
146 *) |
129 *) |
147 INFILE="" |
130 HEAP_FILE="" |
148 ISA_PATH="" |
131 ISA_PATH="" |
149 |
132 |
150 splitarray ":" "$ISABELLE_PATH"; PATHS=("${SPLITARRAY[@]}") |
133 splitarray ":" "$ISABELLE_PATH"; PATHS=("${SPLITARRAY[@]}") |
151 for DIR in "${PATHS[@]}" |
134 for DIR in "${PATHS[@]}" |
152 do |
135 do |
153 DIR="$DIR/$ML_IDENTIFIER" |
136 DIR="$DIR/$ML_IDENTIFIER" |
154 ISA_PATH="$ISA_PATH $DIR\n" |
137 ISA_PATH="$ISA_PATH $DIR\n" |
155 [ -z "$INFILE" -a -f "$DIR/$INPUT" ] && INFILE="$DIR/$INPUT" |
138 [ -z "$HEAP_FILE" -a -f "$DIR/$HEAP" ] && HEAP_FILE="$DIR/$HEAP" |
156 done |
139 done |
157 |
140 |
158 if [ -z "$INFILE" ]; then |
141 if [ -z "$HEAP_FILE" ]; then |
159 echo "Unknown logic \"$INPUT\" -- no heap file found in:" >&2 |
142 echo "Unknown logic \"$HEAP\" -- no heap file found in:" >&2 |
160 echo -ne "$ISA_PATH" >&2 |
143 echo -ne "$ISA_PATH" >&2 |
161 exit 2 |
144 exit 2 |
162 fi |
145 fi |
163 ;; |
146 ;; |
164 esac |
147 esac |
165 |
148 |
166 |
|
167 ## output heap file |
|
168 |
|
169 case "$OUTPUT" in |
|
170 "") |
|
171 if [ -z "$READONLY" -a -w "$INFILE" ]; then |
|
172 perl -e "exit (((stat('$INFILE'))[2] & 0222) != 0 ? 0 : 1);" && OUTFILE="$INFILE" |
|
173 fi |
|
174 ;; |
|
175 */*) |
|
176 OUTFILE="$OUTPUT" |
|
177 ;; |
|
178 *) |
|
179 mkdir -p "$ISABELLE_OUTPUT" |
|
180 chmod $(umask -S) "$ISABELLE_OUTPUT" |
|
181 OUTFILE="$ISABELLE_OUTPUT/$OUTPUT" |
|
182 ;; |
|
183 esac |
|
184 |
149 |
185 |
150 |
186 ## prepare tmp directory |
151 ## prepare tmp directory |
187 |
152 |
188 [ -z "$ISABELLE_TMP_PREFIX" ] && ISABELLE_TMP_PREFIX=/tmp/isabelle |
153 [ -z "$ISABELLE_TMP_PREFIX" ] && ISABELLE_TMP_PREFIX=/tmp/isabelle |
194 |
159 |
195 ## run it! |
160 ## run it! |
196 |
161 |
197 ML_SYSTEM_BASE=$(echo "$ML_SYSTEM" | cut -f1 -d-) |
162 ML_SYSTEM_BASE=$(echo "$ML_SYSTEM" | cut -f1 -d-) |
198 |
163 |
199 [ -n "$MODES" ] && MLTEXT="Unsynchronized.change print_mode (append [$MODES]); $MLTEXT" |
164 [ -n "$MODES" ] && ML_TEXT="Unsynchronized.change print_mode (append [$MODES]); $ML_TEXT" |
200 |
165 |
201 [ -n "$SECURE" ] && MLTEXT="$MLTEXT; Secure.set_secure ();" |
166 [ -n "$SECURE" ] && ML_TEXT="$ML_TEXT; Secure.set_secure ();" |
202 |
167 |
203 if [ -n "$PROCESS_SOCKET" ]; then |
168 if [ -n "$PROCESS_SOCKET" ]; then |
204 MLTEXT="$MLTEXT; Isabelle_Process.init \"$PROCESS_SOCKET\";" |
169 ML_TEXT="$ML_TEXT; Isabelle_Process.init \"$PROCESS_SOCKET\";" |
205 else |
170 else |
206 ISABELLE_PROCESS_OPTIONS="$ISABELLE_TMP/options" |
171 ISABELLE_PROCESS_OPTIONS="$ISABELLE_TMP/options" |
207 if [ -n "$OPTIONS_FILE" ]; then |
172 if [ -n "$OPTIONS_FILE" ]; then |
208 [ "${#SYSTEM_OPTIONS[@]}" -gt 0 ] && \ |
173 [ "${#SYSTEM_OPTIONS[@]}" -gt 0 ] && \ |
209 fail "Cannot provide options file and options on command-line" |
174 fail "Cannot provide options file and options on command-line" |
211 fail "Failed to move options file \"$OPTIONS_FILE\"" |
176 fail "Failed to move options file \"$OPTIONS_FILE\"" |
212 else |
177 else |
213 "$ISABELLE_TOOL" options -x "$ISABELLE_PROCESS_OPTIONS" -- "${SYSTEM_OPTIONS[@]}" || \ |
178 "$ISABELLE_TOOL" options -x "$ISABELLE_PROCESS_OPTIONS" -- "${SYSTEM_OPTIONS[@]}" || \ |
214 fail "Failed to retrieve Isabelle system options" |
179 fail "Failed to retrieve Isabelle system options" |
215 fi |
180 fi |
216 if [ "$INPUT" != RAW_ML_SYSTEM -a "$INPUT" != RAW ]; then |
181 if [ "$HEAP" != RAW_ML_SYSTEM -a "$HEAP" != RAW ]; then |
217 MLTEXT="Exn.capture_exit 2 Options.load_default (); $MLTEXT" |
182 ML_TEXT="Exn.capture_exit 2 Options.load_default (); $ML_TEXT" |
218 fi |
183 fi |
219 fi |
184 fi |
220 |
185 |
221 export INFILE OUTFILE MLTEXT TERMINATE NOWRITE ISABELLE_PID ISABELLE_TMP ISABELLE_PROCESS_OPTIONS |
186 export HEAP_FILE ML_TEXT TERMINATE ISABELLE_PID ISABELLE_TMP ISABELLE_PROCESS_OPTIONS |
222 |
187 |
223 if [ -f "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" ]; then |
188 if [ -f "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" ]; then |
224 "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" |
189 "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM" |
225 else |
190 else |
226 "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM_BASE" |
191 "$ISABELLE_HOME/lib/scripts/run-$ML_SYSTEM_BASE" |