123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- #!/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
|