2003-01-02 Andrew Cagney <ac131313@redhat.com>

* MAINTAINERS: Mention gdb_mbuild.sh.
	* gdb_mbuild.sh: Rewrite.
This commit is contained in:
Andrew Cagney 2003-01-02 16:40:33 +00:00
parent e1ea1d755e
commit 684e56bf67
3 changed files with 266 additions and 150 deletions

View File

@ -1,3 +1,8 @@
2003-01-02 Andrew Cagney <ac131313@redhat.com>
* MAINTAINERS: Mention gdb_mbuild.sh.
* gdb_mbuild.sh: Rewrite.
2003-01-02 Mark Kettenis <kettenis@gnu.org> 2003-01-02 Mark Kettenis <kettenis@gnu.org>
* configure.in: Fix typo in last change. * configure.in: Fix typo in last change.

View File

@ -172,40 +172,8 @@ All recognized developers can make mechanical changes (by virtue of
the obvious fix rule) to ``maintenance only'' targets. The change the obvious fix rule) to ``maintenance only'' targets. The change
shall be sanity checked by compiling with one of the listed targets. shall be sanity checked by compiling with one of the listed targets.
The Bourne shell script: The Bourne shell script gdb_mbuild.sh can be used to rebuild all the
above targets.
cat MAINTAINERS | tr -s '[\t]' '[ ]' | sed -n '
/^[ ]*[-a-z0-9\.]*[ ]*[(]*--target=.*/ !d
s/^.*--target=//
s/).*$//
h
:loop
g
/^[^ ]*,/ !b end
s/,[^ ]*//
p
g
s/^[^,]*,//
h
b loop
:end
p
'
can be used to generate a list of buildable targets. The list
containing values for the configure options --target=,
--enable-gdb-build-warnings= and optionally
--enable-sim-build-warnings vis:
arc-elf ,-Werror
...
m68hc11-elf ,-Werror ,
...
hppa1.1-hp-proelf broken
...
While the ``broken'' targets are included in the listing, the are not
expected to build.
Host/Native: Host/Native:

View File

@ -1,7 +1,10 @@
#!/bin/sh #!/bin/sh
# Multi-build script for testing compilation of all maintained configs of GDB. # Multi-build script for testing compilation of all maintained
# Copyright (C) 2002 Free Software Foundation, Inc. # configs of GDB.
# Copyright 2002 Free Software Foundation, Inc.
# Contributed by Richard Earnshaw (rearnsha@arm.com) # Contributed by Richard Earnshaw (rearnsha@arm.com)
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@ -18,136 +21,276 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
usage() { usage()
echo "Usage: gdb_mbuild.sh <srcdir> <builddir> [<parjobs>]" {
echo " Environment variables examined (with default if not defined):" cat <<EOF
echo " AWK (awk) -- must be GNU awk" Usage: gdb_mbuild.sh [ <options> ... ] <srcdir> <builddir>
echo " MAKE (make)" Options:
echo -j <makejobs> Run <makejobs> in parallel. Passed to make.
echo " Note: Everything in <builddir>/gdb-allcross will be blown away." On a single cpu machine, 2 is recommended.
-k Keep going. Do not stop after the first build fails.
-e <regexp> Regular expression for selecting the targets to build.
-f Force rebuild. Even rebuild previously built directories.
-v Be more (and more, and more) verbose.
Arguments:
<srcdir> Source code directory.
<builddir> Build directory.
Environment variables examined (with default if not defined):
MAKE (make)"
EOF
exit 1; exit 1;
cat <<NOTYET
-b <maxbuilds> Run <maxbuild> builds in parallel.
On a single cpu machine, 1 is recommended.
NOTYET
} }
if [ $# -ne 2 -a $# -ne 3 ] ; then ### COMMAND LINE OPTIONS
usage
fi makejobs=
maxbuilds=1
keepgoing=
force=false
targexp=""
verbose=0
while test $# -gt 0
do
case "$1" in
-j )
# Number of parallel make jobs.
shift
test $# -ge 1 || usage
makejobs="-j $1"
;;
-b | -c )
# Number of builds to fire off in parallel.
shift
test $# -ge 1 || usage
maxbuilds=$1
;;
-k )
# Should we soldier on after the first build fails?
keepgoing=-k
;;
-e )
# A regular expression for selecting targets
shift
test $# -ge 1 || usage
targexp="${targexp} -e ${1}"
;;
-f )
# Force a rebuild
force=true ; shift ;;
-v )
# Be more, and more, and more, verbose
verbose=`expr ${verbose} + 1`
;;
-* ) usage ;;
*) break ;;
esac
shift
done
### COMMAND LINE PARAMETERS ### COMMAND LINE PARAMETERS
# Where the sources live if test $# -ne 2
srcdir=$1 then
usage
# Where the builds occur
buildbase=$2
# Number of parallel make jobs (you probably want about 2 jobs per cpu for
# maximum throughput)
if [ $# -eq 3 ]; then
par=$3
else
par="1"
fi fi
# Convert these to absolute directory paths.
# Where the sources live
srcdir=`cd $1 && /bin/pwd` || exit 1
# Where the builds occur
builddir=`cd $2 && /bin/pwd` || exit 1
### ENVIRONMENT PARAMETERS ### ENVIRONMENT PARAMETERS
# Must be GNU awk
awk=${AWK:-awk}
# Version of make to use # Version of make to use
make=${MAKE:-make} make=${MAKE:-make}
# Where builds will live
builddir=${buildbase}/gdb-allcross
# Where logs will go. NB. Must not be a sub-dir of builddir or you will loose
# them.
logdir=${buildbase}/gdb-logdir
# Where to look for the list of targets to test
maintainers=${srcdir}/gdb/MAINTAINERS
# Get the list of targets and the build options
alltarg=`${awk} < "${maintainers}" '
$2 ~ /--target=.*/ {
targets = gensub (/^.*--target=/, "", 1, $2)
warnings = gensub (/[)]*$/, "", 1, $3)
split (targets, targ, /,/)
for (i in targ) {
print targ[i], warnings
}
}'`
# Back up the log files
cd ${logdir}
if [ -f build.out ]
then
mv build.out build.old
fi
if [ -f config.out ]
then
mv config.out config.old
fi
if [ -f fail.sum ]
then
mv fail.sum fail.old
fi
if [ ! -d ${builddir} ]
then
echo ${builddir} does not exist
exit 1
fi
cd ${builddir}
rm -rf *
MAKE=${make} MAKE=${make}
export MAKE export MAKE
jobs=1
# For each target, configure and build it. # Where to look for the list of targets to test
while read targ opts maintainers=${srcdir}/gdb/MAINTAINERS
do if [ ! -r ${maintainers} ]
if [ ${opts} != "broken" ] then
echo Maintainers file ${maintainers} not found
exit 1
fi
# Get the list of targets and the build options
alltarg=`cat ${maintainers} | tr -s '[\t]' '[ ]' | sed -n '
/^[ ]*[-a-z0-9\.]*[ ]*[(]*--target=.*/ !d
s/^.*--target=//
s/).*$//
h
:loop
g
/^[^ ]*,/ !b end
s/,[^ ]*//
p
g
s/^[^,]*,//
h
b loop
:end
p
' | if test "${targexp}" = ""
then
grep -v -e broken -e OBSOLETE
else
grep ${targexp}
fi`
# Usage: fail <message> <test-that-should-succeed>. Should the build
# fail? If the test is true, and we don't want to keep going, print
# the message and shoot everything in sight and abort the build.
fail ()
{
msg="$1" ; shift
if test "$@"
then
echo "${target}: ${msg}"
if test "${keepgoing}" != ""
then then
trap 'echo cleaning up ...; rm -rf ${builddir}/*; exit 1' 1 2 15 #exit 1
echo ${targ} continue
mkdir ${targ}
cd ${targ}
${srcdir}/configure --target=$targ \
--enable-gdb-build-warnings=$opts \
>> ${logdir}/config.tout.$targ 2>&1 &
cd ..
jobs=`expr ${jobs} + 1`
if [ ${jobs} -gt ${par} ]
then
wait
jobs=1
fi
fi
done << EOF
$alltarg
EOF
wait
cat ${logdir}/config.tout.* > ${logdir}/config.out
rm -f ${logdir}/config.tout.*
for targ in *
do
cd $targ
if ${make} -j ${par} all-gdb >> ${logdir}/build.out 2>&1
then
true
else else
echo ">>>>>>>>>>>>>" >> ${logdir}/fail.sum kill $$
echo "$targ (${opts})" >> ${logdir}/fail.sum exit 1
tail -20 ${logdir}/build.out >> ${logdir}/fail.sum
echo >> ${logdir}/fail.sum
echo $targ build failed
fi fi
rm -rf * fi
cd .. }
# Usage: log <level> <logfile>. Write standard input to <logfile> and
# stdout (if verbose >= level).
log ()
{
if test ${verbose} -ge $1
then
tee $2
else
cat > $2
fi
}
# Warn the user of what is comming, print the list of targets
echo "$alltarg"
echo ""
# For each target, configure, build and test it.
echo "$alltarg" | while read target gdbopts simopts
do
trap "exit 1" 1 2 15
dir=${builddir}/${target}
# Should a scratch rebuild be forced, for perhaphs the entire
# build be skipped?
if ${force}
then
echo forcing ${target} ...
rm -rf ${dir}
elif test -f ${dir}
then
echo "${target}"
continue
else
echo ${target} ...
fi
# Did the previous configure attempt fail? If it did
# restart from scratch.
if test -d ${dir} -a ! -r ${dir}/Makefile
then
echo ... removing partially configured ${target}
rm -rf ${dir}
if test -d ${dir}
then
echo "${target}: unable to remove directory ${dir}"
exit 1
fi
fi
# From now on, we're in this target's build directory
mkdir -p ${dir}
cd ${dir} || exit 1
# Configure, if not already. Should this go back to being
# separate and done in parallel?
if test ! -r Makefile
then
# Default SIMOPTS to GDBOPTS.
test -z "${simopts}" && simopts="${gdbopts}"
# The config options
__target="--target=${target}"
__enable_gdb_build_warnings=`test -z "${gdbopts}" \
|| echo "--enable-gdb-build-warnings=${gdbopts}"`
__enable_sim_build_warnings=`test -z "${simopts}" \
|| echo "--enable-sim-build-warnings=${simopts}"`
__configure="${srcdir}/configure \
${__target} \
${__enable_gdb_build_warnings} \
${__enable_sim_build_warnings}"
echo ... ${__configure}
trap "echo Removing partially configured ${dir} directory ...; rm -rf ${dir}; exit 1" 1 2 15
${__configure} 2>&1 | log 2 Config.log
trap "exit 1" 1 2 15
fi
fail "configure failed" ! -r Makefile
# Build, if not built.
if test ! -x gdb/gdb -a ! -x gdb/gdb.exe
then
echo ... ${make} ${keepgoing} ${makejobs} ${target}
${make} ${keepgoing} ${makejobs} all-gdb 2>&1 | log 1 Build.log
fi
fail "compile failed" ! -x gdb/gdb -a ! -x gdb/gdb.exe
# Check that the built GDB can at least print it's architecture.
echo ... run ${target}
rm -f core gdb.core ${dir}/gdb/x
cat <<EOF > x
maint print architecture
quit
EOF
./gdb/gdb -batch -nx -x x 2>&1 | log 1 Gdb.log
fail "gdb dumped core" -r core -o -r gdb.core
fail "gdb printed no output" ! -s Gdb.log
grep -e internal-error Gdb.log && fail "gdb panic" 1
# Replace the build directory with a file as semaphore that stops
# a rebuild. (should the logs be saved?)
cd ${builddir}
rm -f ${target}.tmp
mv ${target}/Gdb.log ${target}.tmp
rm -rf ${target}
mv ${target}.tmp ${target}
# Success!
echo ... ${target} built
done done
exit 0