mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-16 09:53:36 +00:00
Estimated hours taken: 32
Branches: main
The objective of this diff is to switch from a table of solver events built
into the compiler (and eventually the debugger) into a table of events
defined by a file provided by the user to the compiler, which the compiler
then records in the executable for use by the debugger.
The current design, for speed of implementation, uses temporary files parsed
by a bison-generated parser. Since the compiler needs to be able to invoke
the parser even if it is compiled in a non-debug grade, the parser is in
a new library, the eventspec library, that is always linked into the Mercury
compiler and is always linked into any Mercury program with debugging enabled
(but is of course linked only once into a Mercury compiler which has debugging
enabled).
Modify the debugger to give it the ability to print the attributes of
user-defined events (for now, only the non-synthesized attributes).
Implement a new debugger command, "user", which goes to the next user-defined
event.
configure.in:
Require flex and and bison to be available.
doc/user_guide.texi:
Document user defined events and the new debugger capabilities.
doc/mdb_categories:
Include "user" in the list of forward movement commands.
Fix some earlier omissions in that list.
runtime/mercury_stack_layout.h:
Include an event number in the user-defined event structure.
Include a string representing an event set specification in module
layout structures.
runtime/mercury_stack_layout.h:
runtime/mercury_trace_base.[ch]:
runtime/mercury_types.h
Switch from solver events to user events in names.
runtime/mercury_trace_term.[ch]:
Provide a representation of flat terms, for use in representing
the calls that generate synthesized attributes.
Ensure that exported field names have an MR_ prefix.
browser/cterm.m:
Conform to the change to runtime/mercury_trace_term.h.
scripts/c2init.in:
scripts/ml.in:
Include the eventspec library in programs compiled with debugging
enabled.
compiler/Mmakefile:
Include the eventspec library in the compiler.
compiler/options.m:
Add a new option, --event-spec-file-name, that allows the user to
specify the set of user-defined events the program may use.
compiler/handle_options.m:
Set this optimization from an environment variable (which may be
set by the mmc script) if the new option is not explicitly given.
compiler/prog_data.m:
Define the data structures for the compiler's representation of the
event set specification.
Move some definitions around to group them more logically.
compiler/hlds_module.m:
Include the event set specification as a new field in the module_info.
compiler/prog_event.m:
Add the code for invoking the parser in the eventspec library,
and for converting the simple term output by the parser to the
compiler own representation, which contains more information
(to wit, the types of the function attributes) and which has had
a whole bunch of semantic checks done on it (e.g. whether synthesized
attributes depend on themselves or on nonexistent attributes).
Provide a function to generate a canonicalized version of the event
specification file.
compiler/module_qual.m:
compiler/equiv_type.m:
Process event spec specifications as well as items, to module qualify
the names of the types of event arguments, and expanding out
equivalence types.
In equiv_type.m, rename some variables to make clear what kind of info
they represent.
compiler/mercury_compile.m:
Process the event set specification file if one has been selected:
read it in, module qualify it, expand its equivalence types, and add
to the module_info.
compiler/compile_target_code.m:
Include the event_spec library when linking debuggable executables.
compiler/call_gen.m:
compiler/continuation_info.m:
compiler/trace_gen.m:
compiler/trace_params.m:
mdbcomp/prim_data.m:
mdbcomp/trace_counts.m:
runtime/mercury_goto.h:
Generate user-defined events instead of solver events.
compiler/layout.m:
compiler/layout_out.m:
compiler/stack_layout.m:
Include a canonicalized version of the event specification file
in the module layout if the module has any user-defined events.
compiler/code_info.m:
compiler/llds_out.m:
compiler/modes.m:
compiler/modules.m:
compiler/opt_debug.m:
compiler/typecheck.m:
Conform to the changes above.
compiler/passes_aux.m:
Rename a predicate to avoid an ambiguity.
trace/Mmakefile:
Add the definition and rules required to build the eventspec library.
trace/mercury_event_scanner.l:
trace/mercury_event_parser.y:
A scanner and a parser for reading in event spec specifications.
trace/mercury_event_spec_missing.h:
Provide the declarations that should be (but aren't) provided by
flex and bison.
trace/mercury_event_spec.[ch]:
The main module of the eventspec library. Provides functions to read
in event set specifications from a file, and to write them out as a
Mercury term in the form needed by the compiler.
trace/mercury_trace_tables.c:
If the module layouts being registered include event set
specifications, then check their consistency. Make the specification
and the consistency indication available to other modules.
trace/mercury_trace_internal.c:
During initialization, if the modules contain a consistent set of event
set specifications, then read that specification into the debugger.
(We don't yet make use of this information.)
Add an extra mdb command, "user", which goes forward to the next
user-defined event.
trace/mercury_trace.[ch]:
trace/mercury_trace_cmd_forward.[ch]:
Implement the new mdb command.
trace/mercury_trace_vars.[ch]:
For user-defined events, include the attributes' values among the
values that can be printed or browsed.
trace/mercury_trace_cmd_browsing.c:
trace/mercury_trace_declarative.c:
Minor changes.
scripts/scripts/prepare_tmp_dir_grade_part:
Copy the .y and .l files to the tmp dir we use for installs.
tools/bootcheck:
Copy the .y and .l files of the trace directory to stage 2.
tools/lmc.in:
Include the eventspec library when linking debuggable executables.
tests/debugger/user_event.{m,inp,exp}:
tests/debugger/user_event_spec:
New test case to test the new functionality.
tests/debugger/Mercury.options:
tests/debugger/Mmakefile:
Enable the new test case.
tests/debugger/completion.exp:
Expect the new "user" mdb command in the completion output.
1795 lines
54 KiB
Bash
Executable File
1795 lines
54 KiB
Bash
Executable File
#!/bin/sh
|
|
# vim: ts=4 sw=4 wm=0 tw=0 et
|
|
#---------------------------------------------------------------------------#
|
|
# Copyright (C) 1995-2001 The University of Melbourne.
|
|
# This file may only be copied under the terms of the GNU General
|
|
# Public License - see the file COPYING in the Mercury distribution.
|
|
#---------------------------------------------------------------------------#
|
|
|
|
usage="\
|
|
Usage: $0 [options]
|
|
Options:
|
|
-d <dirname>, --test-dir <dirname>
|
|
Run the tests in directory <dirname>. Multiple such options
|
|
may be given, in which case the tests in all the named
|
|
directories will be run. In the absence of any such options,
|
|
all tests in all directories will be run (unless testing
|
|
as a whole is disabled).
|
|
-s <testname>, --specified-test <testname>
|
|
Run only the tests whose names are specified as arguments of this
|
|
option, which may be given more than once. The test names must include
|
|
the directory name component.
|
|
-f, --failing-tests
|
|
Run only the tests which failed on the last run, as recorded in the
|
|
FAILED_TESTS files in the various test directories. Meaningful only
|
|
in the absence of -s options.
|
|
--error-file
|
|
Run only the tests which failed on the last run, as recorded in the
|
|
tests/runtests.errs file. Meaningful only in the absence of -s and -f
|
|
options.
|
|
--expect-no-failures
|
|
Exit with a nonzero exit status if any test fails, even if the failure
|
|
of that test is otherwise expected.
|
|
-e, --extras
|
|
Test the programs in the extras directory.
|
|
-h, --help
|
|
Display this usage message.
|
|
-j <num-jobs>, --jobs <num-jobs>
|
|
Run using <num-jobs> different parallel processes.
|
|
-k, --keep-objs
|
|
Keep the stage 2 object files even if stage 2 is successful.
|
|
-m <mmake-args>, --mmake-opts <mmake-args>
|
|
Pass <mmake-args> as options to \`mmake'.
|
|
-M <make-args>, --make-opts <make-args>
|
|
Pass <make-args> as options to \`make'.
|
|
-o <filename>, --output-file <filename>
|
|
Output results to <filename>.
|
|
--target <target>
|
|
Specify the target to use in creating stages 2 and 3.
|
|
-G <grade>, --grade <grade>
|
|
Specify the grade to use in creating stages 2 and 3.
|
|
The tests will also be executed in this grade, unless
|
|
the --test-grade option says otherwise. Implies -r -g.
|
|
--gradedir <grade>
|
|
Same as '--grade <grade>', except that it also causes
|
|
the grade name to be included in the names of the stage 2
|
|
and stage 3 directories. This can be useful if you have
|
|
lots of disk space and want to run bootchecks in several
|
|
grades at once. Note however that the name of the tests
|
|
directory doesn't include the grade, so you might also
|
|
need to use --no-test-suite (see below) for this to work.
|
|
--test-grade <grade>
|
|
Specify the grade to use in executing the tests.
|
|
If this is the same as the grade of stages 2 and 3, then
|
|
we use the stage 2 runtime, library etc for the tests.
|
|
Otherwise, we use the stage 1 runtime, library etc,
|
|
and trust that these are compatible with the given grade.
|
|
Implies -r -g.
|
|
--mercury-options <options-string>
|
|
Set MERCURY_OPTIONS to the given string when doing the bootcheck.
|
|
-g, --copy-boehm-gc
|
|
Copy the boehm_gc directory instead of linking it.
|
|
This is necessary if one wants to bootcheck a grade
|
|
that is not compatible with the standard one.
|
|
-r, --copy-runtime
|
|
Copy the runtime directory instead of linking it.
|
|
This is necessary if one wants to bootcheck a grade
|
|
that is not compatible with the standard one.
|
|
-p, --copy-profilers
|
|
Copy the profiler directories instead of linking them.
|
|
This is sometimes necessary for bootstrapping changes.
|
|
-b-, --no-bootcheck
|
|
Do not run the bootstrap check; execute the test suite and/or
|
|
the extras only. This option requires a previous bootstrap
|
|
check to have left a working stage 2 directory.
|
|
--no-check-namespace
|
|
Don't build the check_namespace targets in the runtime,
|
|
trace, browser, mdbcomp and library directories.
|
|
-t-, --no-test-suite
|
|
By default, bootcheck will also run the test quite.
|
|
This option prevents that.
|
|
--skip-stage-2
|
|
Take the existing stage 2 directory as given; do not run mmake
|
|
in it.
|
|
-2, --keep-stage-2
|
|
Don't rebuild the stage 2 directory from scratch after
|
|
building stage 1. Instead use the existing stage 2 directory
|
|
as the starting point for mmake.
|
|
-3, --keep-stage-3
|
|
Don't rebuild the stage 3 directory from scratch after
|
|
building stage 1. Instead use the existing stage 3 directory
|
|
as the starting point for mmake.
|
|
--test-params
|
|
When executing the test suite, use the stage 2 Mmake.params
|
|
file.
|
|
--stop-after-stage-2
|
|
Stop after building stage 2, even if it is successful.
|
|
--use-subdirs
|
|
Assume intermediate files are built in subdirectories.
|
|
(Same as the \`--use-subdirs' option to mmake and mmc.)
|
|
--use-mmc-make
|
|
Use \`mmc --make' to build the files.
|
|
(Same as the \`--use-mmc-make' option to mmake.)
|
|
--compile-times
|
|
Report information about compilation times in the stage 2
|
|
library and compiler directories.
|
|
--no-write-out-profile-data
|
|
When doing bootcheck in a deep profiling grade, disable the
|
|
writing out of profile data files. This makes the bootcheck
|
|
faster, but avoiding writing out the profiling data also avoids
|
|
the checks on its integrity.
|
|
--type-stats TYPE_STATS_FILE_NAME
|
|
Collect statistics about the builtin operations (unify, index
|
|
and compare) performed on various types. The argument of this
|
|
option should give the absolute pathname of the file in which
|
|
the runtime has been configured to accumulate statistics. The
|
|
statistics derived from the creation of the stage 3 compiler
|
|
will be put TYPE_STATS_FILE_NAME.stage3.$$, while the
|
|
statistics derived from the execution of the test suite will
|
|
be put into TYPE_STATS_FILE_NAME.tests.$$. Both filenames will
|
|
be reported in the output of bootcheck, to allow the statistics
|
|
files to be matched with the bootcheck that created them.
|
|
--trace-count
|
|
Collect counts of the number of times each label is executed
|
|
in modules compiled with debugging.
|
|
--coverage-test
|
|
Collect counts of the number of times each label is executed
|
|
in modules compiled with debugging, and put the raw data needed
|
|
by the mct script into a bunch of files in the coverage directory.
|
|
-W, --windows
|
|
Translate paths into the Microsoft Windows format and use the
|
|
extension \`.lib' for libraries. This option also implies
|
|
--no-sym-links.
|
|
--no-sym-links
|
|
Use this option on systems which don't support symbolic links.
|
|
--disable-debug-libs
|
|
Make the trace and browser libraries empty. This can be useful
|
|
when trying to track down the reason why they are being linked
|
|
into the compiler in the first place.
|
|
--keep-deep-data
|
|
Keep the Deep.data files resulting from the bootcheck. The
|
|
usual behavior is to delete them in the interest of conserving
|
|
disk space.
|
|
--progress
|
|
Create a timestamp file when finishing the execution of each test case,
|
|
to allow the user to monitor the bootcheck's progress. The timestamp
|
|
files will have names of the form .date.<testname>.
|
|
"
|
|
|
|
unset WORKSPACE
|
|
testdirs=""
|
|
specified_tests_only=""
|
|
failing_tests_only=false
|
|
error_file_only=false
|
|
expect_listed_failures=true
|
|
extras=false
|
|
jfactor=""
|
|
keep_objs=false
|
|
mmake_opts="-k"
|
|
outfile=""
|
|
runtests=true
|
|
do_bootcheck=true
|
|
if test -f /bin/cygwin1.dll; then
|
|
# Don't run check_namespace on Cygwin, unless explicitly asked,
|
|
# because the `-nostdinc' option doesn't work with gcc 2.95 on Cygwin.
|
|
# (This has been fixed in later versions of gcc, e.g. 3.2, so
|
|
# we should reenable this at some point...)
|
|
check_namespace=false
|
|
else
|
|
check_namespace=true
|
|
fi
|
|
grade=
|
|
use_gradedir=false
|
|
target=c
|
|
test_grade=
|
|
test_params=false
|
|
copy_runtime=false
|
|
copy_boehm_gc=false
|
|
copy_slice=false
|
|
copy_profilers=false
|
|
mmake_stage_2=true
|
|
keep_stage_2=false
|
|
keep_stage_3=false
|
|
stop_after_stage_2=false
|
|
windows=false
|
|
use_cp=false
|
|
A=a # the extension for libraries
|
|
if test -d compiler/Mercury; then
|
|
use_subdirs=${MMAKE_USE_SUBDIRS=yes}
|
|
else
|
|
use_subdirs=${MMAKE_USE_SUBDIRS=no}
|
|
fi
|
|
use_mmc_make=no
|
|
compile_times=false
|
|
write_out_profile_data=true
|
|
type_stats=""
|
|
trace_count=false
|
|
coverage_test=false
|
|
disable_debug_libs=false
|
|
delete_deep_data=true
|
|
progress=false
|
|
|
|
if test -f .KEEP_OBJS
|
|
then
|
|
keep_objs=true
|
|
fi
|
|
|
|
if test -f .BOOT_GRADE
|
|
then
|
|
grade=`cat .BOOT_GRADE`
|
|
fi
|
|
|
|
if test -f .NO_WRITE_DEEP
|
|
then
|
|
write_out_profile_data=false
|
|
fi
|
|
|
|
# If you change these, you will also need to change the files indicated
|
|
# in scripts/c2init.in.
|
|
RT_LIB_NAME=mer_rt
|
|
STD_LIB_NAME=mer_std
|
|
TRACE_LIB_NAME=mer_trace
|
|
BROWSER_LIB_NAME=mer_browser
|
|
MDBCOMP_LIB_NAME=mer_mdbcomp
|
|
ANALYSIS_LIB_NAME=mer_analysis
|
|
|
|
while test $# -gt 0; do
|
|
case "$1" in
|
|
|
|
-b-|--no-bootcheck)
|
|
do_bootcheck=false ;;
|
|
|
|
-d|--test-dir)
|
|
testdirs="$testdirs $2"; shift ;;
|
|
-d*)
|
|
testdirs="$testdirs ` expr $1 : '-d\(.*\)' `"; ;;
|
|
|
|
-e|--extras)
|
|
extras=true ;;
|
|
|
|
-s|--specified-tests)
|
|
specified_tests_only="$specified_tests_only $2"; shift ;;
|
|
|
|
-f|--failing-tests)
|
|
failing_tests_only=true ;;
|
|
|
|
--error-file)
|
|
error_file_only=true ;;
|
|
|
|
--expect-no-failures)
|
|
expect_listed_failures=false ;;
|
|
|
|
-h|--help)
|
|
echo "$usage"
|
|
exit 0 ;;
|
|
|
|
-j|--jobs)
|
|
jfactor="-j$2"; shift ;;
|
|
-j*)
|
|
jfactor="-j` expr $1 : '-j\(.*\)' `" ;;
|
|
--jobs*)
|
|
jfactor="--jobs` expr $1 : '--jobs\(.*\)' `" ;;
|
|
|
|
-k|--keep-objs)
|
|
keep_objs=true ;;
|
|
|
|
-m|--mmake|--mmake-opts)
|
|
mmake_opts="$mmake_opts $2"; shift ;;
|
|
|
|
-o|--output-file)
|
|
outfile="$2"; shift ;;
|
|
-o*)
|
|
outfile="` expr $1 : '-o\(.*\)' `"; ;;
|
|
|
|
--target)
|
|
case "$2" in
|
|
c|asm) target="$2"; shift ;;
|
|
*) echo "unknown target \`$2'" 1>&2; exit 1 ;;
|
|
esac
|
|
;;
|
|
|
|
-G|--grade)
|
|
grade="$2"; shift ;;
|
|
-G*)
|
|
grade="` expr $1 : '-G\(.*\)' `"; ;;
|
|
|
|
--gradedir)
|
|
use_gradedir=true; grade="$2"; shift ;;
|
|
|
|
--test-grade)
|
|
test_grade="$2"; shift ;;
|
|
|
|
--mercury-options)
|
|
MERCURY_OPTIONS="$2"; export MERCURY_OPTIONS; shift ;;
|
|
|
|
-r|--copy-runtime)
|
|
copy_runtime=true ;;
|
|
|
|
-g|--copy-boehm-gc)
|
|
copy_boehm_gc=true ;;
|
|
|
|
-p|--copy-profilers)
|
|
copy_profilers=true ;;
|
|
|
|
--copy-slice)
|
|
copy_slice=true ;;
|
|
|
|
--check-namespace)
|
|
check_namespace=true ;;
|
|
--no-check-namespace)
|
|
check_namespace=false ;;
|
|
|
|
-t-|--no-test-suite)
|
|
runtests=false ;;
|
|
|
|
--skip-stage-2)
|
|
keep_stage_2=true
|
|
mmake_stage_2=false ;;
|
|
|
|
-2|--keep-stage-2)
|
|
keep_stage_2=true ;;
|
|
|
|
-3|--keep-stage-3)
|
|
keep_stage_3=true ;;
|
|
|
|
--test-params)
|
|
test_params=true ;;
|
|
|
|
--stop-after-stage-2)
|
|
stop_after_stage_2=true ;;
|
|
|
|
--use-subdirs)
|
|
use_subdirs=yes ;;
|
|
--no-use-subdirs)
|
|
use_subdirs=no ;;
|
|
|
|
--use-mmc-make)
|
|
use_mmc_make=yes; use_subdirs=yes ;;
|
|
--no-use-mmc-make)
|
|
use_mmc_make=no ;;
|
|
|
|
--compile-times)
|
|
compile_times=true ;;
|
|
--no-compile-times)
|
|
compile_times=false ;;
|
|
|
|
--no-write-out-profile-data)
|
|
write_out_profile_data=false ;;
|
|
|
|
--type-stats)
|
|
type_stats="$2"; shift ;;
|
|
|
|
--trace-count|--trace-counts)
|
|
trace_count=true ;;
|
|
|
|
--coverage-test)
|
|
coverage_test=true ;;
|
|
|
|
-W|--windows)
|
|
windows=true; use_cp=true; A=lib ;;
|
|
|
|
--use-cp)
|
|
use_cp=true ;;
|
|
|
|
--no-sym-links)
|
|
use_cp=true ;;
|
|
|
|
--disable-debug-libs)
|
|
disable_debug_libs=true ;;
|
|
|
|
--keep-deep-data)
|
|
delete_deep_data=false ;;
|
|
|
|
--progress)
|
|
progress=true ;;
|
|
|
|
--)
|
|
shift; break ;;
|
|
-*)
|
|
echo "$0: unknown option \`$1'" 1>&2
|
|
echo "$usage" 1>&2
|
|
exit 1 ;;
|
|
*)
|
|
break ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if test $# -ne 0; then
|
|
echo "$0: unexpected argument(s) \`$*'" 1>&2
|
|
echo "$usage" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
if test "$grade" != "" -a "$test_grade" = ""
|
|
then
|
|
test_grade="$grade"
|
|
fi
|
|
|
|
case $use_subdirs in
|
|
yes)
|
|
cs_subdir=Mercury/cs/
|
|
ss_subdir=Mercury/ss/
|
|
ils_subdir=Mercury/ils/
|
|
;;
|
|
no)
|
|
cs_subdir=
|
|
ss_subdir=
|
|
ils_subdir=
|
|
;;
|
|
esac
|
|
|
|
case $target in
|
|
c)
|
|
target_ext=c
|
|
target_subdir=$cs_subdir
|
|
target_opt=
|
|
;;
|
|
asm)
|
|
target_ext=s
|
|
target_subdir=$ss_subdir
|
|
target_opt="--target asm"
|
|
# If the stage 1 directory was built without --target asm,
|
|
# but the stage 2 will be built with `--target asm',
|
|
# then we need to copy the profiler directories.
|
|
# So to be safe, we just enable this by default.
|
|
copy_slice=true
|
|
copy_profilers=true
|
|
;;
|
|
esac
|
|
case $grade in
|
|
il|ilc)
|
|
target_ext=il
|
|
target_subdir=$ils_subdir
|
|
target_opt=
|
|
# See comment above
|
|
copy_slice=true
|
|
copy_profilers=true
|
|
# The IL back-end generates native Windows executables,
|
|
# which do not understand symlinks. So we need to use cp.
|
|
use_cp=true
|
|
;;
|
|
esac
|
|
|
|
if test "$grade" != "" -o "$test_grade" != ""
|
|
then
|
|
copy_runtime=true
|
|
copy_boehm_gc=true
|
|
fi
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
if $use_cp
|
|
then
|
|
LN="cp -pr"
|
|
LN_S="cp -pr"
|
|
else
|
|
LN="ln"
|
|
LN_S="ln -s"
|
|
fi
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
if $windows
|
|
then
|
|
CYGPATH='cygpath -m'
|
|
else
|
|
CYGPATH='echo'
|
|
fi
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
# Turn off the debugger, since accidentally leaving it on will result
|
|
# in user interaction every time we invoke any version of the compiler
|
|
# that was compiled with tracing. This has happened to me accidentally
|
|
# one too many times - zs.
|
|
if echo $MERCURY_OPTIONS | grep '\-Di' > /dev/null
|
|
then
|
|
MERCURY_OPTIONS=`echo $MERCURY_OPTIONS | sed -e 's/-Di//'`
|
|
export MERCURY_OPTIONS
|
|
fi
|
|
|
|
echo "starting at `date`"
|
|
|
|
set -x
|
|
|
|
root=`/bin/pwd | sed '
|
|
s:/mount/munkora/mercury:/home/mercury:
|
|
s:/mount/munkora/home/mercury:/home/mercury:
|
|
s:/mount/munkora/clp/mercury:/home/mercury:'`
|
|
root=`$CYGPATH $root`
|
|
PATH=$root/tools:$PATH
|
|
export PATH
|
|
|
|
# Try the command given by the environment variable RMSTAGECMD to delete
|
|
# stage directories. Since this command may not always work due to
|
|
# security considerations (.rhost files), we execute /bin/rm -fr afterwards
|
|
# in any case.
|
|
if test "$RMSTAGECMD" = ""
|
|
then
|
|
RMSTAGECMD="/bin/rm -fr"
|
|
fi
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
if test "$use_gradedir" = "true"; then
|
|
stage2dir=stage2.$grade
|
|
stage3dir=stage3.$grade
|
|
else
|
|
stage2dir=stage2
|
|
stage3dir=stage3
|
|
fi
|
|
|
|
if $progress
|
|
then
|
|
BOOTCHECK_TEST_PROGRESS=yes
|
|
export BOOTCHECK_TEST_PROGRESS
|
|
fi
|
|
|
|
ORIG_MERCURY_OPTIONS="$MERCURY_OPTIONS"
|
|
|
|
if $write_out_profile_data
|
|
then
|
|
true
|
|
else
|
|
# Turn off the writing out of deep profiling files, since
|
|
# Deep.data will be overwritten many times in each directory,
|
|
# and thus the time spent writing them out is wasted. If deep
|
|
# profiling debugging is enabled, this also avoids the writing
|
|
# of *huge* amounts of stuff on stderr.
|
|
MERCURY_OPTIONS="$MERCURY_OPTIONS -s"
|
|
export MERCURY_OPTIONS
|
|
fi
|
|
|
|
if $trace_count
|
|
then
|
|
MERCURY_OPTIONS="$MERCURY_OPTIONS --trace-count-if-exec=mercury_compile"
|
|
export MERCURY_OPTIONS
|
|
else
|
|
true
|
|
fi
|
|
|
|
if $coverage_test
|
|
then
|
|
mkdir -p $root/coverage
|
|
# Don't contaminate the coverage test with old data.
|
|
/bin/rm $root/coverage/COVERAGE_TEST_DATA* > /dev/null 2>&1
|
|
MERCURY_OPTIONS="$MERCURY_OPTIONS --coverage-test-if-exec=mercury_compile --trace-count-summary-file=$root/coverage/COVERAGE_TEST_DATA --trace-count-summary-cmd=$root/slice/mtc_union"
|
|
export MERCURY_OPTIONS
|
|
# Check whether we can compile the slice directory.
|
|
copy_slice=true
|
|
else
|
|
true
|
|
fi
|
|
|
|
NEW_MERCURY_OPTIONS="$MERCURY_OPTIONS --mdb-disable-progress"
|
|
|
|
MMAKE_USE_SUBDIRS=$use_subdirs
|
|
export MMAKE_USE_SUBDIRS
|
|
|
|
MMAKE_USE_MMC_MAKE=$use_mmc_make
|
|
export MMAKE_USE_MMC_MAKE
|
|
|
|
if $do_bootcheck
|
|
then
|
|
MERCURY_OPTIONS="$ORIG_MERCURY_OPTIONS"
|
|
export MERCURY_OPTIONS
|
|
|
|
if mmake $mmake_opts MMAKEFLAGS=$jfactor all
|
|
then
|
|
echo "building of stage 1 successful"
|
|
else
|
|
cd $root
|
|
mmake $mmake_opts depend
|
|
if mmake $mmake_opts MMAKEFLAGS=$jfactor all
|
|
then
|
|
echo "building of stage 1 successful"
|
|
else
|
|
echo "building of stage 1 not successful"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
MERCURY_OPTIONS="$NEW_MERCURY_OPTIONS"
|
|
export MERCURY_OPTIONS
|
|
|
|
MERCURY_COMPILER=$root/compiler/mercury_compile
|
|
export MERCURY_COMPILER
|
|
|
|
# now in FLAGS files
|
|
# MERCURY_CONFIG_FILE=$root/scripts/Mercury.config
|
|
# export MERCURY_CONFIG_FILE
|
|
|
|
test -d $stage2dir || mkdir $stage2dir
|
|
if $keep_stage_2
|
|
then
|
|
echo keeping existing stage2
|
|
else
|
|
# We try to do the removal of the stage 2 directory in parallel
|
|
# since recursive rm's across NFS can be quite slow ...
|
|
$RMSTAGECMD $root/$stage2dir/compiler < /dev/null &
|
|
$RMSTAGECMD $root/$stage2dir/library < /dev/null &
|
|
wait
|
|
$RMSTAGECMD $root/$stage2dir/* < /dev/null
|
|
/bin/rm -fr $root/$stage2dir/* < /dev/null
|
|
/bin/rm -fr $root/$stage2dir/.[a-zA-Z]* < /dev/null
|
|
fi
|
|
|
|
if $mmake_stage_2
|
|
then
|
|
set +x
|
|
echo linking stage 2... 1>&2
|
|
cd $stage2dir
|
|
$LN_S $root/main.c .
|
|
mkdir compiler
|
|
cd compiler
|
|
# Break up the links into several chunks.
|
|
# This is needed to cope with small limits
|
|
# on the size of argument vectors.
|
|
|
|
$LN_S $root/compiler/[a-h]*.m .
|
|
$LN_S $root/compiler/[i-o]*.m .
|
|
$LN_S $root/compiler/[p-s]*.m .
|
|
$LN_S $root/compiler/[t-z]*.m .
|
|
$LN_S $root/compiler/*.pp .
|
|
$LN_S $root/compiler/notes .
|
|
|
|
cp $root/compiler/Mmake* $root/compiler/Mercury.options .
|
|
cp $root/compiler/*_FLAGS.in .
|
|
cp $root/compiler/.mgnu* .
|
|
cd $root/$stage2dir
|
|
mkdir library
|
|
cd library
|
|
$LN_S $root/library/[a-l]*.m .
|
|
$LN_S $root/library/[m-z]*.m .
|
|
# See comment below for why we use $LN rather than $LN_S here
|
|
$LN $root/library/library_strong_name.sn .
|
|
$LN_S $root/library/print_extra_inits .
|
|
cp $root/library/Mmake* $root/library/Mercury.options .
|
|
cp $root/library/*_FLAGS.in .
|
|
cp $root/library/INTER_FLAGS* .
|
|
cp $root/library/.mgnu* .
|
|
$LN_S $root/library/$STD_LIB_NAME.init .
|
|
$LN_S $root/library/RESERVED_MACRO_NAMES .
|
|
cd $root/$stage2dir
|
|
mkdir mdbcomp
|
|
cd mdbcomp
|
|
$LN_S $root/mdbcomp/*.m .
|
|
cp $root/mdbcomp/Mmake* $root/mdbcomp/Mercury.options .
|
|
cp $root/mdbcomp/*_FLAGS.in .
|
|
cp $root/mdbcomp/.mgnu* .
|
|
$LN_S $root/mdbcomp/$MDCOMP_LIB_NAME.init .
|
|
$LN_S $root/mdbcomp/RESERVED_MACRO_NAMES .
|
|
cd $root/$stage2dir
|
|
mkdir browser
|
|
cd browser
|
|
$LN_S $root/browser/*.m .
|
|
cp $root/browser/Mmake* $root/browser/Mercury.options .
|
|
cp $root/browser/*_FLAGS.in .
|
|
cp $root/browser/.mgnu* .
|
|
$LN_S $root/browser/$BROWSER_LIB_NAME.init .
|
|
$LN_S $root/browser/RESERVED_MACRO_NAMES .
|
|
cd $root/$stage2dir
|
|
mkdir analysis
|
|
cd analysis
|
|
$LN_S $root/analysis/*.m .
|
|
cp $root/analysis/Mmake* $root/analysis/Mercury.options .
|
|
cp $root/analysis/*_FLAGS.in .
|
|
cp $root/analysis/.mgnu* .
|
|
$LN_S $root/analysis/$ANALYSIS_LIB_NAME.init .
|
|
|
|
cd $root/$stage2dir
|
|
if $copy_runtime
|
|
then
|
|
# Remove symbolic link to the stage 1 runtime
|
|
# if it's present, which it can be with the -2 option.
|
|
rm -f runtime
|
|
mkdir runtime
|
|
cd runtime
|
|
$LN_S $root/runtime/*.h .
|
|
$LN_S $root/runtime/*.c .
|
|
# We need to use $LN rather than $LN_S for the files
|
|
# that get processed with Microsoft's tools, since
|
|
# Microsoft's tools don't understand Cygwin symbolic
|
|
# links (hard links are OK, Cygwin's ln just makes
|
|
# copies).
|
|
$LN $root/runtime/*.cpp .
|
|
rm -f mercury_mcpp.h mercury_conf*.h
|
|
$LN $root/runtime/mercury_mcpp.h .
|
|
$LN $root/runtime/mercury_conf*.h .
|
|
$LN $root/runtime/mercury_il.il .
|
|
$LN_S $root/runtime/*.in .
|
|
cp $root/runtime/Mmake* .
|
|
cp $root/runtime/.mgnu* .
|
|
$LN_S $root/runtime/machdeps .
|
|
$LN_S $root/runtime/RESERVED_MACRO_NAMES .
|
|
cd $root/$stage2dir
|
|
rm -f trace
|
|
mkdir trace
|
|
cd trace
|
|
$LN_S $root/trace/*.h .
|
|
$LN_S $root/trace/*.c .
|
|
$LN_S $root/trace/*.[yl] .
|
|
cp $root/trace/Mmake* .
|
|
cp $root/trace/.mgnu* .
|
|
$LN_S $root/trace/RESERVED_MACRO_NAMES .
|
|
cd $root/$stage2dir
|
|
rm -f robdd
|
|
mkdir robdd
|
|
cd robdd
|
|
$LN_S $root/robdd/*.h .
|
|
$LN_S $root/robdd/*.c .
|
|
cp $root/robdd/Mmake* .
|
|
cp $root/robdd/Make* .
|
|
cd $root/$stage2dir
|
|
else
|
|
$LN_S $root/runtime .
|
|
$LN_S $root/trace .
|
|
$LN_S $root/robdd .
|
|
fi
|
|
if $copy_boehm_gc
|
|
then
|
|
# Remove symbolic link to the stage 1 gc
|
|
# if it's present, which it can be with the -2 option.
|
|
rm -f boehm_gc
|
|
mkdir boehm_gc
|
|
cd boehm_gc
|
|
$LN_S $root/boehm_gc/*.h .
|
|
$LN_S $root/boehm_gc/*.c .
|
|
$LN_S $root/boehm_gc/*.s .
|
|
$LN_S $root/boehm_gc/*.S .
|
|
$LN_S $root/boehm_gc/include .
|
|
cp $root/boehm_gc/Mmake* .
|
|
$LN_S $root/boehm_gc/Makefile .
|
|
cp $root/boehm_gc/NT_MAKEFILE .
|
|
cp $root/boehm_gc/gc_cpp.cc .
|
|
$LN_S $root/boehm_gc/machdeps .
|
|
cp $root/boehm_gc/configure_atomic_ops.sh .
|
|
cp -r $root/boehm_gc/libatomic_ops-*[0-9] .
|
|
cd $root/$stage2dir
|
|
else
|
|
$LN_S $root/boehm_gc .
|
|
fi
|
|
$LN_S $root/java .
|
|
$LN_S $root/mps_gc .
|
|
$LN_S $root/bindist .
|
|
$LN_S $root/doc .
|
|
$LN_S $root/scripts .
|
|
$LN_S $root/tools .
|
|
$LN_S $root/util .
|
|
if $copy_slice
|
|
then
|
|
mkdir slice
|
|
cd slice
|
|
$LN_S $root/slice/*.m .
|
|
cp $root/slice/Mmake* $root/slice/Mercury.options .
|
|
cp $root/slice/*_FLAGS.in .
|
|
cd $root/$stage2dir
|
|
else
|
|
$LN_S $root/slice .
|
|
fi
|
|
if $copy_profilers
|
|
then
|
|
mkdir profiler
|
|
cd profiler
|
|
$LN_S $root/profiler/*.m .
|
|
cp $root/profiler/Mmake* $root/profiler/Mercury.options .
|
|
cp $root/profiler/*_FLAGS.in .
|
|
cp $root/profiler/.mgnu* .
|
|
cd $root/$stage2dir
|
|
mkdir deep_profiler
|
|
cd deep_profiler
|
|
$LN_S $root/deep_profiler/*.m .
|
|
cp $root/deep_profiler/Mmake* .
|
|
cp $root/deep_profiler/Mercury.options .
|
|
cp $root/deep_profiler/*_FLAGS.in .
|
|
cp $root/deep_profiler/.mgnu* .
|
|
cd $root/$stage2dir
|
|
else
|
|
$LN_S $root/profiler .
|
|
$LN_S $root/deep_profiler .
|
|
fi
|
|
$LN_S $root/conf* .
|
|
$LN_S $root/aclocal.m4 .
|
|
$LN_S $root/VERSION .
|
|
$LN_S $root/install-sh .
|
|
$LN_S $root/.*.in .
|
|
rm -f config*.log
|
|
cp $root/Mmake* $root/Mercury.options .
|
|
if test -f $root/Mmake.stage.params
|
|
then
|
|
/bin/rm -f Mmake.params
|
|
cp $root/Mmake.stage.params Mmake.params
|
|
fi
|
|
if test -f $root/Mmake.stage.slice.params
|
|
then
|
|
/bin/rm -f slice/Mmake.slice.params
|
|
cp $root/Mmake.stage.slice.params slice/Mmake.slice.params
|
|
fi
|
|
if test -f $root/Mmake.stage.mdbcomp.params
|
|
then
|
|
/bin/rm -f mdbcomp/Mmake.mdbcomp.params
|
|
cp $root/Mmake.stage.mdbcomp.params mdbcomp/Mmake.mdbcomp.params
|
|
fi
|
|
if test -f $root/Mmake.stage.browser.params
|
|
then
|
|
/bin/rm -f browser/Mmake.browser.params
|
|
cp $root/Mmake.stage.browser.params browser/Mmake.browser.params
|
|
fi
|
|
if test -f $root/Mmake.stage.deep.params
|
|
then
|
|
/bin/rm -f deep_profiler/Mmake.deep.params
|
|
cp $root/Mmake.stage.deep.params deep_profiler/Mmake.deep.params
|
|
fi
|
|
if test -f $root/Mmake.stage.library.params
|
|
then
|
|
/bin/rm -f library/Mmake.library.params
|
|
cp $root/Mmake.stage.library.params library/Mmake.library.params
|
|
fi
|
|
if test -f $root/Mmake.stage.runtime.params
|
|
then
|
|
/bin/rm -f runtime/Mmake.runtime.params
|
|
cp $root/Mmake.stage.runtime.params runtime/Mmake.runtime.params
|
|
fi
|
|
if test -f $root/Mmake.stage.trace.params
|
|
then
|
|
/bin/rm -f trace/Mmake.trace.params
|
|
cp $root/Mmake.stage.trace.params trace/Mmake.trace.params
|
|
fi
|
|
if test -f $root/Mercury.stage.options
|
|
then
|
|
/bin/rm -f Mercury.options
|
|
cp $root/Mercury.stage.options Mercury.options
|
|
fi
|
|
if test "$grade" != ""
|
|
then
|
|
echo "GRADE = $grade" >> Mmake.params
|
|
fi
|
|
echo 'GCC_SRC_DIR := ../$(GCC_SRC_DIR)' >> Mmake.params
|
|
cd $root
|
|
|
|
set -x
|
|
|
|
MMAKE_VPATH=.
|
|
export MMAKE_VPATH
|
|
MMAKE_DIR=$root/scripts
|
|
export MMAKE_DIR
|
|
|
|
# Use the new mmake to build stage 2
|
|
MMAKE=$MMAKE_DIR/mmake
|
|
mmake_opts="$mmake_opts $target_opt"
|
|
|
|
if (cd $stage2dir && $MMAKE $mmake_opts $jfactor runtime)
|
|
then
|
|
echo "building of stage 2 runtime successful"
|
|
else
|
|
echo "building of stage 2 runtime not successful"
|
|
exit 1
|
|
fi
|
|
|
|
case $use_mmc_make in
|
|
yes)
|
|
# The rules to generate *_FLAGS files from *_FLAGS.in files
|
|
# will not run if we are using `mmc --make' so run them now.
|
|
if (cd $stage2dir && \
|
|
$MMAKE compiler/COMP_FLAGS library/LIB_FLAGS \
|
|
mdbcomp/MDBCOMP_FLAGS analysis/ANALYSIS_FLAGS \
|
|
profiler/PROF_FLAGS deep_profiler/DEEP_FLAGS)
|
|
then
|
|
echo "building of stage 2 flags files successful"
|
|
else
|
|
echo "building of stage 2 flags files not successful"
|
|
exit 1
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
if (cd $stage2dir && \
|
|
$MMAKE $mmake_opts dep_library dep_mdbcomp \
|
|
dep_browser dep_analysis dep_compiler \
|
|
dep_profiler dep_deep_profiler)
|
|
then
|
|
echo "building of stage 2 dependencies successful"
|
|
else
|
|
echo "building of stage 2 dependencies not successful"
|
|
exit 1
|
|
fi
|
|
|
|
if (cd $stage2dir/library && \
|
|
$MMAKE $mmake_opts $jfactor mercury)
|
|
then
|
|
echo "building of stage 2 library successful"
|
|
else
|
|
echo "building of stage 2 library not successful"
|
|
exit 1
|
|
fi
|
|
|
|
if (cd $stage2dir/mdbcomp && \
|
|
$MMAKE $mmake_opts $jfactor library)
|
|
then
|
|
echo "building of stage 2 mdbcomp successful"
|
|
else
|
|
echo "building of stage 2 mdbcomp not successful"
|
|
exit 1
|
|
fi
|
|
|
|
if (cd $stage2dir/browser && \
|
|
$MMAKE $mmake_opts $jfactor library)
|
|
then
|
|
echo "building of stage 2 browser successful"
|
|
else
|
|
echo "building of stage 2 browser not successful"
|
|
exit 1
|
|
fi
|
|
|
|
if (cd $stage2dir/trace && \
|
|
$MMAKE $mmake_opts $jfactor trace)
|
|
then
|
|
echo "building of stage 2 trace successful"
|
|
else
|
|
echo "building of stage 2 trace not successful"
|
|
exit 1
|
|
fi
|
|
|
|
if $disable_debug_libs
|
|
then
|
|
/bin/rm $stage2dir/browser/lib$BROWSER_LIB_NAME.a
|
|
ar cr $stage2dir/browser/lib$BROWSER_LIB_NAME.a
|
|
/bin/rm $stage2dir/trace/lib$TRACE_LIB_NAME.a
|
|
ar cr $stage2dir/trace/lib$TRACE_LIB_NAME.a
|
|
fi
|
|
|
|
if (cd $stage2dir/analysis \
|
|
&& $MMAKE $mmake_opts $jfactor all)
|
|
then
|
|
echo "building of stage 2 analysis successful"
|
|
else
|
|
echo "building of stage 2 analysis not successful"
|
|
exit 1
|
|
fi
|
|
|
|
if (cd $stage2dir/compiler && \
|
|
$MMAKE $mmake_opts $jfactor mercury_compile)
|
|
then
|
|
echo "building of stage 2 compiler successful"
|
|
else
|
|
echo "building of stage 2 compiler not successful"
|
|
exit 1
|
|
fi
|
|
|
|
# We use "mmake" instead $MMAKE because we don't want to override
|
|
# the mmc in $PATH with the one in scripts, since that one will
|
|
# probably refer to a nonexistent executable in /usr/local/mercury-DEV.
|
|
|
|
if (cd $stage2dir/slice && \
|
|
unset MMAKE && \
|
|
unset MMAKE_VPATH && \
|
|
unset MMAKE_DIR && \
|
|
unset MERCURY_CONFIG_DIR && \
|
|
unset MERCURY_STDLIB_DIR && \
|
|
mmake $mmake_opts $jfactor depend && \
|
|
mmake $mmake_opts $jfactor all)
|
|
then
|
|
echo "building of stage 2 slice successful"
|
|
else
|
|
echo "building of stage 2 slice not successful"
|
|
exit 1
|
|
fi
|
|
|
|
if (cd $stage2dir && \
|
|
$MMAKE $mmake_opts MMAKEFLAGS=$jfactor all)
|
|
then
|
|
echo "building of stage 2 successful"
|
|
else
|
|
echo "building of stage 2 not successful"
|
|
exit 1
|
|
fi
|
|
|
|
if $compile_times
|
|
then
|
|
ls -lt $stage2dir/library/*.c
|
|
ls -lt $stage2dir/library/*.o
|
|
ls -lt $stage2dir/library/*.{a,so}
|
|
ls -lt $stage2dir/compiler/*.c
|
|
ls -lt $stage2dir/compiler/*.o
|
|
ls -lt $stage2dir/compiler/mercury_compile
|
|
fi
|
|
fi
|
|
echo "finishing stage 2 at `date`"
|
|
|
|
# Build the check_namespace target in the relevant directories.
|
|
# We want to do so before we delete any of the stage 2 object files.
|
|
|
|
check_namespace_status=0
|
|
if $check_namespace
|
|
then
|
|
cd $root/$stage2dir/runtime
|
|
mmake $mmake_opts check_namespace || {
|
|
echo '** mmake check_namespace failed in runtime!'
|
|
check_namespace_status=1
|
|
}
|
|
cd $root/$stage2dir/trace
|
|
mmake $mmake_opts check_namespace || {
|
|
echo '** mmake check_namespace failed in trace!'
|
|
check_namespace_status=1
|
|
}
|
|
cd $root/$stage2dir/library
|
|
mmake $mmake_opts check_namespace || {
|
|
echo '** mmake check_namespace failed in library!'
|
|
check_namespace_status=1
|
|
}
|
|
cd $root/$stage2dir/mdbcomp
|
|
mmake $mmake_opts check_namespace || {
|
|
echo '** mmake check_namespace failed in mdbcomp!'
|
|
check_namespace_status=1
|
|
}
|
|
cd $root/$stage2dir/browser
|
|
mmake $mmake_opts check_namespace || {
|
|
echo '** mmake check_namespace failed in browser!'
|
|
check_namespace_status=1
|
|
}
|
|
cd $root
|
|
fi
|
|
|
|
if $stop_after_stage_2
|
|
then
|
|
echo "stopping after building stage 2"
|
|
exit 0
|
|
fi
|
|
|
|
# We can now remove the object files from most stage 2 directories,
|
|
# but we will keep the compiler objects for a while longer.
|
|
if $keep_objs
|
|
then
|
|
true
|
|
else
|
|
libdirs="library mdbcomp browser"
|
|
if $copy_slice
|
|
then
|
|
slicedirs="slice"
|
|
else
|
|
slicedirs=
|
|
fi
|
|
if $copy_profilers
|
|
then
|
|
profdirs="profiler deep_profiler"
|
|
else
|
|
profdirs=
|
|
fi
|
|
if $copy_runtime
|
|
then
|
|
rundirs="runtime trace"
|
|
else
|
|
rundirs=
|
|
fi
|
|
|
|
objdirs="$libdirs $slicedirs $profdirs $rundirs"
|
|
for rmdir in $objdirs
|
|
do
|
|
cd $root/$stage2dir/$rmdir
|
|
/bin/rm -f *.o *.pic_o
|
|
done
|
|
|
|
for cleandir in runtime trace library mdbcomp browser
|
|
do
|
|
cd $root/$stage2dir/$cleandir
|
|
mmake clean_check
|
|
done
|
|
|
|
cd $root
|
|
fi
|
|
|
|
MERCURY_COMPILER=$root/$stage2dir/compiler/mercury_compile
|
|
export MERCURY_COMPILER
|
|
|
|
test -d $stage3dir || mkdir $stage3dir
|
|
if $keep_stage_3
|
|
then
|
|
echo keeping existing stage3
|
|
else
|
|
# We try to do the removal of the stage 3 directory in parallel
|
|
# since recursive rm's across NFS can be quite slow ...
|
|
$RMSTAGECMD $root/$stage3dir/compiler < /dev/null &
|
|
$RMSTAGECMD $root/$stage3dir/library < /dev/null &
|
|
wait
|
|
$RMSTAGECMD $root/$stage3dir/* < /dev/null
|
|
/bin/rm -fr $root/$stage3dir/* < /dev/null
|
|
/bin/rm -fr $root/$stage3dir/.[a-zA-Z]* < /dev/null
|
|
fi
|
|
|
|
echo linking stage 3... 1>&2
|
|
set +x
|
|
cd $stage3dir
|
|
$LN_S $root/main.c .
|
|
mkdir compiler
|
|
cd compiler
|
|
# Break up the links into several chunks.
|
|
# This is needed to cope with small limits
|
|
# on the size of argument vectors.
|
|
$LN_S $root/compiler/[a-h]*.m .
|
|
$LN_S $root/compiler/[i-o]*.m .
|
|
$LN_S $root/compiler/[p-s]*.m .
|
|
$LN_S $root/compiler/[t-z]*.m .
|
|
$LN_S $root/compiler/*.pp .
|
|
$LN_S $root/compiler/notes .
|
|
|
|
cp $root/compiler/Mmake* $root/compiler/Mercury.options .
|
|
cp $root/compiler/*_FLAGS.in .
|
|
cp $root/compiler/.mgnu* .
|
|
cd $root/$stage3dir
|
|
mkdir library
|
|
cd library
|
|
$LN_S $root/library/[a-l]*.m .
|
|
$LN_S $root/library/[m-z]*.m .
|
|
$LN_S $root/library/print_extra_inits .
|
|
$LN_S $root/library/library_strong_name.sn .
|
|
cp $root/library/Mmake* $root/library/Mercury.options .
|
|
cp $root/library/*_FLAGS.in .
|
|
cp $root/library/INTER_FLAGS* .
|
|
cp $root/library/.mgnu* .
|
|
$LN_S $root/library/$STD_LIB_NAME.init .
|
|
cd $root/$stage3dir
|
|
mkdir mdbcomp
|
|
cd mdbcomp
|
|
$LN_S $root/mdbcomp/*.m .
|
|
cp $root/mdbcomp/Mmake* $root/mdbcomp/Mercury.options .
|
|
cp $root/mdbcomp/*_FLAGS.in .
|
|
cp $root/mdbcomp/.mgnu* .
|
|
$LN_S $root/mdbcomp/$MDBCOMP_LIB_NAME.init .
|
|
cd $root/$stage3dir
|
|
mkdir browser
|
|
cd browser
|
|
$LN_S $root/browser/*.m .
|
|
cp $root/browser/Mmake* $root/browser/Mercury.options .
|
|
cp $root/browser/*_FLAGS.in .
|
|
cp $root/browser/.mgnu* .
|
|
$LN_S $root/browser/$BROWSER_LIB_NAME.init .
|
|
cd $root/$stage3dir
|
|
mkdir analysis
|
|
cd analysis
|
|
$LN_S $root/analysis/*.m .
|
|
cp $root/analysis/Mmake* $root/analysis/Mercury.options .
|
|
cp $root/analysis/*_FLAGS.in .
|
|
cp $root/analysis/.mgnu* .
|
|
$LN_S $root/analysis/$ANALYSIS_LIB_NAME.init .
|
|
cd $root/$stage3dir
|
|
$LN_S $root/$stage2dir/boehm_gc .
|
|
$LN_S $root/$stage2dir/java .
|
|
$LN_S $root/$stage2dir/mps_gc .
|
|
$LN_S $root/bindist .
|
|
$LN_S $root/doc .
|
|
$LN_S $root/$stage2dir/runtime .
|
|
$LN_S $root/$stage2dir/trace .
|
|
$LN_S $root/$stage2dir/robdd .
|
|
$LN_S $root/scripts .
|
|
$LN_S $root/tools .
|
|
$LN_S $root/util .
|
|
$LN_S $root/$stage2dir/slice .
|
|
$LN_S $root/$stage2dir/profiler .
|
|
$LN_S $root/$stage2dir/deep_profiler .
|
|
$LN_S $root/conf* .
|
|
$LN_S $root/aclocal.m4 .
|
|
$LN_S $root/VERSION .
|
|
$LN_S $root/install-sh .
|
|
$LN_S $root/.*.in .
|
|
rm -f config*.log
|
|
cp $root/$stage2dir/Mmake* $root/$stage2dir/Mercury.options .
|
|
cd $root
|
|
set -x
|
|
|
|
MMAKE_VPATH=.
|
|
export MMAKE_VPATH
|
|
MMAKE_DIR=$root/scripts
|
|
export MMAKE_DIR
|
|
|
|
# Use the new mmake to build stage 3
|
|
MMAKE=$MMAKE_DIR/mmake
|
|
|
|
# This setting is ignore unless the stage 2 was compiled with
|
|
# -DMR_HO_CALL_STATS.
|
|
HO_CALL_STATS="$root/HO_CALL_STATS"
|
|
export HO_CALL_STATS
|
|
|
|
if test "$type_stats" != ""
|
|
then
|
|
# Start collecting statistics from stage 3 with a clean slate,
|
|
# while making sure that the existing stats are not lost.
|
|
# Note: we do not have to go to any great lengths to restore
|
|
# the old stats if bootcheck fails, since the save files
|
|
# can easily be recovered outside bootcheck.
|
|
|
|
cat "$type_stats" >> "$type_stats".save.$$
|
|
cp /dev/null "$type_stats"
|
|
fi
|
|
|
|
if (cd $stage3dir && $MMAKE $mmake_opts dep_library dep_mdbcomp \
|
|
dep_browser_all dep_analysis dep_compiler)
|
|
then
|
|
echo "building of stage 3 dependencies successful"
|
|
else
|
|
echo "building of stage 3 dependencies not successful"
|
|
exit 1
|
|
fi
|
|
|
|
if (cd $stage3dir/library &&
|
|
$MMAKE $mmake_opts $jfactor all-ints &&
|
|
$MMAKE $mmake_opts $jfactor ${target_ext}s)
|
|
then
|
|
echo "building of stage 3 library successful"
|
|
else
|
|
echo "building of stage 3 library initially not successful"
|
|
df .
|
|
# try again, in case the failure cause was transient
|
|
if (cd $stage3dir/library &&
|
|
$MMAKE $mmake_opts $jfactor all-ints &&
|
|
$MMAKE $mmake_opts $jfactor ${target_ext}s)
|
|
then
|
|
echo "building of stage 3 library successful"
|
|
else
|
|
echo "building of stage 3 library not successful"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# We delay deleting the stage 2 compiler objects until now,
|
|
# so that if (a) an error manifests itself during the creation
|
|
# of the stage 3 library, and (b) this error can be fixed by
|
|
# changing the runtime, a bootcheck -2, which requires a relink,
|
|
# will not have to expensively recreate the stage 2 compiler objects.
|
|
|
|
if $keep_objs
|
|
then
|
|
true
|
|
else
|
|
find $root/$stage2dir/compiler -name "*.o" -print |
|
|
xargs /bin/rm -f
|
|
fi
|
|
|
|
if (cd $stage3dir/mdbcomp &&
|
|
$MMAKE $mmake_opts $jfactor all-ints &&
|
|
$MMAKE $mmake_opts $jfactor ${target_ext}s)
|
|
then
|
|
echo "building of stage 3 mdbcomp successful"
|
|
else
|
|
echo "building of stage 3 mdbcomp initially not successful"
|
|
df .
|
|
# try again, in case the failure cause was transient
|
|
if (cd $stage3dir/mdbcomp && \
|
|
$MMAKE $mmake_opts $jfactor ${target_ext}s)
|
|
then
|
|
echo "building of stage 3 mdbcomp successful"
|
|
else
|
|
echo "building of stage 3 mdbcomp not successful"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if (cd $stage3dir/browser &&
|
|
$MMAKE $mmake_opts $jfactor all-ints &&
|
|
$MMAKE $mmake_opts $jfactor ${target_ext}s)
|
|
then
|
|
echo "building of stage 3 browser successful"
|
|
else
|
|
echo "building of stage 3 browser initially not successful"
|
|
df .
|
|
# try again, in case the failure cause was transient
|
|
if (cd $stage3dir/browser && \
|
|
$MMAKE $mmake_opts $jfactor ${target_ext}s)
|
|
then
|
|
echo "building of stage 3 browser successful"
|
|
else
|
|
echo "building of stage 3 browser not successful"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if (cd $stage3dir/analysis &&
|
|
$MMAKE $mmake_opts $jfactor all-ints &&
|
|
$MMAKE $mmake_opts $jfactor ${target_ext}s)
|
|
then
|
|
echo "building of stage 3 analysis successful"
|
|
else
|
|
echo "building of stage 3 analysis initially not successful"
|
|
df .
|
|
# try again, in case the failure cause was transient
|
|
if (cd $stage3dir/analysis &&
|
|
$MMAKE $mmake_opts $jfactor all-ints &&
|
|
$MMAKE $mmake_opts $jfactor ${target_ext}s)
|
|
then
|
|
echo "building of stage 3 analysis successful"
|
|
else
|
|
echo "building of stage 3 analysis not successful"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if (cd $stage3dir/compiler && \
|
|
$MMAKE $mmake_opts $jfactor ${target_ext}s)
|
|
then
|
|
echo "building of stage 3 compiler successful"
|
|
else
|
|
echo "building of stage 3 compiler initially not successful"
|
|
df .
|
|
# try again, in case the failure cause was transient
|
|
if (cd $stage3dir/compiler && \
|
|
$MMAKE $mmake_opts $jfactor ${target_ext}s)
|
|
then
|
|
echo "building of stage 3 compiler successful"
|
|
else
|
|
echo "building of stage 3 compiler not successful"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if test "$type_stats" != ""
|
|
then
|
|
echo "Saving stage 3 stats in $type_stats.stage3.$$"
|
|
mv "$type_stats" "$type_stats".stage3.$$
|
|
cp /dev/null "$type_stats"
|
|
fi
|
|
|
|
diff_status=0
|
|
|
|
exec 3>&1 # save stdout in fd 3
|
|
if test -n "$outfile"
|
|
then
|
|
exec > "$outfile" # redirect stdout to $outfile
|
|
fi
|
|
|
|
for dir in library mdbcomp browser analysis compiler; do
|
|
# `mmake cs' in the compiler directory doesn't build
|
|
# `top_level_init.c', so we only compare the `.c'
|
|
# files present in the stage 3 directory.
|
|
for file in $stage3dir/$dir/${target_subdir}*.${target_ext}; do
|
|
diff -u $stage2dir/$dir/${cs_subdir}`basename $file` $file \
|
|
|| diff_status=1
|
|
done
|
|
done
|
|
|
|
exec >&3 # restore stdout from fd 3
|
|
if test $diff_status -ne 0
|
|
then
|
|
echo "** error - stage 2 and stage 3 differ!"
|
|
else
|
|
echo "stage 2 and stage 3 compare ok"
|
|
if test -d $stage3dir/library/ComplexityArgs
|
|
then
|
|
mv $stage3dir/library/ComplexityArgs \
|
|
$root/stage3_library_ComplexityArgs
|
|
fi
|
|
if test -d $stage3dir/library/ComplexityData
|
|
then
|
|
mv $stage3dir/library/ComplexityData \
|
|
$root/stage3_library_ComplexityData
|
|
fi
|
|
if test -d $stage3dir/compiler/ComplexityArgs
|
|
then
|
|
mv $stage3dir/compiler/ComplexityArgs \
|
|
$root/stage3_compiler_ComplexityArgs
|
|
fi
|
|
if test -d $stage3dir/compiler/ComplexityData
|
|
then
|
|
mv $stage3dir/compiler/ComplexityData \
|
|
$root/stage3_compiler_ComplexityData
|
|
fi
|
|
|
|
echo "removing stage 3..."
|
|
# We try to do the removal of the stage 3 directory in parallel
|
|
# since recursive rm's across NFS can be quite slow ...
|
|
$RMSTAGECMD $root/$stage3dir/compiler < /dev/null &
|
|
$RMSTAGECMD $root/$stage3dir/library < /dev/null &
|
|
wait
|
|
$RMSTAGECMD $root/$stage3dir/* < /dev/null
|
|
/bin/rm -fr $root/$stage3dir/* < /dev/null
|
|
/bin/rm -fr $root/$stage3dir/.[a-zA-Z]* < /dev/null
|
|
|
|
if $keep_objs
|
|
then
|
|
true
|
|
else
|
|
case "$grade" in
|
|
*debug*)
|
|
# These files take up a lot of disk space, so we compress
|
|
# them. This reduces the probability that running the tests
|
|
# will run out of disk space, while still allowing the
|
|
# original files to be reconstructed relatively quickly.
|
|
gzip $root/$stage2dir/library/*.c
|
|
gzip $root/$stage2dir/mdbcomp/*.c
|
|
gzip $root/$stage2dir/browser/*.c
|
|
gzip $root/$stage2dir/compiler/*.c
|
|
;;
|
|
esac
|
|
fi
|
|
fi
|
|
|
|
echo "finishing stage 3 at `date`"
|
|
else
|
|
diff_status=0
|
|
check_namespace_status=0
|
|
echo "building of stages 1 and 2 skipped"
|
|
fi
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
if test "$runtests" = "true" -o "$extras" = "true"
|
|
then
|
|
# Use everything from stage 2, unless the options say that the tests
|
|
# should be done in grade different from the grade of stage 2,
|
|
# in which case use everything from stage 1, trusting the user
|
|
# that the grade of the tests and the grade of stage 1 are compatible.
|
|
|
|
MERCURY_COMPILER=$root/$stage2dir/compiler/mercury_compile
|
|
export MERCURY_COMPILER
|
|
|
|
# now in FLAGS files
|
|
# MERCURY_CONFIG_FILE=$root/scripts/Mercury.config
|
|
# export MERCURY_CONFIG_FILE
|
|
|
|
if test "$test_grade" = "$grade"
|
|
then
|
|
stage2_insert="/$stage2dir"
|
|
else
|
|
stage2_insert=""
|
|
fi
|
|
|
|
WORKSPACE="$root${stage2_insert}"
|
|
export WORKSPACE
|
|
|
|
MMAKE_DIR="$root${stage2_insert}/scripts"
|
|
export MMAKE_DIR
|
|
|
|
# Set PATH for mkinit, mmc, mgnuc, ml etc
|
|
PATH=$root${stage2_insert}/util:$root${stage2_insert}/scripts:$PATH
|
|
export PATH
|
|
fi
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
# Run the tests in the tests/* directories
|
|
|
|
if test -s $HOME/.bootcheck_diff_opts
|
|
then
|
|
DIFF_OPTS=`cat $HOME/.bootcheck_diff_opts`
|
|
export DIFF_OPTS
|
|
fi
|
|
|
|
test_status=0
|
|
if $runtests
|
|
then
|
|
# We need to give tests/debugger access to the mdbrc and mdb_doc
|
|
# files in the doc and scripts directories, without hardcoding their
|
|
# pathnames. We must also compensate for scripts/mdbrc having hardcoded
|
|
# within it the *installed* pathname of mdb_doc and not its current
|
|
# pathname.
|
|
cat $root/doc/mdb_doc > $root/scripts/test_mdbrc
|
|
sed -e '/^source/d' $root/scripts/mdbrc >> $root/scripts/test_mdbrc
|
|
MERCURY_DEBUGGER_INIT=$root/scripts/test_mdbrc
|
|
export MERCURY_DEBUGGER_INIT
|
|
|
|
MERCURY_SUPPRESS_STACK_TRACE=yes
|
|
export MERCURY_SUPPRESS_STACK_TRACE
|
|
|
|
if test "$test_grade" != ""
|
|
then
|
|
test_grade_opt="GRADE=$test_grade"
|
|
else
|
|
test_grade_opt=""
|
|
fi
|
|
|
|
test_status=0
|
|
if test -d tests
|
|
then
|
|
tests_prefix=""
|
|
elif test -d ../tests
|
|
then
|
|
tests_prefix="../"
|
|
else
|
|
echo "cannot find test directory"
|
|
test_status=1
|
|
fi
|
|
|
|
if test "$test_status" = 0
|
|
then
|
|
if $test_params
|
|
then
|
|
cp $root/$stage2dir/Mmake.params ${tests_prefix}tests
|
|
else
|
|
/bin/rm ${tests_prefix}tests/Mmake.params > /dev/null 2>&1
|
|
fi
|
|
|
|
cp $root/doc/mdb_command_test.inp ${tests_prefix}tests/debugger
|
|
|
|
sed -e "s:@WORKSPACE@:$WORKSPACE:" \
|
|
< ${tests_prefix}tests/WS_FLAGS.ws \
|
|
> ${tests_prefix}tests/WS_FLAGS
|
|
|
|
sed -e "s:@WORKSPACE@:$WORKSPACE:" \
|
|
< ${tests_prefix}tests/.mgnuc_copts.ws \
|
|
> ${tests_prefix}tests/.mgnuc_copts
|
|
|
|
all_test_dirs="
|
|
benchmarks
|
|
debugger
|
|
debugger/declarative
|
|
dppd
|
|
general
|
|
general/accumulator
|
|
general/string_format
|
|
general/structure_reuse
|
|
grade_subdirs
|
|
hard_coded
|
|
hard_coded/exceptions
|
|
hard_coded/purity
|
|
hard_coded/sub-modules
|
|
hard_coded/typeclasses
|
|
invalid
|
|
invalid/purity
|
|
misc_tests
|
|
mmc_make
|
|
par_conj
|
|
recompilation
|
|
tabling
|
|
term
|
|
trailing
|
|
valid
|
|
warnings"
|
|
|
|
for d in $all_test_dirs
|
|
do
|
|
cp ${tests_prefix}tests/.mgnuc_copts ${tests_prefix}tests/$d
|
|
cp ${tests_prefix}tests/.mgnuc_opts ${tests_prefix}tests/$d
|
|
done
|
|
|
|
WORKSPACE_FLAGS=yes
|
|
export WORKSPACE_FLAGS
|
|
|
|
case $error_file_only in
|
|
true)
|
|
if test ! -f ${tests_prefix}tests/runtests.errs
|
|
then
|
|
echo "bootcheck: \`--failing-tests' specified but" 1>&2
|
|
echo \
|
|
"\`${tests_prefix}tests/runtests.errs' does not exist." \
|
|
1>&2
|
|
exit 1
|
|
fi
|
|
|
|
mv ${tests_prefix}tests/runtests.errs \
|
|
${tests_prefix}tests/runtests.$$
|
|
test_log_opt="ERROR_FILE=$root/${tests_prefix}tests/runtests.$$"
|
|
;;
|
|
false)
|
|
test_log_opt=""
|
|
;;
|
|
esac
|
|
|
|
case $failing_tests_only in
|
|
true)
|
|
test_log_opt="FAILED_TESTS_ONLY=yes"
|
|
;;
|
|
esac
|
|
|
|
cd $root/${tests_prefix}tests
|
|
> FAILED_TESTS_SUMMARY
|
|
|
|
/bin/rm -fr PASSED_TC_DIR FAILED_TC_DIR > /dev/null 2>&1
|
|
mkdir -p PASSED_TC_DIR FAILED_TC_DIR
|
|
echo 0 > PASSED_TC_DIR/NEXT_NUMBER
|
|
echo 0 > FAILED_TC_DIR/NEXT_NUMBER
|
|
SLICE_DIR="$root/slice/"
|
|
export SLICE_DIR
|
|
|
|
if test "$specified_tests_only" != ""
|
|
then
|
|
test_status=0
|
|
for specified_test in $specified_tests_only
|
|
do
|
|
specified_test_dir=`dirname $specified_test`
|
|
specified_test_base=`basename $specified_test`
|
|
if test -d "$root/${tests_prefix}/tests/$specified_test_dir"
|
|
then
|
|
cd $root/${tests_prefix}tests/$specified_test_dir
|
|
mmake $target_opt $jfactor $test_grade_opt \
|
|
SPECIFIED_TESTS="$specified_test_base" runtests
|
|
if test "$?" -ne "0"
|
|
then
|
|
test_status=$?
|
|
fi
|
|
else
|
|
test_status=1
|
|
fi
|
|
done
|
|
else
|
|
if test "$testdirs" = ""
|
|
then
|
|
mmake $target_opt $jfactor $test_grade_opt \
|
|
$test_log_opt runtests
|
|
else
|
|
for testdir in $testdirs
|
|
do
|
|
cd $root/${tests_prefix}tests/$testdir
|
|
mmake $target_opt $jfactor $test_grade_opt \
|
|
$test_log_opt runtests
|
|
done
|
|
fi
|
|
test_status=$?
|
|
fi
|
|
|
|
case $failing_tests_only in
|
|
true) rm -f ${tests_prefix}tests/runtests.$$ ;;
|
|
esac
|
|
|
|
if test "$type_stats" != ""
|
|
then
|
|
echo "Saving test suite stats in $type_stats.test.$$"
|
|
mv "$type_stats" "$type_stats".test.$$
|
|
fi
|
|
|
|
for tcdir in PASSED_TC_DIR FAILED_TC_DIR
|
|
do
|
|
if test "`cat $tcdir/NEXT_NUMBER`" -gt 0
|
|
then
|
|
${SLICE_DIR}slice/mtc_union -o $tcdir/SUMMARY \
|
|
$tcdir/trace_counts.*
|
|
/bin/rm $tcdir/trace_counts.*
|
|
fi
|
|
done
|
|
|
|
cd $root
|
|
fi
|
|
fi
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
# Run the tests in the extras/* directories
|
|
|
|
extras_status=0
|
|
if $extras
|
|
then
|
|
cd $root/extras
|
|
if test -f Mmake.params
|
|
then
|
|
mv Mmake.params Mmake.params.$$
|
|
fi
|
|
|
|
if test -f $root/Mmake.stage.params
|
|
then
|
|
cp $root/Mmake.stage.params Mmake.params
|
|
elif test -f $root/Mmake.params
|
|
then
|
|
cp $root/Mmake.params Mmake.params
|
|
else
|
|
cp /dev/null Mmake.params
|
|
fi
|
|
|
|
if test "$test_grade" != ""
|
|
then
|
|
echo "GRADE = $test_grade" >> Mmake.params
|
|
elif test "$grade" != ""
|
|
then
|
|
echo "GRADE = $grade" >> Mmake.params
|
|
fi
|
|
|
|
for testdir in *
|
|
do
|
|
if test -f $testdir/Mmakefile -a ! -f $testdir/NOBOOTTEST
|
|
then
|
|
(cd $testdir;
|
|
mmake realclean $jfactor;
|
|
mmake depend $jfactor &&
|
|
mmake $jfactor &&
|
|
mmake check $jfactor &&
|
|
mmake realclean $jfactor ) ||
|
|
extras_status=1
|
|
fi
|
|
done
|
|
|
|
if test -f Mmake.params.$$
|
|
then
|
|
mv Mmake.params.$$ Mmake.params
|
|
else
|
|
/bin/rm Mmake.params
|
|
fi
|
|
|
|
cd $root
|
|
fi
|
|
|
|
if $delete_deep_data
|
|
then
|
|
(cd $root; find stage2 tests -name Deep.data -print | xargs /bin/rm -f)
|
|
fi
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
if test "$type_stats" != ""
|
|
then
|
|
mv "$type_stats".save.$$ "$type_stats"
|
|
fi
|
|
|
|
exitstatus=0
|
|
|
|
tests_dir="$root/${tests_prefix}tests"
|
|
|
|
cat /dev/null > $tests_dir/EXPECT_FAIL_TESTS
|
|
|
|
if test -s $tests_dir/FAILED_TESTS_SUMMARY
|
|
then
|
|
sed -e 's/ .*//' < $tests_dir/FAILED_TESTS_SUMMARY > $tests_dir/FAIL_TESTS
|
|
|
|
if test -f $tests_dir/EXPECT_FAIL_TESTS.all_grades
|
|
then
|
|
cat $tests_dir/EXPECT_FAIL_TESTS.all_grades >> \
|
|
$tests_dir/EXPECT_FAIL_TESTS
|
|
fi
|
|
if test -f $tests_dir/EXPECT_FAIL_TESTS.$test_grade
|
|
then
|
|
cat $tests_dir/EXPECT_FAIL_TESTS.$test_grade >> \
|
|
$tests_dir/EXPECT_FAIL_TESTS
|
|
fi
|
|
|
|
sort $tests_dir/EXPECT_FAIL_TESTS > $tests_dir/EXPECT_FAIL_TESTS.sort
|
|
mv $tests_dir/EXPECT_FAIL_TESTS.sort $tests_dir/EXPECT_FAIL_TESTS
|
|
|
|
sort $tests_dir/FAIL_TESTS > $tests_dir/FAIL_TESTS.sort
|
|
mv $tests_dir/FAIL_TESTS.sort $tests_dir/FAIL_TESTS
|
|
|
|
comm -23 $tests_dir/FAIL_TESTS \
|
|
$tests_dir/EXPECT_FAIL_TESTS \
|
|
> $tests_dir/UNEXPECTED_FAILED_TESTS
|
|
comm -12 $tests_dir/FAIL_TESTS \
|
|
$tests_dir/EXPECT_FAIL_TESTS \
|
|
> $tests_dir/EXPECTED_FAILED_TESTS
|
|
|
|
if $expect_listed_failures
|
|
then
|
|
if test ! -s $tests_dir/UNEXPECTED_FAILED_TESTS
|
|
then
|
|
test_status=0
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if test "$diff_status" != 0
|
|
then
|
|
echo "error exit: stages 2 and 3 differ"
|
|
exitstatus=1
|
|
fi
|
|
|
|
if test "$test_status" != 0
|
|
then
|
|
echo "error exit: some tests failed"
|
|
exitstatus=1
|
|
fi
|
|
|
|
if test "$extras_status" != 0
|
|
then
|
|
echo "error exit: some tests failed in extras"
|
|
exitstatus=1
|
|
fi
|
|
|
|
if test "$check_namespace_status" != 0
|
|
then
|
|
echo "error exit: some namespace isn't clean"
|
|
exitstatus=1
|
|
fi
|
|
|
|
if test -s $tests_dir/FAILED_TESTS_SUMMARY
|
|
then
|
|
if test -s $tests_dir/EXPECTED_FAILED_TESTS
|
|
then
|
|
echo expected test case failures:
|
|
cat $tests_dir/EXPECTED_FAILED_TESTS
|
|
fi
|
|
|
|
if test -s $tests_dir/UNEXPECTED_FAILED_TESTS
|
|
then
|
|
echo unexpected test case failures:
|
|
cat $tests_dir/UNEXPECTED_FAILED_TESTS
|
|
fi
|
|
fi
|
|
|
|
echo "finishing at `date`"
|
|
exit $exitstatus
|
|
|
|
#-----------------------------------------------------------------------------#
|