File: binary_step

package info (click to toggle)
mercury 0.9-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 18,488 kB
  • ctags: 9,800
  • sloc: objc: 146,680; ansic: 51,418; sh: 6,436; lisp: 1,567; cpp: 1,040; perl: 854; makefile: 450; asm: 232; awk: 203; exp: 32; fortran: 3; csh: 1
file content (308 lines) | stat: -rwxr-xr-x 7,083 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
#!/bin/sh
# Test the stage2 directory to see whether it passes
# a bootstrap check and/or a check using the tests directory.
# If stage2 passes, binary_step returns an exit status of 0 (true);
# if it fails, binary_step returns an exit status of 1 (false).
#
# binary_step remakes the archive in stage2/library and the executable
# in stage2/compiler. In the intended use, the binary script sets up
# these directories so that these actions cause no recompilations,
# either Mercury to C or C to object, only linking. Other uses probably
# won't work.

usage="\
Usage: $0 [options]
Options:
	-b, --no-bootcheck
		Do not perform a bootcheck; check only the tests directory.
	-c, --compile-only
		Check the successful creation of the stage3 .c files,
		but do not compare stage2.ok and stage3.
	-C, --compare-to-bad
		Compile stage3 using the parameter settings in the stage2.bad
		directory, and compare stage3 to stage2.bad, not stage2.ok.
	-d, --dependency-only
		Check only that the dependencies can be made in stage3.
	-h, --help
		Display this usage message.
	-j <num-jobs>, --jobs <num-jobs>
		Run using <num-jobs> different parallel processes.
	-m <mmake-args>, --mmake-args <mmake-args>
		Pass <mmake-args> as options to \`mmake'.
	-o <filename>, --output-file <filename>
		Output results to <filename>.
	-s <command>, --single-command <command>
		Execute the given command using the constructed compiler.
	-t <testdir>, --test-dir <testdir>
		Execute runtests from the named subdirectory of tests.
"

# If you change this, you will also need to change scripts/ml.in,
# scripts/c2init.in, Mmake.common.in, tools/bootcheck, tools/binary
# and tools/linear.
STD_LIB_NAME=mer_std

set -x

alltestdirs="benchmarks general hard_coded invalid valid warnings"

bootcheck="true"
compile_only="false"
dependency_only="false"
jfactor=""
mmake_opts=""
outfile="DIFF.BINARY"
single_command=""
testdirs=""
basis="ok"

while [ $# -gt 0 ]; do
	case "$1" in

	-b|--no-bootcheck)
		bootcheck="false" ;;

	-c|--compile-only)
		compile_only="true" ;;

	-C|--compare-to-bad)
		basis="bad" ;;

	-d|--dependency-only)
		dependency_only="true" ;;

	-h|--help)
		echo "$usage"
		exit 0 ;;

	-j|--jobs)
		jfactor="-j$2"; shift ;;
	-j*)
		jfactor="-j` expr $1 : '-j\(.*\)' `" ;;
	--jobs*)
		jfactor="--jobs` expr $1 : '--jobs\(.*\)' `" ;;

	-m|--mmake)
		mmake_opts="$mmake_opts $2"; shift ;;

	-o|--output-file)
		outfile="$2"; shift ;;
	-o*)
		outfile="` expr $1 : '-o\(.*\)' `"; ;;

	-s|--single-command)
		single_command="$2"; shift ;;
	-s*)
		single_command="` expr $1 : '-s\(.*\)' `" ;;
	--single-command*)
		single_command="` expr $1 : '--single-command\(.*\)' `" ;;

	-t|--test-dir)
		testdir="$2"; shift
		if test -d tests/$testdir
		then
			testdirs="$testdirs $testdir"
		else
			if test "$testdir" = "all"
			then
				testdirs="$alltestdirs"
			else
				echo "tests has no subdirectory named $testdir"
			fi
		fi ;;
	-t*)
		testdir="` expr $1 : '-t\(.*\)' `"
		if test -d tests/$testdir
		then
			testdirs="$testdirs $testdir"
		else
			if test "$testdir" = "all"
			then
				testdirs="$alltestdirs"
			else
				echo "tests has no subdirectory named $testdir"
			fi
		fi ;;

	-*)
		echo "$0: unknown option \`$1'" 1>&2
		echo "$usage" 1>&2
		exit 1 ;;

	*)
		echo "$usage" 1>&2
		exit 1 ;;
	esac
	shift
done

root=`/bin/pwd`

MERCURY_COMPILER=$root/compiler/mercury_compile
export MERCURY_COMPILER
MERCURY_INT_DIR=$root/stage2/library
export MERCURY_INT_DIR

MMAKE_VPATH=.
export MMAKE_VPATH
MMAKE_DIR=../scripts
export MMAKE_DIR

# Ensure that mmake will not disturb the .o and .c files placed there by binary

set +x

touch stage2/library/*.c
touch stage2/compiler/*.c

sleep 2

touch stage2/library/*.o
touch stage2/compiler/*.o

# Rebuild the stage2 library and compiler from the components already there.

/bin/rm -f stage2/library/lib$STD_LIB_NAME.a stage2/library/lib$STD_LIB_NAME.so
/bin/rm -f stage2/compiler/mercury_compile

set -x

# the `RM_C=:' ensures that the `.c' files do not get deleted

if (cd stage2/library ; mmake $mmake_opts $jfactor RM_C=: )
then
	echo "building of stage 2 library successful"
else
	echo "building of stage 2 library not successful"
	exit 1
fi

if (cd stage2/compiler ; mmake $mmake_opts $jfactor RM_C=: mercury_compile)
then
	echo "building of stage 2 compiler successful"
else
	echo "building of stage 2 compiler not successful"
	exit 1
fi

unset MMAKE_VPATH
unset MMAKE_DIR

MERCURY_COMPILER=$root/stage2/compiler/mercury_compile
export MERCURY_COMPILER
MERCURY_INT_DIR=$root/stage3/library
export MERCURY_INT_DIR

ulimit -t 600

if test "$single_command" != ""
then
	echo "executing $single_command"
	arg $single_command
	if $single_command
	then
		echo "command successful"
	else
		echo "command not successful"
		exit 1
	fi
fi

if "$bootcheck"
then

	# Rebuild the stage3 library and compiler from scratch

	/bin/rm -f stage3/library/*.c
	/bin/rm -f stage3/library/*.d
	/bin/rm -f stage3/library/*.optdate
	/bin/rm -f stage3/library/*.date3
	/bin/rm -f stage3/library/*.date
	/bin/rm -f stage3/library/*.opt
	/bin/rm -f stage3/library/*.int3
	/bin/rm -f stage3/library/*.int2
	/bin/rm -f stage3/library/*.int
	/bin/rm -f stage3/compiler/*.c
	/bin/rm -f stage3/compiler/*.d
	/bin/rm -f stage3/compiler/*.optdate
	/bin/rm -f stage3/compiler/*.date3
	/bin/rm -f stage3/compiler/*.date
	/bin/rm -f stage3/compiler/*.opt
	/bin/rm -f stage3/compiler/*.int3
	/bin/rm -f stage3/compiler/*.int2
	/bin/rm -f stage3/compiler/*.int

	if (cd stage3 ; mmake $mmake_opts depend_library depend_compiler)
	then
		echo "building of stage 3 dependencies successful"
		if test "$dependency_only" = "true"
		then
			exit 0
		fi
	else
		echo "building of stage 3 dependencies not successful"
		exit 1
	fi

	MMAKE_VPATH=.
	export MMAKE_VPATH
	MMAKE_DIR=../scripts
	export MMAKE_DIR

	if (cd stage3/library ; mmake -S $mmake_opts $jfactor ints ; mmake -S $mmake_opts $jfactor cs)
	then
		echo "building of stage 3 library successful"
	else
		echo "building of stage 3 library not successful"
		exit 1
	fi

	if (cd stage3/compiler ; mmake -S $mmake_opts $jfactor ints ; mmake -S $mmake_opts $jfactor cs)
	then
		echo "building of stage 3 compiler successful"
	else
		echo "building of stage 3 compiler not successful"
		exit 1
	fi

	if test "$compile_only" = false
	then
		founddiff=false
		cat /dev/null > $outfile
		for dir in library compiler
		do
			for file in stage2.$basis/$dir/*.c
			do
				stage3file="stage3/$dir/`basename $file`"
				diff -u $file $stage3file >> $outfile ||
					founddiff=true
			done
		done

		if "$founddiff" = true
		then
			echo "error - stage2.$basis and stage3 differ!"
			exit 1
		else
			echo "stage2.$basis and stage3 compare ok"
		fi
	fi
else
	# since we have not created any stage3, we can't let MERCURY_INT_DIR
	# to continue to refer to stage3/library
	MERCURY_INT_DIR=$root/stage2/library
	export MERCURY_INT_DIR
fi

for testdir in $testdirs
do
	if (cd tests/$testdir; runtests)
	then
		echo "tests in the $testdir directory successful"
	else
		echo "tests in the $testdir directory not successful"
		exit 1
	fi
done

exit 0