Files
mercury/tools/binary_step
Simon Taylor 319df48866 Remove the RM_C mmake variable, which controlled whether the intermediate
Estimated hours taken: 0.5
Branches: main

Remove the RM_C mmake variable, which controlled whether the intermediate
`.c' files were removed (now they never are).

The implementation was buggy (it didn't work with parallel makes), and
made it difficult to avoid always recompiling the `.c' file with smart
recompilation.

Mmake.common.in:
configure.in:
README.AIX:
bindist/bindist.build_vars.in:
bindist/bindist.configure.in:
scripts/Mmake.vars.in:
scripts/Mmake.rules:
compiler/modules.m:
tools/bootcheck:
tools/binary_step:
*/Mmakefile:
	Remove references to RM_C, DEFAULT_RM_C and LIBRARY_RM_C.

compiler/modules.m:
	The `.o' and `.pic_o' file now depends only on the `.c' file,
	not on everthing the `.c' file depends on. The extra dependencies
	were only needed because the intermediate `.c' file could
	be removed by RM_C. This change is needed to avoid recompiling
	unchanged `.c' files with smart recompilation.
2001-05-18 14:23:59 +00:00

353 lines
7.7 KiB
Bash
Executable File

#!/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.
-l, --library-only
Check the successful creation of the stage3 .c files in the
library, but do not compile the compiler directory.
-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"
library_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\(.*\)' `" ;;
-l|--library-only)
library_only="true" ;;
-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/*.int3
touch stage2/compiler/*.int3
sleep 2
touch stage2/library/*.date3
touch stage2/compiler/*.date3
touch stage2/library/*.int2
touch stage2/library/*.int
touch stage2/compiler/*.int2
touch stage2/compiler/*.int
sleep 2
touch stage2/library/*.date
touch stage2/compiler/*.date
touch stage2/library/*.opt
sleep 2
touch stage2/library/*.optdate
touch stage2/library/*.trans_opt
sleep 2
touch stage2/library/*.trans_opt_date
touch stage2/library/*.o
touch stage2/library/*.pic_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
if (cd stage2/library ; mmake $mmake_opts $jfactor)
then
echo "building of stage 2 library successful"
else
echo "building of stage 2 library not successful"
touch .stage2_problem
exit 1
fi
if (cd stage2/compiler ; mmake $mmake_opts $jfactor mercury_compile)
then
echo "building of stage 2 compiler successful"
else
echo "building of stage 2 compiler not successful"
touch .stage2_problem
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 200
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/*.trans_opt_date
/bin/rm -f stage3/library/*.date3
/bin/rm -f stage3/library/*.date
/bin/rm -f stage3/library/*.opt
/bin/rm -f stage3/library/*.trans_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/*.trans_opt_date
/bin/rm -f stage3/compiler/*.date3
/bin/rm -f stage3/compiler/*.date
/bin/rm -f stage3/compiler/*.opt
/bin/rm -f stage3/compiler/*.trans_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 $dependency_only
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"
if $library_only
then
exit 0
fi
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