|  | #!/bin/sh | 
|  |  | 
|  | # Build script to build GDB with all targets enabled. | 
|  |  | 
|  | # Copyright (C) 2008-2024 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 |