268 lines
6.5 KiB
Bash
268 lines
6.5 KiB
Bash
#!/bin/sh
|
|
|
|
# Build script to build GDB with all targets enabled.
|
|
|
|
# Copyright (C) 2008-2022 Free Software Foundation, Inc.
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Make certain that the script is not running in an internationalized
|
|
# environment. The script is grepping for GDB's output.
|
|
|
|
# Contributed by Markus Deuling <deuling@de.ibm.com>.
|
|
# Based on gdb_mbuild.sh from Richard Earnshaw.
|
|
|
|
|
|
LANG=c ; export LANG
|
|
LC_ALL=c ; export LC_ALL
|
|
|
|
# Prints a usage message.
|
|
usage()
|
|
{
|
|
cat <<EOF
|
|
Usage: gdb_buildall.sh [ <options> ... ] <srcdir> <builddir>
|
|
|
|
Options:
|
|
|
|
--bfd64 Enable 64-bit BFD.
|
|
--clean Delete build directory after check.
|
|
-e <regexp> Regular expression for selecting the targets to build.
|
|
--force Force rebuild.
|
|
-j <makejobs> Run <makejobs> in parallel. Passed to make.
|
|
On a single cpu machine, 2 is recommended.
|
|
Arguments:
|
|
<srcdir> Source code directory.
|
|
<builddir> Build directory.
|
|
|
|
Environment variables examined (with default if not defined):
|
|
MAKE (make)"
|
|
EOF
|
|
exit 1
|
|
}
|
|
|
|
### Command line options.
|
|
makejobs=
|
|
force=false
|
|
targexp=""
|
|
bfd_flag=""
|
|
clean=false
|
|
while test $# -gt 0
|
|
do
|
|
case "$1" in
|
|
-j )
|
|
# Number of parallel make jobs.
|
|
shift
|
|
test $# -ge 1 || usage
|
|
makejobs="-j $1"
|
|
;;
|
|
--clean )
|
|
# Shall the build directory be deleted after processing?
|
|
clean=true
|
|
;;
|
|
-e )
|
|
# A regular expression for selecting targets
|
|
shift
|
|
test $# -ge 1 || usage
|
|
targexp="${targexp} -e ${1}"
|
|
;;
|
|
--force )
|
|
# Force a rebuild
|
|
force=true ;
|
|
;;
|
|
--bfd64)
|
|
# Enable 64-bit BFD
|
|
bfd_flag="--enable-64-bit-bfd"
|
|
;;
|
|
-* ) usage ;;
|
|
*) break ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if test $# -ne 2
|
|
then
|
|
usage
|
|
fi
|
|
|
|
### Environment.
|
|
|
|
# Convert these to absolute directory paths.
|
|
srcdir=`cd $1 && /bin/pwd` || exit 1
|
|
builddir=`cd $2 && /bin/pwd` || exit 1
|
|
# Version of make to use
|
|
make=${MAKE:-make}
|
|
MAKE=${make}
|
|
export MAKE
|
|
# We don't want GDB do dump cores.
|
|
ulimit -c 0
|
|
|
|
# Just make sure we're in the right directory.
|
|
maintainers=${srcdir}/gdb/MAINTAINERS
|
|
if [ ! -r ${maintainers} ]
|
|
then
|
|
echo Maintainers file ${maintainers} not found
|
|
exit 1
|
|
fi
|
|
|
|
|
|
# Build GDB with all targets enabled.
|
|
echo "Starting gdb_buildall.sh ..."
|
|
|
|
trap "exit 1" 1 2 15
|
|
dir=${builddir}/ALL
|
|
|
|
# Should a scratch rebuild be forced, for perhaps the entire build be skipped?
|
|
if ${force}
|
|
then
|
|
echo ... forcing rebuild
|
|
rm -rf ${dir}
|
|
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
|
|
rm -rf ${dir}
|
|
if test -d ${dir}
|
|
then
|
|
echo "... ERROR: Unable to remove directory ${dir}"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Create build directory.
|
|
mkdir -p ${dir}
|
|
cd ${dir} || exit 1
|
|
|
|
# Configure GDB.
|
|
if test ! -r Makefile
|
|
then
|
|
# Default SIMOPTS to GDBOPTS.
|
|
test -z "${simopts}" && simopts="${gdbopts}"
|
|
|
|
# The config options.
|
|
__build="--enable-targets=all"
|
|
__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 \
|
|
${__build} ${bfd_flag}\
|
|
${__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} > Config.log 2>&1
|
|
trap "exit 1" 1 2 15
|
|
|
|
# Without Makefile GDB won't build.
|
|
if test ! -r Makefile
|
|
then
|
|
echo "... CONFIG ERROR: GDB couldn't be configured " | tee -a Config.log
|
|
echo "... CONFIG ERROR: see Config.log for details "
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Build GDB, if not built.
|
|
gdb_bin="gdb/gdb"
|
|
if test ! -x gdb/gdb -a ! -x gdb/gdb.exe
|
|
then
|
|
echo ... ${make} ${makejobs}
|
|
( ${make} ${makejobs} all-gdb || rm -f gdb/gdb gdb/gdb.exe
|
|
) > Build.log 2>&1
|
|
|
|
# If the build fails, exit.
|
|
if test ! -x gdb/gdb -a ! -x gdb/gdb.exe
|
|
then
|
|
echo "... BUILD ERROR: GDB couldn't be compiled " | tee -a Build.log
|
|
echo "... BUILD ERROR: see Build.log for details "
|
|
exit 1
|
|
fi
|
|
if test -x gdb/gdb.exe
|
|
then
|
|
gdb_bin="gdb/gdb.exe"
|
|
fi
|
|
fi
|
|
|
|
|
|
# Retrieve a list of settable architectures by invoking "set architecture"
|
|
# without parameters.
|
|
cat <<EOF > arch
|
|
set architecture
|
|
quit
|
|
EOF
|
|
./gdb/gdb --batch -nx -x arch 2>&1 | cat > gdb_archs
|
|
tail -n 1 gdb_archs | sed 's/auto./\n/g' | sed 's/,/\n/g' | sed 's/Requires an argument. Valid arguments are/\n/g' | sed '/^[ ]*$/d' > arch
|
|
mv arch gdb_archs
|
|
|
|
if test "${targexp}" != ""
|
|
then
|
|
alltarg=`cat gdb_archs | grep ${targexp}`
|
|
else
|
|
alltarg=`cat gdb_archs`
|
|
fi
|
|
rm -f gdb_archs
|
|
|
|
# Test all architectures available in ALLTARG
|
|
echo "maint print architecture for"
|
|
echo "$alltarg" | while read target
|
|
do
|
|
cat <<EOF > x
|
|
set architecture ${target}
|
|
maint print architecture
|
|
quit
|
|
EOF
|
|
log_file=$target.log
|
|
log_file=${log_file//:/_}
|
|
echo -n "... ${target}"
|
|
./gdb/gdb -batch -nx -x x 2>&1 | cat > $log_file
|
|
# Check GDBs results
|
|
if test ! -s $log_file
|
|
then
|
|
echo " ERR: gdb printed no output" | tee -a $log_file
|
|
elif test `grep -o internal-error $log_file | tail -n 1`
|
|
then
|
|
echo " ERR: gdb panic" | tee -a $log_file
|
|
else
|
|
echo " OK"
|
|
fi
|
|
|
|
# Create a sed script that cleans up the output from GDB.
|
|
rm -f mbuild.sed
|
|
# Rules to replace <0xNNNN> with the corresponding function's name.
|
|
sed -n -e '/<0x0*>/d' -e 's/^.*<0x\([0-9a-f]*\)>.*$/0x\1/p' $log_file \
|
|
| sort -u \
|
|
| while read addr
|
|
do
|
|
func="`addr2line -f -e ./$gdb_bin -s ${addr} | sed -n -e 1p`"
|
|
echo "s/<${addr}>/<${func}>/g"
|
|
done >> mbuild.sed
|
|
# Rules to strip the leading paths off of file names.
|
|
echo 's/"\/.*\/gdb\//"gdb\//g' >> mbuild.sed
|
|
# Run the script.
|
|
sed -f mbuild.sed $log_file > Mbuild.log
|
|
|
|
mv Mbuild.log ${builddir}/$log_file
|
|
rm -rf $log_file x mbuild.sed
|
|
done
|
|
echo "done."
|
|
|
|
# Clean up build directory if necessary.
|
|
if ${clean}
|
|
then
|
|
echo "cleanning up $dir"
|
|
rm -rf ${dir}
|
|
fi
|
|
|
|
exit 0
|